Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
46b3b54
refactor(tools): mandatory ternary tool mode (user/bot/both)
TONresistor May 22, 2026
15b051b
fix(telegram): remove getRawClient escape hatch, fix 2 latent bugs
TONresistor May 22, 2026
c3d49d0
refactor(bridge): replace scattered mode checks with requiresOffsetDe…
TONresistor May 23, 2026
f615dec
chore(deps): bump backend deps, TS 6, @hono/node-server 2
TONresistor May 29, 2026
89438c8
chore(deps): add knip 6, defer TS 6 (dev toolchain not ready)
TONresistor May 29, 2026
51f4f12
chore(models): dual pricing $IN/$OUT, fix Opus 4.7 label, add 2 models
TONresistor May 29, 2026
2d537a8
fix(tools,agent): drop dead schema params, fix gift ToolResult, retri…
TONresistor May 29, 2026
a625ade
fix(webui): React.Fragment key in Tools, shared SearchInput in Memory…
TONresistor May 29, 2026
80ffe4e
fix(agent): jitter + Retry-After on LLM retry backoff
TONresistor May 29, 2026
83704ec
fix(webui): Suspense fallback, ErrorBoundary route-reset, Tasks poll,…
TONresistor May 29, 2026
6079c05
refactor(agent): move pure helpers to runtime-utils, static isBotBrid…
TONresistor May 29, 2026
198b309
refactor(webui): formatDateTime helper for timestamps (task detail, w…
TONresistor May 29, 2026
ec66f5c
refactor(config,tools): remove dead toolset-profile feature
TONresistor May 29, 2026
3d584ed
feat(webui): wire semantic memory search, drop dead skeleton CSS
TONresistor May 29, 2026
c2157b1
fix(webui): clear 7 pre-existing type errors (web tsc now green)
TONresistor May 29, 2026
6057691
chore: ignore .claude-session/
TONresistor May 21, 2026
e6ad9d8
fix(runtime): unify LLM error classification via classifyLlmError
TONresistor May 31, 2026
cb31a46
refactor(client): table-driven 401 retry for refreshable providers
TONresistor May 31, 2026
12adba4
refactor(client): extract finalizeResponse shared by chat and stream
TONresistor May 31, 2026
7985d41
refactor(runtime): move cocoon tool-result shaping into the adapter
TONresistor May 31, 2026
26fbc09
refactor(registry): name the runtime mode type (RuntimeMode)
TONresistor May 31, 2026
796c41f
refactor(registry): centralize tool insertion via insertTool()
TONresistor May 31, 2026
f17012d
fix(registry): propagate plugin-declared tool mode
TONresistor May 31, 2026
363da31
refactor(registry): centralize config seeding via seedConfigs()
TONresistor May 31, 2026
69728f9
refactor(search): hoist FTS5 helpers into shared fts-utils
TONresistor May 31, 2026
d14679d
refactor(telegram): share channel username validation
TONresistor May 31, 2026
dec2318
refactor(telegram): share channel entity resolution via resolveChannel
TONresistor May 31, 2026
ecda39a
refactor(telegram): shared mapTelegramError for known error codes
TONresistor May 31, 2026
22f5699
refactor(ton): neutral units.ts, drop 3 hand-inlined toUnits copies
TONresistor May 31, 2026
4f67986
refactor(ton): single source for the STON.fi pTON address
TONresistor May 31, 2026
f08f916
fix(dedust): shared findDedustPool with volatile/stable fallback
TONresistor May 31, 2026
e67acbe
refactor(deals): shared loadDealForActor for owner/admin scoping
TONresistor May 31, 2026
aa49432
refactor(journal): shared format helpers (emoji, asset flow, tx hash)
TONresistor May 31, 2026
6b164ba
refactor(journal): use existing JournalType/JournalOutcome in Params
TONresistor May 31, 2026
c03ed57
fix(journal): wrap executors with withToolErrors
TONresistor May 31, 2026
d8c22e7
refactor(web): share Tavily resolution + error wrapping
TONresistor May 31, 2026
e4efc98
refactor(workspace): wrap 5 tools with withToolErrors
TONresistor May 31, 2026
3bf7456
refactor(exec): shared runAudited lifecycle + emit 'killed' status
TONresistor May 31, 2026
3470efc
refactor(workspace): co-locate path/file constants in paths.ts
TONresistor May 31, 2026
ad9335e
refactor(ton): lift DeDust assets+constants to src/ton, end sdk->agen…
TONresistor May 31, 2026
ef19d81
refactor(compaction): use CHARS_PER_TOKEN_ESTIMATE instead of magic 4
TONresistor May 31, 2026
fadba5e
refactor(schema): hoist addColumnIfNotExists to a module-level function
TONresistor May 31, 2026
5ef4dad
refactor(tasks): extract rowToTask mapper
TONresistor May 31, 2026
bc2e28b
refactor(ton-proxy): use TonProxyConfig from schema, drop local dup
TONresistor May 31, 2026
5eb055c
refactor(session): centralize sessionKey construction
TONresistor May 31, 2026
a0c4ff5
refactor(web): shared errMsg() helper for unknown errors
TONresistor May 31, 2026
9f68857
refactor(web): extract fetchJson shared by fetchAPI/fetchSetupAPI
TONresistor May 31, 2026
de34f0f
refactor(deal-service): interpolate shared DEAL_COLUMNS
TONresistor May 31, 2026
50d3c18
refactor(bot): typed accessors for GramJS/Grammy error shapes
TONresistor May 31, 2026
732edfc
refactor(message-builder): formatUserGives/formatAgentGives helpers
TONresistor May 31, 2026
177b3ec
refactor(bot-bridge): targeted no-explicit-any instead of file-wide d…
TONresistor May 31, 2026
0632070
refactor(cli): extract maskSecret for onboard key masking
TONresistor May 31, 2026
e0a7e54
refactor(servers): extract shared createLifecycleSSE
TONresistor May 31, 2026
9b9ef96
refactor(user-bridge): extract buildInlineMarkup
TONresistor May 31, 2026
4c18526
refactor(user-bridge): extract resolveSender
TONresistor May 31, 2026
959ec06
refactor(tts): share ensureTtsTempDir + spawnToPromise
TONresistor May 31, 2026
c22eab5
refactor(telegram): drop ambiguous TelegramBridge value alias
TONresistor May 31, 2026
f598510
refactor(session): drop dead policy param from resetSessionWithPolicy
TONresistor May 31, 2026
9534925
refactor(web): runUpdate envelope in useToolManager
TONresistor May 31, 2026
7ceb048
refactor(web): shared Loading component for loading guards
TONresistor May 31, 2026
ad54325
refactor(doctor): share readAndParseConfig across checks
TONresistor May 31, 2026
ab07140
refactor(telegram): extract transcribeAudio core, end handler->tool i…
TONresistor May 31, 2026
f516881
refactor(registry): single checkAccess grid for execute + passesFilters
TONresistor May 31, 2026
e714c6a
refactor(registry): collapse parallel Maps into RegisteredTool
TONresistor May 31, 2026
f6bd649
fix(agent): boost RAG query for holdings/balance/portfolio queries
TONresistor May 31, 2026
fb37924
fix(agent): relax stall detection to 2 consecutive repeated iterations
TONresistor May 31, 2026
f97baac
feat(agent): hybrid tool selection — tool_search escape hatch in RAG …
TONresistor May 31, 2026
f8044c4
fix(journal): clarify outcome enum semantics to stop invalid values
TONresistor May 31, 2026
6c4abed
refactor(web): extract useResource data-fetching hook
TONresistor May 31, 2026
b6b9407
refactor(web): extract Alert component for dismissible alerts
TONresistor May 31, 2026
10ce138
refactor(web): extract expandableRowProps a11y keyboard helper
TONresistor May 31, 2026
ded8296
refactor(web): split Hooks into BlocklistCard+TriggersCard, extract T…
TONresistor May 31, 2026
4c61d84
refactor(runtime): extract addUsage helper + UsageAccumulator type
TONresistor May 31, 2026
ae77346
refactor(memory): extract pi-message text primitives shared by 5 sites
TONresistor May 31, 2026
cde4418
refactor(providers): hoist model resolver to neutral layer, drop memo…
TONresistor May 31, 2026
01abdd8
refactor(runtime): extract streamIteration private method from agenti…
TONresistor May 31, 2026
32ae22f
refactor(runtime): extract selectTools and computeRagEmbedding from b…
TONresistor May 31, 2026
e8e2c54
refactor(runtime): decompose runAgenticLoop into private methods
TONresistor May 31, 2026
6a8d81b
refactor(onboard): use shared chalk constants instead of raw ANSI red…
TONresistor May 31, 2026
1654c7c
refactor(onboard): extract promptOptionalKey for optional integration…
TONresistor May 31, 2026
468af86
refactor(onboard): extract handleAutoDetectedProvider for claude-code…
TONresistor May 31, 2026
25c31f8
refactor(onboard): extract validateAndFetchBot and importWalletFlow, …
TONresistor May 31, 2026
15e5eea
refactor(onboard): extract runUiSetup so onboardCommand only routes m…
TONresistor May 31, 2026
9095ea6
refactor(onboard): extract buildConfig shared by both flows
TONresistor May 31, 2026
926ea6e
refactor(onboard): decompose runInteractiveOnboarding into per-step f…
TONresistor May 31, 2026
c26407a
refactor(servers): share hashApiKey via crypto-tokens util
TONresistor May 31, 2026
59bbcd4
refactor(servers): share http bootstrap via http-common module
TONresistor May 31, 2026
ebbcd77
refactor(servers): share static SPA serving via static-serving module
TONresistor May 31, 2026
cad0b88
refactor(servers): share startHonoServer lifecycle helper
TONresistor May 31, 2026
3cb5922
refactor(servers): share route-factory list across api and webui
TONresistor May 31, 2026
b452562
refactor(servers): consolidate agent lifecycle routes with error mapper
TONresistor May 31, 2026
5cf3a97
refactor(bot): extract editInlineViaGramJS transport helper
TONresistor May 31, 2026
3b98500
refactor(sdk): hoist pure formatting helpers into sdk/formatting.ts
TONresistor May 31, 2026
24ecbb4
refactor(bot): extract MTProto inline transport from DealBot
TONresistor May 31, 2026
806b940
docs(bot): document callback prefix routing contract
TONresistor May 31, 2026
1e0b892
refactor(sdk): extract fetchJettonMeta with single decimals parse
TONresistor May 31, 2026
3f98071
refactor(sdk): extract buildWalletContext + wrapExternalMessage + sig…
TONresistor May 31, 2026
fbd7997
refactor(sdk): extract withSwapWallet shared by stonfi/dedust swaps
TONresistor May 31, 2026
27dcb96
refactor(ton): extract openWallet for the 8 on-chain write tools
TONresistor May 31, 2026
6488799
refactor(bot): centralize inline Number(chatId) conversions into toCh…
TONresistor May 31, 2026
129c1fa
refactor(providers): extract shared token cache and jwt expiry util
TONresistor May 31, 2026
784cd61
refactor(config): derive provider enum from registry, reuse policy/ex…
TONresistor May 31, 2026
65c5e68
refactor(sdk): userOp HOF for telegram-social methods
TONresistor May 31, 2026
fb63f6a
refactor(session): generate updateSession SET from column map
TONresistor May 31, 2026
cf2bbc2
refactor(memory): share identical DDL constants between ensureSchema …
TONresistor May 31, 2026
1558c99
style: prettier formatting on refactored files
TONresistor May 31, 2026
78368cd
fix(bot): remove dead html-parser/styled-keyboard shims flagged by knip
TONresistor Jun 1, 2026
fccf58a
ci: notify Telegram per commit, paced 1/sec, from the push range
TONresistor Jun 1, 2026
6f4c9b9
ci: run on dev too, branch-aware Telegram notifications
TONresistor Jun 1, 2026
b302feb
ci: harden release and notify workflows
TONresistor Jun 1, 2026
8103eb9
fix(ci): retry Telegram sends on 429 instead of dropping them
TONresistor Jun 1, 2026
61277ee
refactor(providers): remove obsolete claude-code provider
TONresistor Jun 1, 2026
78224ff
docs: rename removed claude-code provider to codex
TONresistor Jun 1, 2026
b13efe5
fix(agent): retry on WebSocket-close / dropped-socket LLM errors
TONresistor Jun 1, 2026
243a7f0
fix(tasks): timezone-proof scheduling via scheduleInSeconds
TONresistor Jun 1, 2026
f089ebe
fix(webui): write config.yaml before Telegram auth in setup wizard
TONresistor Jun 2, 2026
c84ab42
feat(webui): light/dark theming
TONresistor Jun 2, 2026
1b00ce5
fix(webui): light mode colors
TONresistor Jun 2, 2026
f0c3bf7
feat(webui): toast, confirm, skeleton, empty-state components
TONresistor Jun 2, 2026
4f4b9b8
feat(webui): page feedback states
TONresistor Jun 2, 2026
ad7e9a5
fix(webui): a11y InfoTip & ArrayInput
TONresistor Jun 2, 2026
650518b
feat(webui): redesign Tools page
TONresistor Jun 2, 2026
d3fb9a0
feat(webui): Tools scope pill tabs
TONresistor Jun 2, 2026
01bed0c
fix(webui): no-cache index.html
TONresistor Jun 2, 2026
db677ee
feat(webui): module scope pill tabs
TONresistor Jun 2, 2026
de9af91
chore(webui): remove dead code (unused ReviewStep, orphaned validate-…
TONresistor Jun 2, 2026
5a6d3b9
feat(webui): Tools filter as folder bar
TONresistor Jun 2, 2026
6221d76
fix(webui): remove focus flash on pill selectors
TONresistor Jun 2, 2026
01a1a54
feat(webui): redesign Plugins page to match Tools
TONresistor Jun 2, 2026
77847e9
feat(webui): System Prompt editor with folder-bar tabs, rename Soul
TONresistor Jun 2, 2026
64aabaf
fix(webui): compact Save button in System Prompt
TONresistor Jun 2, 2026
ad382eb
feat(webui): token/word/char counter in System Prompt
TONresistor Jun 2, 2026
a323320
feat(webui): redesign Memory page to match DA, add CodeBlock
TONresistor Jun 2, 2026
3d50dc5
feat(webui): unified RefreshButton across pages
TONresistor Jun 2, 2026
7f23440
feat(webui): redesign Chats with iOS list and message bubbles
TONresistor Jun 2, 2026
34549a4
feat(webui): render markdown in chat bubbles
TONresistor Jun 2, 2026
7c80fbd
feat(webui): master-detail layout for Chats
TONresistor Jun 2, 2026
78eb949
fix(webui): integrate chat list and detail into one card
TONresistor Jun 2, 2026
26bf942
feat(webui): redesign wallet page, rename token TON→GRAM
TONresistor Jun 2, 2026
582d0dd
feat(webui): redesign hooks page
TONresistor Jun 2, 2026
a2a7aa9
feat(webui): redesign mcp page
TONresistor Jun 2, 2026
3059b9f
feat(webui): redesign tasks page
TONresistor Jun 2, 2026
1050ac6
feat(webui): redesign dashboard (polish)
TONresistor Jun 2, 2026
4b38540
feat(webui): compact menu-bar stats strip on dashboard
TONresistor Jun 2, 2026
e33a065
feat(webui): redesign workspace page
TONresistor Jun 2, 2026
4b9897f
feat(webui): redesign config page
TONresistor Jun 2, 2026
54222aa
fix(ton): confirm transfers on-chain and return the real tx hash
TONresistor Jun 2, 2026
c2617eb
fix(ton): confirm jetton & swap transfers on-chain and return real tx…
TONresistor Jun 2, 2026
5b8b929
fix(ton): confirm DNS write operations on-chain and return real tx ha…
TONresistor Jun 2, 2026
7cac9a4
fix(ton): confirm plugin SDK transfers on-chain and return real tx ha…
TONresistor Jun 2, 2026
9ca0753
feat(webui): per-tool access levels + access-control dashboard
TONresistor Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 133 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,36 @@ name: CI

on:
push:
branches: [main]
branches: [main, dev]
pull_request:
branches: [main]

jobs:
build:
runs-on: ubuntu-latest
# Cancel superseded runs on the same ref (rapid pushes / PR force-pushes).
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

strategy:
matrix:
node-version: [20, 22]
# Least privilege. The notify job authenticates to Telegram via its own secrets,
# not GITHUB_TOKEN, so read-only repo access is enough everywhere.
permissions:
contents: read

jobs:
# Node-version-independent static analysis — run once, not per matrix entry.
checks:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
node-version: 20
cache: npm

- name: Install dependencies
run: npm ci

- name: Install WebUI dependencies
run: cd web && npm ci

- name: Build SDK workspace
run: npm run build -w packages/sdk

Expand All @@ -50,14 +53,128 @@ jobs:
- name: Duplicate code check
run: npm run dupcheck

- name: Security audit
run: npm run audit:ci

# Build + test on each supported Node version.
test:
runs-on: ubuntu-latest
timeout-minutes: 25
strategy:
matrix:
node-version: [20, 22]
steps:
- uses: actions/checkout@v4

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm
cache-dependency-path: |
package-lock.json
web/package-lock.json

- name: Install dependencies
run: npm ci

- name: Install WebUI dependencies
run: cd web && npm ci

- name: Build SDK workspace
run: npm run build -w packages/sdk

- name: Build
run: npm run build

- name: Test with coverage
run: npm run test:coverage

- name: Security audit
run: npm run audit:ci

- name: CLI smoke test
run: node dist/cli/index.js --help

# ---- Telegram notification (after the full CI passes, pushes only) ----
# dev : one message PER COMMIT, prefixed [DEV], paced 1/sec.
# main : one clean summary of how many stable commits were merged.
# Both walk the push range (before..after), not just the HEAD commit.
notify:
needs: [checks, test]
if: github.event_name == 'push'
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Notify Telegram
env:
TG_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
TG_CHAT: ${{ secrets.TELEGRAM_CHAT_ID }}
REPO: ${{ github.repository }}
BRANCH: ${{ github.ref_name }}
BEFORE: ${{ github.event.before }}
AFTER: ${{ github.sha }}
run: |
set -uo pipefail
ZERO=0000000000000000000000000000000000000000

# Resolve the commits in this push, oldest -> newest (merge commits excluded).
# Fallbacks (first push / force-push / unknown before) -> HEAD only.
if [ "$BEFORE" = "$ZERO" ] \
|| ! git cat-file -e "${BEFORE}^{commit}" 2>/dev/null \
|| ! git merge-base --is-ancestor "$BEFORE" "$AFTER" 2>/dev/null; then
SHAS=$(git log -1 --format=%H "$AFTER")
RANGE_OK=0
else
SHAS=$(git log --reverse --no-merges --format=%H "${BEFORE}..${AFTER}")
RANGE_OK=1
fi

COUNT=$(printf '%s\n' "$SHAS" | grep -c . || true)
if [ "$COUNT" -eq 0 ]; then echo "Nothing to notify"; exit 0; fi

esc() { printf '%s' "$1" | sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'; }
# Send one message, retrying until Telegram accepts it. IMPORTANT: no
# curl --fail here — on a 429 we must READ the body to get retry_after;
# --fail discards it, which silently drops rate-limited messages.
send() {
local text="$1" attempt resp ra
for attempt in 1 2 3 4 5 6; do
resp=$(curl -sS -m 25 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-d chat_id="${TG_CHAT}" -d parse_mode=HTML -d disable_web_page_preview=true \
--data-urlencode "text=${text}" 2>/dev/null || true)
case "$resp" in
*'"ok":true'*) return 0 ;;
esac
# 429 -> honor retry_after; other transient error -> small backoff.
ra=$(printf '%s' "$resp" | grep -o '"retry_after":[0-9]*' | grep -o '[0-9]*' || true)
sleep "$(( ${ra:-2} + 1 ))"
done
echo "WARN: gave up sending after retries: ${text%%$'\n'*}"
return 1
}

if [ "$BRANCH" = "main" ]; then
# Clean summary: number of stable commits merged to main.
noun="commits"; [ "$COUNT" -eq 1 ] && noun="commit"
if [ "$RANGE_OK" = 1 ]; then
link="https://github.com/${REPO}/compare/${BEFORE}...${AFTER}"
else
link="https://github.com/${REPO}/commit/${AFTER}"
fi
send "🟢 <b>${COUNT}</b> stable ${noun} merged to <b>main</b>"$'\n'"<a href=\"${link}\">View changes</a>"
else
# Per-commit feed for dev (and any other non-main branch), [DEV] prefixed.
tag="[${BRANCH^^}]"
if [ "$COUNT" -gt 1 ]; then
send "📦 <b>${COUNT}</b> commits pushed to <b>${BRANCH}</b>"
sleep 1
fi
for sha in $SHAS; do
title=$(esc "$(git log -1 --format=%s "$sha")")
url="https://github.com/${REPO}/commit/${sha}"
send "${tag} <b>${title}</b>"$'\n'"<a href=\"${url}\">${sha:0:7}</a>"
sleep 1
done
fi
32 changes: 28 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,25 @@ on:
push:
tags: ["v*"]

# Least privilege by default; jobs opt into the extra scopes they need.
permissions:
contents: write
packages: write
contents: read

jobs:
# ---- Build & Verify ----
build:
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: |
package-lock.json
web/package-lock.json

- run: npm ci
- run: cd web && npm ci
Expand All @@ -39,6 +43,10 @@ jobs:
publish-npm:
needs: build
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
id-token: write # npm provenance
steps:
- uses: actions/checkout@v4

Expand All @@ -47,6 +55,9 @@ jobs:
node-version: 20
registry-url: https://registry.npmjs.org
cache: npm
cache-dependency-path: |
package-lock.json
web/package-lock.json

- name: Check if version already published
id: check
Expand All @@ -71,7 +82,7 @@ jobs:
name: dist
path: dist/

- run: npm publish --access public
- run: npm publish --provenance --access public
if: steps.check.outputs.publish == 'true'
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Expand All @@ -80,6 +91,10 @@ jobs:
publish-sdk:
needs: build
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
id-token: write # npm provenance
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -108,14 +123,18 @@ jobs:

- name: Build and publish SDK
if: steps.check.outputs.publish == 'true'
run: npm run build -w packages/sdk && cd packages/sdk && npm publish --access public
run: npm run build -w packages/sdk && cd packages/sdk && npm publish --provenance --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

# ---- Publish Docker image ----
publish-docker:
needs: build
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
packages: write # push to ghcr.io
steps:
- uses: actions/checkout@v4

Expand All @@ -137,6 +156,8 @@ jobs:
with:
context: .
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: |
ghcr.io/${{ steps.meta.outputs.repo }}:${{ steps.meta.outputs.version }}
ghcr.io/${{ steps.meta.outputs.repo }}:latest
Expand All @@ -145,6 +166,9 @@ jobs:
create-release:
needs: [publish-npm]
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: write # create the GitHub release
steps:
- uses: actions/checkout@v4
with:
Expand Down
43 changes: 5 additions & 38 deletions .github/workflows/telegram-notify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,13 @@ name: Telegram Notify

on:
workflow_run:
workflows: ["CI", "Release"]
workflows: ["Release"]
types: [completed]

jobs:
# ---- Commit notification (only after CI passes) ----
commit:
if: >-
github.event.workflow_run.name == 'CI'
&& github.event.workflow_run.conclusion == 'success'
&& github.event.workflow_run.head_branch == 'main'
runs-on: ubuntu-latest
steps:
- name: Build message file
env:
FULL: ${{ github.event.workflow_run.head_commit.message }}
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
REPO: ${{ github.repository }}
run: |
TITLE=$(echo "$FULL" | head -1)
BODY=$(echo "$FULL" | tail -n +3)
COMMIT_URL="https://github.com/${REPO}/commit/${COMMIT_SHA}"
{
echo "<b>${TITLE}</b>"
if [ -n "$BODY" ]; then
echo ""
echo "$BODY"
fi
echo ""
echo "<a href=\"${COMMIT_URL}\">View commit</a>"
} > "$GITHUB_WORKSPACE/.tg_message.txt"

- name: Send commit to Telegram
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
format: html
disable_web_page_preview: true
message_file: .tg_message.txt
permissions:
contents: read

jobs:
# ---- Release notification (only after Release workflow passes) ----
release:
if: >-
Expand All @@ -68,7 +35,7 @@ jobs:

- name: Send release to Telegram
if: steps.ver.outputs.found == 'true'
uses: appleboy/telegram-action@master
uses: appleboy/telegram-action@v1.0.1
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,6 @@ TODOS/
# TTS voice models (large binaries)
piper-voices/


# Claude Code session logs
.claude-session/
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
## Prerequisites

- **Node.js 20.0.0+** - [Download](https://nodejs.org/)
- **LLM API Key** - One of: [Anthropic](https://console.anthropic.com/) (recommended), [OpenAI](https://platform.openai.com/), [Google](https://aistudio.google.com/), [xAI](https://console.x.ai/), [Groq](https://console.groq.com/), [OpenRouter](https://openrouter.ai/), [Moonshot](https://platform.moonshot.ai/), [Mistral](https://console.mistral.ai/), [Cerebras](https://cloud.cerebras.ai/), [ZAI](https://open.bigmodel.cn/), [MiniMax](https://platform.minimaxi.com/), [Hugging Face](https://huggingface.co/settings/tokens) — or keyless: Claude Code (auto-detect), Cocoon (TON), Local (Ollama/vLLM)
- **LLM API Key** - One of: [Anthropic](https://console.anthropic.com/) (recommended), [OpenAI](https://platform.openai.com/), [Google](https://aistudio.google.com/), [xAI](https://console.x.ai/), [Groq](https://console.groq.com/), [OpenRouter](https://openrouter.ai/), [Moonshot](https://platform.moonshot.ai/), [Mistral](https://console.mistral.ai/), [Cerebras](https://cloud.cerebras.ai/), [ZAI](https://open.bigmodel.cn/), [MiniMax](https://platform.minimaxi.com/), [Hugging Face](https://huggingface.co/settings/tokens) — or keyless: Codex (auto-detect), Cocoon (TON), Local (Ollama/vLLM)
- **Telegram Account** - Dedicated account recommended for security
- **Telegram API Credentials** - From [my.telegram.org/apps](https://my.telegram.org/apps)
- **Your Telegram User ID** - Message [@userinfobot](https://t.me/userinfobot)
Expand Down Expand Up @@ -172,7 +172,7 @@ The `teleton setup` wizard generates a fully configured `~/.teleton/config.yaml`

```yaml
agent:
provider: "anthropic" # anthropic | claude-code | openai | google | xai | groq | openrouter | moonshot | mistral | cerebras | zai | minimax | huggingface | cocoon | local
provider: "anthropic" # anthropic | openai | google | xai | groq | openrouter | moonshot | mistral | cerebras | zai | minimax | huggingface | cocoon | local
api_key: "sk-ant-api03-..."
model: "claude-haiku-4-5-20251001"
utility_model: "claude-haiku-4-5-20251001" # for summarization, compaction, vision
Expand Down Expand Up @@ -219,7 +219,7 @@ ton_proxy: # Optional: .ton domain proxy
<table>
<tr>
<td align="center" width="20%"><br><b>Anthropic</b><br>Claude Opus 4.6<br><br></td>
<td align="center" width="20%"><br><b>Claude Code</b><br>Auto-detected<br><br></td>
<td align="center" width="20%"><br><b>Codex</b><br>Auto-detected<br><br></td>
<td align="center" width="20%"><br><b>OpenAI</b><br>GPT-5<br><br></td>
<td align="center" width="20%"><br><b>Google</b><br>Gemini 3 Pro<br><br></td>
<td align="center" width="20%"><br><b>xAI</b><br>Grok 4.1<br><br></td>
Expand Down Expand Up @@ -475,7 +475,7 @@ The SDK provides namespaced access to core services:

| Layer | Technology |
|-------|------------|
| LLM | Multi-provider via [pi-ai](https://github.com/mariozechner/pi-ai) (15 providers: Anthropic, Claude Code, OpenAI, Google, xAI, Groq, OpenRouter, Moonshot, Mistral, Cerebras, ZAI, MiniMax, Hugging Face, Cocoon, Local) |
| LLM | Multi-provider via [pi-ai](https://github.com/mariozechner/pi-ai) (15 providers: Anthropic, Codex, OpenAI, Google, xAI, Groq, OpenRouter, Moonshot, Mistral, Cerebras, ZAI, MiniMax, Hugging Face, Cocoon, Local) |
| Telegram Userbot | [GramJS](https://gram.js.org/) Layer 223 fork (MTProto) |
| Inline Bot | [Grammy](https://grammy.dev/) (Bot API, for deals) |
| Blockchain | [TON SDK](https://github.com/ton-org/ton) (W5R1 wallet) |
Expand Down
Loading
Loading