@songsid/agend 2.2.0-beta.1 → 2.2.0-beta.10

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 (377) hide show
  1. package/README.md +1 -1
  2. package/README.zh-TW.md +1 -1
  3. package/dist/agent-cli-instructions.md +16 -9
  4. package/dist/agent-cli.js +15 -7
  5. package/dist/agent-cli.js.map +1 -1
  6. package/dist/agent-endpoint.js +21 -9
  7. package/dist/agent-endpoint.js.map +1 -1
  8. package/dist/agent-whats-new.d.ts +47 -0
  9. package/dist/agent-whats-new.js +147 -0
  10. package/dist/agent-whats-new.js.map +1 -0
  11. package/dist/auth-api.d.ts +2 -2
  12. package/dist/auth-api.js +4 -2
  13. package/dist/auth-api.js.map +1 -1
  14. package/dist/backend/antigravity.d.ts +3 -0
  15. package/dist/backend/antigravity.js +9 -0
  16. package/dist/backend/antigravity.js.map +1 -1
  17. package/dist/backend/claude-carry.d.ts +22 -0
  18. package/dist/backend/claude-carry.js +170 -0
  19. package/dist/backend/claude-carry.js.map +1 -0
  20. package/dist/backend/claude-code.d.ts +65 -2
  21. package/dist/backend/claude-code.js +226 -33
  22. package/dist/backend/claude-code.js.map +1 -1
  23. package/dist/backend/codex-metadata.d.ts +33 -0
  24. package/dist/backend/codex-metadata.js +122 -18
  25. package/dist/backend/codex-metadata.js.map +1 -1
  26. package/dist/backend/codex.d.ts +3 -0
  27. package/dist/backend/codex.js +17 -1
  28. package/dist/backend/codex.js.map +1 -1
  29. package/dist/backend/credential-profile.d.ts +40 -3
  30. package/dist/backend/credential-profile.js +113 -5
  31. package/dist/backend/credential-profile.js.map +1 -1
  32. package/dist/backend/effort-metadata.d.ts +1 -1
  33. package/dist/backend/effort-metadata.js +3 -2
  34. package/dist/backend/effort-metadata.js.map +1 -1
  35. package/dist/backend/grok.d.ts +4 -0
  36. package/dist/backend/grok.js +14 -0
  37. package/dist/backend/grok.js.map +1 -1
  38. package/dist/backend/kiro-engine-ledger.d.ts +5 -0
  39. package/dist/backend/kiro-engine-ledger.js +20 -0
  40. package/dist/backend/kiro-engine-ledger.js.map +1 -1
  41. package/dist/backend/kiro-identity.d.ts +6 -0
  42. package/dist/backend/kiro-identity.js +19 -5
  43. package/dist/backend/kiro-identity.js.map +1 -1
  44. package/dist/backend/kiro.d.ts +39 -3
  45. package/dist/backend/kiro.js +143 -19
  46. package/dist/backend/kiro.js.map +1 -1
  47. package/dist/backend/launch-effort.d.ts +33 -0
  48. package/dist/backend/launch-effort.js +123 -0
  49. package/dist/backend/launch-effort.js.map +1 -0
  50. package/dist/backend/muse.d.ts +84 -0
  51. package/dist/backend/muse.js +449 -53
  52. package/dist/backend/muse.js.map +1 -1
  53. package/dist/backend/types.d.ts +33 -4
  54. package/dist/backend/types.js +2 -1
  55. package/dist/backend/types.js.map +1 -1
  56. package/dist/backend-command.d.ts +91 -0
  57. package/dist/backend-command.js +122 -0
  58. package/dist/backend-command.js.map +1 -0
  59. package/dist/background-work-ended.d.ts +18 -0
  60. package/dist/background-work-ended.js +30 -0
  61. package/dist/background-work-ended.js.map +1 -0
  62. package/dist/cache-service.d.ts +2 -0
  63. package/dist/cache-service.js +2 -1
  64. package/dist/cache-service.js.map +1 -1
  65. package/dist/channel/adapters/discord.d.ts +24 -1
  66. package/dist/channel/adapters/discord.js +87 -2
  67. package/dist/channel/adapters/discord.js.map +1 -1
  68. package/dist/channel/adapters/telegram.d.ts +24 -2
  69. package/dist/channel/adapters/telegram.js +118 -20
  70. package/dist/channel/adapters/telegram.js.map +1 -1
  71. package/dist/channel/mcp-server.js +9 -1
  72. package/dist/channel/mcp-server.js.map +1 -1
  73. package/dist/channel/mcp-tools.d.ts +11 -0
  74. package/dist/channel/mcp-tools.js +24 -13
  75. package/dist/channel/mcp-tools.js.map +1 -1
  76. package/dist/channel/message-edit-errors.d.ts +5 -0
  77. package/dist/channel/message-edit-errors.js +24 -0
  78. package/dist/channel/message-edit-errors.js.map +1 -0
  79. package/dist/channel/telegram-markdown.d.ts +6 -0
  80. package/dist/channel/telegram-markdown.js +104 -0
  81. package/dist/channel/telegram-markdown.js.map +1 -0
  82. package/dist/channel/tool-router.js +9 -3
  83. package/dist/channel/tool-router.js.map +1 -1
  84. package/dist/channel/types.d.ts +39 -3
  85. package/dist/cli.js +133 -28
  86. package/dist/cli.js.map +1 -1
  87. package/dist/command-table.d.ts +2 -2
  88. package/dist/command-table.js +6 -3
  89. package/dist/command-table.js.map +1 -1
  90. package/dist/config-validator.js +59 -0
  91. package/dist/config-validator.js.map +1 -1
  92. package/dist/cross-instance-envelope.d.ts +15 -2
  93. package/dist/cross-instance-envelope.js +29 -5
  94. package/dist/cross-instance-envelope.js.map +1 -1
  95. package/dist/daemon.d.ts +156 -1
  96. package/dist/daemon.js +764 -89
  97. package/dist/daemon.js.map +1 -1
  98. package/dist/delivery-outbox.d.ts +62 -7
  99. package/dist/delivery-outbox.js +309 -22
  100. package/dist/delivery-outbox.js.map +1 -1
  101. package/dist/delivery-reconciliation.d.ts +18 -1
  102. package/dist/delivery-reconciliation.js +67 -2
  103. package/dist/delivery-reconciliation.js.map +1 -1
  104. package/dist/fleet-context.d.ts +10 -1
  105. package/dist/fleet-manager.d.ts +345 -10
  106. package/dist/fleet-manager.js +1868 -174
  107. package/dist/fleet-manager.js.map +1 -1
  108. package/dist/general-knowledge/skills/backend-providers/SKILL.md +1 -1
  109. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +92 -21
  110. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +27 -3
  111. package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +8 -8
  112. package/dist/general-knowledge/skills/fleet-config/SKILL.md +5 -5
  113. package/dist/general-knowledge/skills/fleet-health/SKILL.md +4 -4
  114. package/dist/general-knowledge/skills/fleet-restart/SKILL.md +13 -13
  115. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -2
  116. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +6 -0
  117. package/dist/general-knowledge/skills/model-discovery/SKILL.md +9 -9
  118. package/dist/general-knowledge/skills/multi-channel/SKILL.md +8 -2
  119. package/dist/general-knowledge/skills/scheduling/SKILL.md +5 -3
  120. package/dist/general-knowledge/skills/session-management/SKILL.md +6 -5
  121. package/dist/general-knowledge/skills/tui-effort/SKILL.md +2 -2
  122. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +8 -3
  123. package/dist/general-knowledge/steering/core-rules.md +8 -7
  124. package/dist/host-memory.d.ts +10 -0
  125. package/dist/host-memory.js +33 -1
  126. package/dist/host-memory.js.map +1 -1
  127. package/dist/human-delivery-receipts.d.ts +83 -0
  128. package/dist/human-delivery-receipts.js +194 -0
  129. package/dist/human-delivery-receipts.js.map +1 -0
  130. package/dist/instance-avatar.d.ts +36 -0
  131. package/dist/instance-avatar.js +57 -0
  132. package/dist/instance-avatar.js.map +1 -0
  133. package/dist/instance-config-impact.js +6 -0
  134. package/dist/instance-config-impact.js.map +1 -1
  135. package/dist/instance-lifecycle.d.ts +29 -6
  136. package/dist/instance-lifecycle.js +79 -28
  137. package/dist/instance-lifecycle.js.map +1 -1
  138. package/dist/instructions.d.ts +3 -1
  139. package/dist/instructions.js +11 -8
  140. package/dist/instructions.js.map +1 -1
  141. package/dist/kiro-log-gate.d.ts +42 -0
  142. package/dist/kiro-log-gate.js +39 -0
  143. package/dist/kiro-log-gate.js.map +1 -0
  144. package/dist/locale.js +200 -44
  145. package/dist/locale.js.map +1 -1
  146. package/dist/log-service.d.ts +99 -0
  147. package/dist/log-service.js +243 -0
  148. package/dist/log-service.js.map +1 -0
  149. package/dist/log-steps.d.ts +169 -0
  150. package/dist/log-steps.js +858 -0
  151. package/dist/log-steps.js.map +1 -0
  152. package/dist/login-controller.d.ts +20 -3
  153. package/dist/login-controller.js +71 -19
  154. package/dist/login-controller.js.map +1 -1
  155. package/dist/login-flows.d.ts +5 -2
  156. package/dist/login-flows.js +5 -4
  157. package/dist/login-flows.js.map +1 -1
  158. package/dist/memory-pressure.d.ts +13 -1
  159. package/dist/memory-pressure.js +50 -10
  160. package/dist/memory-pressure.js.map +1 -1
  161. package/dist/needs-you-hub.js +2 -0
  162. package/dist/needs-you-hub.js.map +1 -1
  163. package/dist/needs-you-live.d.ts +6 -0
  164. package/dist/needs-you-live.js +23 -3
  165. package/dist/needs-you-live.js.map +1 -1
  166. package/dist/next-steps.js +1 -1
  167. package/dist/next-steps.js.map +1 -1
  168. package/dist/outbound-handlers.d.ts +100 -0
  169. package/dist/outbound-handlers.js +263 -96
  170. package/dist/outbound-handlers.js.map +1 -1
  171. package/dist/outbound-schemas.d.ts +26 -15
  172. package/dist/outbound-schemas.js +24 -7
  173. package/dist/outbound-schemas.js.map +1 -1
  174. package/dist/public-link-progress.d.ts +1 -1
  175. package/dist/public-link-progress.js +8 -2
  176. package/dist/public-link-progress.js.map +1 -1
  177. package/dist/public-preview.d.ts +101 -0
  178. package/dist/public-preview.js +236 -0
  179. package/dist/public-preview.js.map +1 -0
  180. package/dist/public-web-gateway.js +11 -4
  181. package/dist/public-web-gateway.js.map +1 -1
  182. package/dist/public-web-link.d.ts +24 -1
  183. package/dist/public-web-link.js +63 -9
  184. package/dist/public-web-link.js.map +1 -1
  185. package/dist/reply-buttons-controller.d.ts +3 -0
  186. package/dist/reply-buttons-controller.js +3 -2
  187. package/dist/reply-buttons-controller.js.map +1 -1
  188. package/dist/restart-guard.d.ts +6 -3
  189. package/dist/restart-guard.js +6 -3
  190. package/dist/restart-guard.js.map +1 -1
  191. package/dist/restart-progress.d.ts +33 -0
  192. package/dist/restart-progress.js +30 -0
  193. package/dist/restart-progress.js.map +1 -1
  194. package/dist/service-activation.d.ts +15 -7
  195. package/dist/service-activation.js +46 -29
  196. package/dist/service-activation.js.map +1 -1
  197. package/dist/service-installer.d.ts +31 -0
  198. package/dist/service-installer.js +41 -2
  199. package/dist/service-installer.js.map +1 -1
  200. package/dist/settings-api.js +85 -25
  201. package/dist/settings-api.js.map +1 -1
  202. package/dist/settings-change.js +72 -1
  203. package/dist/settings-change.js.map +1 -1
  204. package/dist/settings-effect.js +28 -4
  205. package/dist/settings-effect.js.map +1 -1
  206. package/dist/settings-http-confirmation.js +7 -0
  207. package/dist/settings-http-confirmation.js.map +1 -1
  208. package/dist/setup-form.d.ts +1 -1
  209. package/dist/setup-form.js +1 -1
  210. package/dist/spawn-gate.js +5 -1
  211. package/dist/spawn-gate.js.map +1 -1
  212. package/dist/spawn-hold-reply.d.ts +12 -0
  213. package/dist/spawn-hold-reply.js +39 -0
  214. package/dist/spawn-hold-reply.js.map +1 -0
  215. package/dist/status-emojis.d.ts +10 -3
  216. package/dist/status-emojis.js +11 -2
  217. package/dist/status-emojis.js.map +1 -1
  218. package/dist/systemd-peer-bus.d.ts +95 -0
  219. package/dist/systemd-peer-bus.js +430 -0
  220. package/dist/systemd-peer-bus.js.map +1 -0
  221. package/dist/systemd-runtime.d.ts +27 -1
  222. package/dist/systemd-runtime.js +69 -7
  223. package/dist/systemd-runtime.js.map +1 -1
  224. package/dist/tips.js +4 -4
  225. package/dist/tips.js.map +1 -1
  226. package/dist/tool-progress.js +3 -2
  227. package/dist/tool-progress.js.map +1 -1
  228. package/dist/topic-commands.d.ts +42 -2
  229. package/dist/topic-commands.js +92 -7
  230. package/dist/topic-commands.js.map +1 -1
  231. package/dist/transcript-delta-reader.d.ts +3 -3
  232. package/dist/transcript-delta-reader.js +8 -8
  233. package/dist/transcript-delta-reader.js.map +1 -1
  234. package/dist/transcript-jsonl.d.ts +80 -3
  235. package/dist/transcript-jsonl.js +147 -10
  236. package/dist/transcript-jsonl.js.map +1 -1
  237. package/dist/transcript-monitor.d.ts +19 -0
  238. package/dist/transcript-monitor.js +87 -15
  239. package/dist/transcript-monitor.js.map +1 -1
  240. package/dist/transcript-sources.d.ts +78 -0
  241. package/dist/transcript-sources.js +375 -64
  242. package/dist/transcript-sources.js.map +1 -1
  243. package/dist/transcript-turns.d.ts +15 -2
  244. package/dist/transcript-turns.js +15 -2
  245. package/dist/transcript-turns.js.map +1 -1
  246. package/dist/tunnel/cloudflared.d.ts +7 -15
  247. package/dist/tunnel/cloudflared.js +36 -1
  248. package/dist/tunnel/cloudflared.js.map +1 -1
  249. package/dist/tunnel/purpose-lane.d.ts +5 -1
  250. package/dist/tunnel/purpose-lane.js +14 -7
  251. package/dist/tunnel/purpose-lane.js.map +1 -1
  252. package/dist/tunnel/types.d.ts +5 -1
  253. package/dist/tunnel/types.js.map +1 -1
  254. package/dist/turn-resume.d.ts +2 -0
  255. package/dist/turn-resume.js +1 -1
  256. package/dist/turn-resume.js.map +1 -1
  257. package/dist/types.d.ts +25 -0
  258. package/dist/ui/chat-commands.js +1 -0
  259. package/dist/ui/chat-emojis.js +33 -0
  260. package/dist/ui/chat-mentions.js +63 -0
  261. package/dist/ui/chat-render.js +42 -2
  262. package/dist/ui/chat-store.js +2 -2
  263. package/dist/ui/chat-strings.js +38 -20
  264. package/dist/ui/chat-thread.js +69 -12
  265. package/dist/ui/chat-time.js +80 -0
  266. package/dist/ui/panel-chat.js +39 -10
  267. package/dist/ui/panel-details.js +2 -0
  268. package/dist/ui/panel-fleet.js +199 -57
  269. package/dist/ui/panel-log.js +428 -0
  270. package/dist/ui/panel-needs.js +6 -2
  271. package/dist/ui/panel-settings.js +137 -32
  272. package/dist/ui/preview-panel.js +55 -15
  273. package/dist/ui/preview-status.js +28 -0
  274. package/dist/ui/preview.js +44 -3
  275. package/dist/ui/settings-dialogs.js +7 -2
  276. package/dist/ui/settings-model.js +2 -1
  277. package/dist/ui/settings-strings.js +46 -4
  278. package/dist/ui/settings-token.js +1 -1
  279. package/dist/ui/shared/app-i18n.js +43 -17
  280. package/dist/ui/shared/app-prefs.js +250 -0
  281. package/dist/ui/shared/app-route.js +7 -2
  282. package/dist/ui/shared/app-shell.js +165 -8
  283. package/dist/ui/shared/app-store.js +5 -1
  284. package/dist/ui/shared/app-stream.js +23 -5
  285. package/dist/ui/shared/app.css +155 -22
  286. package/dist/ui/shared/app.js +11 -1
  287. package/dist/ui/shared/fonts/README.md +1 -1
  288. package/dist/ui/shared/header-tools.js +55 -5
  289. package/dist/ui/shared/instance-nav.js +241 -45
  290. package/dist/ui/shared/instance-switch.js +4 -4
  291. package/dist/ui/shared/panel-view.js +6 -0
  292. package/dist/ui/shared/signin.js +7 -7
  293. package/dist/ui/shared/theme.js +39 -7
  294. package/dist/ui/shared/tokens.css +1 -1
  295. package/dist/ui/shared/ui-icons.js +1 -0
  296. package/dist/ui/shared/usage-dialog.js +23 -5
  297. package/dist/ui/shared/view-strings.js +32 -4
  298. package/dist/ui/signin.html +1 -1
  299. package/dist/unrecognised-prompt.d.ts +23 -0
  300. package/dist/unrecognised-prompt.js +74 -0
  301. package/dist/unrecognised-prompt.js.map +1 -0
  302. package/dist/update-install.d.ts +28 -2
  303. package/dist/update-install.js +22 -4
  304. package/dist/update-install.js.map +1 -1
  305. package/dist/update-marker.d.ts +51 -0
  306. package/dist/update-marker.js +61 -0
  307. package/dist/update-marker.js.map +1 -1
  308. package/dist/update-preflight.d.ts +100 -0
  309. package/dist/update-preflight.js +264 -0
  310. package/dist/update-preflight.js.map +1 -0
  311. package/dist/updater-caller.d.ts +31 -0
  312. package/dist/updater-caller.js +109 -0
  313. package/dist/updater-caller.js.map +1 -0
  314. package/dist/usage/i18n-keys.d.ts +1 -1
  315. package/dist/usage/i18n-keys.js +1 -1
  316. package/dist/usage/i18n-keys.js.map +1 -1
  317. package/dist/usage/providers.d.ts +34 -5
  318. package/dist/usage/providers.js +160 -27
  319. package/dist/usage/providers.js.map +1 -1
  320. package/dist/usage/statusline-usage.d.ts +6 -2
  321. package/dist/usage/statusline-usage.js +10 -4
  322. package/dist/usage/statusline-usage.js.map +1 -1
  323. package/dist/view-api.d.ts +1 -1
  324. package/dist/view-api.js +38 -8
  325. package/dist/view-api.js.map +1 -1
  326. package/dist/wake-coordinator.d.ts +11 -0
  327. package/dist/wake-coordinator.js +38 -4
  328. package/dist/wake-coordinator.js.map +1 -1
  329. package/dist/web-api.d.ts +49 -2
  330. package/dist/web-api.js +421 -31
  331. package/dist/web-api.js.map +1 -1
  332. package/dist/web-auth.d.ts +2 -2
  333. package/dist/web-auth.js +9 -4
  334. package/dist/web-auth.js.map +1 -1
  335. package/dist/web-commands.d.ts +27 -4
  336. package/dist/web-commands.js +19 -4
  337. package/dist/web-commands.js.map +1 -1
  338. package/dist/web-host-guard.d.ts +3 -11
  339. package/dist/web-host-guard.js +3 -12
  340. package/dist/web-host-guard.js.map +1 -1
  341. package/dist/web-images.d.ts +47 -0
  342. package/dist/web-images.js +169 -0
  343. package/dist/web-images.js.map +1 -0
  344. package/dist/web-mentions.d.ts +44 -0
  345. package/dist/web-mentions.js +75 -0
  346. package/dist/web-mentions.js.map +1 -0
  347. package/dist/web-prefs.d.ts +63 -0
  348. package/dist/web-prefs.js +265 -0
  349. package/dist/web-prefs.js.map +1 -0
  350. package/dist/web-preview.d.ts +14 -1
  351. package/dist/web-preview.js +35 -13
  352. package/dist/web-preview.js.map +1 -1
  353. package/dist/web-reply-files.d.ts +45 -0
  354. package/dist/web-reply-files.js +223 -0
  355. package/dist/web-reply-files.js.map +1 -0
  356. package/dist/web-schedules.d.ts +12 -0
  357. package/dist/web-schedules.js +34 -0
  358. package/dist/web-schedules.js.map +1 -0
  359. package/dist/web-server-drain.d.ts +10 -0
  360. package/dist/web-server-drain.js +50 -0
  361. package/dist/web-server-drain.js.map +1 -0
  362. package/dist/web-session.d.ts +36 -1
  363. package/dist/web-session.js +53 -6
  364. package/dist/web-session.js.map +1 -1
  365. package/dist/web-settings-patch.d.ts +23 -0
  366. package/dist/web-settings-patch.js +77 -0
  367. package/dist/web-settings-patch.js.map +1 -0
  368. package/dist/web-shell-routes.d.ts +5 -1
  369. package/dist/web-shell-routes.js +10 -1
  370. package/dist/web-shell-routes.js.map +1 -1
  371. package/dist/web-upload.d.ts +17 -4
  372. package/dist/web-upload.js +64 -13
  373. package/dist/web-upload.js.map +1 -1
  374. package/dist/workflow-templates/default.md +1 -1
  375. package/package.json +1 -1
  376. package/templates/launchd.plist.ejs +3 -1
  377. package/templates/systemd.service.ejs +2 -1
@@ -0,0 +1,39 @@
1
+ /**
2
+ * #1218 PR4: whether the Log may read a kiro instance's own history, and if not, why (the leader's ruling, 2026-10-13;
3
+ * sol's design check on #849). Two proofs are needed, and both must be positive — an unknown is a no:
4
+ *
5
+ * 1. **The root.** The launch's store root is the one the reader would open. Per engine: a credential profile's launch
6
+ * sets `XDG_DATA_HOME` itself, which proves the classic (v1) store; the TUI (v2) store's `KIRO_HOME` is inherited from
7
+ * the tmux server's environment and set by no launch, so it is never proven here. Launches are not changed to prove
8
+ * it (a prefix would move an existing instance's store, account and conversation): that is a report-only
9
+ * root-consistency change of its own (#849).
10
+ * 2. **The current session.** `--resume-id` proves where a launch started, not where the instance is now: a `/clear` or
11
+ * `/chat load` typed in its terminal can move it unseen, and a sibling in the same directory writes rows that look the
12
+ * same. No seam observes that yet (#1789), so this proof is never positive today.
13
+ *
14
+ * Until both hold, a kiro Log shows fleet events only, with the reason. There is no "may not be current" fallback,
15
+ * and no newest-row-for-this-directory or cross-engine guess. Fresh and legacy launches own no conversation id; V3 is
16
+ * not read at all.
17
+ */
18
+ /** Today's proofs: none. */
19
+ export const KIRO_LOG_PROOFS_TODAY = {};
20
+ export function kiroLogGate(launch, proofs = KIRO_LOG_PROOFS_TODAY) {
21
+ if (!launch)
22
+ return { open: false, reason: "kiro_not_running" };
23
+ if (launch.engine === "v3")
24
+ return { open: false, reason: "kiro_v3" };
25
+ if (!launch.engine)
26
+ return { open: false, reason: "kiro_engine_unknown" };
27
+ if (launch.mode === "legacy")
28
+ return { open: false, reason: "kiro_legacy" };
29
+ if (launch.mode !== "resume")
30
+ return { open: false, reason: "kiro_fresh" };
31
+ if (launch.engine === "v2" && proofs.v2Root?.() !== true)
32
+ return { open: false, reason: "kiro_v2_root" };
33
+ if (launch.engine === "v1" && !launch.credentialProfile)
34
+ return { open: false, reason: "kiro_no_profile" };
35
+ if (proofs.currentSession?.() !== true)
36
+ return { open: false, reason: "kiro_session_unobservable" };
37
+ return { open: true, engine: launch.engine };
38
+ }
39
+ //# sourceMappingURL=kiro-log-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro-log-gate.js","sourceRoot":"","sources":["../src/kiro-log-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsBH,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAAkB,EAAE,CAAC;AAIvD,MAAM,UAAU,WAAW,CAAC,MAA4B,EAAE,SAAwB,qBAAqB;IACrG,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAC1E,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC5E,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACzG,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC3G,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACpG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC/C,CAAC"}
package/dist/locale.js CHANGED
@@ -13,13 +13,7 @@ export function detectLocale(fleetConfig) {
13
13
  return detectTimezone() === 8 ? "zh-TW" : "en";
14
14
  }
15
15
  const enMessages = {
16
- "memory.pressure": "⚠️ Host memory pressure: {0}, {1} swap free. {2} Existing agents keep running; check other memory-heavy host processes.",
17
- "memory.kernel_pressure": "⚠️ macOS kernel memory pressure level: {0}. Estimated available RAM: {1}; swap free: {2} (diagnostic only). {3} Existing agents keep running.",
18
- "memory.available": "{0} RAM available",
19
- "memory.free": "{0} RAM free (available RAM could not be measured)",
20
- "memory.holding": "New agent starts will wait for memory to recover.",
21
- "memory.slowing": "New agent starts are limited to one at a time, at least 5 seconds apart.",
22
- "memory.unknown": "unknown",
16
+ "memory.action_held": "⏳ Held: host memory is low. This action will continue when memory recovers; see the Fleet dashboard for status.",
23
17
  "cancel.button": "🛑 Cancel",
24
18
  "cancel.sent": "🛑 Sent cancel to {0}.",
25
19
  "cancel.not_running": "❌ {0} not running.",
@@ -59,6 +53,8 @@ const enMessages = {
59
53
  "classic.selection_expired": "⏰ Backend selection expired. Run /start again to choose.",
60
54
  "classic.backend_not_installed": "⚠️ {0} CLI (`{1}`) was not found in PATH.\nInstall: `{2}`\nStarting anyway…",
61
55
  "classic.stopped": "🛑 Agent stopped in this channel.",
56
+ "classic.stopped_bg_work": "⚠️ Background work was running and was ended with it.",
57
+ "stop.background_work_ended": "⚠️ {0} had background work running — it was ended with the stop.",
62
58
  "classic.no_agent_here": "No active agent in this channel.",
63
59
  "admin.only": "⛔ Only admins can do this.",
64
60
  "admin.required": "⛔ This command requires admin access.",
@@ -79,14 +75,14 @@ const enMessages = {
79
75
  "dashboard.public_close": "Close public link",
80
76
  "dashboard.public_close_confirm": "Close link (signs public browsers out)",
81
77
  "dashboard.public_close_keep": "Cancel",
82
- "dashboard.public_general": "Use /dashboard in this bot’s General as a fleet admin.",
78
+ "dashboard.public_general": "Use /web in this bot’s General as a fleet admin.",
83
79
  "dashboard.public_risk": "Public link: Cloudflare handles TLS. Signing in grants full web-admin access. Opens only when you choose it; expires automatically. Link and code go to you privately.",
84
80
  "dashboard.public_status": "Public link: {0} · {1}s remaining",
85
81
  "dashboard.public_until": " · until {0}",
86
82
  "dashboard.code_next": "📋 The code is also in the next message on its own — tap or long-press it to copy.",
87
83
  "dashboard.public_closed": "🔒 Public web access closed.",
88
84
  "dashboard.public_cleanup": "⚠️ Public web access is closed, but the tunnel process could not be confirmed stopped. Resolve its cleanup before opening another link.",
89
- "dashboard.private_link": "🔐 Web sign-in\n{0}\nCode: {1} (single use, {2} minutes)\nLink expires: {3}\nDo not forward. Use /dashboard revoke to sign out everyone and close the public link.",
85
+ "dashboard.private_link": "🔐 Web sign-in\n{0}\nCode: {1} (single use, {2} minutes)\nLink expires: {3}\nDo not forward. Use /web revoke to sign out everyone and close the public link.",
90
86
  "dashboard.private_sent": "🔐 Sign-in details sent privately.",
91
87
  "dashboard.private_sent_dm": "🔐 Sign-in details sent to you by DM.",
92
88
  "dashboard.progress.title": "🌐 Opening a temporary public link · {0} s",
@@ -110,6 +106,10 @@ const enMessages = {
110
106
  "dashboard.progress.fail.cancelled": "cancelled",
111
107
  "dashboard.progress.fail.spawn-failed": "cloudflared could not be started",
112
108
  "dashboard.progress.fail.no-address": "Cloudflare gave no public address in time",
109
+ "dashboard.progress.fail.rate-limited": "Cloudflare is limiting new temporary links from this machine — try again in a while; the LAN link still works",
110
+ "dashboard.progress.fail.provisioning-failed": "Cloudflare refused to create a temporary link right now — try again later; the LAN link still works",
111
+ "dashboard.progress.fail.process-exited": "cloudflared stopped before it gave a public address",
112
+ "dashboard.progress.fail.bad-address": "Cloudflare gave an address AgEnD could not use",
113
113
  "dashboard.progress.fail.unreachable": "the public address never reached this fleet",
114
114
  "dashboard.progress.fail.lease-held": "another tunnel is still running (a /login link, or one whose cleanup is unconfirmed)",
115
115
  "dashboard.progress.fail.gateway-failed": "the local gateway could not start",
@@ -118,18 +118,25 @@ const enMessages = {
118
118
  "dashboard.progress.fail.unknown": "it stopped unexpectedly",
119
119
  "dashboard.private_sent_here": "🔐 The bot could not DM you, so your sign-in details are posted here, visible only to you.",
120
120
  "dashboard.private_sending": "⏳ Sending your sign-in details privately…",
121
- "dashboard.menu_failed": "⚠️ The /dashboard menu could not be shown. Run /dashboard again.",
122
- "dashboard.private_failed": "Private delivery or link startup was not confirmed. On Telegram, /start this bot privately first, then retry /dashboard. No sign-in code is posted here.",
123
- "web.public_login_notice": "🔐 New web sign-in · public: {0} (session {1}). If this was not you, use /dashboard revoke.",
121
+ "dashboard.menu_failed": "⚠️ The /web menu could not be shown. Run /web again.",
122
+ "dashboard.private_failed": "Private delivery or link startup was not confirmed. On Telegram, /start this bot privately first, then retry /web. No sign-in code is posted here.",
123
+ "dashboard.start_web_label": "Start privately →",
124
+ "dashboard.menu_tg_hint": "No private chat with this bot yet? ① Open {0} ② press Start ③ choose the link there — the code arrives in that chat.",
125
+ "dashboard.private_failed_tg": "Couldn't send the sign-in code privately: this bot can't message you until you open a chat with it. ① Tap “Start privately →” below ② press Start in that chat ③ choose the link there — the code arrives in that chat. No sign-in code is posted here.",
126
+ "dashboard.private_failed_tg_nolink": "Couldn't send the sign-in code privately: this bot can't message you until you open a chat with it. ① Open a private chat with this bot ② send /start web ③ choose the link there — the code arrives in that chat. No sign-in code is posted here.",
127
+ "dashboard.private_sent_below": "🔐 Sign-in details are below.",
128
+ "dashboard.link_failed": "⚠️ The sign-in link could not be started, so no sign-in code was sent. Run /web again.",
129
+ "dashboard.start_web_ack": "✅ You can now use /web in your group.",
130
+ "web.public_login_notice": "🔐 New web sign-in · public: {0} (session {1}). If this was not you, use /web revoke.",
124
131
  "dashboard.title": "📊 AgEnD Dashboard",
125
132
  "dashboard.starting": "⏳ Dashboard starting, retry shortly.",
126
133
  "dashboard.signin": "• Sign in: {0}/signin",
127
134
  "dashboard.code": "• Code: {0} (works once, valid {1} min)",
128
- "dashboard.code_help": "Choose a sign-in option below. The bot sends your link and one-time code privately. Revoke every browser with /dashboard revoke.",
135
+ "dashboard.code_help": "Choose a sign-in option below. The bot sends your link and one-time code privately. Revoke every browser with /web revoke.",
129
136
  "dashboard.revoked": "🔒 Signed out {0} web session(s) and withdrew any unused code.",
130
- "dashboard.revoked_not_durable": "⚠️ Signed out {0} web session(s) for now, but the change could NOT be saved: ~/.agend/web-sessions.json could not be updated or removed, so a fleet restart may bring those sessions back. Fix that file's permissions and run /dashboard revoke again, or rotate the token with agend web-token rotate.",
131
- "web.login_notice": "🔐 New web sign-in: {0} ({1}, session {2}). If this was not you, send /dashboard revoke.",
132
- "web.resend_code": "🔐 Web sign-in code: {0} (single use, {1} minutes; any earlier code no longer works)\nRequested from the sign-in page by {2} ({3}). If this was not you, ignore it or send /dashboard revoke.",
137
+ "dashboard.revoked_not_durable": "⚠️ Signed out {0} web session(s) for now, but the change could NOT be saved: ~/.agend/web-sessions.json could not be updated or removed, so a fleet restart may bring those sessions back. Fix that file's permissions and run /web revoke again, or rotate the token with agend web-token rotate.",
138
+ "web.login_notice": "🔐 New web sign-in: {0} ({1}, session {2}). If this was not you, send /web revoke.",
139
+ "web.resend_code": "🔐 Web sign-in code: {0} (single use, {1} minutes; any earlier code no longer works)\nRequested from the sign-in page by {2} ({3}). If this was not you, ignore it or send /web revoke.",
133
140
  "web.resend_unknown_browser": "a browser",
134
141
  "web.resend_public": "public link",
135
142
  "web.resend_local": "local network",
@@ -161,7 +168,7 @@ const enMessages = {
161
168
  "needs.reason.crashed": "Crashed",
162
169
  "needs.reason.delivery_uncertain": "Could not confirm delivery",
163
170
  "needs.reason.delivery_failed": "Delivery failed",
164
- "upgrade.web_chat": "🆕 AgEnD 2.2: web chat\nYou can now talk to your agents from a browser. Each agent's web chat is the same conversation as its chat here: what you send from the web shows up here, and the agent's replies show up in both.\n• Attach files and images (📎, or paste or drop them in)\n• Stop a reply in progress, and see how far your message got\n• To open it, an admin sends /dashboard for the sign-in link and a one-time code\n📱 The dashboard runs on the fleet's own machine. To use it from a phone: {0}",
171
+ "upgrade.web_chat": "🆕 AgEnD 2.2: web chat\nYou can now talk to your agents from a browser. Each agent's web chat is the same conversation as its chat here: what you send from the web shows up here, and the agent's replies show up in both.\n• Attach files and images (📎, or paste or drop them in)\n• Stop a reply in progress, and see how far your message got\n• To open it, an admin sends /web for the sign-in link and a one-time code\n📱 The dashboard runs on the fleet's own machine. To use it from a phone: {0}",
165
172
  "dashboard.remote_hint": "📱 These links open on the fleet's own machine only. To use web chat from a phone or another computer: {0}",
166
173
  "fleet.ready": "Fleet ready. {0}/{1} instances running. v{2}",
167
174
  "fleet.ready_with_failed": "Fleet ready. {0}/{1} instances running. v{2} | Failed: {3}",
@@ -212,6 +219,9 @@ const enMessages = {
212
219
  "kiro.untagged_steering": "kiro: an AgEnD instructions file from before this version (.kiro/steering/agend-<instance>.md, without a fleet tag) is still in this directory. AgEnD cannot tell which fleet wrote it, so it keeps it; delete it by hand once every fleet using this directory has upgraded.",
213
220
  "kiro.no_instance_agent": "kiro-cli {0} has no `--agent` / `--resume-id` (needs {1} or newer), so this instance runs as before: kiro instances sharing its working directory can see each other's tools and conversations. Run `kiro-cli update` to isolate them.",
214
221
  "kiro.identity_legacy": "kiro: this launch runs as before and is NOT isolated from other kiro instances in the same directory ({0}). The next launch tries again.",
222
+ "kiro.upgrade_shared_directory": "kiro: started fresh because another configured kiro instance shares this directory. The pre-upgrade conversation was left untouched; AgEnD cannot safely assign it to either instance.",
223
+ "kiro.upgrade_claimed_conversation": "kiro: started fresh because the newest pre-upgrade conversation is already claimed by another instance or was given up. AgEnD left that conversation untouched.",
224
+ "kiro.upgrade_unknown_peers": "kiro: started fresh because AgEnD could not verify the other configured kiro instances. The pre-upgrade conversations were left untouched.",
215
225
  "kiro.switch_unrecorded": "kiro: the instance now runs as its own agent, but AgEnD could not record that; the next launch checks again and keeps the shared entries until it can.",
216
226
  "kiro.switch_timeout": "kiro: the resumed conversation did not switch to this instance's agent within {0}s. It keeps running as before, with its shared entries kept; the next launch tries again.",
217
227
  "kiro.version_untested": "kiro-cli {0} is newer than the newest version AgEnD has been run with ({1}). AgEnD read its launch flags from `kiro-cli chat --help`; if anything misbehaves, report the version.",
@@ -265,6 +275,9 @@ const enMessages = {
265
275
  "interaction.suspected": "The terminal may be waiting for input; seen {0}s ago. This is not confirmed.",
266
276
  "inst.interaction_parked": "⚠️ {0} is waiting for your input ({1}). Open its terminal and choose how to proceed. Queued messages and Cancel remain available.",
267
277
  "fleet.interaction_parked": "⚠️ {0} is waiting for input ({1}). Check its terminal; AgEnD will not choose an option for you.",
278
+ "inst.unrecognised_prompt": "⚠️ {0} is waiting on a prompt AgEnD doesn't recognise{1}. Open its terminal and answer it there: AgEnD won't press anything. Messages to it are held until the prompt is gone.",
279
+ "inst.unrecognised_prompt_question": " (“{0}”)",
280
+ "fleet.unrecognised_prompt": "⚠️ {0} is waiting on a prompt AgEnD doesn't recognise{1}. Check its terminal; queued messages are held meanwhile.",
268
281
  "interactive.kind.sudo_password": "sudo password",
269
282
  "interactive.kind.password": "password",
270
283
  "interactive.kind.confirmation": "Y/N confirmation",
@@ -361,8 +374,8 @@ const enMessages = {
361
374
  "slash.chat": "Send a message to the agent",
362
375
  "slash.ctx": "Show context usage",
363
376
  "slash.cancel": "Interrupt the agent's current operation (sends Escape)",
364
- "slash.dashboard": "Sign in to the web dashboard and web chat (admin only)",
365
- "slash.web": "Same as /dashboard: sign in to the web dashboard and web chat (admin only)",
377
+ "slash.dashboard": "Alias of /web: sign in to the web dashboard and web chat (admin only)",
378
+ "slash.web": "Sign in to the web dashboard and web chat (admin only)",
366
379
  "slash.compact": "Compact agent context window",
367
380
  "slash.compact_arg": "[optional summary focus — Claude Code only]",
368
381
  "slash.steer": "Interject into the agent's current task",
@@ -376,7 +389,12 @@ const enMessages = {
376
389
  "btw.sent": "💬 Side question sent to {0}.",
377
390
  "btw.not_connected": "❌ Instance not connected (IPC unavailable)",
378
391
  "btw.unsupported": "⚠️ /btw is not supported for the {0} backend (Claude Code only). The message was NOT sent.",
379
- "login.usage": "Usage: /login [backend] | /login cancel",
392
+ "login.usage": "Usage: /login [backend] [profile] | /login cancel",
393
+ "login.profile_label": "{0} profile `{1}`",
394
+ "login.profile_invalid": "`{0}` is not a credential profile name: letters, digits, '.', '_' or '-', starting with a letter or digit, up to 64 characters.",
395
+ "login.profile_host_only": "A {0} profile is signed in on the host for now — run this there:\n`{2}`\n(`/login {0} {1}` from chat is not available for {0} yet.)",
396
+ "login.profile_unsupported": "{0} has no credential profiles: use `/login {0}` for its login.",
397
+ "login.profile_needs_backend": "A profile needs its backend too: `/login backend:claude-code profile:<name>`.",
380
398
  "login.install_cli_moved": "ℹ️ `/install-cli` is now part of `/login`: `/login <backend>` installs a missing CLI, then signs in.",
381
399
  "login.install_by_name": "not installed, and not offered here — `/login {0}` installs it.",
382
400
  "login.choose_backend": "Which backend should sign in again?",
@@ -513,6 +531,7 @@ const enMessages = {
513
531
  "slash.login": "Sign in or install a CLI backend remotely (beta)",
514
532
  "slash.option.login_backend": "Backend to sign in",
515
533
  "slash.option.login_cancel": "Cancel the active login session",
534
+ "slash.option.login_profile": "Credential profile to sign in (claude-code), instead of the default login",
516
535
  "slash.option.restart_mode": "Optional full process reload",
517
536
  "slash.usage": "AI subscription usage",
518
537
  "slash.tips": "Show a useful AgEnD tip",
@@ -537,7 +556,7 @@ const enMessages = {
537
556
  "slash.option.load_filename": "File name to load",
538
557
  "chat.usage": "Usage: `/chat <message>`",
539
558
  "filename.invalid": "⛔ Invalid filename — only letters, numbers, dots, hyphens, underscores allowed.",
540
- "dashboard.disabled": "⛔ /dashboard disabled — no allowed_users configured",
559
+ "dashboard.disabled": "⛔ /web disabled — no allowed_users configured",
541
560
  "update.disabled": "⛔ /update disabled — no allowed_users configured",
542
561
  "doctor.running": "🩺 Running diagnostics...",
543
562
  "doctor.no_output": "No diagnostic output.",
@@ -690,6 +709,8 @@ const enMessages = {
690
709
  "usage.hint.grok_no_login": "auth.json has no usable login. Run `grok login`.",
691
710
  "usage.hint.login_kiro": "Log in with the Kiro CLI (`kiro-cli`).",
692
711
  "usage.hint.kiro_signed_out": "Signed out — run `kiro-cli` to log in.",
712
+ "usage.hint.claude_profile_signed_out": "Not logged in — sign in with: {0}",
713
+ "usage.hint.claude_profile_signed_out_chat": "Not logged in — sign in with `{0}` (or run `{1}` on the host).",
693
714
  "usage.hint.token_refreshing": "Token refreshing — try again in a moment.",
694
715
  "usage.hint.subscription_no_credit": "Subscription — no credit usage to report.",
695
716
  "usage.value.unlimited": "♾️ Unlimited",
@@ -743,6 +764,11 @@ const enMessages = {
743
764
  "model.invalid_chars": "❌ Model name must not contain newlines or control characters.",
744
765
  "model.persist_failed": "❌ Could not set model for {0}.",
745
766
  "model.runtime_success": "✅ Switched {0} to `{1}` (runtime).",
767
+ "model.switch_confirmed": "✅ Switched {0} to `{1}`. Claude asked to confirm because the conversation was cached for the previous model, so its next reply re-reads the full history (slower, more tokens).",
768
+ "model.switch_mismatch": "⚠️ {0}: not switched — Claude would switch to “{1}”, not `{2}`, so AgEnD answered No. The model is unchanged.",
769
+ "model.switch_unconfirmed": "⏳ {0}: asked for `/model {1}`, but no result came back within {2} s (it may still be queued behind other input). Check its terminal; messages to it are held while a model-switch confirmation is on screen.",
770
+ "model.unknown_name": "⚠️ Not switched: unknown model “{0}”. Known: {1} (or a claude-… model id). Nothing was sent.",
771
+ "model.switch_not_sent": "⚠️ {0}: `/model {1}` was not sent (cancelled, or the instance could not take it). Nothing changed.",
746
772
  "model.restart_success": "✅ Set {0} to `{1}` and restarted.",
747
773
  "effort.unsupported": "❌ {0} has no reasoning-effort setting.",
748
774
  "effort.usage": "Usage: /effort <{0}>",
@@ -759,6 +785,54 @@ const enMessages = {
759
785
  "effort.current_default": "Current effort: (CLI default)",
760
786
  "effort.current_fleet": "Current effort: {0} (fleet default)",
761
787
  "effort.current": "Current effort: {0}",
788
+ "backend.usage": "Usage: /backend [backend] [model] [effort] — e.g. /backend codex gpt-5.5 high. With nothing after it, a menu opens.",
789
+ "backend.menu": "Now: {0}\nSelect a backend (CLIs installed on this host):",
790
+ "backend.not_installed": "❌ `{0}` is not a backend installed on this host. Installed: {1}.",
791
+ "backend.same": "{0} already runs {1} — nothing changed. To change only its model or effort, use /model or /effort.",
792
+ "backend.default": "default",
793
+ "backend.default_inherited": "fleet default: {0}",
794
+ "backend.default_cli": "the CLI's default",
795
+ "backend.model_menu": "Model for {0}:",
796
+ "backend.model_menu_empty": "No model list is known for {0} yet, so only its default can be chosen:",
797
+ "backend.unknown_model": "❌ `{0}` is not a model {1} offers. Choose one of: {2}.",
798
+ "backend.effort_menu": "Effort for {0} · {1}:",
799
+ "backend.no_effort": "❌ {0} takes no effort at launch on this host: leave the effort out.",
800
+ "backend.unknown_effort": "❌ `{0}` is not an effort level of {1}. Choose one of: {2}.",
801
+ "backend.confirm_head": "Switch {0} from {1} to {2}?",
802
+ "backend.confirm_model": "• Model: {0}",
803
+ "backend.confirm_effort": "• Effort: {0}",
804
+ "backend.confirm_no_effort": "• Effort: none ({0} takes no effort at launch on this host)",
805
+ "backend.confirm_restart": "⚠️ {0} restarts.",
806
+ "backend.confirm_fresh": "⚠️ The conversation does not carry across backends: {0} starts a fresh session.",
807
+ "backend.confirm_busy": "⚠️ {0} is working on a turn right now — that turn is interrupted.",
808
+ "backend.confirm_turn": "If it is working on a turn then, that turn is interrupted.",
809
+ "backend.confirm_not_running": "{0} is {1}, so nothing restarts now: it starts on {2}, in a fresh session, the next time it starts.",
810
+ "backend.confirm_button": "✅ Switch and restart",
811
+ "backend.confirm_button_stopped": "✅ Switch",
812
+ "backend.cancel_button": "Cancel",
813
+ "backend.cancelled": "Cancelled — nothing changed.",
814
+ "backend.chosen": "/backend {0}",
815
+ "backend.switching": "⏳ Switching {0} to {1}…",
816
+ "backend.switched": "✅ {0} now runs {1} (model: {2}, effort: {3}). It restarted in a fresh session — the conversation did not carry over.",
817
+ "backend.switched_not_running": "✅ Saved: {0} runs {1} (model: {2}, effort: {3}) from its next start, in a fresh session. It is {4}, so nothing restarted.",
818
+ "backend.refused": "⚠️ {0} was not switched — nothing changed:\n{1}",
819
+ "backend.restart_failed": "⚠️ {0} is set to {1}, but the restart failed: {2}",
820
+ "backend.failed": "❌ Switching {0} to {1} failed: {2}",
821
+ "backend.changed": "⚠️ Nothing was changed: {0} is no longer on {1}. Open /backend again.",
822
+ "backend.selection_expired": "⏰ Backend selection expired.",
823
+ "backend.classic_unsupported": "/backend switches fleet instances (fleet.yaml). {0} is a ClassicBot agent: its backend is set in classicBot.yaml or in Settings.",
824
+ "slash.backend": "Switch CLI backend, then model and effort (admin only)",
825
+ "slash.option.backend_name": "Backend (a CLI installed on this host)",
826
+ "slash.option.backend_model": "Model, or default",
827
+ "slash.option.backend_effort": "Effort, or default",
828
+ "effort.launch_skipped": "effort \"{0}\" was not passed to {1} at launch: {2}. It runs on its own effort setting.",
829
+ "effort.launch_not_a_level": "it is not one of AgEnD's levels ({0})",
830
+ "effort.launch_no_help": "its --help could not be read, so the flag is not known to be there",
831
+ "effort.launch_no_flag": "this version's --help does not list {0}",
832
+ "effort.launch_no_levels": "this version's --help lists {0} without the levels it takes",
833
+ "effort.launch_level_not_offered": "it takes {0}",
834
+ "effort.launch_codex_unknown_model": "no catalog entry lists the levels of its model ({0})",
835
+ "effort.launch_codex_model_unproven": "which model it runs could not be proven (a project .codex/config.toml can set another, and none is given on the command line)",
762
836
  "status.no_config": "No fleet config loaded.",
763
837
  "status.no_instances": "No instances configured.",
764
838
  "status.title": "Fleet Status",
@@ -845,6 +919,8 @@ const enMessages = {
845
919
  "collab.off.classic": "💬 Collaboration mode OFF — use /chat to talk to the agent.",
846
920
  "delivery.fleet_uncertain": "⚠️ Delivery to {0} could not be confirmed. Do not resend until an operator checks what happened.\noperation_id={1}; target={0}; delivery_id={2}; state=uncertain",
847
921
  "delivery.fleet_failed": "❌ The message to {0} was not delivered after retries or the waiting period ended.\noperation_id={1}; target={0}; delivery_id={2}; state=failed",
922
+ "delivery.fleet_uncertain_silent_schedule": "⚠️ A silent schedule's paste into {0} could not be confirmed ({3}). It is not re-sent and not listed in Needs you; the next run goes ahead as usual.\noperation_id={1}; target={0}; delivery_id={2}; state=uncertain",
923
+ "delivery.fleet_failed_silent_schedule": "❌ A silent schedule's paste into {0} was not delivered ({3}). It is not listed in Needs you; the next run goes ahead as usual.\noperation_id={1}; target={0}; delivery_id={2}; state=failed",
848
924
  "delivery.expired": "{0} cross-instance message(s) reached the 24-hour waiting limit. Delivery is still unconfirmed for {1} of them; they may already have arrived, so do not resend those. Notices to the sending instances have been queued.",
849
925
  "delivery.lane_waiting": "⚠️ The message to {0} is still waiting after {1} minutes. We are waiting for its current process to report the result or be replaced before sending another message.\ndelivery_id={2}",
850
926
  "delivery.restart_blocked": "{0} is still stopped because we could not confirm that its previous CLI window closed. Check that window before restarting so a message is not sent twice.",
@@ -865,7 +941,9 @@ const enMessages = {
865
941
  "delivery.outcome_failed": "[system:delivery-outcome] The message to {0} was not delivered after retries or the waiting period ended. Report this to the operator.\n{1}\noperation_id={2}; delivery_id={3}; target={0}; state=failed",
866
942
  "delivery.post_restart": "[system:delivery-outcome] Your message to {0} was accepted before the restart. Do not resend this operation. Ask the operator to check delivery_status for its current status.\n{1}\noperation_id={2}; target={0}; current_state={3}",
867
943
  "delivery.reply_turn_ended": "[system:reply-pending] Your turn ended without answering {0}. Send your conclusion with report_result now; terminal text does not reach them.\ncorrelation_id={1}; asked={2}",
868
- "delivery.reply_restart": "[system:reply-pending] A restart interrupted your work for {0}. Resume it and answer with report_result; terminal text does not reach them.\ncorrelation_id={1}; asked={2}",
944
+ "delivery.reply_restart": "[system:reply-pending] A restart left these requests unanswered. Use report_result with each request's correlation_id; terminal text does not reach the requester. Check delivery_status for omitted requests or shortened IDs; do not resend the original requests.",
945
+ "delivery.reply_restart_more": "+{0} more requests (delivery_status)",
946
+ "delivery.reply_expired": "[system:reply-overdue] The reply requested from {0} has expired without an answer recorded. It will not be reminded again. Check with describe_instance or delivery_status; ask again if it is still needed.\ncorrelation_id={1}; asked={2}",
869
947
  "delivery.reply_overdue": "[system:reply-overdue] {0} has not replied and is not working on anything now. Check with describe_instance or delivery_status, or ask again.\ncorrelation_id={1}; asked={2}{3}",
870
948
  "delivery.reply_reminded": "; reminded={0}",
871
949
  "delivery.wake_auth": "⏸️ {0} is paused because its login failed. {1} message(s) are waiting. Fix the login, then use /wake.",
@@ -902,13 +980,7 @@ const enMessages = {
902
980
  "delivery.telegram_retry_failed": "Telegram could not complete the request after retrying.\nmethod={0}; details={1}",
903
981
  };
904
982
  const zhTWMessages = {
905
- "memory.pressure": "⚠️ 主機記憶體吃緊:{0},swap 剩餘 {1}。{2} 已在執行的 agent 會繼續工作;請檢查主機上其他大量使用記憶體的程式。",
906
- "memory.kernel_pressure": "⚠️ macOS 核心記憶體壓力等級:{0}。估計可用記憶體:{1};swap 剩餘:{2}(僅供診斷)。{3} 已在執行的 agent 會繼續工作。",
907
- "memory.available": "可用記憶體 {0}",
908
- "memory.free": "空閒記憶體 {0}(無法量到可用記憶體)",
909
- "memory.holding": "新的 agent 啟動會等待記憶體恢復。",
910
- "memory.slowing": "新的 agent 改為一次啟動一個,至少間隔 5 秒。",
911
- "memory.unknown": "未知",
983
+ "memory.action_held": "⏳ 已延後:主機記憶體吃緊。記憶體恢復後會繼續這次操作;目前狀態請看儀表板的 Fleet 頁面。",
912
984
  "cancel.button": "🛑 取消",
913
985
  "cancel.sent": "🛑 已送出取消給 {0}。",
914
986
  "cancel.not_running": "❌ {0} 未在執行。",
@@ -947,6 +1019,8 @@ const zhTWMessages = {
947
1019
  "classic.selection_expired": "⏰ 選擇逾時。請再次執行 /start。",
948
1020
  "classic.backend_not_installed": "⚠️ 找不到 {0} CLI(`{1}`)於 PATH。\n安裝:`{2}`\n仍會嘗試啟動…",
949
1021
  "classic.stopped": "🛑 已停止此頻道的 Agent。",
1022
+ "classic.stopped_bg_work": "⚠️ 背景工作仍在執行,已一併結束。",
1023
+ "stop.background_work_ended": "⚠️ {0} 仍有背景工作在執行,已隨停止一併結束。",
950
1024
  "classic.no_agent_here": "此頻道沒有活動中的 Agent。",
951
1025
  "admin.only": "⛔ 只有管理員能執行此操作。",
952
1026
  "admin.required": "⛔ 此指令需要管理員權限。",
@@ -967,14 +1041,14 @@ const zhTWMessages = {
967
1041
  "dashboard.public_close": "關閉公開連結",
968
1042
  "dashboard.public_close_confirm": "確定關閉(公開連結的登入都會登出)",
969
1043
  "dashboard.public_close_keep": "取消",
970
- "dashboard.public_general": "請由 fleet 管理員在這個 bot 的 General 使用 /dashboard。",
1044
+ "dashboard.public_general": "請由 fleet 管理員在這個 bot 的 General 使用 /web。",
971
1045
  "dashboard.public_risk": "公開連結:Cloudflare 終止 TLS,登入者具有完整網頁管理權限。只有選擇後才開啟,期限到會自動關閉。連結及登入碼只私送給你。",
972
1046
  "dashboard.public_status": "公開連結:{0} · 剩餘 {1} 秒",
973
1047
  "dashboard.public_until": " · 到 {0} 為止",
974
1048
  "dashboard.code_next": "📋 登入碼也單獨放在下一則訊息裡,點一下或長按就能複製。",
975
1049
  "dashboard.public_closed": "🔒 公開網頁入口已關閉。",
976
1050
  "dashboard.public_cleanup": "⚠️ 公開網頁入口已關閉,但無法確認 tunnel 行程已停止。請先處理清理問題,再開新連結。",
977
- "dashboard.private_link": "🔐 網頁登入\n{0}\n登入碼:{1}(只能用一次,{2} 分鐘內有效)\n連結期限:{3}\n不要轉傳。/dashboard revoke 會登出所有瀏覽器並關閉公開連結。",
1051
+ "dashboard.private_link": "🔐 網頁登入\n{0}\n登入碼:{1}(只能用一次,{2} 分鐘內有效)\n連結期限:{3}\n不要轉傳。/web revoke 會登出所有瀏覽器並關閉公開連結。",
978
1052
  "dashboard.private_sent": "🔐 登入資訊已私送。",
979
1053
  "dashboard.private_sent_dm": "🔐 登入資訊已私訊給你。",
980
1054
  "dashboard.progress.title": "🌐 正在開啟臨時公開連結 · {0} 秒",
@@ -998,6 +1072,10 @@ const zhTWMessages = {
998
1072
  "dashboard.progress.fail.cancelled": "已取消",
999
1073
  "dashboard.progress.fail.spawn-failed": "無法啟動 cloudflared",
1000
1074
  "dashboard.progress.fail.no-address": "Cloudflare 沒有及時給出公開網址",
1075
+ "dashboard.progress.fail.rate-limited": "Cloudflare 正在限制這台機器建立新的臨時連結 — 請過一陣子再試;區網連結仍可使用",
1076
+ "dashboard.progress.fail.provisioning-failed": "Cloudflare 目前拒絕建立臨時連結 — 請稍後再試;區網連結仍可使用",
1077
+ "dashboard.progress.fail.process-exited": "cloudflared 在給出公開網址前就停止了",
1078
+ "dashboard.progress.fail.bad-address": "Cloudflare 給出的網址 AgEnD 無法使用",
1001
1079
  "dashboard.progress.fail.unreachable": "公開網址一直連不到這個 fleet",
1002
1080
  "dashboard.progress.fail.lease-held": "還有另一個 tunnel 在執行(/login 的連結,或尚未確認清理的連結)",
1003
1081
  "dashboard.progress.fail.gateway-failed": "本機 gateway 無法啟動",
@@ -1006,18 +1084,25 @@ const zhTWMessages = {
1006
1084
  "dashboard.progress.fail.unknown": "意外中止",
1007
1085
  "dashboard.private_sent_here": "🔐 bot 無法私訊你,登入資訊改貼在這裡,只有你看得到。",
1008
1086
  "dashboard.private_sending": "⏳ 正在私送登入資訊…",
1009
- "dashboard.menu_failed": "⚠️ 無法顯示 /dashboard 選單,請再執行一次 /dashboard。",
1010
- "dashboard.private_failed": "無法確認私送或連結啟動。Telegram 請先私訊這個 bot 的 /start,再重試 /dashboard。此處不會貼出登入碼。",
1011
- "web.public_login_notice": "🔐 有新的網頁登入 · 公開入口:{0}(session {1})。如果不是你,請用 /dashboard revoke。",
1087
+ "dashboard.menu_failed": "⚠️ 無法顯示 /web 選單,請再執行一次 /web。",
1088
+ "dashboard.private_failed": "無法確認私送或連結啟動。Telegram 請先私訊這個 bot 的 /start,再重試 /web。此處不會貼出登入碼。",
1089
+ "dashboard.start_web_label": "先開私訊 →",
1090
+ "dashboard.menu_tg_hint": "還沒私訊過這個 bot?① 開啟 {0} ② 按「開始」 ③ 在那裡選擇連結,登入碼會送到那個私訊。",
1091
+ "dashboard.private_failed_tg": "無法私送登入碼:你還沒開啟和這個 bot 的私訊,它無法傳訊息給你。① 點下方「先開私訊 →」 ② 在私訊裡按「開始」 ③ 在那裡選擇連結,登入碼會送到那個私訊。此處不會貼出登入碼。",
1092
+ "dashboard.private_failed_tg_nolink": "無法私送登入碼:你還沒開啟和這個 bot 的私訊,它無法傳訊息給你。① 開啟和這個 bot 的私訊 ② 傳送 /start web ③ 在那裡選擇連結,登入碼會送到那個私訊。此處不會貼出登入碼。",
1093
+ "dashboard.private_sent_below": "🔐 登入資訊在下方。",
1094
+ "dashboard.link_failed": "⚠️ 無法啟動登入連結,所以沒有送出登入碼。請再執行一次 /web。",
1095
+ "dashboard.start_web_ack": "✅ 你現在可以在群組裡使用 /web 了。",
1096
+ "web.public_login_notice": "🔐 有新的網頁登入 · 公開入口:{0}(session {1})。如果不是你,請用 /web revoke。",
1012
1097
  "dashboard.title": "📊 AgEnD 儀表板",
1013
1098
  "dashboard.starting": "⏳ 儀表板啟動中,請稍後再試。",
1014
1099
  "dashboard.signin": "• 登入頁: {0}/signin",
1015
1100
  "dashboard.code": "• 登入碼: {0}(只能用一次,{1} 分鐘內有效)",
1016
- "dashboard.code_help": "選擇下方登入方式,bot 會私送連結與一次性登入碼。要讓所有瀏覽器登出,請傳 /dashboard revoke。",
1101
+ "dashboard.code_help": "選擇下方登入方式,bot 會私送連結與一次性登入碼。要讓所有瀏覽器登出,請傳 /web revoke。",
1017
1102
  "dashboard.revoked": "🔒 已登出 {0} 個網頁 session,並作廢尚未使用的登入碼。",
1018
- "dashboard.revoked_not_durable": "⚠️ 目前已登出 {0} 個網頁 session,但這個變更「無法保存」:~/.agend/web-sessions.json 無法更新也無法刪除,fleet 重啟後這些 session 可能會復活。請修正該檔權限後再執行一次 /dashboard revoke,或用 agend web-token rotate 換掉 token。",
1019
- "web.login_notice": "🔐 有新的網頁登入:{0}({1},session {2})。如果不是你,請傳 /dashboard revoke。",
1020
- "web.resend_code": "🔐 網頁登入碼:{0}(只能用一次,{1} 分鐘內有效;之前的登入碼已作廢)\n由登入頁面上的 {2}({3})要求。如果不是你,請忽略或傳 /dashboard revoke。",
1103
+ "dashboard.revoked_not_durable": "⚠️ 目前已登出 {0} 個網頁 session,但這個變更「無法保存」:~/.agend/web-sessions.json 無法更新也無法刪除,fleet 重啟後這些 session 可能會復活。請修正該檔權限後再執行一次 /web revoke,或用 agend web-token rotate 換掉 token。",
1104
+ "web.login_notice": "🔐 有新的網頁登入:{0}({1},session {2})。如果不是你,請傳 /web revoke。",
1105
+ "web.resend_code": "🔐 網頁登入碼:{0}(只能用一次,{1} 分鐘內有效;之前的登入碼已作廢)\n由登入頁面上的 {2}({3})要求。如果不是你,請忽略或傳 /web revoke。",
1021
1106
  "web.resend_unknown_browser": "某個瀏覽器",
1022
1107
  "web.resend_public": "公開連結",
1023
1108
  "web.resend_local": "本機網路",
@@ -1049,7 +1134,7 @@ const zhTWMessages = {
1049
1134
  "needs.reason.crashed": "已崩潰",
1050
1135
  "needs.reason.delivery_uncertain": "無法確認是否送達",
1051
1136
  "needs.reason.delivery_failed": "傳送失敗",
1052
- "upgrade.web_chat": "🆕 AgEnD 2.2:網頁聊天\n現在可以在瀏覽器裡跟 Agent 對話。每個 Agent 的網頁聊天,就是它在這裡的同一段對話:從網頁送出的訊息會出現在這裡,Agent 的回覆兩邊都看得到。\n• 可以附上檔案和圖片(按 📎,或直接貼上、拖進來)\n• 可以中止正在進行的回覆,也看得到訊息送到哪一步\n• 怎麼開:由管理員傳 /dashboard,取得登入連結和一次性登入碼\n📱 儀表板跑在 Fleet 所在的那台電腦上。要用手機開:{0}",
1137
+ "upgrade.web_chat": "🆕 AgEnD 2.2:網頁聊天\n現在可以在瀏覽器裡跟 Agent 對話。每個 Agent 的網頁聊天,就是它在這裡的同一段對話:從網頁送出的訊息會出現在這裡,Agent 的回覆兩邊都看得到。\n• 可以附上檔案和圖片(按 📎,或直接貼上、拖進來)\n• 可以中止正在進行的回覆,也看得到訊息送到哪一步\n• 怎麼開:由管理員傳 /web,取得登入連結和一次性登入碼\n📱 儀表板跑在 Fleet 所在的那台電腦上。要用手機開:{0}",
1053
1138
  "dashboard.remote_hint": "📱 這些連結只能在 Fleet 所在的那台電腦上開。要用手機或其他電腦開網頁聊天:{0}",
1054
1139
  "fleet.ready": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2}",
1055
1140
  "fleet.ready_with_failed": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2} | 失敗:{3}",
@@ -1100,6 +1185,9 @@ const zhTWMessages = {
1100
1185
  "kiro.untagged_steering": "kiro:這個目錄還留有舊版 AgEnD 的指示檔(.kiro/steering/agend-<instance>.md,沒有 fleet 標記)。AgEnD 無法判斷是哪個 fleet 寫的,所以保留它;等所有使用這個目錄的 fleet 都升級後,請手動刪除。",
1101
1186
  "kiro.no_instance_agent": "kiro-cli {0} 沒有 `--agent` / `--resume-id`(需要 {1} 以上),所以這個 instance 照舊執行:同一個工作目錄裡的 kiro instance 會看到彼此的工具和對話。執行 `kiro-cli update` 即可讓它們隔離。",
1102
1187
  "kiro.identity_legacy": "kiro:這次啟動照舊執行,與同目錄的其他 kiro instance「沒有」隔離({0})。下次啟動會再試。",
1188
+ "kiro.upgrade_shared_directory": "kiro:另一個已設定的 kiro instance 共用這個目錄,因此本次開新對話。升級前的對話保持原樣;AgEnD 無法安全判定它屬於哪個 instance。",
1189
+ "kiro.upgrade_claimed_conversation": "kiro:升級前最新的對話已被其他 instance 認領,或已被放棄,因此本次開新對話。AgEnD 沒有修改該對話。",
1190
+ "kiro.upgrade_unknown_peers": "kiro:AgEnD 無法確認其他已設定的 kiro instance,因此本次開新對話。升級前的對話保持原樣。",
1103
1191
  "kiro.switch_unrecorded": "kiro:instance 已經切換成自己的 agent,但 AgEnD 無法記錄這件事;下次啟動會再檢查,在記錄成功前保留共用設定。",
1104
1192
  "kiro.switch_timeout": "kiro:恢復的對話沒有在 {0} 秒內切換成這個 instance 的 agent。它會照舊繼續執行並保留共用設定;下次啟動會再試。",
1105
1193
  "kiro.version_untested": "kiro-cli {0} 比 AgEnD 實際跑過的最新版本({1})還新。啟動參數是依照 `kiro-cli chat --help` 判斷的;若有異常,請回報這個版本。",
@@ -1153,6 +1241,9 @@ const zhTWMessages = {
1153
1241
  "interaction.suspected": "終端可能在等輸入;{0} 秒前看到,尚未確認。",
1154
1242
  "inst.interaction_parked": "⚠️ {0} 正在等你輸入({1})。請打開它的終端,確認要如何繼續;排隊訊息與取消仍保留。",
1155
1243
  "fleet.interaction_parked": "⚠️ {0} 正在等輸入({1})。請查看它的終端,AgEnD 不會替你選選項。",
1244
+ "inst.unrecognised_prompt": "⚠️ {0} 停在一個 AgEnD 不認得的提示上{1}。請打開它的終端在那裡回答,AgEnD 不會替你按任何鍵。提示消失前,送給它的訊息會先保留。",
1245
+ "inst.unrecognised_prompt_question": "(「{0}」)",
1246
+ "fleet.unrecognised_prompt": "⚠️ {0} 停在一個 AgEnD 不認得的提示上{1}。請查看它的終端;期間排隊訊息會保留。",
1156
1247
  "interactive.kind.sudo_password": "sudo 密碼",
1157
1248
  "interactive.kind.password": "密碼",
1158
1249
  "interactive.kind.confirmation": "Y/N 確認",
@@ -1249,8 +1340,8 @@ const zhTWMessages = {
1249
1340
  "slash.chat": "傳送訊息給 Agent",
1250
1341
  "slash.ctx": "顯示 Context 使用量",
1251
1342
  "slash.cancel": "中斷 Agent 目前的動作(送出 Escape)",
1252
- "slash.dashboard": "登入網頁儀表板與網頁聊天(管理員)",
1253
- "slash.web": "同 /dashboard:登入網頁儀表板與網頁聊天(管理員)",
1343
+ "slash.dashboard": "/web 的別名:登入網頁儀表板與網頁聊天(管理員)",
1344
+ "slash.web": "登入網頁儀表板與網頁聊天(管理員)",
1254
1345
  "slash.compact": "壓縮 Agent 的 Context",
1255
1346
  "slash.compact_arg": "[選填:摘要重點,僅 Claude Code]",
1256
1347
  "slash.steer": "插入指示到 Agent 當前任務",
@@ -1264,7 +1355,12 @@ const zhTWMessages = {
1264
1355
  "btw.sent": "💬 已將旁支問題送給 {0}。",
1265
1356
  "btw.not_connected": "❌ instance 未連線(IPC 不可用)",
1266
1357
  "btw.unsupported": "⚠️ {0} Backend 不支援 /btw(僅 Claude Code 支援)。訊息未送出。",
1267
- "login.usage": "用法:/login [backend] | /login cancel",
1358
+ "login.usage": "用法:/login [backend] [profile] | /login cancel",
1359
+ "login.profile_label": "{0} 的 profile `{1}`",
1360
+ "login.profile_invalid": "`{0}` 不是有效的 credential profile 名稱:只能用英數字、'.'、'_' 或 '-',以英數字開頭,最多 64 個字元。",
1361
+ "login.profile_host_only": "{0} 的 profile 目前要在主機上登入,請在主機執行:\n`{2}`\n({0} 暫時還不能從聊天室用 `/login {0} {1}` 登入。)",
1362
+ "login.profile_unsupported": "{0} 沒有 credential profile:請用 `/login {0}` 登入它的帳號。",
1363
+ "login.profile_needs_backend": "指定 profile 時也要指定 backend:`/login backend:claude-code profile:<名稱>`。",
1268
1364
  "login.install_cli_moved": "ℹ️ `/install-cli` 已併入 `/login`:`/login <backend>` 會先安裝缺少的 CLI,再接著登入。",
1269
1365
  "login.install_by_name": "尚未安裝,選單也不提供——`/login {0}` 可以安裝它。",
1270
1366
  "login.choose_backend": "要重新登入哪個 Backend?",
@@ -1401,6 +1497,7 @@ const zhTWMessages = {
1401
1497
  "slash.login": "遠端登入或安裝 CLI Backend(Beta)",
1402
1498
  "slash.option.login_backend": "要登入的 Backend",
1403
1499
  "slash.option.login_cancel": "取消進行中的登入流程",
1500
+ "slash.option.login_profile": "要登入的 credential profile(claude-code),而不是預設登入",
1404
1501
  "slash.option.restart_mode": "選填:完整重載程序",
1405
1502
  "slash.usage": "AI 訂閱用量",
1406
1503
  "slash.tips": "顯示一則 AgEnD 使用提示",
@@ -1425,7 +1522,7 @@ const zhTWMessages = {
1425
1522
  "slash.option.load_filename": "要載入的檔名",
1426
1523
  "chat.usage": "用法:`/chat <訊息>`",
1427
1524
  "filename.invalid": "⛔ 檔名無效 — 只允許字母、數字、點、連字號、底線。",
1428
- "dashboard.disabled": "⛔ /dashboard 已停用 — 未設定 allowed_users",
1525
+ "dashboard.disabled": "⛔ /web 已停用 — 未設定 allowed_users",
1429
1526
  "update.disabled": "⛔ /update 已停用 — 未設定 allowed_users",
1430
1527
  "doctor.running": "🩺 執行診斷中...",
1431
1528
  "doctor.no_output": "診斷沒有輸出。",
@@ -1578,6 +1675,8 @@ const zhTWMessages = {
1578
1675
  "usage.hint.grok_no_login": "auth.json 沒有可用的登入資料。請執行 `grok login`。",
1579
1676
  "usage.hint.login_kiro": "請使用 Kiro CLI(`kiro-cli`)登入。",
1580
1677
  "usage.hint.kiro_signed_out": "目前已登出;請執行 `kiro-cli` 登入。",
1678
+ "usage.hint.claude_profile_signed_out": "尚未登入;請用這行指令登入:{0}",
1679
+ "usage.hint.claude_profile_signed_out_chat": "尚未登入;請用 `{0}` 登入(或在主機上執行 `{1}`)。",
1581
1680
  "usage.hint.token_refreshing": "Token 更新中 — 請稍候再試。",
1582
1681
  "usage.hint.subscription_no_credit": "訂閱方案沒有可回報的額度用量。",
1583
1682
  "usage.value.unlimited": "♾️ 無限",
@@ -1631,6 +1730,11 @@ const zhTWMessages = {
1631
1730
  "model.invalid_chars": "❌ 模型名稱不得包含換行或控制字元。",
1632
1731
  "model.persist_failed": "❌ 無法設定 {0} 的模型。",
1633
1732
  "model.runtime_success": "✅ 已即時將 {0} 切換到 `{1}`。",
1733
+ "model.switch_confirmed": "✅ 已將 {0} 切換到 `{1}`。因為對話是用先前的 Model 快取的,Claude 要求確認;它的下一則回覆會重新讀取完整對話紀錄(較慢、用較多 token)。",
1734
+ "model.switch_mismatch": "⚠️ {0}:沒有切換。Claude 會切到「{1}」而不是 `{2}`,所以 AgEnD 回答了「否」。Model 維持不變。",
1735
+ "model.switch_unconfirmed": "⏳ {0}:已要求 `/model {1}`,但 {2} 秒內沒有收到結果(可能還排在其他輸入後面)。請查看它的終端;Model 切換確認畫面還在時,送給它的訊息會先保留。",
1736
+ "model.unknown_name": "⚠️ 沒有切換:不認得的 Model「{0}」。已知的有:{1}(或 claude-… 形式的 Model id)。沒有送出任何指令。",
1737
+ "model.switch_not_sent": "⚠️ {0}:`/model {1}` 沒有送出(已取消,或 instance 無法接收)。沒有任何變更。",
1634
1738
  "model.restart_success": "✅ 已將 {0} 設為 `{1}` 並重啟。",
1635
1739
  "effort.unsupported": "❌ {0} 沒有推理強度設定。",
1636
1740
  "effort.usage": "用法:/effort <{0}>",
@@ -1647,6 +1751,54 @@ const zhTWMessages = {
1647
1751
  "effort.current_default": "目前推理強度:(CLI 預設)",
1648
1752
  "effort.current_fleet": "目前推理強度:{0}(Fleet 預設)",
1649
1753
  "effort.current": "目前推理強度:{0}",
1754
+ "backend.usage": "用法:/backend [backend] [模型] [推理強度] — 例如 /backend codex gpt-5.5 high。不加參數會開啟選單。",
1755
+ "backend.menu": "目前:{0}\n請選擇 backend(這台主機已安裝的 CLI):",
1756
+ "backend.not_installed": "❌ `{0}` 不是這台主機已安裝的 backend。已安裝:{1}。",
1757
+ "backend.same": "{0} 已經在用 {1} — 沒有變更。只要換模型或推理強度,請用 /model 或 /effort。",
1758
+ "backend.default": "預設",
1759
+ "backend.default_inherited": "fleet 預設:{0}",
1760
+ "backend.default_cli": "CLI 的預設",
1761
+ "backend.model_menu": "{0} 的模型:",
1762
+ "backend.model_menu_empty": "目前還沒有 {0} 的模型清單,只能選它的預設:",
1763
+ "backend.unknown_model": "❌ `{0}` 不是 {1} 提供的模型。請從這些選:{2}。",
1764
+ "backend.effort_menu": "{0} · {1} 的推理強度:",
1765
+ "backend.no_effort": "❌ 在這台主機上,{0} 啟動時不接受推理強度:請不要指定推理強度。",
1766
+ "backend.unknown_effort": "❌ `{0}` 不是 {1} 的推理強度。請從這些選:{2}。",
1767
+ "backend.confirm_head": "要把 {0} 從 {1} 切換到 {2} 嗎?",
1768
+ "backend.confirm_model": "• 模型:{0}",
1769
+ "backend.confirm_effort": "• 推理強度:{0}",
1770
+ "backend.confirm_no_effort": "• 推理強度:無(在這台主機上,{0} 啟動時不接受推理強度)",
1771
+ "backend.confirm_restart": "⚠️ {0} 會重新啟動。",
1772
+ "backend.confirm_fresh": "⚠️ 對話不會跨 backend 延續:{0} 會開一個全新的 session。",
1773
+ "backend.confirm_busy": "⚠️ {0} 現在正在處理一輪對話 — 這一輪會被中斷。",
1774
+ "backend.confirm_turn": "如果那時它正在處理一輪對話,這一輪會被中斷。",
1775
+ "backend.confirm_not_running": "{0} 目前是 {1},所以現在不會重新啟動:下次啟動時會用 {2},並開全新的 session。",
1776
+ "backend.confirm_button": "✅ 切換並重新啟動",
1777
+ "backend.confirm_button_stopped": "✅ 切換",
1778
+ "backend.cancel_button": "取消",
1779
+ "backend.cancelled": "已取消 — 沒有變更。",
1780
+ "backend.chosen": "/backend {0}",
1781
+ "backend.switching": "⏳ 正在把 {0} 切換到 {1}…",
1782
+ "backend.switched": "✅ {0} 現在使用 {1}(模型:{2},推理強度:{3})。已用全新的 session 重新啟動 — 對話沒有延續過來。",
1783
+ "backend.switched_not_running": "✅ 已儲存:{0} 下次啟動時使用 {1}(模型:{2},推理強度:{3}),並開全新的 session。它目前是 {4},所以沒有重新啟動。",
1784
+ "backend.refused": "⚠️ {0} 沒有切換 — 沒有任何變更:\n{1}",
1785
+ "backend.restart_failed": "⚠️ {0} 已設定為 {1},但重新啟動失敗:{2}",
1786
+ "backend.failed": "❌ 把 {0} 切換到 {1} 失敗:{2}",
1787
+ "backend.changed": "⚠️ 沒有變更:{0} 已經不在 {1} 上了。請重新開啟 /backend。",
1788
+ "backend.selection_expired": "⏰ Backend 選擇已逾時。",
1789
+ "backend.classic_unsupported": "/backend 用來切換 fleet instance(fleet.yaml)。{0} 是 ClassicBot agent:它的 backend 在 classicBot.yaml 或設定頁裡設定。",
1790
+ "slash.backend": "切換 CLI backend,再選模型和推理強度(管理員)",
1791
+ "slash.option.backend_name": "Backend(這台主機已安裝的 CLI)",
1792
+ "slash.option.backend_model": "模型,或 default",
1793
+ "slash.option.backend_effort": "推理強度,或 default",
1794
+ "effort.launch_skipped": "推理強度 \"{0}\" 沒有在啟動時傳給 {1}:{2}。它會用自己的推理強度設定。",
1795
+ "effort.launch_not_a_level": "它不是 AgEnD 的推理強度等級({0})",
1796
+ "effort.launch_no_help": "讀不到它的 --help,無法確定有這個參數",
1797
+ "effort.launch_no_flag": "這個版本的 --help 沒有列出 {0}",
1798
+ "effort.launch_no_levels": "這個版本的 --help 列出了 {0},但沒有列出它接受的等級",
1799
+ "effort.launch_level_not_offered": "它接受的是 {0}",
1800
+ "effort.launch_codex_unknown_model": "模型目錄裡沒有列出它的模型({0})的等級",
1801
+ "effort.launch_codex_model_unproven": "無法確定它會用哪個模型(專案的 .codex/config.toml 可能設定了別的模型,而命令列沒有指定)",
1650
1802
  "status.no_config": "尚未載入 Fleet 設定。",
1651
1803
  "status.no_instances": "尚未設定任何 instance。",
1652
1804
  "status.title": "Fleet 狀態",
@@ -1733,6 +1885,8 @@ const zhTWMessages = {
1733
1885
  "collab.off.classic": "💬 協作模式關閉 — 用 /chat 對話。",
1734
1886
  "delivery.fleet_uncertain": "⚠️ 無法確認送往 {0} 的訊息是否已送達。請先讓操作者查明結果,不要重送。\noperation_id={1}; target={0}; delivery_id={2}; state=uncertain",
1735
1887
  "delivery.fleet_failed": "❌ 送往 {0} 的訊息在重試後或等待期限結束時仍未送達。\noperation_id={1}; target={0}; delivery_id={2}; state=failed",
1888
+ "delivery.fleet_uncertain_silent_schedule": "⚠️ 無法確認靜默排程貼到 {0} 的內容是否已送達({3})。不會重送,也不會列入「需要你」;下一次排程照常執行。\noperation_id={1}; target={0}; delivery_id={2}; state=uncertain",
1889
+ "delivery.fleet_failed_silent_schedule": "❌ 靜默排程貼到 {0} 的內容未送達({3})。不會列入「需要你」;下一次排程照常執行。\noperation_id={1}; target={0}; delivery_id={2}; state=failed",
1736
1890
  "delivery.expired": "有 {0} 筆跨 instance 訊息已等滿 24 小時。其中 {1} 筆仍無法確認是否送達,可能已送達,請不要重送;通知已排入佇列,等待送給寄件的 instance。",
1737
1891
  "delivery.lane_waiting": "⚠️ 送往 {0} 的訊息已等了 {1} 分鐘。下一筆會等目前的程序回報結果或被替換後再送。\ndelivery_id={2}",
1738
1892
  "delivery.restart_blocked": "{0} 暫時保持停止,因為無法確認先前的 CLI 視窗已關閉。請先檢查該視窗再重啟,以免訊息重複送出。",
@@ -1753,7 +1907,9 @@ const zhTWMessages = {
1753
1907
  "delivery.outcome_failed": "[system:delivery-outcome] 送往 {0} 的訊息在重試後或等待期限結束時仍未送達。請向操作者回報。\n{1}\noperation_id={2}; delivery_id={3}; target={0}; state=failed",
1754
1908
  "delivery.post_restart": "[system:delivery-outcome] 重啟前已收下你送往 {0} 的訊息。請不要重送,請操作者用 delivery_status 查看目前結果。\n{1}\noperation_id={2}; target={0}; current_state={3}",
1755
1909
  "delivery.reply_turn_ended": "[system:reply-pending] 這一輪已結束,但你還沒回覆 {0}。請現在用 report_result 回報結論;終端裡的文字不會送到對方。\ncorrelation_id={1}; asked={2}",
1756
- "delivery.reply_restart": "[system:reply-pending] 重啟打斷了你為 {0} 進行的工作。請接著完成並用 report_result 回報;終端裡的文字不會送到對方。\ncorrelation_id={1}; asked={2}",
1910
+ "delivery.reply_restart": "[system:reply-pending] 重啟時,以下請求尚未收到回覆。請用 report_result 搭配各請求的 correlation_id 回報;終端裡的文字不會送到寄件者。省略的請求或縮短的識別碼請查 delivery_status;不要重送原始請求。",
1911
+ "delivery.reply_restart_more": "+{0} 個其他請求(delivery_status)",
1912
+ "delivery.reply_expired": "[system:reply-overdue] 向 {0} 要求的回覆已逾期,仍未記錄到回答,之後不再提醒。請用 describe_instance 或 delivery_status 查看;如仍需要,請重新詢問。\ncorrelation_id={1}; asked={2}",
1757
1913
  "delivery.reply_overdue": "[system:reply-overdue] {0} 還沒回覆,目前也沒有在進行工作。請用 describe_instance 或 delivery_status 查看,或再詢問一次。\ncorrelation_id={1}; asked={2}{3}",
1758
1914
  "delivery.reply_reminded": ";上次提醒={0}",
1759
1915
  "delivery.wake_auth": "⏸️ {0} 因登入失敗而暫停,有 {1} 筆訊息在等待。請先修好登入,再用 /wake 喚醒。",