@songsid/agend 2.3.3 → 2.3.4-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 (368) hide show
  1. package/README.md +3 -3
  2. package/README.zh-TW.md +3 -3
  3. package/THIRD_PARTY_NOTICES.md +37 -0
  4. package/dist/agend-home.d.ts +13 -0
  5. package/dist/agend-home.js +42 -0
  6. package/dist/agend-home.js.map +1 -1
  7. package/dist/agent-cli-instructions.md +2 -2
  8. package/dist/agent-credentials.d.ts +24 -0
  9. package/dist/agent-credentials.js +66 -0
  10. package/dist/agent-credentials.js.map +1 -0
  11. package/dist/agent-endpoint.d.ts +3 -1
  12. package/dist/agent-endpoint.js +13 -0
  13. package/dist/agent-endpoint.js.map +1 -1
  14. package/dist/auth-api.d.ts +16 -3
  15. package/dist/auth-api.js +32 -8
  16. package/dist/auth-api.js.map +1 -1
  17. package/dist/authority/session-authorizations.d.ts +28 -4
  18. package/dist/authority/session-authorizations.js +63 -17
  19. package/dist/authority/session-authorizations.js.map +1 -1
  20. package/dist/authority/web-authority.d.ts +15 -1
  21. package/dist/authority/web-authority.js +27 -10
  22. package/dist/authority/web-authority.js.map +1 -1
  23. package/dist/backend/antigravity.js +3 -1
  24. package/dist/backend/antigravity.js.map +1 -1
  25. package/dist/backend/claude-code.d.ts +3 -0
  26. package/dist/backend/claude-code.js +100 -5
  27. package/dist/backend/claude-code.js.map +1 -1
  28. package/dist/backend/codex-footer-hints.d.ts +4 -0
  29. package/dist/backend/codex-footer-hints.js +27 -0
  30. package/dist/backend/codex-footer-hints.js.map +1 -0
  31. package/dist/backend/codex-session-lookup.d.ts +35 -0
  32. package/dist/backend/codex-session-lookup.js +93 -0
  33. package/dist/backend/codex-session-lookup.js.map +1 -1
  34. package/dist/backend/codex.d.ts +27 -0
  35. package/dist/backend/codex.js +136 -23
  36. package/dist/backend/codex.js.map +1 -1
  37. package/dist/backend/kiro-identity.d.ts +2 -0
  38. package/dist/backend/kiro-identity.js +13 -6
  39. package/dist/backend/kiro-identity.js.map +1 -1
  40. package/dist/backend/kiro.d.ts +3 -0
  41. package/dist/backend/kiro.js +68 -5
  42. package/dist/backend/kiro.js.map +1 -1
  43. package/dist/backend/muse.js +5 -3
  44. package/dist/backend/muse.js.map +1 -1
  45. package/dist/backend/types.d.ts +13 -1
  46. package/dist/backend/types.js +3 -0
  47. package/dist/backend/types.js.map +1 -1
  48. package/dist/backend-availability.d.ts +6 -0
  49. package/dist/backend-availability.js +13 -5
  50. package/dist/backend-availability.js.map +1 -1
  51. package/dist/cache-ledger.d.ts +85 -0
  52. package/dist/cache-ledger.js +236 -1
  53. package/dist/cache-ledger.js.map +1 -1
  54. package/dist/cache-service.d.ts +5 -0
  55. package/dist/cache-service.js +16 -4
  56. package/dist/cache-service.js.map +1 -1
  57. package/dist/channel/adapters/discord.js +27 -4
  58. package/dist/channel/adapters/discord.js.map +1 -1
  59. package/dist/channel/adapters/telegram.d.ts +51 -0
  60. package/dist/channel/adapters/telegram.js +238 -18
  61. package/dist/channel/adapters/telegram.js.map +1 -1
  62. package/dist/channel/inbox-temp-name.d.ts +9 -0
  63. package/dist/channel/inbox-temp-name.js +13 -0
  64. package/dist/channel/inbox-temp-name.js.map +1 -0
  65. package/dist/channel/mcp-tools.js +3 -3
  66. package/dist/channel/mcp-tools.js.map +1 -1
  67. package/dist/channel/types.d.ts +2 -0
  68. package/dist/chat-log-ids.d.ts +48 -0
  69. package/dist/chat-log-ids.js +182 -0
  70. package/dist/chat-log-ids.js.map +1 -0
  71. package/dist/classic-channel-manager.d.ts +8 -1
  72. package/dist/classic-channel-manager.js +24 -2
  73. package/dist/classic-channel-manager.js.map +1 -1
  74. package/dist/cli.js +4 -6
  75. package/dist/cli.js.map +1 -1
  76. package/dist/config-validator.js +18 -1
  77. package/dist/config-validator.js.map +1 -1
  78. package/dist/cross-instance-notice.d.ts +10 -0
  79. package/dist/cross-instance-notice.js +67 -5
  80. package/dist/cross-instance-notice.js.map +1 -1
  81. package/dist/daemon.d.ts +52 -0
  82. package/dist/daemon.js +538 -35
  83. package/dist/daemon.js.map +1 -1
  84. package/dist/delivery-consumed-watch.d.ts +23 -1
  85. package/dist/delivery-consumed-watch.js +30 -3
  86. package/dist/delivery-consumed-watch.js.map +1 -1
  87. package/dist/delivery-reconciliation.d.ts +7 -0
  88. package/dist/delivery-reconciliation.js +9 -1
  89. package/dist/delivery-reconciliation.js.map +1 -1
  90. package/dist/dialog-screen-text.d.ts +16 -0
  91. package/dist/dialog-screen-text.js +51 -0
  92. package/dist/dialog-screen-text.js.map +1 -0
  93. package/dist/env-file.d.ts +2 -0
  94. package/dist/env-file.js +13 -8
  95. package/dist/env-file.js.map +1 -1
  96. package/dist/export-import.d.ts +7 -0
  97. package/dist/export-import.js +44 -10
  98. package/dist/export-import.js.map +1 -1
  99. package/dist/fleet-context.d.ts +2 -0
  100. package/dist/fleet-manager.d.ts +172 -12
  101. package/dist/fleet-manager.js +897 -139
  102. package/dist/fleet-manager.js.map +1 -1
  103. package/dist/fleet-yaml-patch.d.ts +3 -0
  104. package/dist/fleet-yaml-patch.js +103 -0
  105. package/dist/fleet-yaml-patch.js.map +1 -0
  106. package/dist/general-knowledge/skills/concepts/SKILL.md +393 -0
  107. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +2 -1
  108. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
  109. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
  110. package/dist/general-knowledge/skills/model-discovery/SKILL.md +2 -0
  111. package/dist/general-knowledge/skills/web-appearance/SKILL.md +1 -1
  112. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +14 -4
  113. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  114. package/dist/install-stream.d.ts +53 -0
  115. package/dist/install-stream.js +134 -0
  116. package/dist/install-stream.js.map +1 -0
  117. package/dist/instance-config-impact.js +1 -0
  118. package/dist/instance-config-impact.js.map +1 -1
  119. package/dist/instance-lifecycle.d.ts +22 -2
  120. package/dist/instance-lifecycle.js +103 -19
  121. package/dist/instance-lifecycle.js.map +1 -1
  122. package/dist/instance-topic-delete.d.ts +77 -0
  123. package/dist/instance-topic-delete.js +123 -0
  124. package/dist/instance-topic-delete.js.map +1 -0
  125. package/dist/instructions.d.ts +2 -2
  126. package/dist/instructions.js +2 -2
  127. package/dist/instructions.js.map +1 -1
  128. package/dist/interaction-observation.d.ts +1 -0
  129. package/dist/interaction-observation.js +1 -1
  130. package/dist/interaction-observation.js.map +1 -1
  131. package/dist/kiro-engine-status.d.ts +11 -0
  132. package/dist/kiro-engine-status.js +6 -0
  133. package/dist/kiro-engine-status.js.map +1 -1
  134. package/dist/kiro-resume-summary.d.ts +37 -0
  135. package/dist/kiro-resume-summary.js +85 -0
  136. package/dist/kiro-resume-summary.js.map +1 -0
  137. package/dist/locale.js +130 -6
  138. package/dist/locale.js.map +1 -1
  139. package/dist/log-service.d.ts +30 -0
  140. package/dist/log-service.js +36 -3
  141. package/dist/log-service.js.map +1 -1
  142. package/dist/log-steps.d.ts +4 -3
  143. package/dist/log-steps.js +32 -7
  144. package/dist/log-steps.js.map +1 -1
  145. package/dist/logger.d.ts +12 -0
  146. package/dist/logger.js +43 -1
  147. package/dist/logger.js.map +1 -1
  148. package/dist/login-controller.js +9 -1
  149. package/dist/login-controller.js.map +1 -1
  150. package/dist/login-flows.d.ts +2 -0
  151. package/dist/login-flows.js +5 -2
  152. package/dist/login-flows.js.map +1 -1
  153. package/dist/login-manager.d.ts +6 -0
  154. package/dist/login-manager.js +10 -1
  155. package/dist/login-manager.js.map +1 -1
  156. package/dist/missed-offline.d.ts +25 -0
  157. package/dist/missed-offline.js +79 -0
  158. package/dist/missed-offline.js.map +1 -0
  159. package/dist/needs-you-hub.d.ts +6 -1
  160. package/dist/needs-you-hub.js +31 -8
  161. package/dist/needs-you-hub.js.map +1 -1
  162. package/dist/needs-you.d.ts +22 -2
  163. package/dist/needs-you.js +17 -3
  164. package/dist/needs-you.js.map +1 -1
  165. package/dist/next-steps.d.ts +12 -2
  166. package/dist/next-steps.js +19 -3
  167. package/dist/next-steps.js.map +1 -1
  168. package/dist/office-share-page.d.ts +1 -1
  169. package/dist/office-share-page.js +6 -2
  170. package/dist/office-share-page.js.map +1 -1
  171. package/dist/office-share-service.d.ts +57 -0
  172. package/dist/office-share-service.js +76 -11
  173. package/dist/office-share-service.js.map +1 -1
  174. package/dist/office-share.d.ts +8 -0
  175. package/dist/office-share.js +34 -0
  176. package/dist/office-share.js.map +1 -1
  177. package/dist/outbound-handlers.js +59 -3
  178. package/dist/outbound-handlers.js.map +1 -1
  179. package/dist/outbound-schemas.d.ts +1 -0
  180. package/dist/outbound-schemas.js +10 -4
  181. package/dist/outbound-schemas.js.map +1 -1
  182. package/dist/package-preimage.js +27 -2
  183. package/dist/package-preimage.js.map +1 -1
  184. package/dist/page-share.d.ts +122 -0
  185. package/dist/page-share.js +199 -0
  186. package/dist/page-share.js.map +1 -0
  187. package/dist/public-preview.d.ts +4 -0
  188. package/dist/public-preview.js +5 -4
  189. package/dist/public-preview.js.map +1 -1
  190. package/dist/public-web-gateway.js +5 -0
  191. package/dist/public-web-gateway.js.map +1 -1
  192. package/dist/queued-handoffs.d.ts +33 -0
  193. package/dist/queued-handoffs.js +75 -0
  194. package/dist/queued-handoffs.js.map +1 -0
  195. package/dist/quickstart-api.d.ts +5 -0
  196. package/dist/quickstart-api.js +1 -1
  197. package/dist/quickstart-api.js.map +1 -1
  198. package/dist/quickstart.d.ts +40 -0
  199. package/dist/quickstart.js +174 -28
  200. package/dist/quickstart.js.map +1 -1
  201. package/dist/remote-card-answer.js +2 -0
  202. package/dist/remote-card-answer.js.map +1 -1
  203. package/dist/remote-card-prompt.js +4 -2
  204. package/dist/remote-card-prompt.js.map +1 -1
  205. package/dist/reply-buttons-controller.js +10 -0
  206. package/dist/reply-buttons-controller.js.map +1 -1
  207. package/dist/scheduler/db.d.ts +2 -1
  208. package/dist/scheduler/db.js +23 -9
  209. package/dist/scheduler/db.js.map +1 -1
  210. package/dist/selection-card.d.ts +20 -0
  211. package/dist/selection-card.js +202 -0
  212. package/dist/selection-card.js.map +1 -0
  213. package/dist/settings-api.d.ts +13 -0
  214. package/dist/settings-api.js +16 -1
  215. package/dist/settings-api.js.map +1 -1
  216. package/dist/settings-change.js +5 -0
  217. package/dist/settings-change.js.map +1 -1
  218. package/dist/settings-effect.js +2 -0
  219. package/dist/settings-effect.js.map +1 -1
  220. package/dist/setup-host.js +2 -2
  221. package/dist/setup-host.js.map +1 -1
  222. package/dist/setup-wizard.js +2 -2
  223. package/dist/setup-wizard.js.map +1 -1
  224. package/dist/stall-reporter.d.ts +21 -0
  225. package/dist/stall-reporter.js +82 -0
  226. package/dist/stall-reporter.js.map +1 -0
  227. package/dist/tmux-control.d.ts +2 -2
  228. package/dist/tmux-control.js +4 -2
  229. package/dist/tmux-control.js.map +1 -1
  230. package/dist/tmux-exec-helper.d.ts +6 -3
  231. package/dist/tmux-exec-helper.js +115 -53
  232. package/dist/tmux-exec-helper.js.map +1 -1
  233. package/dist/tmux-manager.d.ts +6 -0
  234. package/dist/tmux-manager.js +17 -0
  235. package/dist/tmux-manager.js.map +1 -1
  236. package/dist/tool-permissions.d.ts +5 -2
  237. package/dist/tool-permissions.js +6 -5
  238. package/dist/tool-permissions.js.map +1 -1
  239. package/dist/tool-progress.d.ts +2 -0
  240. package/dist/tool-progress.js +19 -3
  241. package/dist/tool-progress.js.map +1 -1
  242. package/dist/topic-commands.js +4 -0
  243. package/dist/topic-commands.js.map +1 -1
  244. package/dist/tunnel/cloudflared-install.d.ts +4 -0
  245. package/dist/tunnel/cloudflared-install.js +20 -1
  246. package/dist/tunnel/cloudflared-install.js.map +1 -1
  247. package/dist/tunnel/cloudflared.d.ts +8 -1
  248. package/dist/tunnel/cloudflared.js +34 -6
  249. package/dist/tunnel/cloudflared.js.map +1 -1
  250. package/dist/tunnel/lease.d.ts +3 -3
  251. package/dist/tunnel/lease.js +23 -19
  252. package/dist/tunnel/lease.js.map +1 -1
  253. package/dist/tunnel/manager.js +6 -7
  254. package/dist/tunnel/manager.js.map +1 -1
  255. package/dist/types.d.ts +10 -0
  256. package/dist/ui/chat-store.js +28 -4
  257. package/dist/ui/chat-strings.js +40 -4
  258. package/dist/ui/chat-thread.js +52 -10
  259. package/dist/ui/fleet-canvas.js +4 -3
  260. package/dist/ui/fleet-office-model.js +55 -22
  261. package/dist/ui/fleet-office-overview.js +6 -38
  262. package/dist/ui/fleet-office-pack.js +4 -3
  263. package/dist/ui/fleet-office-skin.js +114 -21
  264. package/dist/ui/fleet-office-store.js +5 -0
  265. package/dist/ui/fleet-office-zones.js +2 -2
  266. package/dist/ui/fleet-office.js +41 -9
  267. package/dist/ui/fleet-usage.js +90 -27
  268. package/dist/ui/page-share-dialog.js +191 -0
  269. package/dist/ui/panel-chat.js +16 -0
  270. package/dist/ui/panel-log.js +7 -1
  271. package/dist/ui/panel-needs.js +17 -8
  272. package/dist/ui/panel-notices.js +98 -0
  273. package/dist/ui/panel-settings.js +9 -2
  274. package/dist/ui/preview-pages.js +41 -0
  275. package/dist/ui/preview-panel-actions.js +161 -0
  276. package/dist/ui/preview-panel.js +209 -28
  277. package/dist/ui/preview-versions.js +155 -0
  278. package/dist/ui/preview.js +88 -3
  279. package/dist/ui/settings-registry.js +1 -0
  280. package/dist/ui/settings-strings.js +6 -2
  281. package/dist/ui/shared/app-i18n.js +6 -6
  282. package/dist/ui/shared/app-needs.js +1 -1
  283. package/dist/ui/shared/app-route.js +4 -0
  284. package/dist/ui/shared/app-shell.js +9 -5
  285. package/dist/ui/shared/app-store.js +71 -1
  286. package/dist/ui/shared/app-stream.js +27 -1
  287. package/dist/ui/shared/app.css +94 -4
  288. package/dist/ui/shared/app.js +22 -1
  289. package/dist/ui/shared/office/guild.png +0 -0
  290. package/dist/ui/shared/office/school.png +0 -0
  291. package/dist/ui/shared/panel-view.js +339 -17
  292. package/dist/ui/shared/signin.js +12 -1
  293. package/dist/ui/shared/ui-icons.js +3 -0
  294. package/dist/ui/shared/usage-dialog.js +18 -1
  295. package/dist/ui/shared/view-history.css +17 -0
  296. package/dist/ui/shared/view-history.js +438 -0
  297. package/dist/ui/shared/view-strings.js +42 -0
  298. package/dist/ui/shared/web-authorize.js +3 -1
  299. package/dist/unattended-install.d.ts +6 -0
  300. package/dist/unattended-install.js +79 -0
  301. package/dist/unattended-install.js.map +1 -0
  302. package/dist/usage/capacity.d.ts +69 -0
  303. package/dist/usage/capacity.js +119 -0
  304. package/dist/usage/capacity.js.map +1 -0
  305. package/dist/usage/i18n-keys.d.ts +1 -1
  306. package/dist/usage/i18n-keys.js +3 -0
  307. package/dist/usage/i18n-keys.js.map +1 -1
  308. package/dist/usage/profile-timeline.d.ts +16 -0
  309. package/dist/usage/profile-timeline.js +58 -0
  310. package/dist/usage/profile-timeline.js.map +1 -0
  311. package/dist/usage/quota-history.d.ts +43 -0
  312. package/dist/usage/quota-history.js +168 -0
  313. package/dist/usage/quota-history.js.map +1 -0
  314. package/dist/usage/usage-api.d.ts +31 -0
  315. package/dist/usage/usage-api.js +80 -1
  316. package/dist/usage/usage-api.js.map +1 -1
  317. package/dist/usage-report.d.ts +25 -1
  318. package/dist/usage-report.js +55 -4
  319. package/dist/usage-report.js.map +1 -1
  320. package/dist/usage-rollup.d.ts +4 -1
  321. package/dist/usage-rollup.js +12 -3
  322. package/dist/usage-rollup.js.map +1 -1
  323. package/dist/view-api.d.ts +31 -0
  324. package/dist/view-api.js +186 -41
  325. package/dist/view-api.js.map +1 -1
  326. package/dist/view-history.d.ts +84 -0
  327. package/dist/view-history.js +116 -0
  328. package/dist/view-history.js.map +1 -0
  329. package/dist/web-api.d.ts +32 -0
  330. package/dist/web-api.js +195 -5
  331. package/dist/web-api.js.map +1 -1
  332. package/dist/web-auth.js +7 -1
  333. package/dist/web-auth.js.map +1 -1
  334. package/dist/web-chat-history.d.ts +20 -0
  335. package/dist/web-chat-history.js +21 -0
  336. package/dist/web-chat-history.js.map +1 -1
  337. package/dist/web-guest-access.js +5 -1
  338. package/dist/web-guest-access.js.map +1 -1
  339. package/dist/web-login.d.ts +6 -3
  340. package/dist/web-login.js +26 -15
  341. package/dist/web-login.js.map +1 -1
  342. package/dist/web-notices.d.ts +51 -0
  343. package/dist/web-notices.js +118 -0
  344. package/dist/web-notices.js.map +1 -0
  345. package/dist/web-office-pack-tools.d.ts +1 -1
  346. package/dist/web-office-pack-tools.js +1 -1
  347. package/dist/web-office-pack-tools.js.map +1 -1
  348. package/dist/web-only-fleet.d.ts +22 -0
  349. package/dist/web-only-fleet.js +13 -0
  350. package/dist/web-only-fleet.js.map +1 -0
  351. package/dist/web-preview.d.ts +32 -3
  352. package/dist/web-preview.js +52 -19
  353. package/dist/web-preview.js.map +1 -1
  354. package/dist/web-session-authorization.d.ts +13 -2
  355. package/dist/web-session-authorization.js +10 -3
  356. package/dist/web-session-authorization.js.map +1 -1
  357. package/dist/web-session.d.ts +12 -0
  358. package/dist/web-session.js +22 -8
  359. package/dist/web-session.js.map +1 -1
  360. package/dist/web-settings-patch.d.ts +3 -1
  361. package/dist/web-settings-patch.js +4 -1
  362. package/dist/web-settings-patch.js.map +1 -1
  363. package/dist/web-shell-routes.d.ts +2 -0
  364. package/dist/web-shell-routes.js +3 -0
  365. package/dist/web-shell-routes.js.map +1 -1
  366. package/launcher/agend-install.cjs +16 -2
  367. package/launcher/private-home.cjs +1 -1
  368. package/package.json +1 -1
@@ -62,6 +62,10 @@ Close it with **Close public link** → **Close link (signs public browsers out)
62
62
  A public link is limited on purpose: no live stream (the page polls), no custom CSS, and Settings → Access & security, Look,
63
63
  schedule edits and preference writes are refused. HTML previews work over it through a second tunnel
64
64
  of their own (`web.preview_on_public_link`, default on).
65
+ HTML previews cannot load from the network; Settings → Web dashboard → **HTML previews may load libraries from cdnjs /
66
+ jsDelivr** (`web.preview_cdn`, default off) allows scripts, styles and fonts from cdnjs `/ajax/libs/` and jsDelivr `/npm/`
67
+ only — those requests leave the machine. The preview panel steps between a page's versions (‹ v2/3 ›, **Changes**),
68
+ lists every page (**Pages (N)**), shows a page at phone or tablet width, and goes full screen.
65
69
 
66
70
  **Sessions.**
67
71
  - Local: 48 h from sign-in and 48 h unused (`web.session.local.absolute_hours` / `idle_hours`, 1–720). Background
@@ -75,7 +79,7 @@ of their own (`web.preview_on_public_link`, default on).
75
79
  - `/web revoke` (in chat) signs every browser out, withdraws an unused code and closes the public link.
76
80
 
77
81
  **`/view` without signing in.** `web.view_access`: `open` (default) or `session`. With `open`, anyone who can reach
78
- the local address sees every instance's live terminal and the roster (status, context %, model, effort, backend,
82
+ the local address sees every instance's live terminal (for Claude Code with its earlier conversation, as below) and the roster (status, context %, model, effort, backend,
79
83
  tags, name, description, avatars, cards) and the usage meters — read only; editing says "Sign in to edit". Over a
80
84
  public link `/view` always needs sign-in.
81
85
 
@@ -97,7 +101,7 @@ They can chat there unless `web.guests.chat` is false, run only the commands the
97
101
  agent's channel (on the web: `/ctx`, `/steer`, `/btw`, `/cancel`; anything else is refused), open the usage panel, and the
98
102
  agent sees them as `via web (guest)`. A guest's app has no Fleet, Settings or Needs you. Each person is **Chat** (the
99
103
  default) or **Trusted** (#2855, `level: trusted` on the grant; Chat → Trusted waits for a fleet admin): a Trusted guest
100
- also gets a read-only **View** of those agents (no typing; 2 reads a second, 2 agents at once) and **search** of the chat
104
+ also gets a read-only **View** of those agents (no typing; 2 reads a second, 2 agents at once; for Claude Code with its earlier conversation) and **search** of the chat
101
105
  messages it can already see (6 a minute, 20 results; no messages between agents, tasks or settings). To invite someone: turn it
102
106
  on, grant them their agents in Settings → Access & security → Guests, and press **Send sign-in code** (or tell them to
103
107
  send `/web`). The Guests section is not in Settings over the public link.
@@ -287,8 +291,9 @@ buttons in General); every change is logged and told in General. **Style** (per
287
291
  **Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
288
292
  **Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
289
293
  restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
290
- own) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
291
- Cozy or a pack,
294
+ own), **Guild** and **School** (#2947: two more pictures on the Cozy's arrangement — an adventurers' guild hall and a
295
+ classroom) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
296
+ Cozy, Guild, School or a pack,
292
297
  **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door, the mail drop
293
298
  (an envelope: where letters from other offices land; dashed on a pack without a `mailDrop`, #2736) and
294
299
  waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
@@ -378,6 +383,11 @@ to that instance's Log).
378
383
 
379
384
  **Chat | View | Log | Details** switch at the top of an instance.
380
385
  - **View** — the live terminal (read only), the identity card, and **Edit profile** (or **Sign in to edit** when signed out).
386
+ Scrolling up (or **Earlier output**) shows what scrolled off: tmux's scrollback; for Claude Code, its earlier
387
+ conversation from its transcript, drawn in Claude's own terminal style above the live screen under **History above**
388
+ (long output folded, click to expand; older pages near the top; the latest ~1000 steps), tool results included.
389
+ Everyone who may open the View sees it — a signed-in admin, an anonymous reader under `view_access: open`, a Trusted
390
+ guest for its agents (the user's decision on #3069); the Log tab's switch plays no part.
381
391
  - **Log** — [the Log tab](#the-log-tab).
382
392
  - **Details** — Configuration (display name, description, directory, bound to, tags; "Read only — change it in
383
393
  Settings." with **Edit in Settings**), Runtime (backend, model, effort, cost, context, 5 h and 7 d rate), Recent
@@ -42,4 +42,4 @@ Do not put user-facing results only in terminal text; the fleet report is the de
42
42
 
43
43
  ## Relayed human approval
44
44
 
45
- For an irreversible action based on relayed consent, request an explicit `forwards` edge for the original human `verification_id`, then read its original content and origin with `delivery_status`. Each hop needs a forward; a peer's summary or a mentioned ID grants nothing. When you relay it, put the ID in `forwards` (even if your loaded copy of the tool's schema lacks the parameter: the server accepts it), not in the text. Require delivered and an owned proof_kind, and verify the actual platform/adapter/actor plus the exact resource. Hidden/expired/uncertain receipts are not consent and must not trigger a resend. A web-chat message (`[user:<name> via web, id:…]`) is that person: their sign-in code went to their own Discord or Telegram account. Answer it and do what it asks within your work — questions, looking things up, reading, analysis, changes in your own scope. Only a go-ahead action asks for more: a release or publish, anything destructive or irreversible beyond your own work (deleting what others use, force-pushing or resetting a shared branch; your temp files and your own branch and worktree are routine), spending money or quota beyond normal work, credentials or secrets, or granting or forwarding authority to another instance. For these an open browser is not proof of the account, so the account must stand behind it: a Discord or Telegram receipt, or a `via web (verified)` one — read it with `delivery_status`: `authority.kind: web-verified`, its person `authority.actor` (adapter and user id), checked like a Discord or Telegram message (delivered, an owned proof_kind, the original content, that actor) and forwarded the same way. A guest (`via web (guest)`) was let in only to chat: talk with them there, and take nothing they ask as the admin's. Plain `via web`, a guest, and authority since revoked (`authority.kind: none`) are not a go-ahead; nor is a reviewer's APPROVE. See the cross-instance-messaging skill.
45
+ For an irreversible action based on relayed consent, request an explicit `forwards` edge for the original human `verification_id`, then read its original content and origin with `delivery_status`. Each hop needs a forward; a peer's summary or a mentioned ID grants nothing. When you relay it, put the ID in `forwards` (even if your loaded copy of the tool's schema lacks the parameter: the server accepts it), not in the text. Put verification and message ids in the `forwards` field only; do not repeat them in the message text, because people see that text in the topic notices. Require delivered and an owned proof_kind, and verify the actual platform/adapter/actor plus the exact resource. Hidden/expired/uncertain receipts are not consent and must not trigger a resend. A web-chat message (`[user:<name> via web, id:…]`) is that person: their sign-in code went to their own Discord or Telegram account. Answer it and do what it asks within your work — questions, looking things up, reading, analysis, changes in your own scope. Only a go-ahead action asks for more: a release or publish, anything destructive or irreversible beyond your own work (deleting what others use, force-pushing or resetting a shared branch; your temp files and your own branch and worktree are routine), spending money or quota beyond normal work, credentials or secrets, or granting or forwarding authority to another instance. For these an open browser is not proof of the account, so the account must stand behind it: a Discord or Telegram receipt, or a `via web (verified)` one — read it with `delivery_status`: `authority.kind: web-verified`, its person `authority.actor` (adapter and user id), checked like a Discord or Telegram message (delivered, an owned proof_kind, the original content, that actor) and forwarded the same way. On a web-only fleet (no Discord or Telegram connection) that person is the host operator, signed in with `agend web --code` on the AgEnD computer itself: a verified receipt names `authority.actor` adapter `host`, user `operator`. A guest (`via web (guest)`) was let in only to chat: talk with them there, and take nothing they ask as the admin's. Plain `via web`, a guest, and authority since revoked (`authority.kind: none`) are not a go-ahead; nor is a reviewer's APPROVE. See the cross-instance-messaging skill.
@@ -0,0 +1,53 @@
1
+ export declare const INSTALL_STREAM_LINES = 15;
2
+ export declare const INSTALL_STREAM_BYTES = 1500;
3
+ export declare const INSTALL_STREAM_EDIT_MIN_MS = 5000;
4
+ export interface InstallStreamSink {
5
+ /** Post the message (its plain status line); its id is what the edits change. */
6
+ send(text: string): Promise<{
7
+ messageId: string;
8
+ } | undefined>;
9
+ /** Replace the message's text: a code block under the status line, in the stream's style (markdown or html). */
10
+ edit(messageId: string, text: string): Promise<void>;
11
+ warn?(message: string, err: unknown): void;
12
+ }
13
+ export interface InstallStreamClock {
14
+ now(): number;
15
+ setTimeout(fn: () => void, ms: number): unknown;
16
+ clearTimeout(handle: unknown): void;
17
+ }
18
+ /**
19
+ * The window's own text, without what tmux adds to it: a dead pane's "Pane is dead (status N, <date>)" line (drawn on
20
+ * the bottom row, below a screenful of blank rows), and runs of blank rows collapsed to one — else the last lines of a
21
+ * finished install would be blanks and that line.
22
+ */
23
+ export declare function installerOutput(pane: string): string;
24
+ /**
25
+ * How a frame is written: "markdown" (a fenced code block — Discord) or "html" (Telegram's own `<pre>`: its markdown
26
+ * conversion keeps a fence as literal backticks).
27
+ */
28
+ export type InstallFrameStyle = "markdown" | "html";
29
+ /** The window's last lines as a code block under a status line; just the status line when there are none. */
30
+ export declare function renderInstallFrame(header: string, pane: string, style?: InstallFrameStyle): string;
31
+ export declare class InstallStream {
32
+ private readonly sink;
33
+ private readonly header;
34
+ private readonly clock;
35
+ private readonly editMinMs;
36
+ private readonly style;
37
+ private messageId;
38
+ private shown;
39
+ private wanted;
40
+ private pane;
41
+ private lastAt;
42
+ private timer;
43
+ private inFlight;
44
+ private closed;
45
+ constructor(sink: InstallStreamSink, header: string, clock?: InstallStreamClock, editMinMs?: number, style?: InstallFrameStyle);
46
+ /** A new capture of the window. Never awaits; nothing is posted until the window shows something. */
47
+ update(pane: string): void;
48
+ /** Stop editing and write the final frame (the last capture, unless a later one is given) over the message. */
49
+ finish(header: string, pane?: string): Promise<void>;
50
+ private schedule;
51
+ /** `header`: the frame's status line as plain text — what a new message is first posted as. */
52
+ private write;
53
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * M-2281 (#2980): the installer's output, live, in the chat that asked `/login` to install a CLI. No page shows the
3
+ * `agend-login-<backend>` window (it is not an instance), so the chat is where its progress is seen.
4
+ *
5
+ * One message, edited in place: the last INSTALL_STREAM_LINES lines of the window, ANSI stripped and secrets masked
6
+ * (dialogScreenText — the whole capture is masked before its bottom is kept), under INSTALL_STREAM_BYTES so it fits
7
+ * a Discord (2000) or Telegram (4096) message. At most one edit per INSTALL_STREAM_EDIT_MIN_MS, one in flight, none
8
+ * for an unchanged frame. The frames come from the session's own poll capture — nothing here reads the pane.
9
+ *
10
+ * Fire-and-forget from the poll: update() only records the frame and arms a timer. finish() stops the edits and
11
+ * writes the final frame (success / failed / timed out / cancelled) over the same message.
12
+ */
13
+ import { dialogScreenText } from "./dialog-screen-text.js";
14
+ export const INSTALL_STREAM_LINES = 15;
15
+ export const INSTALL_STREAM_BYTES = 1_500;
16
+ export const INSTALL_STREAM_EDIT_MIN_MS = 5_000;
17
+ const realClock = {
18
+ now: () => performance.now(),
19
+ setTimeout: (fn, ms) => { const t = setTimeout(fn, ms); t.unref?.(); return t; },
20
+ clearTimeout: handle => clearTimeout(handle),
21
+ };
22
+ /**
23
+ * The window's own text, without what tmux adds to it: a dead pane's "Pane is dead (status N, <date>)" line (drawn on
24
+ * the bottom row, below a screenful of blank rows), and runs of blank rows collapsed to one — else the last lines of a
25
+ * finished install would be blanks and that line.
26
+ */
27
+ export function installerOutput(pane) {
28
+ return pane.replace(/^Pane is dead\b.*$/gm, "").replace(/\n(?:[ \t]*\n){2,}/g, "\n\n");
29
+ }
30
+ const escapeHtml = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
31
+ /** The window's last lines as a code block under a status line; just the status line when there are none. */
32
+ export function renderInstallFrame(header, pane, style = "markdown") {
33
+ const body = dialogScreenText(installerOutput(pane), { lines: INSTALL_STREAM_LINES, bytes: INSTALL_STREAM_BYTES });
34
+ if (!body)
35
+ return style === "html" ? escapeHtml(header) : header;
36
+ // HTML: everything escaped, the only tag is ours. Markdown: a fence inside the output would close the block early,
37
+ // so its backticks become look-alikes.
38
+ return style === "html"
39
+ ? `${escapeHtml(header)}\n<pre>${escapeHtml(body)}</pre>`
40
+ : `${header}\n\`\`\`\n${body.replace(/`/g, "ˋ")}\n\`\`\``;
41
+ }
42
+ export class InstallStream {
43
+ sink;
44
+ header;
45
+ clock;
46
+ editMinMs;
47
+ style;
48
+ messageId;
49
+ shown = "";
50
+ wanted = "";
51
+ pane = "";
52
+ lastAt = Number.NEGATIVE_INFINITY;
53
+ timer = null;
54
+ inFlight = null;
55
+ closed = false;
56
+ constructor(sink, header, clock = realClock, editMinMs = INSTALL_STREAM_EDIT_MIN_MS, style = "markdown") {
57
+ this.sink = sink;
58
+ this.header = header;
59
+ this.clock = clock;
60
+ this.editMinMs = editMinMs;
61
+ this.style = style;
62
+ }
63
+ /** A new capture of the window. Never awaits; nothing is posted until the window shows something. */
64
+ update(pane) {
65
+ if (this.closed)
66
+ return;
67
+ this.pane = pane;
68
+ const frame = renderInstallFrame(this.header, pane, this.style);
69
+ if (frame === renderInstallFrame(this.header, "", this.style) && this.messageId === undefined)
70
+ return;
71
+ this.wanted = frame;
72
+ this.schedule();
73
+ }
74
+ /** Stop editing and write the final frame (the last capture, unless a later one is given) over the message. */
75
+ async finish(header, pane) {
76
+ this.closed = true;
77
+ if (this.timer !== null) {
78
+ this.clock.clearTimeout(this.timer);
79
+ this.timer = null;
80
+ }
81
+ await this.inFlight;
82
+ const frame = renderInstallFrame(header, pane ?? this.pane, this.style);
83
+ // Nothing was ever shown: the result message says it all.
84
+ if (this.messageId === undefined && frame === renderInstallFrame(header, "", this.style))
85
+ return;
86
+ // The final edit keeps the rate too: it waits out what is left of the interval rather than skip it.
87
+ const wait = this.lastAt + this.editMinMs - this.clock.now();
88
+ if (wait > 0)
89
+ await new Promise(resolve => this.clock.setTimeout(resolve, wait));
90
+ await this.write(frame, header);
91
+ }
92
+ schedule() {
93
+ if (this.timer !== null || this.inFlight || this.wanted === this.shown)
94
+ return;
95
+ const delay = Math.max(0, this.lastAt + this.editMinMs - this.clock.now());
96
+ this.timer = this.clock.setTimeout(() => {
97
+ this.timer = null;
98
+ if (this.closed)
99
+ return;
100
+ const frame = this.wanted;
101
+ this.inFlight = this.write(frame, this.header).finally(() => {
102
+ this.inFlight = null;
103
+ if (!this.closed)
104
+ this.schedule();
105
+ });
106
+ }, delay);
107
+ }
108
+ /** `header`: the frame's status line as plain text — what a new message is first posted as. */
109
+ async write(frame, header) {
110
+ if (frame === this.shown)
111
+ return;
112
+ this.lastAt = this.clock.now();
113
+ try {
114
+ if (this.messageId === undefined) {
115
+ // Posted as its plain status line, and every frame goes in by an edit: the message is then one kind from start
116
+ // to end (Telegram posts a text with a code block as a rich message, but edits text with HTML).
117
+ const sent = await this.sink.send(header);
118
+ if (!sent?.messageId)
119
+ return;
120
+ this.messageId = sent.messageId;
121
+ await this.sink.edit(this.messageId, frame);
122
+ }
123
+ else {
124
+ await this.sink.edit(this.messageId, frame);
125
+ }
126
+ this.shown = frame;
127
+ }
128
+ catch (err) {
129
+ // A refused edit (rate limit, a reconnect) is tried again with the next frame, after the interval.
130
+ this.sink.warn?.("install output edit failed", err);
131
+ }
132
+ }
133
+ }
134
+ //# sourceMappingURL=install-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-stream.js","sourceRoot":"","sources":["../src/install-stream.ts"],"names":[],"mappings":"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"}
@@ -97,6 +97,7 @@ const FLEET_FIELD_IMPACTS = {
97
97
  "web.log_tab": "now",
98
98
  "web.usage_report_on_public_link": "now",
99
99
  "web.office_levels": "now",
100
+ "web.preview_cdn": "now",
100
101
  "web.public_link.allow_public": "now",
101
102
  "web.public_link.ttl_minutes": "now",
102
103
  "web.public_link.protocol": "now",
@@ -1 +1 @@
1
- {"version":3,"file":"instance-config-impact.js","sourceRoot":"","sources":["../src/instance-config-impact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instance-config-impact.js","sourceRoot":"","sources":["../src/instance-config-impact.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { SettingsExecution } from "./settings-transaction.js";
2
2
  import type { InstanceConfig, FleetConfig } from "./types.js";
3
+ import type { TopicDeleteOutcome } from "./instance-topic-delete.js";
3
4
  import { RoutingEngine } from "./routing-engine.js";
4
5
  import type { Logger } from "./logger.js";
5
6
  import type { IpcClient } from "./channel/ipc-bridge.js";
@@ -41,6 +42,11 @@ export interface BackendInstallationInfo {
41
42
  export declare const BACKEND_INSTALLATION_INFO: Readonly<Record<string, BackendInstallationInfo>>;
42
43
  /** Check one executable using the same PATH visible to the fleet process. */
43
44
  export declare function checkBinaryInstalled(binary: string): boolean;
45
+ /**
46
+ * M-2281 (#2980): the same check without holding the fleet loop — for paths a chat click runs (`/login`'s install
47
+ * routing), where a slow PATH (WSL's /mnt/c entries) would otherwise stall every adapter for up to the timeout.
48
+ */
49
+ export declare function checkBinaryInstalledAsync(binary: string): Promise<boolean>;
44
50
  /**
45
51
  * Return why an instance daemon PID must not receive SIGTERM, or null when the
46
52
  * stale-process cleanup may proceed. daemon.pid historically stores the shared
@@ -52,6 +58,7 @@ export declare function getUnsafeInstanceDaemonPidReason(pid: number, dataDir: s
52
58
  * FleetManager implements this.
53
59
  */
54
60
  export interface LifecycleContext {
61
+ readonly agentCredentials?: Pick<import("./agent-credentials.js").AgentCredentials, "issue" | "invalidate">;
55
62
  readonly fleetConfig: FleetConfig | null;
56
63
  readonly logger: Logger;
57
64
  readonly dataDir: string;
@@ -86,8 +93,12 @@ export interface LifecycleContext {
86
93
  }): Promise<void>;
87
94
  connectIpcToInstance(name: string): Promise<void>;
88
95
  createForumTopic(topicName: string, adapterId?: string): Promise<number | string>;
89
- /** adapterId selects the world, mirroring createForumTopic (rollback must delete where it created). */
90
- deleteForumTopic(topicId: number | string, adapterId?: string): Promise<void>;
96
+ /** #2910: no Discord or Telegram connection at all — a new agent gets no topic (it is reached from the dashboard). */
97
+ isWebOnlyFleet?(): boolean;
98
+ /** delete_instance: the removal, then (unless `deleteTopic` is false) the agent's own topic, through its own bot. */
99
+ removeInstanceAndTopic(name: string, authorization: ExplicitInstanceRemoval, opts: {
100
+ deleteTopic: boolean;
101
+ }): Promise<TopicDeleteOutcome>;
91
102
  /**
92
103
  * A bound delete for the world `adapterId` selects, captured by the caller
93
104
  * BEFORE awaiting createForumTopic. Rollback must use exactly this — never
@@ -128,6 +139,8 @@ export interface LifecycleContext {
128
139
  /** Notify a clean CLI exit and offer an admin-only restart action in General. */
129
140
  notifyNormalExit(name: string): Promise<void>;
130
141
  notifySessionOomStop?(name: string, unclear?: boolean): Promise<void>;
142
+ /** A pre-launch refusal is still a visible wait when no daemon was published. */
143
+ setKiroCompatibilityHold?(name: string, message: string | null): void;
131
144
  /** Tell every General, as an agent, that kiro-cli can no longer run this instance as configured. */
132
145
  queueKiroIncompatNotice?(name: string, reason: string): void;
133
146
  /** True for a dynamic ClassicBot channel instance (not a fleet topic). */
@@ -364,6 +377,13 @@ export declare class InstanceLifecycle {
364
377
  /** Max retries before giving up and pausing. */
365
378
  private static readonly CAPACITY_BACKOFF_MAX;
366
379
  constructor(ctx: LifecycleContext);
380
+ /** M-2269: the last dialog text logged per instance — the same screen seen again on later scans is not logged again. */
381
+ private readonly lastLoggedScreen;
382
+ /**
383
+ * M-2269: `{ screen }` for a dialog/prompt event's Log row (the daemon already stripped, masked and capped it), or
384
+ * nothing when there is none or it is the same text this instance's Log already has. Bookkeeping only.
385
+ */
386
+ private screenForLog;
367
387
  /** Seed only the Codex daemon replacing a scheduled capacity retry. */
368
388
  private applyCapacityBackoffBaseline;
369
389
  /**
@@ -5,12 +5,14 @@ import { existsSync, readFileSync, mkdirSync, realpathSync, writeFileSync, statS
5
5
  import { ensureInstanceDir } from "./private-dir.js";
6
6
  import { assertNoSessionOomStop } from "./session-oom-stop.js";
7
7
  import { execFileSync } from "node:child_process";
8
+ import { execFile } from "./child-process.js";
8
9
  import { join, basename, dirname, resolve, sep as pathSep } from "node:path";
9
10
  import { access } from "node:fs/promises";
10
11
  import { getAgendHome, ensureWorkspaceGit } from "./paths.js";
11
12
  import { DEFAULT_INSTANCE_CONFIG, getEffectiveInstanceDefaults, getTmuxSession, newInstanceKiroUi } from "./config.js";
12
13
  import { readStatuslineModel, uniqueInstanceName } from "./topic-commands.js";
13
- import { isModelCompatible } from "./backend/types.js";
14
+ import { sanitizeInstanceName } from "./instance-names.js";
15
+ import { isModelCompatible, noteResolvedBinary } from "./backend/types.js";
14
16
  import { safeHandler } from "./safe-async.js";
15
17
  import { t } from "./locale.js";
16
18
  import { interactionCategory } from "./interaction-observation.js";
@@ -18,7 +20,7 @@ import { EMBEDDED_CREDENTIAL_REMOTE_REPAIR_FAILED, EMBEDDED_CREDENTIAL_REMOTE_WA
18
20
  import { clearPausedMarker, hasPausedMarker, readPausedAt, readPauseReason, writePausedMarker } from "./pause-marker.js";
19
21
  import { reportProviderRateLimit } from "./usage/provider-alerts.js";
20
22
  import { isFleetStartCommandLine } from "./fleet-lock.js";
21
- import { GENERAL_PAUSE_ERROR, isGeneralInstance } from "./general-instance.js";
23
+ import { GENERAL_PAUSE_ERROR, isGeneralInstance, GENERAL_NAME } from "./general-instance.js";
22
24
  import { BACKEND_AUTH_CHECKS, checkAuthStatus, LOGIN_FLOWS } from "./login-flows.js";
23
25
  import { CHAT_PROFILE_LOGIN_BACKENDS, credentialProfileEnv, credentialProfileLoginCommand } from "./backend/credential-profile.js";
24
26
  import { fetchClaudeUsage, fetchCodexUsage } from "./usage/providers.js";
@@ -64,6 +66,20 @@ export const BACKEND_INSTALLATION_INFO = {
64
66
  export function checkBinaryInstalled(binary) {
65
67
  return measureSyncWork("lifecycle.checkBinaryInstalled", () => checkBinaryInstalledSync(binary));
66
68
  }
69
+ /**
70
+ * M-2281 (#2980): the same check without holding the fleet loop — for paths a chat click runs (`/login`'s install
71
+ * routing), where a slow PATH (WSL's /mnt/c entries) would otherwise stall every adapter for up to the timeout.
72
+ */
73
+ export function checkBinaryInstalledAsync(binary) {
74
+ return new Promise(resolve => {
75
+ try {
76
+ execFile("which", [binary], { timeout: 2000 }, err => resolve(!err));
77
+ }
78
+ catch {
79
+ resolve(false);
80
+ }
81
+ });
82
+ }
67
83
  function checkBinaryInstalledSync(binary) {
68
84
  try {
69
85
  execFileSync("which", [binary], { stdio: "pipe", timeout: 2000 });
@@ -321,6 +337,20 @@ export class InstanceLifecycle {
321
337
  constructor(ctx) {
322
338
  this.ctx = ctx;
323
339
  }
340
+ /** M-2269: the last dialog text logged per instance — the same screen seen again on later scans is not logged again. */
341
+ lastLoggedScreen = new Map();
342
+ /**
343
+ * M-2269: `{ screen }` for a dialog/prompt event's Log row (the daemon already stripped, masked and capped it), or
344
+ * nothing when there is none or it is the same text this instance's Log already has. Bookkeeping only.
345
+ */
346
+ screenForLog(name, screen) {
347
+ if (typeof screen !== "string" || !screen)
348
+ return {};
349
+ if (this.lastLoggedScreen.get(name) === screen)
350
+ return {};
351
+ this.lastLoggedScreen.set(name, screen);
352
+ return { screen };
353
+ }
324
354
  /** Seed only the Codex daemon replacing a scheduled capacity retry. */
325
355
  applyCapacityBackoffBaseline(name, backendName, daemon) {
326
356
  if (backendName !== "codex")
@@ -651,6 +681,24 @@ export class InstanceLifecycle {
651
681
  }
652
682
  this.ctx.notifyInstanceTopic(name, t("delivery.cancelled_unsent", messages.length, name));
653
683
  }, this.ctx.logger, `daemon.human_messages_cancelled[${name}]`));
684
+ // #3030: messages handed to the busy CLI's own queue that it never took (it went idle without them), or that a
685
+ // restart left unverifiable (its transcript could not be read, so they were not sent again). Each is marked ❌ and
686
+ // the person is told once — never a silent ✅.
687
+ daemon.on("human_handoffs_unsettled", safeHandler((data) => {
688
+ const messages = Array.isArray(data?.messages) ? data.messages : [];
689
+ if (!messages.length)
690
+ return;
691
+ const reason = data.reason === "unverifiable" ? "unverifiable" : "not-taken";
692
+ this.ctx.eventLog?.insert(name, "handoffs_unsettled", { reason, count: messages.length });
693
+ this.ctx.logger.warn({ name, reason, count: messages.length }, "Queued messages not taken by the CLI — telling the person");
694
+ for (const m of messages) {
695
+ if (this.ctx.finishDeliveryStatus)
696
+ this.ctx.finishDeliveryStatus(name, m.chatId, m.messageId, "failed", m.threadId);
697
+ else
698
+ this.ctx.reactMessageStatus(name, m.chatId, m.messageId, "failed", m.threadId);
699
+ }
700
+ this.ctx.notifyInstanceTopic(name, t(reason === "unverifiable" ? "delivery.handoff_unverified_after_restart" : "delivery.handoff_not_taken", messages.length, name));
701
+ }, this.ctx.logger, `daemon.human_handoffs_unsettled[${name}]`));
654
702
  }
655
703
  attachIncidentHandlers(name, daemon) {
656
704
  daemon.on("capacity_nudge_cancelled", safeHandler((data) => {
@@ -936,7 +984,7 @@ export class InstanceLifecycle {
936
984
  // position, so the human must LOOK and pick the option explicitly — no
937
985
  // fixed key sequence; a known dialog whose auto-dismiss did not take gets
938
986
  // the keys we would have pressed.
939
- this.ctx.eventLog?.insert(name, "dialog_parked", { description: data.description, holdOnly: data.holdOnly });
987
+ this.ctx.eventLog?.insert(name, "dialog_parked", { description: data.description, holdOnly: data.holdOnly, ...this.screenForLog(name, data.screen) });
940
988
  this.ctx.logger.warn({ name, description: data.description, holdOnly: data.holdOnly }, "Instance is parked on a CLI dialog — not auto-answering");
941
989
  if (this.ctx.isPlannedRestart())
942
990
  return;
@@ -982,7 +1030,7 @@ export class InstanceLifecycle {
982
1030
  // #2822: a usage-limit hold began or ended — Needs you lists it while it lasts.
983
1031
  daemon.on("usage_hold", () => this.ctx.onAttentionChanged?.(name));
984
1032
  daemon.on("interactive_prompt", safeHandler(async (data) => {
985
- this.ctx.eventLog?.insert(name, "interactive_prompt", { kind: data.kind });
1033
+ this.ctx.eventLog?.insert(name, "interactive_prompt", { kind: data.kind, ...this.screenForLog(name, data.screen) });
986
1034
  this.ctx.logger.warn({ name, kind: data.kind, prompt: data.prompt }, "Instance is waiting for interactive terminal input");
987
1035
  if (this.ctx.isPlannedRestart()) {
988
1036
  this.ctx.logger.info({ name }, "Interactive prompt notification suppressed — planned restart in progress");
@@ -1337,6 +1385,7 @@ export class InstanceLifecycle {
1337
1385
  }
1338
1386
  /** Invalidate every start/wake already running for `name` (they will not publish). */
1339
1387
  invalidate(name) {
1388
+ this.ctx.agentCredentials?.invalidate(name);
1340
1389
  this.lifecycleEpochs.set(name, this.epochOf(name) + 1);
1341
1390
  }
1342
1391
  /** Whether `transition` is `name`'s transition and is the one running now. */
@@ -1430,10 +1479,18 @@ export class InstanceLifecycle {
1430
1479
  this.ctx.notifyInstanceTopic(name, t("inst.backend_removed", name, backendName, REMOVED_BACKENDS[backendName].replacement));
1431
1480
  return;
1432
1481
  }
1433
- // Verify backend binary is in PATH before spawning
1482
+ // Verify backend binary is in PATH before spawning. Off-loop resolve pins a
1483
+ // hint so createBackend's resolveBinary does not run synchronous `which`
1484
+ // (#1490 row 67). Missing still only logs; start continues.
1434
1485
  const installation = BACKEND_INSTALLATION_INFO[backendName];
1435
- if (installation && !checkBinaryInstalled(installation.binary)) {
1436
- this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
1486
+ if (installation) {
1487
+ const { resolveBackendBinary } = await import("./backend-availability.js");
1488
+ const path = await resolveBackendBinary(backendName);
1489
+ noteResolvedBinary(installation.binary, path ?? installation.binary);
1490
+ check();
1491
+ if (!path) {
1492
+ this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
1493
+ }
1437
1494
  }
1438
1495
  // claude-code refuses --dangerously-skip-permissions as root — fail fast
1439
1496
  // Unless IS_SANDBOX=1 is set (recognized sandbox environment)
@@ -1449,6 +1506,18 @@ export class InstanceLifecycle {
1449
1506
  backend: backendName,
1450
1507
  model: config.model ?? "default",
1451
1508
  }, this.ctx.spawnGate, this.ctx.stormWindow, this.ctx.backendOutage);
1509
+ // Register before start: a pre-launch refusal has no published daemon or later incident handlers.
1510
+ daemon.on("kiro_compatibility_hold", (message) => {
1511
+ const owner = this.daemons.get(name);
1512
+ if (owner ? owner !== daemon : this.epochOf(name) !== epoch)
1513
+ return;
1514
+ this.ctx.setKiroCompatibilityHold?.(name, message);
1515
+ });
1516
+ daemon.setAgentCredentialIssuer?.(token => {
1517
+ if (this.epochOf(name) !== epoch)
1518
+ throw new SupersededStartError(name);
1519
+ this.ctx.agentCredentials?.issue(name, token);
1520
+ });
1452
1521
  daemon.setDeliveryOutboxPort(this.ctx.deliveryOutbox ?? undefined);
1453
1522
  daemon.setWorkLeaseCheck(() => this.hasWorkLease(name));
1454
1523
  if (seedNow)
@@ -1542,6 +1611,7 @@ export class InstanceLifecycle {
1542
1611
  this.ctx.setTopicIcon(name, "green");
1543
1612
  this.ctx.touchActivity(name);
1544
1613
  });
1614
+ this.ctx.setKiroCompatibilityHold?.(name, null);
1545
1615
  this.attachIncidentHandlers(name, daemon);
1546
1616
  // #2897: a new daemon starts with no dialog held; a notice the last one left (a crash, a respawn) is out of date.
1547
1617
  this.ctx.resolveParkedNotice?.(name);
@@ -2151,9 +2221,13 @@ export class InstanceLifecycle {
2151
2221
  // primary or a new world). Null means fail closed at rollback.
2152
2222
  const topicDeleter = this.ctx.getForumTopicDeleter?.(adapterId) ?? null;
2153
2223
  try {
2154
- check();
2155
- createdTopicId = await this.ctx.createForumTopic(topicName, adapterId);
2156
- check();
2224
+ // #2910: a web-only fleet has no topics to create — the agent is reached from the dashboard.
2225
+ const webOnly = this.ctx.isWebOnlyFleet?.() === true;
2226
+ if (!webOnly) {
2227
+ check();
2228
+ createdTopicId = await this.ctx.createForumTopic(topicName, adapterId);
2229
+ check();
2230
+ }
2157
2231
  // Use explicit topic_name as name base when provided; fall back to directory basename
2158
2232
  const explicitTopicName = args.topic_name;
2159
2233
  const nameBase = explicitTopicName ?? (worktreePath ? topicName : (directory ? basename(workDir) : topicName));
@@ -2163,7 +2237,17 @@ export class InstanceLifecycle {
2163
2237
  // (#1305 P1): full topic_id string equality, plus the adapter/world
2164
2238
  // check when the existing entry records one (channel_id). A dir-only
2165
2239
  // collision (no config entry) can never prove that.
2166
- {
2240
+ if (webOnly) {
2241
+ // No topic to suffix with: the name as asked, else the first free "-2", "-3"…. "general" is never handed out
2242
+ // here (#2919 review): that name alone makes an instance the General (its create/start tools, never paused).
2243
+ const instances = this.ctx.fleetConfig?.instances ?? {};
2244
+ const taken = (candidate) => candidate === GENERAL_NAME || candidate in instances || existsSync(this.ctx.getInstanceDir(candidate));
2245
+ const clean = sanitizeInstanceName(nameBase);
2246
+ newInstanceName = clean;
2247
+ for (let n = 2; taken(newInstanceName); n++)
2248
+ newInstanceName = `${clean}-${n}`;
2249
+ }
2250
+ else {
2167
2251
  const instances = this.ctx.fleetConfig?.instances ?? {};
2168
2252
  const wanted = String(createdTopicId);
2169
2253
  newInstanceName = uniqueInstanceName(nameBase, createdTopicId, (candidate) => candidate in instances
@@ -2191,7 +2275,7 @@ export class InstanceLifecycle {
2191
2275
  ...DEFAULT_INSTANCE_CONFIG,
2192
2276
  ...getEffectiveInstanceDefaults(this.ctx.fleetConfig.defaults ?? {}),
2193
2277
  working_directory: workDir,
2194
- topic_id: createdTopicId,
2278
+ ...(createdTopicId != null ? { topic_id: createdTopicId } : {}),
2195
2279
  ...(description ? { description } : {}),
2196
2280
  ...(systemPrompt ? { systemPrompt } : {}),
2197
2281
  ...(args.model ? { model: args.model } : {}),
@@ -2222,7 +2306,8 @@ export class InstanceLifecycle {
2222
2306
  const beforeCreate = structuredClone(this.ctx.fleetConfig);
2223
2307
  const persist = () => {
2224
2308
  this.ctx.fleetConfig.instances[newInstanceName] = instanceConfig;
2225
- this.ctx.routing.register(createdTopicId, { kind: "instance", name: newInstanceName });
2309
+ if (createdTopicId != null)
2310
+ this.ctx.routing.register(createdTopicId, { kind: "instance", name: newInstanceName });
2226
2311
  try {
2227
2312
  this.ctx.saveFleetConfig();
2228
2313
  }
@@ -2288,7 +2373,8 @@ export class InstanceLifecycle {
2288
2373
  /** Handle delete_instance tool call from a daemon. */
2289
2374
  async handleDelete(args, respond) {
2290
2375
  const instanceName = args.name;
2291
- const deleteTopic = args.delete_topic ?? false;
2376
+ // The user's decision (beta.9): deleting an agent deletes its topic, unless `delete_topic: false` keeps it.
2377
+ const deleteTopic = args.delete_topic ?? true;
2292
2378
  const instanceConfig = this.ctx.fleetConfig?.instances[instanceName];
2293
2379
  if (!instanceConfig) {
2294
2380
  respond(null, `Instance not found: ${instanceName}`);
@@ -2298,11 +2384,9 @@ export class InstanceLifecycle {
2298
2384
  respond(null, "Cannot delete the General instance");
2299
2385
  return;
2300
2386
  }
2301
- if (deleteTopic && instanceConfig.topic_id) {
2302
- await this.ctx.deleteForumTopic(instanceConfig.topic_id);
2303
- }
2304
- await this.ctx.removeInstance(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"));
2305
- respond({ success: true, name: instanceName, topic_deleted: deleteTopic });
2387
+ // topic_deleted is the platform's answer, never the request; when the topic stays, topic_reason says why.
2388
+ const topic = await this.ctx.removeInstanceAndTopic(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"), { deleteTopic });
2389
+ respond({ success: true, name: instanceName, topic_deleted: topic.deleted, ...(topic.deleted ? {} : { topic_reason: topic.reason }) });
2306
2390
  }
2307
2391
  has(name) {
2308
2392
  return this.daemons.has(name);