@songsid/agend 2.1.12-beta.2 → 2.1.12-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +54 -8
  2. package/README.zh-TW.md +104 -11
  3. package/dist/agent-endpoint.d.ts +2 -0
  4. package/dist/agent-endpoint.js +38 -29
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/backend/claude-code.d.ts +20 -0
  7. package/dist/backend/claude-code.js +84 -25
  8. package/dist/backend/claude-code.js.map +1 -1
  9. package/dist/backend/codex.d.ts +20 -0
  10. package/dist/backend/codex.js +55 -5
  11. package/dist/backend/codex.js.map +1 -1
  12. package/dist/backend/factory.js +5 -5
  13. package/dist/backend/factory.js.map +1 -1
  14. package/dist/backend/index.d.ts +0 -1
  15. package/dist/backend/index.js +0 -1
  16. package/dist/backend/index.js.map +1 -1
  17. package/dist/backend/kiro.d.ts +10 -1
  18. package/dist/backend/kiro.js +13 -0
  19. package/dist/backend/kiro.js.map +1 -1
  20. package/dist/backend/mock.d.ts +1 -1
  21. package/dist/backend/mock.js +1 -1
  22. package/dist/backend/muse.d.ts +20 -0
  23. package/dist/backend/muse.js +68 -11
  24. package/dist/backend/muse.js.map +1 -1
  25. package/dist/backend/removed.d.ts +12 -0
  26. package/dist/backend/removed.js +18 -0
  27. package/dist/backend/removed.js.map +1 -0
  28. package/dist/backend/session-signals.js +5 -10
  29. package/dist/backend/session-signals.js.map +1 -1
  30. package/dist/backend/types.d.ts +15 -1
  31. package/dist/backend/types.js +0 -1
  32. package/dist/backend/types.js.map +1 -1
  33. package/dist/channel/adapters/discord.js +9 -0
  34. package/dist/channel/adapters/discord.js.map +1 -1
  35. package/dist/channel/adapters/telegram.d.ts +14 -8
  36. package/dist/channel/adapters/telegram.js +80 -26
  37. package/dist/channel/adapters/telegram.js.map +1 -1
  38. package/dist/channel/mcp-tools.js +2 -2
  39. package/dist/channel/mcp-tools.js.map +1 -1
  40. package/dist/classic-channel-manager.js +2 -2
  41. package/dist/classic-channel-manager.js.map +1 -1
  42. package/dist/cli.js +27 -53
  43. package/dist/cli.js.map +1 -1
  44. package/dist/command-table.d.ts +1 -1
  45. package/dist/command-table.js +4 -2
  46. package/dist/command-table.js.map +1 -1
  47. package/dist/config-validator.js +48 -10
  48. package/dist/config-validator.js.map +1 -1
  49. package/dist/config.js +7 -5
  50. package/dist/config.js.map +1 -1
  51. package/dist/context-guardian.d.ts +1 -1
  52. package/dist/context-guardian.js +1 -1
  53. package/dist/cross-instance-notice.d.ts +39 -0
  54. package/dist/cross-instance-notice.js +84 -0
  55. package/dist/cross-instance-notice.js.map +1 -0
  56. package/dist/daemon.d.ts +73 -2
  57. package/dist/daemon.js +333 -31
  58. package/dist/daemon.js.map +1 -1
  59. package/dist/daily-summary.js +0 -3
  60. package/dist/daily-summary.js.map +1 -1
  61. package/dist/fleet-manager.d.ts +16 -3
  62. package/dist/fleet-manager.js +110 -53
  63. package/dist/fleet-manager.js.map +1 -1
  64. package/dist/general-knowledge/skills/fleet-config/SKILL.md +1 -1
  65. package/dist/instance-config-impact.js +3 -0
  66. package/dist/instance-config-impact.js.map +1 -1
  67. package/dist/instance-lifecycle.d.ts +9 -1
  68. package/dist/instance-lifecycle.js +62 -7
  69. package/dist/instance-lifecycle.js.map +1 -1
  70. package/dist/locale.js +30 -6
  71. package/dist/locale.js.map +1 -1
  72. package/dist/memory-pressure.d.ts +8 -2
  73. package/dist/memory-pressure.js +10 -4
  74. package/dist/memory-pressure.js.map +1 -1
  75. package/dist/outbound-handlers.js +47 -25
  76. package/dist/outbound-handlers.js.map +1 -1
  77. package/dist/outbound-schemas.d.ts +0 -1
  78. package/dist/outbound-schemas.js +3 -3
  79. package/dist/outbound-schemas.js.map +1 -1
  80. package/dist/reply-dedup.d.ts +5 -0
  81. package/dist/reply-dedup.js +9 -0
  82. package/dist/reply-dedup.js.map +1 -1
  83. package/dist/settings-api.js +5 -1
  84. package/dist/settings-api.js.map +1 -1
  85. package/dist/setup-wizard.js +0 -4
  86. package/dist/setup-wizard.js.map +1 -1
  87. package/dist/spawn-gate.js +4 -3
  88. package/dist/spawn-gate.js.map +1 -1
  89. package/dist/target-queue-worker.d.ts +1 -1
  90. package/dist/topic-commands.d.ts +64 -5
  91. package/dist/topic-commands.js +172 -14
  92. package/dist/topic-commands.js.map +1 -1
  93. package/dist/transcript-jsonl.d.ts +20 -0
  94. package/dist/transcript-jsonl.js +64 -0
  95. package/dist/transcript-jsonl.js.map +1 -0
  96. package/dist/transcript-monitor.js +21 -29
  97. package/dist/transcript-monitor.js.map +1 -1
  98. package/dist/transcript-sources.d.ts +1 -1
  99. package/dist/transcript-sources.js +29 -26
  100. package/dist/transcript-sources.js.map +1 -1
  101. package/dist/turn-reply-guard.d.ts +25 -1
  102. package/dist/turn-reply-guard.js +36 -1
  103. package/dist/turn-reply-guard.js.map +1 -1
  104. package/dist/types.d.ts +13 -4
  105. package/dist/ui/dashboard.html +3 -3
  106. package/dist/ui/settings.html +58 -16
  107. package/dist/ui/view.html +17 -10
  108. package/dist/ui/web-terminal/terminal.css +1 -1
  109. package/dist/ui/web-terminal/terminal.js +5 -1
  110. package/dist/update-check.d.ts +15 -6
  111. package/dist/update-check.js +20 -7
  112. package/dist/update-check.js.map +1 -1
  113. package/dist/usage/format-rich.js +3 -7
  114. package/dist/usage/format-rich.js.map +1 -1
  115. package/dist/usage/i18n-keys.d.ts +1 -1
  116. package/dist/usage/i18n-keys.js +1 -1
  117. package/dist/usage/i18n-keys.js.map +1 -1
  118. package/dist/usage/i18n.d.ts +5 -2
  119. package/dist/usage/i18n.js +9 -5
  120. package/dist/usage/i18n.js.map +1 -1
  121. package/dist/usage/providers.d.ts +11 -5
  122. package/dist/usage/providers.js +55 -1
  123. package/dist/usage/providers.js.map +1 -1
  124. package/dist/usage/usage-api.d.ts +0 -9
  125. package/dist/usage/usage-api.js +7 -32
  126. package/dist/usage/usage-api.js.map +1 -1
  127. package/dist/wake-coordinator.js +1 -1
  128. package/dist/web-api.js +1 -2
  129. package/dist/web-api.js.map +1 -1
  130. package/package.json +1 -1
  131. package/dist/backend/gemini-cli.d.ts +0 -20
  132. package/dist/backend/gemini-cli.js +0 -169
  133. package/dist/backend/gemini-cli.js.map +0 -1
package/README.md CHANGED
@@ -54,7 +54,9 @@ AgEnD (**Agent Engineering Daemon**) turns your Telegram or Discord into a comma
54
54
 
55
55
  🛑 **Cancel Button** — Interrupt agent generation with a single tap. Inline button appears on every message; works across TG and Discord.
56
56
 
57
- 📬 **Delivery Status** — See message delivery progress: 👀 received → ⏳ processing → ✅ done (or ❌ failed).
57
+ 📬 **Delivery Status** — Each message you send gets a reaction that tracks it: on Discord 👀 received → ⏳ queued → 👀 with the agent → ✅ delivered, or ❌ if delivery failed. Telegram only accepts its own reaction set, so there it is 👀 throughout and 👎 on failure.
58
+
59
+ 🎨 **Configurable Status Emoji** — Every delivery-status emoji can be changed per channel or per instance with `status_emojis`, including Discord server emoji. See [Configuration](docs/configuration.md#channeloptionsstatus_emojis-discord-and-telegram).
58
60
 
59
61
  🖥️ **Web Dashboard** — Live fleet monitoring in the browser with SSE updates and integrated chat UI.
60
62
 
@@ -64,6 +66,18 @@ AgEnD (**Agent Engineering Daemon**) turns your Telegram or Discord into a comma
64
66
 
65
67
  📋 **Fleet Templates** — Define reusable fleet configurations. Deploy multi-instance setups with one command, each with its own git worktree.
66
68
 
69
+ 😀 **Stickers & Persona Emoji** — Agents can send stickers on Discord and Telegram, and each agent can pick its own emoji so you can tell bots apart in a shared channel.
70
+
71
+ 📊 **Subscription Usage** — `/usage` (also the dashboard and the `get_usage` tool) shows the remaining quota of your Claude, Codex, Kiro, Grok, Muse and Antigravity subscriptions, one row per subscription.
72
+
73
+ 🔑 **Credential Profiles** — Run instances, or ClassicBot channels, on a second subscription of the same backend with `backend_options.<backend>.credential_profile` (kiro-cli and Codex today). See [Configuration](docs/configuration.md#credential-profiles-multiple-subscriptions-of-one-backend).
74
+
75
+ 🌐 **Sign In From Your Phone** — `/login` (fleet admins) signs a CLI in without SSH: device-code logins such as Codex and Grok post their link and code in the chat, and a sign-in that needs a terminal gets a time-limited, token-protected browser terminal on the host. For kiro-cli and Claude Code it can also open a temporary public link through a Cloudflare Quick Tunnel after you confirm; AgEnD downloads `cloudflared` if it is missing. Turn it off with `web_terminal.tunnel.allow_public: false`. See [Configuration](docs/configuration.md#finishing-a-login-away-from-the-machine-public-link).
76
+
77
+ 💤 **Auto-Pause & Wake** — With `auto_pause_after` (minutes, off by default) an idle instance is paused and wakes by itself when a message arrives. `/pause` and `/wake` do the same by hand.
78
+
79
+ 🧠 **Memory Pressure Guard** — On Linux the fleet watches host memory: under pressure it slows new CLI starts, holds them while memory is critical, and posts a notice. On macOS the readings are only logged.
80
+
67
81
  ## Use Cases
68
82
 
69
83
  AgEnD is an AI personal assistant that lives in Discord and Telegram, running on the AI subscriptions you already have.
@@ -180,11 +194,16 @@ The quickstart will set up both `fleet.yaml` and `classicBot.yaml`. Run `agend q
180
194
 
181
195
  ### Usage
182
196
 
183
- | Command | Description |
184
- |---------|-------------|
185
- | `/start` | Start an agent in the current channel |
186
- | `/chat <message>` | Send a message to the agent |
187
- | `/stop` | Stop the agent in the current channel |
197
+ | Command | Who | Description |
198
+ |---------|-----|-------------|
199
+ | `/start <backend>` | see below | Start an agent in the current channel |
200
+ | `/chat <message>` | anyone | Send a message to the agent |
201
+ | `/steer`, `/btw`, `/cancel`, `/ctx` | anyone | Interject into the current task, ask a side question, interrupt, show context usage |
202
+ | `/pause`, `/wake`, `/compact`, `/clear`, `/model`, `/save` | admin | Pause or wake the agent, compact or clear its context, switch model, save the conversation |
203
+ | `/effort`, `/collab` | admin | Discord only: reasoning effort, collab mode |
204
+ | `/stop`, `/load` | ClassicBot admin | Stop the agent in the current channel; load a saved conversation (`/load` is Discord only) |
205
+
206
+ "Admin" is a fleet admin or a ClassicBot admin (`admin_users`) on Discord. On Telegram, `/pause`, `/wake`, `/compact` and `/save` take a ClassicBot admin. Fleet-wide commands such as `/usage` and `/status` also work in a ClassicBot channel on Discord. Who may `/start`: on Discord, anyone in an allowed server; on Telegram, a user in `allowed_users` in a private chat, or a ClassicBot admin in an allowed group (`/start@yourbot`).
188
207
 
189
208
  On Discord, `/start` turns on collab mode: @-mention the bot to talk to it. See [Use Cases](docs/use-cases.md) for examples.
190
209
 
@@ -202,7 +221,8 @@ defaults:
202
221
 
203
222
  - **Empty or omitted** `allowed_guilds` → all servers allowed (default)
204
223
  - **Primary guild** (fleet.yaml `group_id`) → full access (topic mode + ClassicBot)
205
- - **Whitelisted guilds** → ClassicBot only (`/start`, `/chat`, `/stop`)
224
+ - **Whitelisted guilds** → ClassicBot channels only
225
+ - **A `/start` from a server that is not listed** posts an approval request with buttons to the General topic
206
226
  - **Hot reload** — changes detected every 30 seconds, no restart needed
207
227
 
208
228
  ### Per-Channel Backend
@@ -220,11 +240,37 @@ channels:
220
240
 
221
241
  Backend fallback: channel → `defaults.backend` → `fleet.yaml` defaults → `claude-code`
222
242
 
243
+ ### Access Lists
244
+
245
+ ```yaml
246
+ defaults:
247
+ allowed_guilds: ["123456789012345678"] # Discord servers (empty = all)
248
+ allowed_groups: ["-1001234567890"] # Telegram groups (empty = all)
249
+ allowed_users: ["123456789"] # Telegram users who may /start in a private chat (empty = all)
250
+ admin_users: ["123456789"] # ClassicBot admins (empty = nobody)
251
+ ```
252
+
253
+ Quote the ids: a Discord id is too long to survive as a YAML number. With no `admin_users`, nobody can `/stop` a ClassicBot agent and nobody can start one in a Telegram group.
254
+
255
+ ### Second Subscription per Channel
256
+
257
+ A channel can run on a different login of the same backend, as a fleet instance can:
258
+
259
+ ```yaml
260
+ channels:
261
+ "1234567890":
262
+ backend: kiro-cli
263
+ backend_options:
264
+ kiro-cli:
265
+ credential_profile: work # "" = back to the shared login
266
+ ```
267
+
268
+ The channel's `backend_options` are merged over the fleet.yaml defaults'. Profiles work for kiro-cli and Codex; an invalid profile name keeps the agent from starting rather than running it on the wrong account, and a change restarts a running agent. Log the profile in first: see [Credential profiles](docs/configuration.md#credential-profiles-multiple-subscriptions-of-one-backend). Every other `classicBot.yaml` key is in the [Configuration reference](docs/configuration.md#classicbotyaml).
269
+
223
270
  ## Known Limitations
224
271
 
225
272
  - macOS (launchd) and Linux (systemd) supported; on Windows, run it inside WSL ([Windows install guide](https://songsid.github.io/AgEnD/install-windows/)). Native Windows is not supported
226
273
  - Official Telegram plugin in global `enabledPlugins` causes 409 polling conflicts
227
- - OpenCode and Kiro CLI do not read MCP server `instructions` field — fleet context and workflow templates are not injected into these backends' system prompts. Awaiting upstream fix.
228
274
 
229
275
  ## License
230
276
 
package/README.zh-TW.md CHANGED
@@ -27,7 +27,7 @@ AgEnD(**Agent Engineering Daemon**)把你的 Telegram 或 Discord 變成 AI
27
27
  |---|---|
28
28
  | 關掉終端機,agent 就斷線 | 系統服務常駐,重開機也不怕 |
29
29
  | 一個終端機 = 一個專案 | 一個 bot,無限專案同時跑 |
30
- | 長時間 session 累積過時 context | 依 max age 自動輪替 session,保持新鮮 |
30
+ | 長時間 session 累積過時 context | CLI 自動壓縮 context,當機後用 context 快照恢復 |
31
31
  | 不知道 agent 半夜在幹嘛 | 每日花費報告 + 卡住偵測通知 |
32
32
  | Agent 各做各的,無法協作 | 點對點協作,透過 MCP tools |
33
33
  | 無人看管時帳單暴增 | 每個 instance 每日花費上限,自動暫停 |
@@ -42,7 +42,7 @@ AgEnD(**Agent Engineering Daemon**)把你的 Telegram 或 Discord 變成 AI
42
42
 
43
43
  📱 **手機操控** — 用 Telegram 或 Discord 的按鈕核准工具使用、重啟 session、管理整個 fleet。
44
44
 
45
- 🛡️ **自主又安全** — 花費上限、卡住偵測、model failover、context 輪替,fleet 不用顧也能穩穩跑。
45
+ 🛡️ **自主又安全** — 花費上限、卡住偵測、model failover、當機自動恢復,fleet 不用顧也能穩穩跑。
46
46
 
47
47
  ⏰ **持久化排程** — cron 排程任務,SQLite 儲存,重啟不遺失。
48
48
 
@@ -52,9 +52,31 @@ AgEnD(**Agent Engineering Daemon**)把你的 Telegram 或 Discord 變成 AI
52
52
 
53
53
  🪞 **Mirror Topic** — 跨 instance 可見性。從另一個 topic 即時觀看其他 agent 的工作。
54
54
 
55
+ 🛑 **取消按鈕** — 按一下就能中斷 agent 正在產生的回應。每則訊息都會附上這個按鈕,Telegram 和 Discord 都能用。
56
+
57
+ 📬 **送達狀態** — 你傳出的每則訊息都會掛上一個表情,標示它走到哪一步:在 Discord 上依序是 👀 已收到 → ⏳ 排隊中 → 👀 agent 已接手 → ✅ 已送達,送達失敗則是 ❌。Telegram 只接受它自己的那組反應表情,所以在 Telegram 上一律是 👀,失敗時是 👎。
58
+
59
+ 🎨 **狀態表情可自訂** — 每個送達狀態的表情都能用 `status_emojis` 依頻道或依 instance 更換,Discord 伺服器的自訂表情也可以。詳見 [Configuration](docs/configuration.zh-TW.md#instancesname) 的 `status_emojis`。
60
+
55
61
  🖥️ **Web Dashboard** — 瀏覽器即時 fleet 監控,SSE 更新 + 整合聊天介面。
56
62
 
57
- 🔌 **可擴充** — Discord adapter、webhook 通知、health endpoint、外部 session 透過 IPC 連入。
63
+ 🔌 **可擴充** — 轉接器外掛、webhook 通知、health endpoint、外部 session 透過 IPC 連入。
64
+
65
+ 👥 **團隊與任務看板** — 用具名群組做定向廣播;共用的任務看板讓多個 instance 一起追蹤多步驟的工作。
66
+
67
+ 📋 **Fleet 範本** — 把常用的 fleet 設定存成範本,一個指令就能部署多個 instance,每個都有自己的 git worktree。
68
+
69
+ 😀 **貼圖與代表表情** — agent 可以在 Discord 和 Telegram 傳貼圖,每個 agent 也能挑一個代表自己的表情,同一個頻道裡有好幾個 bot 時一眼就分得出是誰。
70
+
71
+ 📊 **訂閱用量** — `/usage`(儀表板和 `get_usage` 工具也看得到)顯示 Claude、Codex、Kiro、Grok、Muse、Antigravity 訂閱還剩多少額度,每個訂閱各佔一列。
72
+
73
+ 🔑 **多組登入(credential profile)** — 用 `backend_options.<backend>.credential_profile`,讓 instance 或 ClassicBot 頻道改用同一個 backend 的第二個訂閱(目前支援 kiro-cli 和 Codex)。詳見[英文版設定參考](docs/configuration.md#credential-profiles-multiple-subscriptions-of-one-backend)。
74
+
75
+ 🌐 **用手機完成登入** — `/login`(僅限 fleet 管理員)不必 SSH 就能讓 CLI 登入:Codex、Grok 這類裝置碼登入會把網址和代碼貼在聊天室;需要終端機的登入,則會在主機上開一個有時限、要權杖才能進入的瀏覽器終端機。kiro-cli 和 Claude Code 在你確認後,還能透過 Cloudflare Quick Tunnel 開一個暫時的公開連結;主機上沒有 `cloudflared` 時,AgEnD 會自動下載。要關掉這個功能,設定 `web_terminal.tunnel.allow_public: false`。詳見 [Configuration](docs/configuration.zh-TW.md#人不在機器旁完成-login公開連結)。
76
+
77
+ 💤 **自動暫停與喚醒** — 設定 `auto_pause_after`(分鐘,預設關閉)後,閒置的 instance 會被暫停,有新訊息進來時自動喚醒。也可以用 `/pause`、`/wake` 手動操作。
78
+
79
+ 🧠 **記憶體壓力保護** — 在 Linux 上,fleet 會監看主機記憶體:吃緊時放慢新 CLI 的啟動,到了危險程度就先暫緩啟動,並發出通知。在 macOS 上只會記錄到日誌。
58
80
 
59
81
  ## 使用情境
60
82
 
@@ -85,7 +107,7 @@ agend fleet start # 3. 啟動 fleet 🎉
85
107
 
86
108
  打開 Telegram 或 Discord,傳訊息給你的 bot,就能用手機開始工作。
87
109
 
88
- > **用 Discord?** `agend quickstart` 也支援 Discord,已內建,不用另外安裝。詳見 [Discord 設定說明](docs/features.zh-TW.md#discord-轉接器-discord-adapter)。
110
+ > **用 Discord?** `agend quickstart` 也支援 Discord,已內建,不用另外安裝。詳見 [Discord 設定說明](docs/features.zh-TW.md#discord-adapter)。
89
111
 
90
112
  ## 運作原理
91
113
 
@@ -138,6 +160,13 @@ graph LR
138
160
 
139
161
  > **Codex:** 每個 instance 恢復的是記錄在自己工作目錄下的對話,同一個 git repo 的不同 worktree 上的 instance 不再互搶 session。詳見 [Codex session 恢復](docs/features.zh-TW.md#codex-session-恢復-codex-session-resume)。
140
162
 
163
+ > **WSL(Windows Subsystem for Linux):** 完整支援。安裝腳本會自動偵測 WSL,避免用到 PATH 裡 Windows 的 `node.exe`。如果遇到 PATH 問題,在 `/etc/wsl.conf` 加上:
164
+ > ```ini
165
+ > [interop]
166
+ > appendWindowsPath=false
167
+ > ```
168
+ > 然後重新啟動 WSL(`wsl --shutdown`)。安裝指令:`curl -fsSL https://songsid.github.io/AgEnD/install.sh | bash`
169
+
141
170
  ## 文件
142
171
 
143
172
  - [使用情境](docs/use-cases.zh-TW.md) — AgEnD 實際被拿來做什麼,附真實案例
@@ -165,19 +194,83 @@ quickstart 會同時設定好 `fleet.yaml` 和 `classicBot.yaml`。之後要新
165
194
 
166
195
  ### 用法
167
196
 
168
- | 指令 | 說明 |
169
- |---------|-------------|
170
- | `/start` | 在目前的頻道啟動 agent |
171
- | `/chat <訊息>` | 傳訊息給 agent |
172
- | `/stop` | 停止目前頻道的 agent |
197
+ | 指令 | 誰能用 | 說明 |
198
+ |---------|-----|-------------|
199
+ | `/start <backend>` | 見下方 | 在目前的頻道啟動 agent |
200
+ | `/chat <訊息>` | 任何人 | 傳訊息給 agent |
201
+ | `/steer`、`/btw`、`/cancel`、`/ctx` | 任何人 | 插入指示到目前的任務、問一個旁支問題、中斷、查看 context 用量 |
202
+ | `/pause`、`/wake`、`/compact`、`/clear`、`/model`、`/save` | 管理員 | 暫停或喚醒 agent、壓縮或清空 context、切換模型、儲存對話 |
203
+ | `/effort`、`/collab` | 管理員 | 僅限 Discord:推理強度、collab 模式 |
204
+ | `/stop`、`/load` | ClassicBot 管理員 | 停止目前頻道的 agent;載入已儲存的對話(`/load` 僅限 Discord) |
205
+
206
+ 在 Discord 上,「管理員」指 fleet 管理員或 ClassicBot 管理員(`admin_users`)。在 Telegram 上,`/pause`、`/wake`、`/compact`、`/save` 只限 ClassicBot 管理員。`/usage`、`/status` 這類全 fleet 的指令,在 Discord 的 ClassicBot 頻道裡也能用。誰能 `/start`:Discord 上是允許的伺服器裡的任何人;Telegram 上是私訊時列在 `allowed_users` 的使用者,或在允許的群組裡(`/start@你的bot`)的 ClassicBot 管理員。
207
+
208
+ 在 Discord 上,`/start` 會開啟 collab 模式:@ 這個 bot 就能跟它對話。實際用法請見[使用情境](docs/use-cases.zh-TW.md)。
209
+
210
+ ### 伺服器白名單
211
+
212
+ 用 `~/.agend/classicBot.yaml` 控制哪些 Discord 伺服器可以使用 ClassicBot:
213
+
214
+ ```yaml
215
+ defaults:
216
+ backend: claude-code
217
+ allowed_guilds: # 只有這些伺服器可以 /start
218
+ - "123456789012345678"
219
+ - "9876543210123456789"
220
+ ```
221
+
222
+ - `allowed_guilds` **留空或不寫** → 所有伺服器都允許(預設)
223
+ - **主要伺服器**(fleet.yaml 的 `group_id`)→ 完整權限(topic 模式 + ClassicBot)
224
+ - **白名單內的伺服器** → 只能用 ClassicBot 頻道
225
+ - **不在名單上的伺服器打 `/start`** → 會在 General topic 貼出一則附按鈕的核准請求
226
+ - **熱重載** — 每 30 秒偵測一次變更,不用重啟
227
+
228
+ ### 每個頻道指定 backend
229
+
230
+ 替特定頻道改用別的 backend:
231
+
232
+ ```yaml
233
+ defaults:
234
+ backend: claude-code
235
+ channels:
236
+ "1234567890": # Discord 頻道 ID
237
+ name: dev-help
238
+ backend: kiro-cli # 這個頻道改用 kiro-cli
239
+ ```
240
+
241
+ Backend 的決定順序:頻道 → `defaults.backend` → `fleet.yaml` 的 defaults → `claude-code`
242
+
243
+ ### 存取名單
244
+
245
+ ```yaml
246
+ defaults:
247
+ allowed_guilds: ["123456789012345678"] # Discord 伺服器(留空 = 全部允許)
248
+ allowed_groups: ["-1001234567890"] # Telegram 群組(留空 = 全部允許)
249
+ allowed_users: ["123456789"] # 可以在私訊裡 /start 的 Telegram 使用者(留空 = 全部允許)
250
+ admin_users: ["123456789"] # ClassicBot 管理員(留空 = 沒有人)
251
+ ```
252
+
253
+ ID 請加上引號:Discord 的 ID 太長,寫成 YAML 數字會失真。沒有設定 `admin_users` 時,沒有人能 `/stop` ClassicBot 的 agent,也沒有人能在 Telegram 群組裡啟動 agent。
254
+
255
+ ### 每個頻道用第二個訂閱
256
+
257
+ 跟 fleet 的 instance 一樣,頻道也能改用同一個 backend 的另一組登入:
258
+
259
+ ```yaml
260
+ channels:
261
+ "1234567890":
262
+ backend: kiro-cli
263
+ backend_options:
264
+ kiro-cli:
265
+ credential_profile: work # "" = 回到共用的登入
266
+ ```
173
267
 
174
- 在 Discord 上,`/start` 會開啟 collab 模式:@ 這個 bot 就能跟它對話。伺服器白名單、每個頻道指定不同 backend 的設定方式,請見[英文版 README](README.md#classicbot);實際用法請見[使用情境](docs/use-cases.zh-TW.md)。
268
+ 頻道的 `backend_options` 會覆蓋在 fleet.yaml defaults 的設定之上。目前 kiro-cli 和 Codex 支援 profile;profile 名稱不合法時,agent 會直接不啟動,而不是用錯的帳號跑;改了設定,執行中的 agent 會重啟。記得先讓這個 profile 登入,做法見[英文版設定參考](docs/configuration.md#credential-profiles-multiple-subscriptions-of-one-backend)。`classicBot.yaml` 的其他欄位請見 [Configuration](docs/configuration.zh-TW.md#classicbotyaml)。
175
269
 
176
270
  ## 已知限制
177
271
 
178
272
  - 支援 macOS(launchd)和 Linux(systemd);Windows 請在 WSL 裡執行([Windows 安裝指南](https://songsid.github.io/AgEnD/zh-tw/install-windows/)),不支援原生 Windows
179
273
  - 全域 `enabledPlugins` 裡有官方 Telegram plugin 會造成 409 polling 衝突
180
- - OpenCode 和 Kiro CLI 不讀取 MCP server 的 `instructions` 欄位 — fleet context 和 workflow template 不會注入到這些 backend 的 system prompt。等待上游修復。
181
274
 
182
275
  ## 授權
183
276
 
@@ -25,6 +25,8 @@ export interface AgentEndpointContext extends OutboundContext {
25
25
  readonly dataDir: string;
26
26
  /** Duplicate-reply suppression shared with the MCP path (see reply-dedup.ts). */
27
27
  readonly replyDeduper?: import("./reply-dedup.js").ReplyDeduper;
28
+ /** The MCP path's `reply.stickers` pre-check (#1226): a refused sticker is the reply's error, sent nothing. */
29
+ replyStickerProblem?(adapter: import("./channel/types.js").ChannelAdapter, args: Record<string, unknown>, threadId: string | undefined, worldId: string | undefined): Promise<string | null>;
28
30
  /** Mark an HTTP durable-operation result once its response is written. */
29
31
  markDurableResponseDelivered?(sourceInstance: string, operationId: string): void;
30
32
  handleScheduleCrudHttp(instance: string, op: string, args: Record<string, unknown>): Promise<unknown>;
@@ -3,6 +3,7 @@ import { join } from "node:path";
3
3
  import { randomUUID, timingSafeEqual } from "node:crypto";
4
4
  import { outboundHandlers } from "./outbound-handlers.js";
5
5
  import { routeToolCall } from "./channel/tool-router.js";
6
+ import { replyDedupText } from "./reply-dedup.js";
6
7
  import { EARLY_AGENT_OP_TOOLS, mayUseTool, resolveToolSet, toolRefusedMessage, } from "./tool-permissions.js";
7
8
  /** Read the last real channel target persisted by the instance daemon. */
8
9
  export function readPersistedReplyContext(dataDir, instance) {
@@ -247,7 +248,7 @@ export async function dispatchAgentOperation(ctx, instance, op, args) {
247
248
  // Channel tools (reply, react, edit, download)
248
249
  const channelTools = new Set(["reply", "react", "edit_message", "download_attachment"]);
249
250
  if (channelTools.has(tool)) {
250
- return new Promise((resolve) => {
251
+ return (async () => {
251
252
  const persisted = readPersistedReplyContext(ctx.dataDir, instance);
252
253
  const configuredThreadId = ctx.fleetConfig?.instances[instance]?.topic_id != null
253
254
  ? String(ctx.fleetConfig.instances[instance].topic_id)
@@ -259,40 +260,48 @@ export async function dispatchAgentOperation(ctx, instance, op, args) {
259
260
  const chatId = classicChannelId ?? persisted?.chatId ?? configuredChatId;
260
261
  const threadId = classicChannelId ? undefined : (persisted?.threadId ?? configuredThreadId);
261
262
  if (tool !== "download_attachment" && !chatId) {
262
- resolve({ error: "No active chat context — awaiting inbound message" });
263
- return;
263
+ return { error: "No active chat context — awaiting inbound message" };
264
264
  }
265
265
  const fullArgs = { ...args, chat_id: chatId, ...(threadId ? { thread_id: threadId } : {}) };
266
266
  const adapter = (persisted?.adapterId ? ctx.adapters?.get(persisted.adapterId) : undefined)
267
267
  ?? ctx.getAdapterForInstance?.(instance) ?? ctx.adapter;
268
- // Reply dedup, same ledger as the MCP path. The HTTP variant of the race:
269
- // the agent's shell tool kills a slow `agend-agent reply` (the adapter send
270
- // is waiting out a rate limit and will succeed), the agent re-runs it, and
271
- // the channel shows the reply twice.
272
- const ticket = tool === "reply"
273
- ? ctx.replyDeduper?.begin(instance, String(args.text ?? ""), Array.isArray(args.files) ? args.files : [])
274
- : undefined;
275
- if (ticket?.duplicate) {
276
- ticket.subscribe((result, error) => resolve(error ? { error } : result));
277
- return;
268
+ // The same pre-check as the MCP path, before anything is sent: a sticker this channel cannot send
269
+ // (another server's, an id that is not Telegram's) is the reply's error, not a reply without it.
270
+ if (tool === "reply" && ctx.replyStickerProblem) {
271
+ const problem = await ctx.replyStickerProblem(adapter, fullArgs, threadId, persisted?.adapterId);
272
+ if (problem)
273
+ return { error: problem };
278
274
  }
279
- const handled = routeToolCall(adapter, tool, fullArgs, threadId, (result, error) => {
280
- if (ticket && !ticket.duplicate)
281
- ticket.complete(result, error);
282
- // A successful reply retires the instance's cancel button — mirroring the
283
- // MCP path (handleOutboundFromInstance). HTTP agents (e.g. Antigravity,
284
- // which replies via POST /agent instead of an MCP tool call) never hit
285
- // that path, so without this their cancel button would never clear.
286
- if (!error && tool === "reply")
287
- ctx.clearCancelButton?.(instance);
288
- resolve(error ? { error } : result);
275
+ return new Promise((resolve) => {
276
+ // Reply dedup, same ledger as the MCP path. The HTTP variant of the race:
277
+ // the agent's shell tool kills a slow `agend-agent reply` (the adapter send
278
+ // is waiting out a rate limit and will succeed), the agent re-runs it, and
279
+ // the channel shows the reply twice.
280
+ const ticket = tool === "reply"
281
+ ? ctx.replyDeduper?.begin(instance, replyDedupText(args), Array.isArray(args.files) ? args.files : [])
282
+ : undefined;
283
+ if (ticket?.duplicate) {
284
+ ticket.subscribe((result, error) => resolve(error ? { error } : result));
285
+ return;
286
+ }
287
+ const handled = routeToolCall(adapter, tool, fullArgs, threadId, (result, error) => {
288
+ if (ticket && !ticket.duplicate)
289
+ ticket.complete(result, error);
290
+ // A successful reply retires the instance's cancel button — mirroring the
291
+ // MCP path (handleOutboundFromInstance). HTTP agents (e.g. Antigravity,
292
+ // which replies via POST /agent instead of an MCP tool call) never hit
293
+ // that path, so without this their cancel button would never clear.
294
+ if (!error && tool === "reply")
295
+ ctx.clearCancelButton?.(instance);
296
+ resolve(error ? { error } : result);
297
+ });
298
+ if (!handled) {
299
+ if (ticket && !ticket.duplicate)
300
+ ticket.complete(null, "unhandled");
301
+ resolve({ error: `Unhandled channel tool: ${tool}` });
302
+ }
289
303
  });
290
- if (!handled) {
291
- if (ticket && !ticket.duplicate)
292
- ticket.complete(null, "unhandled");
293
- resolve({ error: `Unhandled channel tool: ${tool}` });
294
- }
295
- });
304
+ })();
296
305
  }
297
306
  // Fleet tools (outbound handlers)
298
307
  const handler = outboundHandlers.get(tool);
@@ -1 +1 @@
1
- {"version":3,"file":"agent-endpoint.js","sourceRoot":"","sources":["../src/agent-endpoint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-endpoint.js","sourceRoot":"","sources":["../src/agent-endpoint.ts"],"names":[],"mappings":"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"}
@@ -98,6 +98,23 @@ export interface ClaudeDangerousCommandPromptState {
98
98
  export declare function claudeDangerousCommandPromptState(pane: string): ClaudeDangerousCommandPromptState;
99
99
  /** Native 2.1.287 four-choice Bash permission, observed but never approved. */
100
100
  export declare function claudeBashPermissionActive(pane: string): boolean;
101
+ /**
102
+ * #1217: Claude's answer to `/exit` while a background task runs (2.1.289,
103
+ * captured from a live pane):
104
+ *
105
+ * Background work is running
106
+ * The following will stop when you exit:
107
+ * shell · python3 - <<'EOF' p="src/…
108
+ * ❯ 1. Exit and stop tasks
109
+ * 2. Move to background and exit
110
+ * 3. Stay
111
+ * Enter to confirm · Esc to cancel
112
+ *
113
+ * Enter takes the selected option, so a stray Enter (a delivery's) exits and
114
+ * kills the tasks. Recognised only as a whole, at the bottom of the pane.
115
+ */
116
+ export declare const CLAUDE_BACKGROUND_WORK_EXIT: RegExp;
117
+ export declare function claudeBackgroundWorkExitActive(pane: string): boolean;
101
118
  /** This text is code-owned and intentionally never includes the command. */
102
119
  export declare const CLAUDE_DANGEROUS_COMMAND_BLOCKED_NOTICE = "[system:dangerous-command-blocked]\nThe previous command was classified as dangerous and was automatically denied. Do not retry it. Use a safe form instead (for example `${VAR:?}` validation, a literal path, or skip the destructive operation).";
103
120
  /** Startup budget for a resuming claude-code launch (fresh starts keep the default). */
@@ -197,6 +214,9 @@ export declare class ClaudeCodeBackend implements CliBackend {
197
214
  getCompactCommand(): string;
198
215
  getClearCommand(): string;
199
216
  getCancelKey(): string;
217
+ /** #1217: Claude's own words for a session that is not there to resume. */
218
+ resumeMissingPattern(): RegExp;
219
+ quitBlockedByDialog(pane: string): boolean;
200
220
  getEffortStrategy(): "runtime" | "restart" | "unsupported";
201
221
  getEffortLevels(): string[];
202
222
  getModelSwitchStrategy(): "runtime" | "restart";
@@ -381,30 +381,35 @@ const CLAUDE_RETRY_SUFFIX = `[ \\t]·[ \\t]Retrying in ${CLAUDE_RETRY_WAIT}[ \\t
381
381
  /** The spinner glyphs Claude Code cycles through (six measured frames). */
382
382
  const CLAUDE_SPINNER_GLYPH = "[✻✽✢·✶*]";
383
383
  /**
384
- * What makes a retry row LIVE rather than history or a quotation: it is the status
385
- * row of the composer at the BOTTOM of the pane, and that composer's footer shows
386
- * the running-turn hint. Asserted as a lookahead (the match stays the row):
384
+ * What makes a retry row LIVE rather than history or a quotation: it holds the
385
+ * spinner's slot, directly above the composer at the BOTTOM of the pane.
386
+ * Asserted as a lookahead (the match stays the row):
387
387
  *
388
- * - between the row and the composer's top separator only blank rows, `⎿` tip
389
- * rows, and Claude's own right-aligned hint rows — `tmux detected · …`, `tmux
388
+ * - between the row and the composer's top separator only blank rows, `⎿` rows
389
+ * (a tip or the todo list under the spinner, never `⎿ Interrupted`), and
390
+ * Claude's own right-aligned hint rows — `tmux detected · …`, `tmux
390
391
  * focus-events off · …`, `◐ medium · /effort` — which are matched by shape,
391
392
  * not by "indented text";
392
393
  * - then separator, `❯` row(s), separator;
393
- * - then a footer with no further separator that contains `esc to interrupt`
394
- * (shown while a turn runs: bypass, auto-mode and the other footers alike; an
395
- * idle footer reads `· ← for agents` without it) and runs to the end of the
396
- * pane.
394
+ * - then footer rows to the end of the pane, with no further separator.
397
395
  *
398
- * A retry row in a finished transcript is followed by more history and ends in
399
- * the current idle composer; one inside a quoted TUI is followed by the real
400
- * composer's own separators, which the footer cannot contain; either way the
401
- * lookahead fails. Only a quotation sitting directly above a composer whose
402
- * footer says `esc to interrupt` — a turn that really is running — is read as
403
- * live, and then the pane IS busy.
396
+ * The footer's text is NOT the signal (#1239). Without a statusLine a running
397
+ * turn's footer says `esc to interrupt`, but with one Claude Code leaves that
398
+ * hint out, and AgEnD always configures a statusLine (writeConfig): a running
399
+ * turn's footer and an idle one then read the same. The slot is what tells
400
+ * them apart. While a request runs the spinner, or the retry row in its place,
401
+ * sits right above the composer; once the turn ends that row is gone —
402
+ * replaced by the final `● API Error: …`, by the completed-turn row (`✻ Worked
403
+ * for 3m · done …`), or, on Esc, by `⎿ Interrupted`.
404
+ *
405
+ * A retry row in a finished transcript is followed by more history (at least
406
+ * that completed-turn row) before the composer; one inside a quoted TUI is
407
+ * followed by its own separators and composer and then the real composer's,
408
+ * which the footer cannot contain. Either way the lookahead fails.
404
409
  */
405
- const CLAUDE_LIVE_TAIL = "\\n(?:[ \\t]*\\n|[ \\t]*⎿[^\\n]*\\n|[ \\t]{10,}(?:tmux (?:detected|focus-events)[^\\n]*|\\S \\w+ · /effort)[ \\t]*\\n)*"
410
+ const CLAUDE_LIVE_TAIL = "\\n(?:[ \\t]*\\n|[ \\t]*⎿(?![ \\t\\u00a0]*Interrupted\\b)[^\\n]*\\n|[ \\t]{10,}(?:tmux (?:detected|focus-events)[^\\n]*|\\S \\w+ · /effort)[ \\t]*\\n)*"
406
411
  + "─{10,}[ \\t]*\\n[ \\t]*❯[^\\n]*\\n(?:(?!─{10,})[^\\n]*\\n)*─{10,}[ \\t]*\\n"
407
- + "(?:(?!─{10,})[^\\n]*\\n)*?[^\\n]*esc to interrupt[^\\n]*(?:\\n(?!─{10,})[^\\n]*)*(?![\\s\\S])";
412
+ + "(?:(?!─{10,})[^\\n]*\\n)*(?!─{10,})[^\\n]*(?![\\s\\S])";
408
413
  /** A LIVE retry row whose message starts with one of these HTTP statuses. */
409
414
  const claudeRetryRow = (statuses) => new RegExp(`^[ \\t]*${CLAUDE_SPINNER_GLYPH}[ \\t]+(${statuses})\\b[^\\n]*?[ \\t]·[ \\t]Retrying in ${CLAUDE_RETRY_WAIT}[ \\t]·[ \\t]attempt (\\d+)/(\\d+)[ \\t]*$(?=${CLAUDE_LIVE_TAIL})`, "im");
410
415
  /**
@@ -471,20 +476,56 @@ export function claudeBashPermissionActive(pane) {
471
476
  break;
472
477
  }
473
478
  }
474
- if (question < 0 || rows.length !== question + 6)
479
+ if (question < 0 || !/^[ \t]*Esc to cancel · Tab to amend[ \t]*$/.test(rows[rows.length - 1]))
475
480
  return false;
476
481
  const before = rows.slice(Math.max(0, question - 20), question);
477
482
  if (!before.some(row => /^[ \t]*Bash command[ \t]*$/.test(row)))
478
483
  return false;
479
- if (!/^[ \t]*[❯›]?[ \t]*1\.[ \t]+Yes[ \t]*$/.test(rows[question + 1]))
480
- return false;
481
- if (!/^[ \t]*[❯›]?[ \t]*2\.[ \t]+Yes, and always allow access to .+ from this project[ \t]*$/.test(rows[question + 2]))
482
- return false;
483
- if (!/^[ \t]*[❯›]?[ \t]*3\.[ \t]+Yes, and switch to auto mode · auto mode handles these prompts for you[ \t]*$/.test(rows[question + 3]))
484
+ // An option too long for the pane wraps onto indented rows below it (#1239):
485
+ // option 2 names the working directory, so a long path wraps it. A row that
486
+ // does not start a numbered option continues the one above.
487
+ const options = [];
488
+ for (const row of rows.slice(question + 1, rows.length - 1)) {
489
+ if (/^[ \t]*[❯›]?[ \t]*\d\.[ \t]/.test(row))
490
+ options.push(row.trimEnd());
491
+ else if (options.length)
492
+ options[options.length - 1] += ` ${row.trim()}`;
493
+ else
494
+ return false;
495
+ }
496
+ return options.length === 4
497
+ && /^[ \t]*[❯›]?[ \t]*1\.[ \t]+Yes$/.test(options[0])
498
+ && /^[ \t]*[❯›]?[ \t]*2\.[ \t]+Yes, and always allow access to .+ from this project$/.test(options[1])
499
+ && /^[ \t]*[❯›]?[ \t]*3\.[ \t]+Yes, and switch to auto mode · auto mode handles these prompts for you$/.test(options[2])
500
+ && /^[ \t]*[❯›]?[ \t]*4\.[ \t]+No$/.test(options[3]);
501
+ }
502
+ /**
503
+ * #1217: Claude's answer to `/exit` while a background task runs (2.1.289,
504
+ * captured from a live pane):
505
+ *
506
+ * Background work is running
507
+ * The following will stop when you exit:
508
+ * shell · python3 - <<'EOF' p="src/…
509
+ * ❯ 1. Exit and stop tasks
510
+ * 2. Move to background and exit
511
+ * 3. Stay
512
+ * Enter to confirm · Esc to cancel
513
+ *
514
+ * Enter takes the selected option, so a stray Enter (a delivery's) exits and
515
+ * kills the tasks. Recognised only as a whole, at the bottom of the pane.
516
+ */
517
+ export const CLAUDE_BACKGROUND_WORK_EXIT = /^[ \t]*Background work is running[ \t]*$/m;
518
+ export function claudeBackgroundWorkExitActive(pane) {
519
+ const rows = pane.replace(/\r/g, "").split("\n").filter(row => row.trim() !== "");
520
+ const footer = rows.length - 1;
521
+ if (footer < 4 || !/^[ \t]*Enter to confirm · Esc to cancel[ \t]*$/.test(rows[footer]))
484
522
  return false;
485
- if (!/^[ \t]*[❯›]?[ \t]*4\.[ \t]+No[ \t]*$/.test(rows[question + 4]))
523
+ const head = rows.slice(Math.max(0, footer - 12), footer).findIndex(row => CLAUDE_BACKGROUND_WORK_EXIT.test(row));
524
+ if (head < 0)
486
525
  return false;
487
- return /^[ \t]*Esc to cancel · Tab to amend[ \t]*$/.test(rows[question + 5]);
526
+ const block = rows.slice(Math.max(0, footer - 12), footer).slice(head).join("\n");
527
+ return /^[ \t]*[❯›]?[ \t]*1\.[ \t]+Exit and stop tasks[ \t]*$/m.test(block)
528
+ && /^[ \t]*[❯›]?[ \t]*3\.[ \t]+Stay[ \t]*$/m.test(block);
488
529
  }
489
530
  /** Private request text: excludes history, cursor motion, and native auto-deny countdown. */
490
531
  function claudeCommandRequestIdentity(pane) {
@@ -975,6 +1016,17 @@ export class ClaudeCodeBackend {
975
1016
  description: "Claude dangerous-command prompt (unknown cursor) — holding for a human, never auto-selecting",
976
1017
  autoResolutionKey: "claude-dangerous-command",
977
1018
  },
1019
+ {
1020
+ // #1217: never answered here. A delivery's Enter would pick "Exit and
1021
+ // stop tasks"; the stop flow answers it (Escape, then SIGTERM).
1022
+ pattern: CLAUDE_BACKGROUND_WORK_EXIT,
1023
+ isActive: claudeBackgroundWorkExitActive,
1024
+ keys: [],
1025
+ holdOnly: true,
1026
+ blocksDelivery: true,
1027
+ inputBlocked: true,
1028
+ description: "Claude \"Background work is running\" exit prompt — holding, never answering with Enter",
1029
+ },
978
1030
  {
979
1031
  pattern: CLAUDE_DANGEROUS_COMMAND_PROMPT,
980
1032
  isActive: claudeBashPermissionActive,
@@ -1010,6 +1062,13 @@ export class ClaudeCodeBackend {
1010
1062
  getCompactCommand() { return "/compact"; }
1011
1063
  getClearCommand() { return "/clear"; }
1012
1064
  getCancelKey() { return "Escape"; }
1065
+ /** #1217: Claude's own words for a session that is not there to resume. */
1066
+ resumeMissingPattern() {
1067
+ return /no conversation found|no conversation to (continue|resume)|no previous (session|conversation)/i;
1068
+ }
1069
+ quitBlockedByDialog(pane) {
1070
+ return claudeBackgroundWorkExitActive(pane);
1071
+ }
1013
1072
  // `claude --effort <level>` (low, medium, high, xhigh, max) and a `/effort`
1014
1073
  // slash command in the TUI — verified from `claude --help` on 2026-08-02.
1015
1074
  getEffortStrategy() { return EFFORT_CAPABILITIES["claude-code"].strategy; }