@songsid/agend 2.1.12 → 2.2.0-alpha.2

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 (436) hide show
  1. package/README.md +4 -2
  2. package/README.zh-TW.md +4 -2
  3. package/dist/agent-cli.js +6 -1
  4. package/dist/agent-cli.js.map +1 -1
  5. package/dist/agent-endpoint.js +68 -12
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/agent-token-header.d.ts +13 -0
  8. package/dist/agent-token-header.js +16 -0
  9. package/dist/agent-token-header.js.map +1 -0
  10. package/dist/auth/one-time-code.d.ts +19 -0
  11. package/dist/auth/one-time-code.js +49 -0
  12. package/dist/auth/one-time-code.js.map +1 -0
  13. package/dist/auth-api.d.ts +52 -0
  14. package/dist/auth-api.js +346 -0
  15. package/dist/auth-api.js.map +1 -0
  16. package/dist/backend/antigravity.js +4 -3
  17. package/dist/backend/antigravity.js.map +1 -1
  18. package/dist/backend/claude-code.d.ts +4 -0
  19. package/dist/backend/claude-code.js +97 -0
  20. package/dist/backend/claude-code.js.map +1 -1
  21. package/dist/backend/codex.js +59 -30
  22. package/dist/backend/codex.js.map +1 -1
  23. package/dist/backend/grok.js +1 -1
  24. package/dist/backend/grok.js.map +1 -1
  25. package/dist/backend/kiro-agent.d.ts +66 -0
  26. package/dist/backend/kiro-agent.js +302 -0
  27. package/dist/backend/kiro-agent.js.map +1 -0
  28. package/dist/backend/kiro-identity.d.ts +80 -0
  29. package/dist/backend/kiro-identity.js +537 -0
  30. package/dist/backend/kiro-identity.js.map +1 -0
  31. package/dist/backend/kiro-v2-store-worker.d.ts +1 -0
  32. package/dist/backend/kiro-v2-store-worker.js +87 -0
  33. package/dist/backend/kiro-v2-store-worker.js.map +1 -0
  34. package/dist/backend/kiro-v2-store.d.ts +54 -0
  35. package/dist/backend/kiro-v2-store.js +131 -0
  36. package/dist/backend/kiro-v2-store.js.map +1 -0
  37. package/dist/backend/kiro-v3-identity.d.ts +5 -0
  38. package/dist/backend/kiro-v3-identity.js +22 -0
  39. package/dist/backend/kiro-v3-identity.js.map +1 -1
  40. package/dist/backend/kiro.d.ts +90 -7
  41. package/dist/backend/kiro.js +500 -124
  42. package/dist/backend/kiro.js.map +1 -1
  43. package/dist/backend/muse.js +1 -1
  44. package/dist/backend/muse.js.map +1 -1
  45. package/dist/backend/types.d.ts +51 -3
  46. package/dist/backend/types.js.map +1 -1
  47. package/dist/cache-analysis.d.ts +92 -0
  48. package/dist/cache-analysis.js +147 -0
  49. package/dist/cache-analysis.js.map +1 -0
  50. package/dist/cache-ledger.d.ts +108 -0
  51. package/dist/cache-ledger.js +230 -0
  52. package/dist/cache-ledger.js.map +1 -0
  53. package/dist/cache-prices.d.ts +32 -0
  54. package/dist/cache-prices.js +73 -0
  55. package/dist/cache-prices.js.map +1 -0
  56. package/dist/cache-scan.d.ts +39 -0
  57. package/dist/cache-scan.js +115 -0
  58. package/dist/cache-scan.js.map +1 -0
  59. package/dist/cache-service.d.ts +115 -0
  60. package/dist/cache-service.js +417 -0
  61. package/dist/cache-service.js.map +1 -0
  62. package/dist/channel/adapters/discord.d.ts +1 -0
  63. package/dist/channel/adapters/discord.js +29 -10
  64. package/dist/channel/adapters/discord.js.map +1 -1
  65. package/dist/channel/adapters/telegram.d.ts +1 -0
  66. package/dist/channel/adapters/telegram.js +13 -1
  67. package/dist/channel/adapters/telegram.js.map +1 -1
  68. package/dist/channel/types.d.ts +9 -1
  69. package/dist/classic-channel-manager.d.ts +18 -10
  70. package/dist/classic-channel-manager.js +45 -18
  71. package/dist/classic-channel-manager.js.map +1 -1
  72. package/dist/cli-entry.d.ts +19 -0
  73. package/dist/cli-entry.js +36 -0
  74. package/dist/cli-entry.js.map +1 -0
  75. package/dist/cli.js +471 -146
  76. package/dist/cli.js.map +1 -1
  77. package/dist/command-table.d.ts +5 -3
  78. package/dist/command-table.js +29 -27
  79. package/dist/command-table.js.map +1 -1
  80. package/dist/config-validator.js +46 -0
  81. package/dist/config-validator.js.map +1 -1
  82. package/dist/config.js +12 -0
  83. package/dist/config.js.map +1 -1
  84. package/dist/connection-secrets.d.ts +6 -0
  85. package/dist/connection-secrets.js +4 -0
  86. package/dist/connection-secrets.js.map +1 -1
  87. package/dist/daemon.d.ts +95 -4
  88. package/dist/daemon.js +748 -111
  89. package/dist/daemon.js.map +1 -1
  90. package/dist/darwin-memory.d.ts +6 -1
  91. package/dist/darwin-memory.js +17 -6
  92. package/dist/darwin-memory.js.map +1 -1
  93. package/dist/delivery-consumed-watch.d.ts +85 -0
  94. package/dist/delivery-consumed-watch.js +244 -0
  95. package/dist/delivery-consumed-watch.js.map +1 -0
  96. package/dist/delivery-outbox.d.ts +61 -0
  97. package/dist/delivery-outbox.js +120 -2
  98. package/dist/delivery-outbox.js.map +1 -1
  99. package/dist/delivery-reconciliation.d.ts +14 -5
  100. package/dist/delivery-reconciliation.js +27 -4
  101. package/dist/delivery-reconciliation.js.map +1 -1
  102. package/dist/delivery-reconciliation.test.js +35 -1
  103. package/dist/delivery-reconciliation.test.js.map +1 -1
  104. package/dist/event-log.d.ts +4 -1
  105. package/dist/event-log.js +6 -3
  106. package/dist/event-log.js.map +1 -1
  107. package/dist/event-loop-watch.d.ts +28 -0
  108. package/dist/event-loop-watch.js +75 -3
  109. package/dist/event-loop-watch.js.map +1 -1
  110. package/dist/fleet-context.d.ts +22 -2
  111. package/dist/fleet-control-audit.d.ts +5 -0
  112. package/dist/fleet-control-audit.js +7 -0
  113. package/dist/fleet-control-audit.js.map +1 -1
  114. package/dist/fleet-level-config.d.ts +2 -2
  115. package/dist/fleet-level-config.js +28 -1
  116. package/dist/fleet-level-config.js.map +1 -1
  117. package/dist/fleet-manager.d.ts +339 -12
  118. package/dist/fleet-manager.js +2623 -461
  119. package/dist/fleet-manager.js.map +1 -1
  120. package/dist/full-restart.js +2 -3
  121. package/dist/full-restart.js.map +1 -1
  122. package/dist/general-knowledge/skills/persona-emoji/SKILL.md +3 -1
  123. package/dist/host-memory.d.ts +4 -0
  124. package/dist/host-memory.js.map +1 -1
  125. package/dist/install-lock.d.ts +49 -0
  126. package/dist/install-lock.js +200 -0
  127. package/dist/install-lock.js.map +1 -0
  128. package/dist/instance-config-impact.js +8 -2
  129. package/dist/instance-config-impact.js.map +1 -1
  130. package/dist/instance-lifecycle.d.ts +10 -5
  131. package/dist/instance-lifecycle.js +162 -53
  132. package/dist/instance-lifecycle.js.map +1 -1
  133. package/dist/locale.js +164 -16
  134. package/dist/locale.js.map +1 -1
  135. package/dist/login-controller.d.ts +2 -0
  136. package/dist/login-controller.js +17 -5
  137. package/dist/login-controller.js.map +1 -1
  138. package/dist/memory-pressure.d.ts +7 -8
  139. package/dist/memory-pressure.js +76 -15
  140. package/dist/memory-pressure.js.map +1 -1
  141. package/dist/monotonic-budget.d.ts +2 -0
  142. package/dist/monotonic-budget.js +28 -0
  143. package/dist/monotonic-budget.js.map +1 -0
  144. package/dist/needs-you-hub.d.ts +114 -0
  145. package/dist/needs-you-hub.js +370 -0
  146. package/dist/needs-you-hub.js.map +1 -0
  147. package/dist/needs-you-live.d.ts +116 -0
  148. package/dist/needs-you-live.js +228 -0
  149. package/dist/needs-you-live.js.map +1 -0
  150. package/dist/needs-you.d.ts +132 -0
  151. package/dist/needs-you.js +164 -0
  152. package/dist/needs-you.js.map +1 -0
  153. package/dist/node-version-guard.d.ts +30 -0
  154. package/dist/node-version-guard.js +50 -0
  155. package/dist/node-version-guard.js.map +1 -0
  156. package/dist/operator-control-paths.d.ts +4 -0
  157. package/dist/operator-control-paths.js +24 -0
  158. package/dist/operator-control-paths.js.map +1 -0
  159. package/dist/outbound-handlers.d.ts +2 -0
  160. package/dist/outbound-handlers.js +9 -2
  161. package/dist/outbound-handlers.js.map +1 -1
  162. package/dist/outbound-schemas.d.ts +5 -5
  163. package/dist/outbound-schemas.js +1 -1
  164. package/dist/outbound-schemas.js.map +1 -1
  165. package/dist/package-preimage.d.ts +26 -0
  166. package/dist/package-preimage.js +96 -0
  167. package/dist/package-preimage.js.map +1 -0
  168. package/dist/profile-control.js +4 -20
  169. package/dist/profile-control.js.map +1 -1
  170. package/dist/public-web-gateway.d.ts +18 -0
  171. package/dist/public-web-gateway.js +141 -0
  172. package/dist/public-web-gateway.js.map +1 -0
  173. package/dist/public-web-link.d.ts +53 -0
  174. package/dist/public-web-link.js +175 -0
  175. package/dist/public-web-link.js.map +1 -0
  176. package/dist/quickstart-api.d.ts +8 -1
  177. package/dist/quickstart-api.js +86 -48
  178. package/dist/quickstart-api.js.map +1 -1
  179. package/dist/quickstart.d.ts +1 -0
  180. package/dist/quickstart.js +16 -6
  181. package/dist/quickstart.js.map +1 -1
  182. package/dist/restart-guard.d.ts +52 -0
  183. package/dist/restart-guard.js +109 -0
  184. package/dist/restart-guard.js.map +1 -0
  185. package/dist/scheduler/db.d.ts +7 -1
  186. package/dist/scheduler/db.js +44 -2
  187. package/dist/scheduler/db.js.map +1 -1
  188. package/dist/scheduler/index.d.ts +1 -1
  189. package/dist/scheduler/retry-label.d.ts +11 -0
  190. package/dist/scheduler/retry-label.js +24 -0
  191. package/dist/scheduler/retry-label.js.map +1 -0
  192. package/dist/scheduler/scheduler.d.ts +55 -2
  193. package/dist/scheduler/scheduler.js +220 -8
  194. package/dist/scheduler/scheduler.js.map +1 -1
  195. package/dist/scheduler/types.d.ts +22 -0
  196. package/dist/scheduler/types.js.map +1 -1
  197. package/dist/secret-store.d.ts +5 -0
  198. package/dist/secret-store.js +20 -0
  199. package/dist/secret-store.js.map +1 -1
  200. package/dist/service-activation.d.ts +152 -0
  201. package/dist/service-activation.js +407 -0
  202. package/dist/service-activation.js.map +1 -0
  203. package/dist/service-installer.d.ts +63 -1
  204. package/dist/service-installer.js +141 -16
  205. package/dist/service-installer.js.map +1 -1
  206. package/dist/service-plan.d.ts +65 -0
  207. package/dist/service-plan.js +108 -0
  208. package/dist/service-plan.js.map +1 -0
  209. package/dist/service-restart-selection.d.ts +6 -5
  210. package/dist/service-restart-selection.js +6 -5
  211. package/dist/service-restart-selection.js.map +1 -1
  212. package/dist/settings-api.d.ts +10 -2
  213. package/dist/settings-api.js +216 -72
  214. package/dist/settings-api.js.map +1 -1
  215. package/dist/settings-baseline.d.ts +20 -0
  216. package/dist/settings-baseline.js +104 -0
  217. package/dist/settings-baseline.js.map +1 -0
  218. package/dist/settings-change.d.ts +21 -0
  219. package/dist/settings-change.js +161 -0
  220. package/dist/settings-change.js.map +1 -0
  221. package/dist/settings-confirmation.d.ts +105 -0
  222. package/dist/settings-confirmation.js +232 -0
  223. package/dist/settings-confirmation.js.map +1 -0
  224. package/dist/settings-control.d.ts +41 -0
  225. package/dist/settings-control.js +294 -0
  226. package/dist/settings-control.js.map +1 -0
  227. package/dist/settings-effect.d.ts +24 -0
  228. package/dist/settings-effect.js +169 -0
  229. package/dist/settings-effect.js.map +1 -0
  230. package/dist/settings-http-confirmation.d.ts +29 -0
  231. package/dist/settings-http-confirmation.js +123 -0
  232. package/dist/settings-http-confirmation.js.map +1 -0
  233. package/dist/settings-instance-patch.d.ts +4 -0
  234. package/dist/settings-instance-patch.js +26 -0
  235. package/dist/settings-instance-patch.js.map +1 -0
  236. package/dist/settings-request-capability.d.ts +16 -0
  237. package/dist/settings-request-capability.js +32 -0
  238. package/dist/settings-request-capability.js.map +1 -0
  239. package/dist/settings-transaction.d.ts +65 -0
  240. package/dist/settings-transaction.js +223 -0
  241. package/dist/settings-transaction.js.map +1 -0
  242. package/dist/setup-auth.d.ts +10 -18
  243. package/dist/setup-auth.js +14 -38
  244. package/dist/setup-auth.js.map +1 -1
  245. package/dist/setup-form.d.ts +1 -1
  246. package/dist/setup-form.js +75 -18
  247. package/dist/setup-form.js.map +1 -1
  248. package/dist/setup-guide.d.ts +13 -0
  249. package/dist/setup-guide.js +25 -0
  250. package/dist/setup-guide.js.map +1 -0
  251. package/dist/setup-host.d.ts +16 -0
  252. package/dist/setup-host.js +199 -35
  253. package/dist/setup-host.js.map +1 -1
  254. package/dist/setup-wizard.js +5 -1
  255. package/dist/setup-wizard.js.map +1 -1
  256. package/dist/slash-authz.d.ts +17 -3
  257. package/dist/slash-authz.js +5 -0
  258. package/dist/slash-authz.js.map +1 -1
  259. package/dist/spawn-gate.js +3 -3
  260. package/dist/spawn-gate.js.map +1 -1
  261. package/dist/sqlite-open-errors.d.ts +12 -0
  262. package/dist/sqlite-open-errors.js +13 -0
  263. package/dist/sqlite-open-errors.js.map +1 -0
  264. package/dist/statusline-watcher.d.ts +5 -0
  265. package/dist/statusline-watcher.js +2 -0
  266. package/dist/statusline-watcher.js.map +1 -1
  267. package/dist/steer-capability.d.ts +6 -0
  268. package/dist/steer-capability.js +8 -0
  269. package/dist/steer-capability.js.map +1 -1
  270. package/dist/sync-work-attribution.d.ts +14 -0
  271. package/dist/sync-work-attribution.js +43 -8
  272. package/dist/sync-work-attribution.js.map +1 -1
  273. package/dist/tips.js +10 -5
  274. package/dist/tips.js.map +1 -1
  275. package/dist/tmux-control.d.ts +57 -5
  276. package/dist/tmux-control.js +379 -61
  277. package/dist/tmux-control.js.map +1 -1
  278. package/dist/tmux-manager.d.ts +20 -6
  279. package/dist/tmux-manager.js +90 -47
  280. package/dist/tmux-manager.js.map +1 -1
  281. package/dist/tmux-read.d.ts +59 -0
  282. package/dist/tmux-read.js +213 -0
  283. package/dist/tmux-read.js.map +1 -0
  284. package/dist/topic-commands.d.ts +21 -10
  285. package/dist/topic-commands.js +205 -63
  286. package/dist/topic-commands.js.map +1 -1
  287. package/dist/transcript-delta-reader.js +2 -1
  288. package/dist/transcript-delta-reader.js.map +1 -1
  289. package/dist/tunnel/cloudflared-install.d.ts +2 -0
  290. package/dist/tunnel/cloudflared-install.js +1 -1
  291. package/dist/tunnel/cloudflared-install.js.map +1 -1
  292. package/dist/tunnel/purpose-lane.d.ts +14 -0
  293. package/dist/tunnel/purpose-lane.js +43 -0
  294. package/dist/tunnel/purpose-lane.js.map +1 -0
  295. package/dist/turn-reply-guard.d.ts +2 -0
  296. package/dist/turn-reply-guard.js +10 -1
  297. package/dist/turn-reply-guard.js.map +1 -1
  298. package/dist/types.d.ts +33 -0
  299. package/dist/ui/app.html +18 -0
  300. package/dist/ui/chat-commands.js +43 -0
  301. package/dist/ui/chat-render.js +478 -0
  302. package/dist/ui/chat-store.js +318 -0
  303. package/dist/ui/chat-strings.js +89 -0
  304. package/dist/ui/chat-thread.js +246 -0
  305. package/dist/ui/chat-tour.js +116 -0
  306. package/dist/ui/fleet-cache.js +168 -0
  307. package/dist/ui/fleet-org.js +142 -0
  308. package/dist/ui/panel-chat.js +504 -0
  309. package/dist/ui/panel-fleet.js +427 -0
  310. package/dist/ui/panel-needs.js +202 -0
  311. package/dist/ui/panel-settings.js +754 -0
  312. package/dist/ui/preview-panel.js +202 -0
  313. package/dist/ui/preview.js +270 -0
  314. package/dist/ui/settings-apply.js +239 -0
  315. package/dist/ui/settings-confirm.js +186 -0
  316. package/dist/ui/settings-dialogs.js +546 -0
  317. package/dist/ui/settings-model.js +277 -0
  318. package/dist/ui/settings-strings.js +654 -0
  319. package/dist/ui/settings-wizard.js +140 -0
  320. package/dist/ui/shared/agend-auth.js +93 -0
  321. package/dist/ui/shared/app-ctx.js +80 -0
  322. package/dist/ui/shared/app-html.js +9 -0
  323. package/dist/ui/shared/app-i18n.js +95 -0
  324. package/dist/ui/shared/app-nav.js +73 -0
  325. package/dist/ui/shared/app-needs.js +114 -0
  326. package/dist/ui/shared/app-route.js +73 -0
  327. package/dist/ui/shared/app-session.js +66 -0
  328. package/dist/ui/shared/app-shell.js +346 -0
  329. package/dist/ui/shared/app-store.js +51 -0
  330. package/dist/ui/shared/app-stream.js +201 -0
  331. package/dist/ui/shared/app.css +820 -0
  332. package/dist/ui/shared/app.js +88 -0
  333. package/dist/ui/shared/fonts/OFL.txt +92 -0
  334. package/dist/ui/shared/fonts/README.md +21 -0
  335. package/dist/ui/shared/fonts/inter.woff2 +0 -0
  336. package/dist/ui/shared/htm.module.js +1 -0
  337. package/dist/ui/shared/panel-view.js +655 -0
  338. package/dist/ui/shared/preact-hooks.module.js +2 -0
  339. package/dist/ui/shared/preact.module.js +2 -0
  340. package/dist/ui/shared/signin.js +142 -0
  341. package/dist/ui/shared/theme.js +29 -0
  342. package/dist/ui/shared/tokens.css +153 -0
  343. package/dist/ui/shared/ui-confirm.js +43 -0
  344. package/dist/ui/shared/ui-dialog.js +45 -0
  345. package/dist/ui/shared/ui-icons.js +63 -0
  346. package/dist/ui/shared/ui-menu.js +39 -0
  347. package/dist/ui/shared/ui-states.js +20 -0
  348. package/dist/ui/shared/ui-toast.js +18 -0
  349. package/dist/ui/shared/vendor/htm.LICENSE +202 -0
  350. package/dist/ui/shared/vendor/preact.LICENSE +21 -0
  351. package/dist/ui/shared/vendor/vendor.json +39 -0
  352. package/dist/ui/shared/view-strings.js +309 -0
  353. package/dist/ui/signin.html +52 -0
  354. package/dist/update-check.d.ts +6 -2
  355. package/dist/update-check.js +12 -3
  356. package/dist/update-check.js.map +1 -1
  357. package/dist/update-dispatch.d.ts +28 -0
  358. package/dist/update-dispatch.js +73 -0
  359. package/dist/update-dispatch.js.map +1 -0
  360. package/dist/update-install.d.ts +129 -0
  361. package/dist/update-install.js +262 -0
  362. package/dist/update-install.js.map +1 -0
  363. package/dist/upgrade-notices.d.ts +17 -0
  364. package/dist/upgrade-notices.js +93 -0
  365. package/dist/upgrade-notices.js.map +1 -0
  366. package/dist/usage/statusline-usage.d.ts +2 -0
  367. package/dist/usage/statusline-usage.js +14 -10
  368. package/dist/usage/statusline-usage.js.map +1 -1
  369. package/dist/view-api.d.ts +6 -1
  370. package/dist/view-api.js +62 -51
  371. package/dist/view-api.js.map +1 -1
  372. package/dist/web-api.d.ts +85 -14
  373. package/dist/web-api.js +557 -77
  374. package/dist/web-api.js.map +1 -1
  375. package/dist/web-auth.d.ts +71 -27
  376. package/dist/web-auth.js +169 -69
  377. package/dist/web-auth.js.map +1 -1
  378. package/dist/web-body.d.ts +3 -0
  379. package/dist/web-body.js +55 -0
  380. package/dist/web-body.js.map +1 -0
  381. package/dist/web-channel-echo.d.ts +9 -0
  382. package/dist/web-channel-echo.js +55 -0
  383. package/dist/web-channel-echo.js.map +1 -0
  384. package/dist/web-chat-history.d.ts +125 -0
  385. package/dist/web-chat-history.js +184 -0
  386. package/dist/web-chat-history.js.map +1 -0
  387. package/dist/web-commands.d.ts +77 -0
  388. package/dist/web-commands.js +81 -0
  389. package/dist/web-commands.js.map +1 -0
  390. package/dist/web-continuation.d.ts +7 -0
  391. package/dist/web-continuation.js +22 -0
  392. package/dist/web-continuation.js.map +1 -0
  393. package/dist/web-host-guard.d.ts +34 -0
  394. package/dist/web-host-guard.js +57 -1
  395. package/dist/web-host-guard.js.map +1 -1
  396. package/dist/web-login.d.ts +72 -0
  397. package/dist/web-login.js +132 -0
  398. package/dist/web-login.js.map +1 -0
  399. package/dist/web-org.d.ts +55 -0
  400. package/dist/web-org.js +67 -0
  401. package/dist/web-org.js.map +1 -0
  402. package/dist/web-preview.d.ts +77 -0
  403. package/dist/web-preview.js +240 -0
  404. package/dist/web-preview.js.map +1 -0
  405. package/dist/web-request-context.d.ts +10 -0
  406. package/dist/web-request-context.js +13 -0
  407. package/dist/web-request-context.js.map +1 -0
  408. package/dist/web-session.d.ts +167 -0
  409. package/dist/web-session.js +389 -0
  410. package/dist/web-session.js.map +1 -0
  411. package/dist/web-shell-routes.d.ts +59 -0
  412. package/dist/web-shell-routes.js +96 -0
  413. package/dist/web-shell-routes.js.map +1 -0
  414. package/dist/web-upload.d.ts +183 -0
  415. package/dist/web-upload.js +468 -0
  416. package/dist/web-upload.js.map +1 -0
  417. package/dist/website-tips-renderer.d.ts +2 -2
  418. package/dist/website-tips-renderer.js +3 -3
  419. package/dist/website-tips-renderer.js.map +1 -1
  420. package/launcher/agend +110 -0
  421. package/launcher/agend-agent +110 -0
  422. package/launcher/agend-agent.cjs +4 -0
  423. package/launcher/agend.cjs +4 -0
  424. package/launcher/install-admission.cjs +105 -0
  425. package/launcher/launch.cjs +64 -0
  426. package/launcher/postinstall.cjs +114 -0
  427. package/launcher/run-in-process.cjs +13 -0
  428. package/launcher/runtime-platform.cjs +86 -0
  429. package/launcher/runtime-select.cjs +217 -0
  430. package/package.json +18 -7
  431. package/scripts/preinstall-guard.cjs +55 -0
  432. package/templates/launchd.plist.ejs +2 -2
  433. package/templates/systemd.service.ejs +1 -1
  434. package/dist/ui/dashboard.html +0 -774
  435. package/dist/ui/settings.html +0 -2165
  436. package/dist/ui/view.html +0 -1139
package/dist/locale.js CHANGED
@@ -14,6 +14,7 @@ export function detectLocale(fleetConfig) {
14
14
  }
15
15
  const enMessages = {
16
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.",
17
18
  "memory.available": "{0} RAM available",
18
19
  "memory.free": "{0} RAM free (available RAM could not be measured)",
19
20
  "memory.holding": "New agent starts will wait for memory to recover.",
@@ -70,26 +71,76 @@ const enMessages = {
70
71
  "pause.failed": "❌ Failed to pause {0}: {1}",
71
72
  "wake.failed": "❌ Failed to wake {0}: {1}",
72
73
  "instance.not_found": "❌ Instance not found: {0}",
74
+ "instance.other_bot": "⛔ {0} belongs to another bot. Use that bot's General.",
73
75
  "not_authorized": "⛔ Not authorized",
74
76
  "usage.chat": "Usage: `/chat <message>`",
77
+ "dashboard.local": "Local network",
78
+ "dashboard.public_open": "Open temporary public link",
79
+ "dashboard.public_close": "Close public link",
80
+ "dashboard.public_general": "Use /dashboard in this bot’s General as a fleet admin.",
81
+ "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.",
82
+ "dashboard.public_status": "Public link: {0} · {1}s remaining",
83
+ "dashboard.public_closed": "🔒 Public web access closed.",
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.",
85
+ "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.",
86
+ "dashboard.private_sent": "🔐 Sign-in details sent privately.",
87
+ "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.",
88
+ "web.public_login_notice": "🔐 New web sign-in · public: {0} (session {1}). If this was not you, use /dashboard revoke.",
75
89
  "dashboard.title": "📊 AgEnD Dashboard",
76
90
  "dashboard.starting": "⏳ Dashboard starting, retry shortly.",
91
+ "dashboard.signin": "• Sign in: {0}/signin",
92
+ "dashboard.code": "• Code: {0} (works once, valid {1} min)",
93
+ "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.",
94
+ "dashboard.revoked": "🔒 Signed out {0} web session(s) and withdrew any unused code.",
95
+ "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.",
96
+ "web.login_notice": "🔐 New web sign-in: {0} ({1}, session {2}). If this was not you, send /dashboard revoke.",
77
97
  "update.available": "🆕 AgEnD {0} available! Run: /update (or agend update)",
78
98
  "update.available_current": "🆕 AgEnD {0} available (current: {1})! Run: /update (or agend update)",
79
99
  "update.available_stable": "🆕 AgEnD {0} (stable) is available (current: {1}, a beta). /update stays on the beta channel; to switch to the stable release run: agend update --stable",
80
100
  "update.highlights": "Highlights: {0}",
101
+ "needs.live_header": "📥 Needs you — {0}",
102
+ "needs.live_more": "… and {0} more: open /ui",
103
+ "needs.live_empty": "✅ Nothing needs you right now.",
104
+ "needs.live_stopped": "⏹ Fleet stopped. This list resumes when it starts.",
105
+ "needs.live_off": "Needs you list turned off (needs_you.live_message: false).",
106
+ "needs.dm_header": "📥 {0} new thing(s) need you:",
107
+ "needs.ack_button": "Acknowledge {0}",
108
+ "needs.ack_done": "Acknowledged.",
109
+ "needs.ack_already": "Already handled.",
110
+ "needs.ack_failed": "Could not record the acknowledgement. Try again.",
111
+ "needs.ack_stale": "This list has been updated. Use the current one.",
112
+ "needs.ack_not_this_world": "This item now belongs to another bot's list.",
113
+ "needs.reason.hang": "Not responding",
114
+ "needs.reason.exited": "Exited",
115
+ "needs.reason.assist": "Waiting at its terminal",
116
+ "needs.reason.permission": "Permission needed",
117
+ "needs.reason.dangerous_command": "Dangerous command waiting",
118
+ "needs.reason.login": "Sign-in needed",
119
+ "needs.reason.dialog": "Waiting at a dialog",
120
+ "needs.reason.terminal_input": "May be waiting for input",
121
+ "needs.reason.auth_paused": "Paused: sign-in needed",
122
+ "needs.reason.crashed": "Crashed",
123
+ "needs.reason.delivery_uncertain": "Could not confirm delivery",
124
+ "needs.reason.delivery_failed": "Delivery failed",
125
+ "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}",
126
+ "dashboard.remote_hint": "📱 These links open on the fleet's own machine only. To use web chat from a phone or another computer: {0}",
81
127
  "fleet.ready": "Fleet ready. {0}/{1} instances running. v{2}",
82
128
  "fleet.ready_with_failed": "Fleet ready. {0}/{1} instances running. v{2} | Failed: {3}",
83
129
  "cost.approaching": "⚠️ {0} cost: {1} / {2} ({3}%)",
84
130
  "cost.limit_reached": "🛑 {0} daily limit {1} reached — pausing instance.",
85
131
  "general.start_failed": "⚠️ General instance \"{0}\" failed to start:\n{1}",
86
- "alert.unauth_user_private": "🆕 Unauthorized user tried /start in private chat:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n\nTo allow: add `{1}` to classicBot.yaml `allowed_users`",
132
+ "alert.unauth_user_private": "🆕 Unauthorized user tried /start in private chat:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n\nReview the access request with the buttons below.",
87
133
  "alert.start_not_admin": "🔑 User wants to /start but is not admin:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n• Group: {3}\n\nTo approve: add `{1}` to classicBot.yaml `admin_users`",
88
134
  "alert.stop_not_admin": "🔑 User wants to /stop but is not admin:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n• Group: {3}\n\nTo approve: add `{1}` to classicBot.yaml `admin_users`",
89
- "alert.unauth_guild": "🆕 Unauthorized guild tried /start:\n• Guild ID: {0}\n• User: {1}\n• Platform: discord\n\nTo allow: add `{0}` to classicBot.yaml `allowed_guilds`",
135
+ "alert.unauth_guild": "🆕 Unauthorized guild tried /start:\n• Guild ID: {0}\n• User: {1}\n• Platform: discord\n\nReview the access request with the buttons below.",
90
136
  "alert.bot_added": "🆕 Bot added to new server:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n\nTo allow: add `{1}` to classicBot.yaml `allowed_guilds`",
91
137
  "alert.new_group": "🆕 New group detected:\n• Name: {0}\n• ID: {1}\n• User: {2} ({3})\n• Platform: {4}\n\nTo allow: add `{1}` (quoted) to classicBot.yaml `allowed_groups`",
92
138
  "schedule.deferred": "⏳ Schedule \"{0}\" deferred — rate limit at {1}%",
139
+ "schedule.deferred_retry": "⏳ Schedule \"{0}\" deferred — rate limit at {1}%. It runs once after the window resets (around {2}), unless its next run comes first.",
140
+ "schedule.retry_dropped": "{0} ⚠️ Schedule \"{1}\" did not run: its {2} run was deferred by the 5h rate limit ({3}%), and {4}.",
141
+ "schedule.retry_reason_superseded": "its next run ({0}) came before the window reset",
142
+ "schedule.retry_reason_deferred_again": "it was deferred again after the window reset",
143
+ "schedule.retry_reason_expired": "the window did not reset within {0} minutes",
93
144
  "restart.full_initiated": "🔄 Full restart initiated — waiting for all instances to idle, then reloading process...",
94
145
  "restart.full_preparing": "🔄 Full process reload requested — preparing a tracked restart...",
95
146
  "restart.full_launch_failed": "❌ Full process reload could not start; the current fleet is still running. Check the fleet log and retry.",
@@ -117,6 +168,13 @@ const enMessages = {
117
168
  "inst.dialog_answer_ignored_held": "⚠️ {0} is showing a CLI dialog ({1}) and it is not taking AgEnD's answer — {2} tries in a row, still on screen. Open its pane and answer it by hand. Deliveries to this instance are held until the dialog is gone.",
118
169
  "fleet.dialog_answer_ignored": "⚠️ {0}: a CLI dialog ({1}) is not taking AgEnD's answer ({2} tries). Someone needs to answer it in its pane.",
119
170
  "kiro.version_below_supported": "kiro-cli {0} is older than the oldest version AgEnD supports ({1}). It still runs, but run `kiro-cli update` when you can.",
171
+ "kiro.shared_conflict": "kiro: the shared .kiro {0} in this directory already has something in this instance's place that AgEnD did not write. It was left untouched, so this instance is not fully isolated from others in the same directory until that is resolved.",
172
+ "kiro.shared_unreadable": "kiro: AgEnD could not read or update the shared .kiro {0} in this directory. Nothing was changed; this instance is not reported as isolated, and the next launch tries again.",
173
+ "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.",
174
+ "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.",
175
+ "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.",
176
+ "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.",
177
+ "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.",
120
178
  "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.",
121
179
  "inst.cli_unsupported": "⛔ `{0}` was not started: {1}",
122
180
  "fleet.cli_unsupported": "⛔ Not started ({0}): {1}\nThese instances will not be retried automatically; start them again once the CLI or the configuration is changed.",
@@ -149,6 +207,11 @@ const enMessages = {
149
207
  "inst.codex_capacity_nudge_text": "Continue only if the last request is unfinished; if it is done, reply that it is done.",
150
208
  "inst.malformed_tool_call_recovered": "⚠️ {0}: detected a malformed Claude tool call and attempted to recover its reply.",
151
209
  "inst.malformed_tool_call_unrecoverable": "⚠️ {0}: detected a malformed Claude tool call, but no reply text could be recovered.",
210
+ "web.echo_full_text": "full text in web chat",
211
+ "web.raw_public_refused": "/raw is not available over the public link: it would reach the CLI without the [user:] envelope. Send it as a normal message, or use it from Discord or a local session.",
212
+ "web.command_public_refused": "{0} is not available over the public link.",
213
+ "web.command_unknown": "{0} is not a command the web chat runs. Send it as a message instead.",
214
+ "web.command_no_choices": "{0} has nothing to choose from for this instance.",
152
215
  "inst.reply_drop_retrying": "⚠️ The agent ended this turn without sending a reply. AgEnD will ask it once to send a concise conclusion.",
153
216
  "inst.reply_drop_unknown": "⚠️ The agent's reply could not be confirmed as delivered. To avoid a duplicate, AgEnD will not resend it automatically; ask again if needed.",
154
217
  "inst.reply_drop_unrecovered": "⚠️ The agent still did not send a reply after one recovery attempt. A long conversation may have degraded its reply tool. Save important context to soul.md, then run /clear.",
@@ -167,12 +230,12 @@ const enMessages = {
167
230
  "interactive.kind.password": "password",
168
231
  "interactive.kind.confirmation": "Y/N confirmation",
169
232
  "interactive.kind.press_enter": "Press Enter",
170
- "interactive.general_notice": "⚠️ {0} is waiting for interactive input ({1}). Ask General to assist?",
233
+ "interactive.general_notice": "⚠️ {0} is waiting for interactive input ({1}). Ask General to help, or handle it yourself in its terminal?",
171
234
  "interactive.instance_notice": "⚠️ {0} is waiting for interactive input. Go to the General channel to confirm how to proceed.",
172
- "interactive.confirm": "Confirm",
173
- "interactive.cancel": "Cancel",
235
+ "interactive.confirm": "Ask General to help",
236
+ "interactive.cancel": "I'll handle it myself",
174
237
  "interactive.confirmed": "✅ General assistance requested for {0}.",
175
- "interactive.ignored": "🚫 Interactive prompt for {0} ignored.",
238
+ "interactive.ignored": "🙋 You're handling {0}'s prompt yourself; General was not asked.",
176
239
  "interactive.expired": "⌛ Interactive prompt assistance for {0} expired.",
177
240
  "interactive.self_assist": "⚠️ {0} is General itself and cannot self-assist while blocked. Use tmux attach.",
178
241
  "interactive.delivery_failed": "❌ Could not deliver the assistance request for {0} to General.",
@@ -197,6 +260,8 @@ const enMessages = {
197
260
  "buttons.stale": "⌛ This prompt has expired and can no longer be acted on.",
198
261
  "buttons.stale_notice": "⌛ This prompt has expired. Run the command again for a new one.",
199
262
  "buttons.admin_only": "⛔ Only a fleet admin can use this button.",
263
+ "buttons.not_allowed": "⛔ You can't use this button.",
264
+ "menu.click_stale": "⚠️ Nothing was changed: the instance moved to another bot, or you are no longer an admin there. Open the menu again.",
200
265
  "buttons.wrong_place": "⚠️ This button does not match the prompt it belongs to. Run the command again.",
201
266
  "buttons.post_failed": "⚠️ Could not post the buttons: {0}",
202
267
  "tips.label": "Tip",
@@ -246,12 +311,13 @@ const enMessages = {
246
311
  "slash.dm_unsupported": "This command only works in the AgEnD server's channels, not in a direct message.",
247
312
  "slash.ack_failed": "{0} ⏱ {1} could not be acknowledged in time — it reached AgEnD {2}s after you sent it, and Discord allows 3s. It was NOT run, so nothing happened twice; please run it again.",
248
313
  "slash.wrong_server": "This command is not available in this server.",
314
+ "slash.other_bot": "This channel belongs to another bot of this fleet — use that bot's commands here.",
249
315
  "slash.start": "Start an agent in this channel",
250
316
  "slash.stop": "Stop the agent in this channel",
251
317
  "slash.chat": "Send a message to the agent",
252
318
  "slash.ctx": "Show context usage",
253
319
  "slash.cancel": "Interrupt the agent's current operation (sends Escape)",
254
- "slash.dashboard": "Get dashboard URLs (admin only)",
320
+ "slash.dashboard": "Sign in to the web dashboard and web chat (admin only)",
255
321
  "slash.compact": "Compact agent context window",
256
322
  "slash.compact_arg": "[optional summary focus — Claude Code only]",
257
323
  "slash.steer": "Interject into the agent's current task",
@@ -259,6 +325,7 @@ const enMessages = {
259
325
  "steer.sent": "🎯 Steering message sent to {0} (lands mid-turn; falls back to the queue if the CLI can't take busy input).",
260
326
  "steer.not_connected": "❌ Instance not connected (IPC unavailable)",
261
327
  "steer.unsupported": "⚠️ /steer is not supported for the {0} backend yet (its TUI can't take input mid-turn). The message was NOT sent — use a normal message instead, or /cancel first.",
328
+ "steer.unsupported_launch": "⚠️ /steer is not available for this {0} instance as it runs now: only its TUI on a verified version takes input mid-turn (the legacy UI does not). The message was NOT sent — use a normal message instead, or /cancel first.",
262
329
  "slash.btw": "Ask a side question without interrupting the current task",
263
330
  "btw.usage": "Usage: /btw <message> — asks Claude Code a side question without interrupting its current task",
264
331
  "btw.sent": "💬 Side question sent to {0}.",
@@ -353,11 +420,13 @@ const enMessages = {
353
420
  "login.remote_unsupported_agent_cli": "⛔ Remote login for {0} is not supported in this version. `{1}` is the full agent CLI with no isolated login command — signing in means running the whole agent, which breaks the terminal's \"one login command, no shell\" boundary. Run `{1}` directly on the host to sign in; remote login will follow once upstream ships a dedicated login command.",
354
421
  "classic.approve_done_group": "✅ Access granted — `{0}` added to the allow-list.",
355
422
  "classic.approve_done_group_already": "ℹ️ `{0}` was already on the allow-list — nothing changed.",
356
- "classic.approve_done_group_open": "ℹ️ `{0}` is already allowed: the list is empty, which means allow-all. Adding it would have restricted every other chat instead, so nothing was changed.",
357
423
  "classic.approve_done_admin": "✅ `{0}` is now a ClassicBot admin.",
358
424
  "classic.approve_done_admin_already": "ℹ️ `{0}` was already a ClassicBot admin.",
359
425
  "classic.approve_failed": "⚠️ Could not apply access for `{0}` — ClassicBot is not configured on this fleet.",
360
426
  "classic.unrecoverable_ids": "⚠️ classicBot.yaml holds ids that can never match: {0}\n\nThey were written without quotes and are too large for YAML, so their last digits were lost when the file was read. Re-add each one as a QUOTED string copied from Discord or Telegram — the digits now in the file are themselves wrong, so do not copy them from there.",
427
+ "classic.approve_user": "✅ Allow this user",
428
+ "classic.request_allowed": "✅ Access approved. Try /start again (in groups: /start@BotUsername, by a ClassicBot admin).",
429
+ "classic.request_ignored": "🚫 Your access request was ignored. No access was granted.",
361
430
  "classic.approve_group": "✅ Allow this group",
362
431
  "classic.approve_group_admin": "✅ Allow + make admin",
363
432
  "classic.approve_ignore": "🚫 Ignore",
@@ -386,6 +455,7 @@ const enMessages = {
386
455
  "slash.profile": "Record a bounded CPU profile (General, admin only)",
387
456
  "slash.option.profile_seconds": "Recording seconds (1–1800; default 60)",
388
457
  "profile.general_only": "⛔ /profile is available only in General.",
458
+ "cmd.use_in_general": "ℹ️ {0} works in the General topic — please use it there.",
389
459
  "profile.disabled": "⛔ /profile disabled — no fleet admins configured.",
390
460
  "profile.invalid": "Usage: /profile [seconds] — a whole number from 1 to 1800 (default 60).",
391
461
  "profile.started": "🔬 Recording a CPU profile for {0}s. The result will be posted in General.",
@@ -411,6 +481,7 @@ const enMessages = {
411
481
  "slash.option.instance": "Instance name (required in General)",
412
482
  "slash.option.message": "Your message",
413
483
  "slash.option.tips_mode": "Optional daily-tip setting",
484
+ "slash.option.dashboard_action": "Optional: revoke signs every browser out",
414
485
  "slash.option.visibility_mode": "full, summary or hidden; leave empty to see the current setting",
415
486
  "slash.option.steer_message": "What to tell the agent mid-task",
416
487
  "slash.option.compact_instructions": "Optional: what the summary should focus on (Claude Code only; ignored elsewhere)",
@@ -690,6 +761,9 @@ const enMessages = {
690
761
  "storm.recovered": "✅ tmux recovery finished: {0}/{1} instances recovered. Unresolved: {2}.",
691
762
  "storm.timed_out": "⚠️ tmux recovery timed out: {0}/{1} instances recovered. Unresolved: {2}.",
692
763
  "storm.none": "none",
764
+ "eventlog.locked": "⚠️ events.db stayed locked by another process for 5 s, so it was not opened. The file was left untouched; event logging is off until AgEnD restarts.",
765
+ "eventlog.abi": "⚠️ events.db could not be opened because AgEnD's SQLite driver does not load on this Node.js (it was built for another version or architecture). The file was left untouched. Reinstall AgEnD (or run `npm rebuild better-sqlite3` in its package) and restart.",
766
+ "eventlog.unopenable": "⚠️ events.db could not be opened (permissions, disk or I/O — see daemon.log). The file was left untouched; event logging is off until AgEnD restarts.",
693
767
  "storm.window_loss": "⚠️ {0} instances lost their tmux window within {1}s while the tmux server kept running — a host or tmux event, not {0} separate crashes. They are being respawned at a reduced rate (at most {2} at a time) and reported as one incident.",
694
768
  "general.antigravity_unsupported": "⚠️ Antigravity is not supported for General instances because it cannot receive MCP instructions. Switch to Claude Code or Kiro CLI.",
695
769
  "classic.manager_unavailable": "Classic channel manager is not initialized.",
@@ -776,6 +850,7 @@ const enMessages = {
776
850
  };
777
851
  const zhTWMessages = {
778
852
  "memory.pressure": "⚠️ 主機記憶體吃緊:{0},swap 剩餘 {1}。{2} 已在執行的 agent 會繼續工作;請檢查主機上其他大量使用記憶體的程式。",
853
+ "memory.kernel_pressure": "⚠️ macOS 核心記憶體壓力等級:{0}。估計可用記憶體:{1};swap 剩餘:{2}(僅供診斷)。{3} 已在執行的 agent 會繼續工作。",
779
854
  "memory.available": "可用記憶體 {0}",
780
855
  "memory.free": "空閒記憶體 {0}(無法量到可用記憶體)",
781
856
  "memory.holding": "新的 agent 啟動會等待記憶體恢復。",
@@ -831,26 +906,76 @@ const zhTWMessages = {
831
906
  "pause.failed": "❌ 暫停 {0} 失敗:{1}",
832
907
  "wake.failed": "❌ 喚醒 {0} 失敗:{1}",
833
908
  "instance.not_found": "❌ 找不到 instance:{0}",
909
+ "instance.other_bot": "⛔ {0} 屬於另一個 bot,請在那個 bot 的 General 使用。",
834
910
  "not_authorized": "⛔ 未授權",
835
911
  "usage.chat": "用法:`/chat <訊息>`",
912
+ "dashboard.local": "本機網路",
913
+ "dashboard.public_open": "開啟臨時公開連結",
914
+ "dashboard.public_close": "關閉公開連結",
915
+ "dashboard.public_general": "請由 fleet 管理員在這個 bot 的 General 使用 /dashboard。",
916
+ "dashboard.public_risk": "公開連結:Cloudflare 終止 TLS,登入者具有完整網頁管理權限。只有選擇後才開啟,期限到會自動關閉。連結及登入碼只私送給你。",
917
+ "dashboard.public_status": "公開連結:{0} · 剩餘 {1} 秒",
918
+ "dashboard.public_closed": "🔒 公開網頁入口已關閉。",
919
+ "dashboard.public_cleanup": "⚠️ 公開網頁入口已關閉,但無法確認 tunnel 行程已停止。請先處理清理問題,再開新連結。",
920
+ "dashboard.private_link": "🔐 網頁登入\n{0}\n登入碼:{1}(只能用一次,{2} 分鐘內有效)\n連結期限:{3}\n不要轉傳。/dashboard revoke 會登出所有瀏覽器並關閉公開連結。",
921
+ "dashboard.private_sent": "🔐 登入資訊已私送。",
922
+ "dashboard.private_failed": "無法確認私送或連結啟動。Telegram 請先私訊這個 bot 的 /start,再重試 /dashboard。此處不會貼出登入碼。",
923
+ "web.public_login_notice": "🔐 有新的網頁登入 · 公開入口:{0}(session {1})。如果不是你,請用 /dashboard revoke。",
836
924
  "dashboard.title": "📊 AgEnD 儀表板",
837
925
  "dashboard.starting": "⏳ 儀表板啟動中,請稍後再試。",
926
+ "dashboard.signin": "• 登入頁: {0}/signin",
927
+ "dashboard.code": "• 登入碼: {0}(只能用一次,{1} 分鐘內有效)",
928
+ "dashboard.code_help": "選擇下方登入方式,bot 會私送連結與一次性登入碼。要讓所有瀏覽器登出,請傳 /dashboard revoke。",
929
+ "dashboard.revoked": "🔒 已登出 {0} 個網頁 session,並作廢尚未使用的登入碼。",
930
+ "dashboard.revoked_not_durable": "⚠️ 目前已登出 {0} 個網頁 session,但這個變更「無法保存」:~/.agend/web-sessions.json 無法更新也無法刪除,fleet 重啟後這些 session 可能會復活。請修正該檔權限後再執行一次 /dashboard revoke,或用 agend web-token rotate 換掉 token。",
931
+ "web.login_notice": "🔐 有新的網頁登入:{0}({1},session {2})。如果不是你,請傳 /dashboard revoke。",
838
932
  "update.available": "🆕 AgEnD {0} 可更新!執行:/update(或 agend update)",
839
933
  "update.available_current": "🆕 AgEnD {0} 可更新(目前:{1})!執行:/update(或 agend update)",
840
934
  "update.available_stable": "🆕 AgEnD {0}(穩定版)已推出(目前:{1},beta 版)。/update 會留在 beta 線;要切換到穩定版請執行:agend update --stable",
841
935
  "update.highlights": "更新重點:{0}",
936
+ "needs.live_header": "📥 等你處理 — {0}",
937
+ "needs.live_more": "…還有 {0} 項:請開 /ui",
938
+ "needs.live_empty": "✅ 目前沒有需要你處理的事。",
939
+ "needs.live_stopped": "⏹ Fleet 已停止。啟動後這份清單會繼續更新。",
940
+ "needs.live_off": "「等你處理」清單已關閉(needs_you.live_message: false)。",
941
+ "needs.dm_header": "📥 有 {0} 件新的事等你處理:",
942
+ "needs.ack_button": "已確認 {0}",
943
+ "needs.ack_done": "已確認。",
944
+ "needs.ack_already": "已經處理過了。",
945
+ "needs.ack_failed": "無法記錄確認,請再試一次。",
946
+ "needs.ack_stale": "這份清單已更新,請使用最新的那則。",
947
+ "needs.ack_not_this_world": "這一項現在屬於另一個 bot 的清單。",
948
+ "needs.reason.hang": "沒有回應",
949
+ "needs.reason.exited": "已結束",
950
+ "needs.reason.assist": "在終端機上等待",
951
+ "needs.reason.permission": "需要權限",
952
+ "needs.reason.dangerous_command": "危險指令待確認",
953
+ "needs.reason.login": "需要登入",
954
+ "needs.reason.dialog": "停在對話框",
955
+ "needs.reason.terminal_input": "可能在等輸入",
956
+ "needs.reason.auth_paused": "已暫停:需要登入",
957
+ "needs.reason.crashed": "已崩潰",
958
+ "needs.reason.delivery_uncertain": "無法確認是否送達",
959
+ "needs.reason.delivery_failed": "傳送失敗",
960
+ "upgrade.web_chat": "🆕 AgEnD 2.2:網頁聊天\n現在可以在瀏覽器裡跟 Agent 對話。每個 Agent 的網頁聊天,就是它在這裡的同一段對話:從網頁送出的訊息會出現在這裡,Agent 的回覆兩邊都看得到。\n• 可以附上檔案和圖片(按 📎,或直接貼上、拖進來)\n• 可以中止正在進行的回覆,也看得到訊息送到哪一步\n• 怎麼開:由管理員傳 /dashboard,取得登入連結和一次性登入碼\n📱 儀表板跑在 Fleet 所在的那台電腦上。要用手機開:{0}",
961
+ "dashboard.remote_hint": "📱 這些連結只能在 Fleet 所在的那台電腦上開。要用手機或其他電腦開網頁聊天:{0}",
842
962
  "fleet.ready": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2}",
843
963
  "fleet.ready_with_failed": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2} | 失敗:{3}",
844
964
  "cost.approaching": "⚠️ {0} 花費:{1} / {2}({3}%)",
845
965
  "cost.limit_reached": "🛑 {0} 已達每日上限 {1} — 暫停 Agent。",
846
966
  "general.start_failed": "⚠️ General Agent「{0}」啟動失敗:\n{1}",
847
- "alert.unauth_user_private": "🆕 未授權使用者嘗試在私訊 /start:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_users`",
967
+ "alert.unauth_user_private": "🆕 未授權使用者嘗試在私訊 /start:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n請使用下方按鈕審核存取請求。",
848
968
  "alert.start_not_admin": "🔑 使用者想 /start 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
849
969
  "alert.stop_not_admin": "🔑 使用者想 /stop 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
850
- "alert.unauth_guild": "🆕 未授權伺服器嘗試 /start:\n• Guild ID:{0}\n• 使用者:{1}\n• 平台:discord\n\n允許:把 `{0}` 加到 classicBot.yaml 的 `allowed_guilds`",
970
+ "alert.unauth_guild": "🆕 未授權伺服器嘗試 /start:\n• Guild ID:{0}\n• 使用者:{1}\n• 平台:discord\n\n請使用下方按鈕審核存取請求。",
851
971
  "alert.bot_added": "🆕 Bot 被加入新伺服器:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
852
972
  "alert.new_group": "🆕 偵測到新群組:\n• 名稱:{0}\n• ID:{1}\n• 使用者:{2}({3})\n• 平台:{4}\n\n允許:把 `{1}`(加引號)加到 classicBot.yaml 的 `allowed_groups`",
853
973
  "schedule.deferred": "⏳ 排程「{0}」延後 — rate limit 於 {1}%",
974
+ "schedule.deferred_retry": "⏳ 排程「{0}」延後 — rate limit 於 {1}%。額度重置後(約 {2})會補跑一次,除非下一次排程先到。",
975
+ "schedule.retry_dropped": "{0} ⚠️ 排程「{1}」沒有執行:{2} 那次因 5 小時額度({3}%)延後,而且{4}。",
976
+ "schedule.retry_reason_superseded": "額度重置前下一次排程({0})就先到了",
977
+ "schedule.retry_reason_deferred_again": "額度重置後又再次被延後",
978
+ "schedule.retry_reason_expired": "額度在 {0} 分鐘內都沒有重置",
854
979
  "restart.full_initiated": "🔄 開始完整重啟 — 等待所有 Agent 閒置後重載程序...",
855
980
  "restart.full_preparing": "🔄 已要求完整重載程序 — 正在建立可追蹤的重啟交接...",
856
981
  "restart.full_launch_failed": "❌ 無法啟動完整重載;目前 Fleet 仍在運行。請檢查 fleet log 後重試。",
@@ -878,6 +1003,13 @@ const zhTWMessages = {
878
1003
  "inst.dialog_answer_ignored_held": "⚠️ {0} 畫面上有個 CLI 對話框({1}),AgEnD 的自動回答沒有生效——連續 {2} 次回答後它仍然在畫面上。請到它的 pane 手動回答。對話框消失前,送給這個 instance 的訊息會先保留。",
879
1004
  "fleet.dialog_answer_ignored": "⚠️ {0}:CLI 對話框({1})不接受 AgEnD 的自動回答(試了 {2} 次)。需要有人到它的 pane 回答。",
880
1005
  "kiro.version_below_supported": "kiro-cli {0} 比 AgEnD 支援的最舊版本({1})還舊。仍可執行,但建議找時間執行 `kiro-cli update`。",
1006
+ "kiro.shared_conflict": "kiro:這個目錄共用的 .kiro {0} 裡,本 instance 的位置已經有不是 AgEnD 寫的東西。AgEnD 沒有動它,所以在處理掉之前,本 instance 與同目錄的其他 instance 沒有完全隔離。",
1007
+ "kiro.shared_unreadable": "kiro:AgEnD 無法讀取或更新這個目錄共用的 .kiro {0}。沒有做任何變更;本 instance 不會被當成已隔離,下次啟動會再試。",
1008
+ "kiro.untagged_steering": "kiro:這個目錄還留有舊版 AgEnD 的指示檔(.kiro/steering/agend-<instance>.md,沒有 fleet 標記)。AgEnD 無法判斷是哪個 fleet 寫的,所以保留它;等所有使用這個目錄的 fleet 都升級後,請手動刪除。",
1009
+ "kiro.no_instance_agent": "kiro-cli {0} 沒有 `--agent` / `--resume-id`(需要 {1} 以上),所以這個 instance 照舊執行:同一個工作目錄裡的 kiro instance 會看到彼此的工具和對話。執行 `kiro-cli update` 即可讓它們隔離。",
1010
+ "kiro.identity_legacy": "kiro:這次啟動照舊執行,與同目錄的其他 kiro instance「沒有」隔離({0})。下次啟動會再試。",
1011
+ "kiro.switch_unrecorded": "kiro:instance 已經切換成自己的 agent,但 AgEnD 無法記錄這件事;下次啟動會再檢查,在記錄成功前保留共用設定。",
1012
+ "kiro.switch_timeout": "kiro:恢復的對話沒有在 {0} 秒內切換成這個 instance 的 agent。它會照舊繼續執行並保留共用設定;下次啟動會再試。",
881
1013
  "kiro.version_untested": "kiro-cli {0} 比 AgEnD 實際跑過的最新版本({1})還新。啟動參數是依照 `kiro-cli chat --help` 判斷的;若有異常,請回報這個版本。",
882
1014
  "inst.cli_unsupported": "⛔ `{0}` 沒有啟動:{1}",
883
1015
  "fleet.cli_unsupported": "⛔ 沒有啟動({0}):{1}\n這些 instance 不會自動重試;換了 CLI 或修改設定之後再啟動即可。",
@@ -910,6 +1042,11 @@ const zhTWMessages = {
910
1042
  "inst.codex_capacity_nudge_text": "只有上一個請求還沒做完才繼續;如果已經做完,就回覆說已完成。",
911
1043
  "inst.malformed_tool_call_recovered": "⚠️ {0}:偵測到 malformed Claude tool-call,已嘗試恢復回覆。",
912
1044
  "inst.malformed_tool_call_unrecoverable": "⚠️ {0}:偵測到 malformed Claude tool-call,但無法擷取可恢復的回覆文字。",
1045
+ "web.echo_full_text": "完整內容請看 web chat",
1046
+ "web.raw_public_refused": "公開連結無法使用 /raw:它會繞過 [user:] 包裝直接送進 CLI。請當成一般訊息送出,或改在 Discord 或本機登入的工作階段使用。",
1047
+ "web.command_public_refused": "公開連結無法使用 {0}。",
1048
+ "web.command_unknown": "{0} 不是 web chat 可執行的指令,請改成一般訊息送出。",
1049
+ "web.command_no_choices": "這個 instance 的 {0} 沒有可選的項目。",
913
1050
  "inst.reply_drop_retrying": "⚠️ 代理已結束這一輪,但沒有送出回覆。AgEnD 會要求它補送一次精簡結論。",
914
1051
  "inst.reply_drop_unknown": "⚠️ 代理這一輪的回覆無法確認是否送達。為避免重複訊息,AgEnD 不會自動重送;如有需要,請再詢問一次。",
915
1052
  "inst.reply_drop_unrecovered": "⚠️ 代理在一次補送後仍未送出回覆。長對話可能已使回覆工具退化;請先把重要內容保存到 soul.md,再執行 /clear。",
@@ -928,12 +1065,12 @@ const zhTWMessages = {
928
1065
  "interactive.kind.password": "密碼",
929
1066
  "interactive.kind.confirmation": "Y/N 確認",
930
1067
  "interactive.kind.press_enter": "按 Enter",
931
- "interactive.general_notice": "⚠️ {0} 正在等待人工輸入({1})。請 General 協助嗎?",
1068
+ "interactive.general_notice": "⚠️ {0} 正在等待人工輸入({1})。要請 General 協助,還是你自己到它的終端機處理?",
932
1069
  "interactive.instance_notice": "⚠️ {0} 正在等待人工輸入。請至 General channel 確認處理方式。",
933
- "interactive.confirm": "確認",
934
- "interactive.cancel": "取消",
1070
+ "interactive.confirm": "請 General 協助",
1071
+ "interactive.cancel": "我自己處理",
935
1072
  "interactive.confirmed": "✅ 已請 General 協助處理 {0}。",
936
- "interactive.ignored": "🚫 已忽略 {0} 的人工輸入提示。",
1073
+ "interactive.ignored": "🙋 {0} 的輸入提示由你自己處理,未請 General 協助。",
937
1074
  "interactive.expired": "⌛ {0} 的人工輸入協助請求已逾時。",
938
1075
  "interactive.self_assist": "⚠️ {0} 就是 General;阻塞時無法自助。請直接使用 tmux attach。",
939
1076
  "interactive.delivery_failed": "❌ 無法把 {0} 的協助請求送進 General。",
@@ -958,6 +1095,8 @@ const zhTWMessages = {
958
1095
  "buttons.stale": "⌛ 此提示已逾時,無法再操作。",
959
1096
  "buttons.stale_notice": "⌛ 此提示已逾時,請重新執行指令取得新的提示。",
960
1097
  "buttons.admin_only": "⛔ 只有 fleet 管理員可以使用這個按鈕。",
1098
+ "buttons.not_allowed": "⛔ 你無法使用這個按鈕。",
1099
+ "menu.click_stale": "⚠️ 沒有變更:這個 instance 已移到另一個 bot,或你已不再是那裡的管理員。請重新開啟選單。",
961
1100
  "buttons.wrong_place": "⚠️ 這個按鈕和它所屬的提示對不上,請重新執行指令。",
962
1101
  "buttons.post_failed": "⚠️ 無法送出按鈕:{0}",
963
1102
  "tips.label": "小提示",
@@ -1007,12 +1146,13 @@ const zhTWMessages = {
1007
1146
  "slash.dm_unsupported": "此指令只能在 AgEnD 伺服器的頻道中使用,不能在私訊中使用。",
1008
1147
  "slash.ack_failed": "{0} ⏱ {1} 沒能及時回應——它在你送出後 {2} 秒才到 AgEnD,而 Discord 只給 3 秒。這次**沒有執行**(不會重複執行),請再送一次。",
1009
1148
  "slash.wrong_server": "此伺服器無法使用此指令。",
1149
+ "slash.other_bot": "這個頻道屬於 fleet 裡的另一個 bot,請在這裡使用那個 bot 的指令。",
1010
1150
  "slash.start": "在此頻道啟動 Agent",
1011
1151
  "slash.stop": "停止此頻道的 Agent",
1012
1152
  "slash.chat": "傳送訊息給 Agent",
1013
1153
  "slash.ctx": "顯示 Context 使用量",
1014
1154
  "slash.cancel": "中斷 Agent 目前的動作(送出 Escape)",
1015
- "slash.dashboard": "取得儀表板網址(管理員)",
1155
+ "slash.dashboard": "登入網頁儀表板與網頁聊天(管理員)",
1016
1156
  "slash.compact": "壓縮 Agent 的 Context",
1017
1157
  "slash.compact_arg": "[選填:摘要重點,僅 Claude Code]",
1018
1158
  "slash.steer": "插入指示到 Agent 當前任務",
@@ -1020,6 +1160,7 @@ const zhTWMessages = {
1020
1160
  "steer.sent": "🎯 已將指示插入 {0} 的當前任務(若 CLI 不接受忙碌輸入會自動改排隊)。",
1021
1161
  "steer.not_connected": "❌ instance 未連線(IPC 不可用)",
1022
1162
  "steer.unsupported": "⚠️ {0} Backend 尚未支援 /steer(其 TUI 無法在回合中接收輸入)。訊息未送出——請改用一般訊息,或先 /cancel。",
1163
+ "steer.unsupported_launch": "⚠️ 這個 {0} instance 目前的執行方式不支援 /steer:只有已驗證版本的 TUI 能在回合中接收輸入(legacy UI 不行)。訊息未送出——請改用一般訊息,或先 /cancel。",
1023
1164
  "slash.btw": "不中斷目前任務,詢問一個旁支問題",
1024
1165
  "btw.usage": "用法:/btw <訊息> — 向 Claude Code 詢問旁支問題,不中斷目前任務",
1025
1166
  "btw.sent": "💬 已將旁支問題送給 {0}。",
@@ -1114,11 +1255,13 @@ const zhTWMessages = {
1114
1255
  "login.remote_unsupported_agent_cli": "⛔ {0} 的遠端登入在這個版本不支援。`{1}` 是完整的 agent CLI、沒有隔離的登入子指令 —— 登入等於跑整個 agent,違反瀏覧器終端「只跑登入指令、沒有 shell」的邊界。請暫時在主機上直接執行 `{1}` 登入;等上游提供專用 login 指令後再支援。",
1115
1256
  "classic.approve_done_group": "✅ 已開放存取 —— `{0}` 已加入允許清單。",
1116
1257
  "classic.approve_done_group_already": "ℹ️ `{0}` 本來就在允許清單裡,沒有變更。",
1117
- "classic.approve_done_group_open": "ℹ️ `{0}` 目前已經被允許:清單是空的,代表「全部允許」。加進去反而會變成只允許它、把其他聊天室全部擋掉,所以沒有做任何變更。",
1118
1258
  "classic.approve_done_admin": "✅ 已將 `{0}` 設為 ClassicBot 管理員。",
1119
1259
  "classic.approve_done_admin_already": "ℹ️ `{0}` 本來就是 ClassicBot 管理員。",
1120
1260
  "classic.approve_failed": "⚠️ 無法開放 `{0}` 的存取 —— 這個 fleet 沒有設定 ClassicBot。",
1121
1261
  "classic.unrecoverable_ids": "⚠️ classicBot.yaml 裡有永遠無法比對成功的 ID:{0}\n\n它們沒有加引號、而且大到超出 YAML 精度,讀取時末幾位數字就已經遺失。請從 Discord 或 Telegram 重新複製正確 ID、**加引號**重新填入 —— 檔案裡現在顯示的數字本身就是錯的,不要從檔案複製。",
1262
+ "classic.approve_user": "✅ 允許此使用者",
1263
+ "classic.request_allowed": "✅ 存取已核准。請再次 /start(群組請由 ClassicBot 管理員使用 /start@BotUsername)。",
1264
+ "classic.request_ignored": "🚫 你的存取請求已忽略,未授予存取權。",
1122
1265
  "classic.approve_group": "✅ 允許此群組",
1123
1266
  "classic.approve_group_admin": "✅ 允許+設為管理員",
1124
1267
  "classic.approve_ignore": "🚫 忽略",
@@ -1147,6 +1290,7 @@ const zhTWMessages = {
1147
1290
  "slash.profile": "錄製有時限的 CPU profile(僅 General 管理員)",
1148
1291
  "slash.option.profile_seconds": "錄製秒數(1–1800;預設 60)",
1149
1292
  "profile.general_only": "⛔ /profile 只能在 General 使用。",
1293
+ "cmd.use_in_general": "ℹ️ {0} 要在 General topic 使用,請到那裡執行。",
1150
1294
  "profile.disabled": "⛔ /profile 已停用 — 未設定 Fleet 管理員。",
1151
1295
  "profile.invalid": "用法:/profile [秒數] — 1 到 1800 的整數(預設 60)。",
1152
1296
  "profile.started": "🔬 正在錄製 {0} 秒的 CPU profile,完成後會在 General 公布。",
@@ -1172,6 +1316,7 @@ const zhTWMessages = {
1172
1316
  "slash.option.instance": "instance 名稱(在 General 中為必填)",
1173
1317
  "slash.option.message": "訊息內容",
1174
1318
  "slash.option.tips_mode": "選填的每日提示設定",
1319
+ "slash.option.dashboard_action": "選填:revoke 讓所有瀏覽器登出",
1175
1320
  "slash.option.visibility_mode": "full、summary 或 hidden;留空則顯示目前設定",
1176
1321
  "slash.option.steer_message": "要在任務中途傳給 Agent 的內容",
1177
1322
  "slash.option.compact_instructions": "選填:摘要要著重的內容(僅 Claude Code 支援,其他後端會忽略)",
@@ -1451,6 +1596,9 @@ const zhTWMessages = {
1451
1596
  "storm.recovered": "✅ tmux 恢復完成:{0}/{1} 個 instance 已恢復。尚未恢復:{2}。",
1452
1597
  "storm.timed_out": "⚠️ tmux 恢復逾時:{0}/{1} 個 instance 已恢復。尚未恢復:{2}。",
1453
1598
  "storm.none": "無",
1599
+ "eventlog.locked": "⚠️ events.db 被其他行程鎖住超過 5 秒,因此沒有開啟。檔案原封不動;在 AgEnD 重新啟動前,事件紀錄暫停。",
1600
+ "eventlog.abi": "⚠️ events.db 無法開啟:AgEnD 的 SQLite 驅動在這個 Node.js 上載入失敗(是為其他版本或架構編譯的)。檔案原封不動。請重新安裝 AgEnD(或在套件目錄執行 `npm rebuild better-sqlite3`)後重新啟動。",
1601
+ "eventlog.unopenable": "⚠️ events.db 無法開啟(權限、磁碟或 I/O 問題,詳見 daemon.log)。檔案原封不動;在 AgEnD 重新啟動前,事件紀錄暫停。",
1454
1602
  "storm.window_loss": "⚠️ {0} 個 instance 在 {1} 秒內同時失去 tmux 視窗,但 tmux server 仍在運作 — 這是主機或 tmux 層級的事件,不是 {0} 次獨立當機。正以較低速率重新啟動(同時最多 {2} 個),並合併為單一事件通知。",
1455
1603
  "general.antigravity_unsupported": "⚠️ Antigravity 無法接收 MCP instructions,因此不支援 General instance。請改用 Claude Code 或 Kiro CLI。",
1456
1604
  "classic.manager_unavailable": "Classic channel manager 尚未初始化。",