@songsid/agend 2.3.2-beta.1 → 2.3.2-beta.11

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 (298) hide show
  1. package/THIRD_PARTY_NOTICES.md +40 -0
  2. package/dist/agent-cli.js +69 -2
  3. package/dist/agent-cli.js.map +1 -1
  4. package/dist/agent-endpoint.js +11 -0
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/agent-whats-new.js +3 -0
  7. package/dist/agent-whats-new.js.map +1 -1
  8. package/dist/antigravity-usage-scan.d.ts +58 -0
  9. package/dist/antigravity-usage-scan.js +257 -0
  10. package/dist/antigravity-usage-scan.js.map +1 -0
  11. package/dist/antigravity-usage-worker.d.ts +1 -0
  12. package/dist/antigravity-usage-worker.js +10 -0
  13. package/dist/antigravity-usage-worker.js.map +1 -0
  14. package/dist/auth-api.js +4 -0
  15. package/dist/auth-api.js.map +1 -1
  16. package/dist/backend/kiro-classic-archive.d.ts +52 -0
  17. package/dist/backend/kiro-classic-archive.js +444 -0
  18. package/dist/backend/kiro-classic-archive.js.map +1 -0
  19. package/dist/backend/kiro-identity.d.ts +83 -0
  20. package/dist/backend/kiro-identity.js +144 -0
  21. package/dist/backend/kiro-identity.js.map +1 -1
  22. package/dist/backend/kiro-migration-verify.d.ts +10 -0
  23. package/dist/backend/kiro-migration-verify.js +52 -0
  24. package/dist/backend/kiro-migration-verify.js.map +1 -0
  25. package/dist/backend/kiro-retired-model.d.ts +62 -0
  26. package/dist/backend/kiro-retired-model.js +160 -0
  27. package/dist/backend/kiro-retired-model.js.map +1 -0
  28. package/dist/backend/kiro-v2-store-worker.js +21 -1
  29. package/dist/backend/kiro-v2-store-worker.js.map +1 -1
  30. package/dist/backend/kiro-v2-store.d.ts +8 -0
  31. package/dist/backend/kiro-v2-store.js.map +1 -1
  32. package/dist/backend/kiro.d.ts +169 -2
  33. package/dist/backend/kiro.js +703 -28
  34. package/dist/backend/kiro.js.map +1 -1
  35. package/dist/backend/types.d.ts +108 -0
  36. package/dist/backend/types.js +9 -0
  37. package/dist/backend/types.js.map +1 -1
  38. package/dist/backend-signin-guide.d.ts +1 -0
  39. package/dist/backend-signin-guide.js +9 -0
  40. package/dist/backend-signin-guide.js.map +1 -0
  41. package/dist/backend-signin-pending.d.ts +10 -0
  42. package/dist/backend-signin-pending.js +44 -0
  43. package/dist/backend-signin-pending.js.map +1 -0
  44. package/dist/browser-backend-signins.d.ts +56 -0
  45. package/dist/browser-backend-signins.js +189 -0
  46. package/dist/browser-backend-signins.js.map +1 -0
  47. package/dist/cache-ledger.d.ts +38 -2
  48. package/dist/cache-ledger.js +133 -8
  49. package/dist/cache-ledger.js.map +1 -1
  50. package/dist/cache-prices.d.ts +2 -1
  51. package/dist/cache-prices.js +5 -2
  52. package/dist/cache-prices.js.map +1 -1
  53. package/dist/cache-service.d.ts +68 -0
  54. package/dist/cache-service.js +355 -13
  55. package/dist/cache-service.js.map +1 -1
  56. package/dist/channel/adapters/discord.d.ts +11 -0
  57. package/dist/channel/adapters/discord.js +71 -14
  58. package/dist/channel/adapters/discord.js.map +1 -1
  59. package/dist/channel/ipc-timeouts.js +3 -0
  60. package/dist/channel/ipc-timeouts.js.map +1 -1
  61. package/dist/channel/mcp-tools.js +41 -2
  62. package/dist/channel/mcp-tools.js.map +1 -1
  63. package/dist/channel/tool-router.js +2 -1
  64. package/dist/channel/tool-router.js.map +1 -1
  65. package/dist/classic-channel-manager.d.ts +11 -0
  66. package/dist/classic-channel-manager.js +39 -1
  67. package/dist/classic-channel-manager.js.map +1 -1
  68. package/dist/cli.js +54 -2
  69. package/dist/cli.js.map +1 -1
  70. package/dist/config-validator.d.ts +7 -1
  71. package/dist/config-validator.js +55 -10
  72. package/dist/config-validator.js.map +1 -1
  73. package/dist/config.d.ts +19 -0
  74. package/dist/config.js +33 -1
  75. package/dist/config.js.map +1 -1
  76. package/dist/cpu-quota.d.ts +23 -0
  77. package/dist/cpu-quota.js +86 -0
  78. package/dist/cpu-quota.js.map +1 -0
  79. package/dist/daemon.d.ts +68 -0
  80. package/dist/daemon.js +448 -26
  81. package/dist/daemon.js.map +1 -1
  82. package/dist/dashboard-permissions.d.ts +31 -6
  83. package/dist/dashboard-permissions.js +84 -9
  84. package/dist/dashboard-permissions.js.map +1 -1
  85. package/dist/doctor.js +2 -1
  86. package/dist/doctor.js.map +1 -1
  87. package/dist/fleet-control-audit.d.ts +1 -1
  88. package/dist/fleet-control-audit.js +3 -0
  89. package/dist/fleet-control-audit.js.map +1 -1
  90. package/dist/fleet-manager.d.ts +133 -2
  91. package/dist/fleet-manager.js +905 -94
  92. package/dist/fleet-manager.js.map +1 -1
  93. package/dist/forged-envelope-scan.d.ts +9 -0
  94. package/dist/forged-envelope-scan.js +30 -5
  95. package/dist/forged-envelope-scan.js.map +1 -1
  96. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
  97. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +24 -1
  98. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +49 -1
  99. package/dist/general-knowledge/skills/web-appearance/SKILL.md +49 -1
  100. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +47 -9
  101. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +54 -11
  102. package/dist/instance-config-impact.js +10 -5
  103. package/dist/instance-config-impact.js.map +1 -1
  104. package/dist/instance-lifecycle.d.ts +23 -0
  105. package/dist/instance-lifecycle.js +62 -12
  106. package/dist/instance-lifecycle.js.map +1 -1
  107. package/dist/kiro-db-reader.d.ts +5 -0
  108. package/dist/kiro-db-reader.js +18 -0
  109. package/dist/kiro-db-reader.js.map +1 -1
  110. package/dist/kiro-engine-status.d.ts +2 -0
  111. package/dist/kiro-engine-status.js +9 -0
  112. package/dist/kiro-engine-status.js.map +1 -1
  113. package/dist/kiro-migrate.d.ts +60 -0
  114. package/dist/kiro-migrate.js +160 -0
  115. package/dist/kiro-migrate.js.map +1 -0
  116. package/dist/kiro-session-proof.d.ts +41 -0
  117. package/dist/kiro-session-proof.js +89 -0
  118. package/dist/kiro-session-proof.js.map +1 -0
  119. package/dist/kiro-transcript-lane.d.ts +2 -0
  120. package/dist/kiro-transcript-lane.js.map +1 -1
  121. package/dist/kiro-transcript-worker.js +1 -0
  122. package/dist/kiro-transcript-worker.js.map +1 -1
  123. package/dist/kiro-tui-forensic.d.ts +12 -0
  124. package/dist/kiro-tui-forensic.js +110 -0
  125. package/dist/kiro-tui-forensic.js.map +1 -0
  126. package/dist/kiro-usage-run.d.ts +7 -0
  127. package/dist/kiro-usage-run.js +39 -0
  128. package/dist/kiro-usage-run.js.map +1 -0
  129. package/dist/kiro-usage-scan.d.ts +49 -0
  130. package/dist/kiro-usage-scan.js +223 -0
  131. package/dist/kiro-usage-scan.js.map +1 -0
  132. package/dist/kiro-usage-worker.d.ts +1 -0
  133. package/dist/kiro-usage-worker.js +10 -0
  134. package/dist/kiro-usage-worker.js.map +1 -0
  135. package/dist/kiro-usage.d.ts +58 -0
  136. package/dist/kiro-usage.js +310 -0
  137. package/dist/kiro-usage.js.map +1 -0
  138. package/dist/locale.js +230 -8
  139. package/dist/locale.js.map +1 -1
  140. package/dist/log-service.js +1 -1
  141. package/dist/log-service.js.map +1 -1
  142. package/dist/login-url.d.ts +4 -0
  143. package/dist/login-url.js +22 -0
  144. package/dist/login-url.js.map +1 -0
  145. package/dist/needs-you-hub.d.ts +2 -1
  146. package/dist/needs-you-hub.js +1 -1
  147. package/dist/needs-you-hub.js.map +1 -1
  148. package/dist/needs-you.d.ts +10 -2
  149. package/dist/needs-you.js +10 -2
  150. package/dist/needs-you.js.map +1 -1
  151. package/dist/notice-delivery.d.ts +16 -0
  152. package/dist/notice-delivery.js +35 -0
  153. package/dist/notice-delivery.js.map +1 -0
  154. package/dist/office-share-page.d.ts +16 -0
  155. package/dist/office-share-page.js +85 -0
  156. package/dist/office-share-page.js.map +1 -0
  157. package/dist/office-share-service.d.ts +91 -0
  158. package/dist/office-share-service.js +176 -0
  159. package/dist/office-share-service.js.map +1 -0
  160. package/dist/office-share.d.ts +268 -0
  161. package/dist/office-share.js +574 -0
  162. package/dist/office-share.js.map +1 -0
  163. package/dist/opencode-usage-scan.d.ts +28 -0
  164. package/dist/opencode-usage-scan.js +92 -0
  165. package/dist/opencode-usage-scan.js.map +1 -0
  166. package/dist/opencode-usage-worker.d.ts +1 -0
  167. package/dist/opencode-usage-worker.js +10 -0
  168. package/dist/opencode-usage-worker.js.map +1 -0
  169. package/dist/outbound-handlers.js +22 -2
  170. package/dist/outbound-handlers.js.map +1 -1
  171. package/dist/outbound-schemas.d.ts +65 -2
  172. package/dist/outbound-schemas.js +56 -2
  173. package/dist/outbound-schemas.js.map +1 -1
  174. package/dist/public-web-gateway.js +7 -1
  175. package/dist/public-web-gateway.js.map +1 -1
  176. package/dist/quickstart-api.js +13 -2
  177. package/dist/quickstart-api.js.map +1 -1
  178. package/dist/quickstart.js +2 -1
  179. package/dist/quickstart.js.map +1 -1
  180. package/dist/remote-card-answer.d.ts +83 -0
  181. package/dist/remote-card-answer.js +208 -0
  182. package/dist/remote-card-answer.js.map +1 -0
  183. package/dist/remote-card-prompt.d.ts +38 -0
  184. package/dist/remote-card-prompt.js +86 -0
  185. package/dist/remote-card-prompt.js.map +1 -0
  186. package/dist/reply-triggers.d.ts +2 -0
  187. package/dist/reply-triggers.js +3 -0
  188. package/dist/reply-triggers.js.map +1 -0
  189. package/dist/settings-api.d.ts +2 -0
  190. package/dist/settings-api.js +41 -16
  191. package/dist/settings-api.js.map +1 -1
  192. package/dist/settings-change.js +20 -14
  193. package/dist/settings-change.js.map +1 -1
  194. package/dist/settings-effect.js +7 -1
  195. package/dist/settings-effect.js.map +1 -1
  196. package/dist/settings-instance-patch.js +4 -1
  197. package/dist/settings-instance-patch.js.map +1 -1
  198. package/dist/setup-form.d.ts +1 -1
  199. package/dist/setup-form.js +55 -6
  200. package/dist/setup-form.js.map +1 -1
  201. package/dist/setup-host.d.ts +9 -0
  202. package/dist/setup-host.js +127 -6
  203. package/dist/setup-host.js.map +1 -1
  204. package/dist/setup-signin-assets.d.ts +2 -0
  205. package/dist/setup-signin-assets.js +6 -0
  206. package/dist/setup-signin-assets.js.map +1 -0
  207. package/dist/setup-wizard.js +2 -0
  208. package/dist/setup-wizard.js.map +1 -1
  209. package/dist/structured-signin-transport.d.ts +8 -0
  210. package/dist/structured-signin-transport.js +79 -0
  211. package/dist/structured-signin-transport.js.map +1 -0
  212. package/dist/structured-signin.d.ts +131 -0
  213. package/dist/structured-signin.js +388 -0
  214. package/dist/structured-signin.js.map +1 -0
  215. package/dist/tool-permissions.js +29 -0
  216. package/dist/tool-permissions.js.map +1 -1
  217. package/dist/topic-commands.js +6 -2
  218. package/dist/topic-commands.js.map +1 -1
  219. package/dist/transcript-sources.d.ts +27 -2
  220. package/dist/transcript-sources.js +104 -40
  221. package/dist/transcript-sources.js.map +1 -1
  222. package/dist/turn-reply-guard.d.ts +1 -1
  223. package/dist/turn-reply-guard.js +1 -1
  224. package/dist/turn-reply-guard.js.map +1 -1
  225. package/dist/types.d.ts +33 -8
  226. package/dist/ui/backend-signin.js +63 -10
  227. package/dist/ui/chat-store.js +3 -2
  228. package/dist/ui/chat-strings.js +4 -4
  229. package/dist/ui/fleet-office-editor.js +68 -11
  230. package/dist/ui/fleet-office-layout.js +110 -35
  231. package/dist/ui/fleet-office-model.js +6 -3
  232. package/dist/ui/fleet-office-overview.js +167 -0
  233. package/dist/ui/fleet-office-pack.d.ts +13 -3
  234. package/dist/ui/fleet-office-pack.js +214 -24
  235. package/dist/ui/fleet-office-skin.js +98 -23
  236. package/dist/ui/fleet-office-store.js +82 -5
  237. package/dist/ui/fleet-office-view.js +5 -4
  238. package/dist/ui/fleet-office-zones.js +232 -21
  239. package/dist/ui/fleet-office.js +549 -186
  240. package/dist/ui/fleet-usage.js +19 -15
  241. package/dist/ui/office-share-dialog.js +145 -0
  242. package/dist/ui/office-share-page.js +164 -0
  243. package/dist/ui/panel-chat.js +22 -3
  244. package/dist/ui/panel-log.js +4 -4
  245. package/dist/ui/panel-needs.js +5 -5
  246. package/dist/ui/panel-settings.js +38 -12
  247. package/dist/ui/settings-dialogs.js +8 -1
  248. package/dist/ui/settings-guests.js +17 -7
  249. package/dist/ui/settings-model.js +22 -6
  250. package/dist/ui/settings-registry.js +4 -0
  251. package/dist/ui/settings-strings.js +18 -2
  252. package/dist/ui/shared/app-i18n.js +4 -2
  253. package/dist/ui/shared/app-shell.js +14 -6
  254. package/dist/ui/shared/app-stream.js +2 -1
  255. package/dist/ui/shared/app.css +85 -4
  256. package/dist/ui/shared/office/cozy.png +0 -0
  257. package/dist/ui/shared/side-panel.js +95 -0
  258. package/dist/ui/structured-signin.js +115 -0
  259. package/dist/usage-report.d.ts +20 -0
  260. package/dist/usage-report.js +54 -17
  261. package/dist/usage-report.js.map +1 -1
  262. package/dist/usage-rollup.d.ts +9 -1
  263. package/dist/usage-rollup.js +20 -4
  264. package/dist/usage-rollup.js.map +1 -1
  265. package/dist/web-api.d.ts +23 -1
  266. package/dist/web-api.js +292 -3
  267. package/dist/web-api.js.map +1 -1
  268. package/dist/web-auth.js +1 -1
  269. package/dist/web-auth.js.map +1 -1
  270. package/dist/web-backend-login.d.ts +1 -7
  271. package/dist/web-backend-login.js +2 -24
  272. package/dist/web-backend-login.js.map +1 -1
  273. package/dist/web-office-acts.d.ts +173 -0
  274. package/dist/web-office-acts.js +285 -0
  275. package/dist/web-office-acts.js.map +1 -0
  276. package/dist/web-office-pack-read.d.ts +35 -0
  277. package/dist/web-office-pack-read.js +252 -0
  278. package/dist/web-office-pack-read.js.map +1 -0
  279. package/dist/web-office-pack-tools.d.ts +232 -0
  280. package/dist/web-office-pack-tools.js +754 -0
  281. package/dist/web-office-pack-tools.js.map +1 -0
  282. package/dist/web-office-skins.d.ts +71 -6
  283. package/dist/web-office-skins.js +321 -35
  284. package/dist/web-office-skins.js.map +1 -1
  285. package/dist/web-office-store.d.ts +5 -2
  286. package/dist/web-office-store.js +69 -10
  287. package/dist/web-office-store.js.map +1 -1
  288. package/dist/web-settings-patch.d.ts +2 -1
  289. package/dist/web-settings-patch.js +4 -1
  290. package/dist/web-settings-patch.js.map +1 -1
  291. package/dist/working-recovery.d.ts +2 -2
  292. package/dist/working-recovery.js +43 -8
  293. package/dist/working-recovery.js.map +1 -1
  294. package/dist/working-state-journal.d.ts +2 -0
  295. package/dist/working-state-journal.js +16 -1
  296. package/dist/working-state-journal.js.map +1 -1
  297. package/package.json +3 -2
  298. package/templates/windows-shortcuts.ps1 +155 -140
@@ -152,7 +152,8 @@ workspace `inbox/`; an unused upload is deleted after 30 minutes.
152
152
 
153
153
  **In replies.** Images inline; video and audio play inline; Markdown, CSV, JSON, code and text files get a **Show**
154
154
  card (200 lines, then "Show all … lines"); other files download. Code blocks have a language tag, **Wrap** and
155
- **Copy**, and fold after 30 lines. Each reply has **Copy this reply**. Markdown: headings, lists, quotes, bold/italic/
155
+ **Copy**, and fold after 30 lines. **⋯ → Full width** (desk only, off by default, this browser's choice) widens the
156
+ thread and the composer to the whole chat panel for wide tables and code; a person's bubbles keep their size. Each reply has **Copy this reply**. Markdown: headings, lists, quotes, bold/italic/
156
157
  strike, links, and tables (header row plus separator, alignment, up to 20 columns). Discord mentions show as names;
157
158
  a Discord server emoji (`<:name:id>`) of the fleet's servers shows as its picture, and any other (or one whose picture
158
159
  can't load) as `:name:`. Unicode emoji are drawn by the system's colour emoji font under every theme font (boxes on
@@ -195,6 +196,9 @@ tab title. Items, grouped by instance, oldest first:
195
196
  - the instance: "Paused: sign-in needed", "Crashed";
196
197
  - deliveries from the last 24 h: "Could not confirm delivery", "Delivery failed" (source → target · kind).
197
198
 
199
+ "Asking you a question" is a kiro V3 question card, posted to the instance's chat with a button per answer and a box
200
+ for answering in words (on Discord/Telegram: reply to the post); an MCP input request offers Decline / Cancel and is
201
+ filled in at the terminal (View).
198
202
  A prompt shows its own answer buttons (first answer wins); a delivery has **Acknowledge** (clears it everywhere);
199
203
  "Paused: sign-in needed" has **Sign in** when the dashboard can run that login (#2233); every item has **Open chat**. **Notify me on this device** (Turn on / Turn off) gives desktop notifications while the
200
204
  tab is hidden — per browser, not on phones or plain-HTTP addresses. Config: `needs_you.live_message` (default on),
@@ -268,22 +272,54 @@ desk to desk along the corridors in the Key's colours; a delegation in progress
268
272
  desk. Hover (or tap once) a desk for its name, state and backend; click (or tap again) opens the chat. **Find** dims
269
273
  the rest. **Show** picks a team or the Lobby and **People** pins chosen instances (both kept per browser); the
270
274
  **Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`). An admin session
271
- (never a read-only one, a guest or the public link) gets **Edit offices**: add, rename and delete offices, pick who is
275
+ (never a read-only one, a guest or the public link) gets **Edit offices** (≥1200 px: a panel docked on the right in the
276
+ usage rail's place, the Office in use beside it, × or Esc closes it and the rail returns; narrower: a centred dialog): add, rename and delete offices, pick who is
272
277
  in each (whole teams or single instances; none = everyone) and its style, and upload or delete **skin packs** (an
273
278
  artist's pictures: `manifest.json` plus PNGs, format v1, kept in `web-office-skins/` in the AgEnD home; the host
274
279
  checks every rule — PNG only, each strip exactly frames·w × h, a 16:9 background, size caps — and never changes a
275
280
  pack; a strip may give its displayed size, `dw`/`dh`, apart from its pictures' size, and a character may walk four
276
- ways with `walkDown`, `walkUp` and `walkSide`, the side one mirrored for left). **Style** (per browser for the whole fleet, per office for a stored one): **Desks** (the default),
277
- **Studio** — one scene (Work, Lounge, Help desk, Nap corner) where each instance walks to the area for its state —
278
- or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio or a pack,
281
+ ways with `walkDown`, `walkUp` and `walkSide`, the side one mirrored for left). #2692: an agent with **Office skin
282
+ packs** on (`office_pack_access`, Dashboard access) can check, upload, replace, delete and restore packs itself (one
283
+ previous version kept per pack); **Agents changing packs** under the packs names those agents, sets whether their changes
284
+ **Need my yes** (the default) or **Apply at once**, and approves or rejects the waiting ones (also from the notice's
285
+ buttons in General); every change is logged and told in General. **Style** (per browser for the whole fleet, per office for a stored one): **Desks**,
286
+ **Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
287
+ **Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
288
+ restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
289
+ own) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
290
+ Cozy or a pack,
279
291
  **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
280
292
  waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
281
- corridors; **Save layout** keeps the moves as that office's overrides (the pack stays as uploaded), **Reset** goes
282
- back to the pack's own. While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
293
+ corridors; an item that sleeps at bedtime (a pack's `night`) has a night handle too ("Item {id} (night)": its night
294
+ picture faint, a moon, a line to its day place; on the day place while it sleeps in place) — drag it to give the item
295
+ its own night place, **Back to the pack's night place** undoes it (#2665); a selected seat has **Reserved for** (the
296
+ office's members, several allowed) and **Lend when away** (#2691) — whoever it is for sits there first when they come
297
+ to its area, nobody else does unless it is lent while they are all away (a borrower moves off when one comes), and a
298
+ reserved seat's handle is ringed; a pack can reserve seats as well; **Save layout** keeps the moves as that
299
+ office's overrides (the pack stays as uploaded), **Reset** goes back to the pack's own. On a screen ≥1200 px its controls sit in the right-hand panel (the canvas whole for the
300
+ handles); narrower, or in fullscreen, they are the bar along the canvas's bottom. Esc is Cancel. While either editor
301
+ is docked the page beside it works, Ctrl+K search included; leaving the page with unsaved changes asks first
302
+ ("Discard changes"). While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
283
303
  saved the offices meanwhile, Save says so and keeps your layout — Save again puts it on the current list. A crowded area packs extra people into a tighter grid, then shows "+N" in its corner; there
284
304
  only calls and work get bubbles (a few at most) and name tags show on hover or focus. **Hide paused and stopped**
285
305
  (per browser, off by default) leaves the sleepers out. Now and then someone says a short line for their state in a
286
306
  bubble (never message content). Reduced motion: still poses, nothing in the air, bubbles shown whole.
307
+ **All offices** (in the switcher once two or more offices are stored, kept per device) shows every stored office as
308
+ a tile on one canvas, each exactly as its own view (its style, members, seats, bubbles, walking), labelled with its
309
+ name and head count, each as large as its office's content, packed to fill the panel; **Lobby tile** (on by
310
+ default; disabled when everyone is in an office) adds the instances in no office. Below 75% name tags show on hover
311
+ only. Hover and click work across
312
+ tiles; a tile's label, or a double-click on it, opens that office; traffic between offices flies straight across.
313
+ Edit offices and Edit layout wait for a single office.
314
+ **Share…** (#2636; an admin session, on the dashboard reached directly or over the public link — never read-only or a guest; the URL shows only to its maker, in the dialog) makes an Office share
315
+ link: anyone who opens it watches one office (or **All offices**) live, read-only, with no sign-in — names, identity
316
+ colours and states, every 5 s; no chat, no clicks into anything, no settings; agents' `office_set` lines only when
317
+ **Include agents' own status lines** is ticked; hidden instances never. 1 h by default, 15 min to 24 h
318
+ (`web.office_share.max_hours`); at most 10 open. Its own quick tunnel (`https://<random>.trycloudflare.com/o/<token>`)
319
+ starts with the first link and stops with the last; the token is shown once. There is no chat command: the button only. Open links and **Revoke** are in **Settings → Access
320
+ & security → Office share links**; each made or revoked link is announced in General (never its URL). A Cloudflare 429
321
+ says to try again in a few minutes (no retry). `web.office_share.enabled: false` turns it off and ends open links.
322
+
287
323
  The Office fills the Fleet panel and moves like the Canvas (#2540): drag to pan, the wheel or a pinch to zoom,
288
324
  **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them) or the `+ - 0` keys
289
325
  (with the office focused), an overview at the bottom right to jump (not on a phone). It takes the whole panel: the
@@ -303,6 +339,8 @@ A pack may add a `foreground` (a 16:9 PNG over the whole scene, zones packs only
303
339
  and items in the air, below name tags, bubbles and "+N" — door frames, pillars, table fronts that hide whoever walks
304
340
  behind them. A furniture item's `depth` may be `"y"`: drawn among the people by base y (whoever stands lower is in
305
341
  front). Numeric depths keep their meaning (under 1000 under the people, 1000 and up over them).
342
+ A pack may set `"straight": true` (#2634): each diagonal leg of a walk becomes an L (across, then up or down), so the
343
+ three walking strips always fit; lay its graph out with horizontal and vertical edges and the corners land on the aisles.
306
344
 
307
345
  **Live traffic** (**Live** switch, on by default; **Key** in the toolbar explains it, as a strip above the canvas): a line for each message between instances.
308
346
  Colour by kind — task (delegate_task) purple, send/query/update teal, report pink, broadcast orange; between teams
@@ -380,11 +418,14 @@ coordinators and full-profile instances, and each other instance only its own ro
380
418
 
381
419
  **The usage report** (the `get_usage_report` tool, and Fleet → **Usage**, `/ui/fleet/usage`, #2122; the ◔ dialog's
382
420
  **By agent →** opens it). Per instance (or backend,
383
- model, credential profile, team): input, output, cache read and cache write tokens, requests, delivered messages,
421
+ model, credential profile, team): input, output, reasoning, cache read and cache write tokens, requests, delivered messages,
384
422
  and an amount, over today / 7d / month / all / custom days in the fleet's timezone. **Every amount is the
385
423
  API-equivalent at list price — not money spent** (subscriptions aren't billed per token): say "API-equivalent", never
386
- "spent". Measured for Claude Code and Codex. Marks to repeat in words:
387
- - `cache_write_not_reported`: Codex records no cache writes, so they are neither shown as 0 nor priced.
424
+ "spent". Measured for Claude Code, Codex, Grok, Muse, OpenCode and Antigravity; **estimated** for Kiro (it records no token counts). Marks to repeat in words:
425
+ - `cost_reported`: the model has no list price in AgEnD's table, so the amount is what the CLI (Grok, OpenCode's provider) reported.
426
+ - `estimated` (a row) / `includes_estimates` (the totals, with `amountEstimated`): Kiro's tokens are estimated from text
427
+ size, not measured — say "estimated" and give the estimated part apart.
428
+ - `cache_write_not_reported`: Codex and Muse record no cache writes, so they are neither shown as 0 nor priced.
388
429
  - `not_priced`: the tokens are shown, the amount isn't.
389
430
  - `source_unknown`: read before #2122, when which backend and profile read it was not recorded (backend and profile
390
431
  "unknown" — never today's).
@@ -476,6 +517,7 @@ opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`).
476
517
  | Agent mode, Tool set | `agent_mode`, `tool_set` | agent |
477
518
  | Tool progress; Bot-to-bot messages in topics (full / summary / hidden); Log level | `tool_progress`, `cross_instance_visibility`, `log_level` | now |
478
519
  | Require a delivered reply | `reply_completion_guard` | now |
520
+ | Daily tips (Topic / Off; always posted in General, never by DM) | `tips` | now |
479
521
  | Lightweight mode, Fallback model | `lightweight`, `model_failover` | agent |
480
522
  | System prompt | `systemPrompt` | agent |
481
523
  | Tags | `tags` | now |
@@ -510,11 +552,12 @@ progress, reply guard, **ClassicBot admins**, **Allowed guilds**.
510
552
  | Terminal session minutes (1–20) | `web_terminal.ttl_minutes` |
511
553
  | Web echo | `web.echo_to_channel` |
512
554
  | Log tab: each agent's steps | `web.log_tab` |
555
+ | Web sign-in notices (Topic / Off; never by DM, guest and public-link notices always post) | `web.notify_login` |
513
556
  | Offer temporary public web links | `web.public_link.allow_public` |
514
557
  | Public link minutes (1–480; with a fixed hostname 0–10080, 0 = no expiry) | `web.public_link.ttl_minutes` |
515
558
  | Reopen the public link when AgEnD starts (fixed hostname only) | `web.public_link.auto_open` |
516
559
  | Tunnel protocol (http2 / quic / auto) | `web.public_link.protocol` |
517
- Shown read-only ("Set in fleet.yaml"): `web.allowed_hosts`, `view_access`, `notify_login`, `preview`, `preview_port`,
560
+ Shown read-only ("Set in fleet.yaml"): `web.allowed_hosts`, `view_access`, `preview`, `preview_port`,
518
561
  `preview_origin`, `preview_on_public_link`, `usage_panel`, `search` (`retention_days`: unset and 0 = no age limit,
519
562
  300,000-row cap), `provider_secrets`, `upload_max_file_mb`,
520
563
  `upload_max_total_mb`, `web_terminal.bind`, `web_terminal.tunnel`.
@@ -25,6 +25,7 @@ export const IMPACT_ORDER = ["now", "instance", "fleet"];
25
25
  export const HOT_INSTANCE_CONFIG_KEYS = new Set([
26
26
  "tool_progress",
27
27
  "reply_completion_guard",
28
+ "reply_triggers",
28
29
  "mcp_proxy_reply",
29
30
  "resume_interrupted_work",
30
31
  "auto_pause_after",
@@ -38,7 +39,7 @@ export const HOT_INSTANCE_CONFIG_KEYS = new Set([
38
39
  // #2303: the fleet reads it at each task board claim; the daemon only keeps it current.
39
40
  "board_cards_at_once",
40
41
  // The fleet reads it at each tool call; the daemon keeps it current for the next spawn's tool menu.
41
- "dashboard",
42
+ "dashboard", "office_access", "office_pack_access",
42
43
  ]);
43
44
  /**
44
45
  * The hot keys a ClassicBot channel edit can use.
@@ -49,7 +50,7 @@ export const HOT_INSTANCE_CONFIG_KEYS = new Set([
49
50
  * dropped on the way. Derived, not re-listed: dropping a key from the hot set
50
51
  * drops it here too.
51
52
  */
52
- export const CLASSIC_HOT_CONFIG_KEYS = new Set(["tool_progress", "reply_completion_guard"]
53
+ export const CLASSIC_HOT_CONFIG_KEYS = new Set(["tool_progress", "reply_completion_guard", "reply_triggers"]
53
54
  .filter(key => HOT_INSTANCE_CONFIG_KEYS.has(key)));
54
55
  /**
55
56
  * Instance keys that are not the instance's own business: they change how the
@@ -64,7 +65,7 @@ const FLEET_SCOPED_INSTANCE_KEYS = new Set([
64
65
  const INSTANCE_FIELDS = [
65
66
  "display_name", "description", "backend", "model", "working_directory",
66
67
  "resume_interrupted_work", "auto_pause_after", "warm_cap", "topic_id", "channel_id", "general_topic",
67
- "tool_progress", "reply_completion_guard", "mcp_proxy_reply", "log_level",
68
+ "tool_progress", "reply_completion_guard", "reply_triggers", "mcp_proxy_reply", "log_level",
68
69
  "systemPrompt", "tags", "hang_detector", "agent_mode", "tool_set",
69
70
  "lightweight", "model_failover", "effort", "pre_task_command",
70
71
  // #1005: the status reactions follow at once, but the instructions' avoid
@@ -74,12 +75,12 @@ const INSTANCE_FIELDS = [
74
75
  // #2303: read by the fleet at each task board claim.
75
76
  "board_cards_at_once",
76
77
  // Read by the fleet at each tool call (dashboard-permissions.ts).
77
- "dashboard",
78
+ "dashboard", "office_access", "office_pack_access",
78
79
  ];
79
80
  /** ClassicBot channel fields the settings page renders. */
80
81
  const CLASSIC_FIELDS = [
81
82
  "backend", "model", "auto_pause_after", "tool_progress",
82
- "reply_completion_guard", "collab", "context_lines", "pre_task_command",
83
+ "reply_completion_guard", "reply_triggers", "collab", "context_lines", "pre_task_command",
83
84
  "web_echo",
84
85
  ];
85
86
  /**
@@ -87,6 +88,10 @@ const CLASSIC_FIELDS = [
87
88
  * fleet process or the channel binding rather than to an instance's config.
88
89
  */
89
90
  const FLEET_FIELD_IMPACTS = {
91
+ "defaults.tips": "now",
92
+ "web.notify_login": "now",
93
+ "web.notice_delivery": "now",
94
+ "defaults.reply_triggers": "now",
90
95
  "web.experimental.canvas_worker": "now",
91
96
  "web.echo_to_channel": "now",
92
97
  "web.log_tab": "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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"}
@@ -18,7 +18,15 @@ import type { DeliveryOutbox } from "./delivery-outbox.js";
18
18
  export { isFleetStartCommandLine } from "./fleet-lock.js";
19
19
  export interface BackendInstallationInfo {
20
20
  binary: string;
21
+ /** The install command shown to a person (to copy and run themselves). */
21
22
  install: string;
23
+ /**
24
+ * The same install when AgEnD runs it with nobody at the terminal (`/login`'s install window). Codex's
25
+ * install.sh asks "Start Codex now? [y/N]" (and, on a conflict, whether to uninstall) on /dev/tty, so a
26
+ * window nobody types into waits until the install times out; CODEX_NON_INTERACTIVE=1 skips both questions.
27
+ * Omitted: `install` runs as it is.
28
+ */
29
+ unattended?: string;
22
30
  /**
23
31
  * #1092: where this backend's own installer puts the binary, read from the
24
32
  * installer script itself. `/login`'s install verifies on a fresh login shell
@@ -100,6 +108,10 @@ export interface LifecycleContext {
100
108
  notifyInstanceTopic(name: string, text: string): boolean | void;
101
109
  /** Notify the blocked instance and offer an interactive assist action in General. */
102
110
  notifyInteractivePrompt(name: string, kind: string): Promise<void>;
111
+ /** #2675: a card the CLI shows in place of its composer: put it to the people who talk to the instance, with its answers. */
112
+ postRemoteCard?(name: string, card: import("./backend/types.js").RemoteCard): Promise<void>;
113
+ /** #2675: that card is gone from the screen: its post's buttons collapse. */
114
+ retireRemoteCard?(name: string, identity: string | null): void;
103
115
  /** #1386: an instance's interaction observation, pause or wake changed ("Needs you" recomputes at once, not at its tick). */
104
116
  onAttentionChanged?(name: string): void;
105
117
  /**
@@ -193,6 +205,8 @@ export interface IncidentEventSource {
193
205
  isCodexLivePane?(): Promise<boolean>;
194
206
  /** Existing occurrence count used to preserve Codex capacity history on restart. */
195
207
  getErrorPatternOccurrenceCount?(type: "model_error", pattern: RegExp): number;
208
+ /** #2648: kiro only — what a model error on its current launch should do (restart once, say once, or nothing). */
209
+ kiroModelError?(): import("./backend/kiro-retired-model.js").KiroModelErrorVerdict | null;
196
210
  /** Present on real daemons; hang buttons attach only when it returns one. */
197
211
  getHangDetector?(): {
198
212
  on(event: string, handler: (...args: any[]) => void): unknown;
@@ -435,6 +449,15 @@ export declare class InstanceLifecycle {
435
449
  * up, and the operator needs to know which conversation each instance is in.
436
450
  */
437
451
  attachLaunchWarningHandler(name: string, daemon: IncidentEventSource): void;
452
+ /**
453
+ * The daemon gave up resuming after repeated startup failures and started a
454
+ * fresh conversation (#737, #749). Without this the only trace was an error
455
+ * line in daemon.log. Attached before start, because the startup spawn is
456
+ * where it happens; and never suppressed for a planned restart, which is
457
+ * exactly when the user expects the conversation to carry on. A ClassicBot's
458
+ * channel is the end user's chat, so its notice goes to General only.
459
+ */
460
+ attachContextLostHandler(name: string, daemon: IncidentEventSource): void;
438
461
  /**
439
462
  * Daemon delivery events → the status reaction on the inbound message. The
440
463
  * emoji for each status comes from config (#1005); this only names it.
@@ -8,7 +8,7 @@ import { execFileSync } from "node:child_process";
8
8
  import { join, basename, dirname, resolve, sep as pathSep } from "node:path";
9
9
  import { access } from "node:fs/promises";
10
10
  import { getAgendHome, ensureWorkspaceGit } from "./paths.js";
11
- import { DEFAULT_INSTANCE_CONFIG, getEffectiveInstanceDefaults, getTmuxSession } from "./config.js";
11
+ import { DEFAULT_INSTANCE_CONFIG, getEffectiveInstanceDefaults, getTmuxSession, newInstanceKiroUi } from "./config.js";
12
12
  import { readStatuslineModel, uniqueInstanceName } from "./topic-commands.js";
13
13
  import { isModelCompatible } from "./backend/types.js";
14
14
  import { safeHandler } from "./safe-async.js";
@@ -39,6 +39,7 @@ export const BACKEND_INSTALLATION_INFO = {
39
39
  // a symlink into ~/.codex/packages/standalone/current/bin (#1092).
40
40
  codex: {
41
41
  binary: "codex", install: "curl -fsSL https://chatgpt.com/codex/install.sh | sh",
42
+ unattended: "curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh",
42
43
  binDirs: (env, home) => [env.CODEX_INSTALL_DIR, localBin(home)].filter((d) => !!d),
43
44
  },
44
45
  opencode: { binary: "opencode", install: "curl -fsSL https://opencode.ai/install | bash", binDirs: (_env, home) => [join(home, ".opencode", "bin")] },
@@ -554,6 +555,27 @@ export class InstanceLifecycle {
554
555
  this.ctx.notifyInstanceTopic(name, t("inst.backend_launch_warning", name, data.message));
555
556
  }, this.ctx.logger, `daemon.backend_launch_warning[${name}]`));
556
557
  }
558
+ /**
559
+ * The daemon gave up resuming after repeated startup failures and started a
560
+ * fresh conversation (#737, #749). Without this the only trace was an error
561
+ * line in daemon.log. Attached before start, because the startup spawn is
562
+ * where it happens; and never suppressed for a planned restart, which is
563
+ * exactly when the user expects the conversation to carry on. A ClassicBot's
564
+ * channel is the end user's chat, so its notice goes to General only.
565
+ */
566
+ attachContextLostHandler(name, daemon) {
567
+ daemon.on("context_lost", safeHandler((_name, reason, attempts) => {
568
+ this.ctx.eventLog?.insert(name, "context_lost", { reason, ...(attempts != null ? { attempts } : {}) });
569
+ this.ctx.logger.warn({ name, reason, attempts }, "Instance started a fresh conversation — previous context lost");
570
+ const tries = attempts != null ? String(attempts) : "?";
571
+ if (!this.ctx.isClassicInstance?.(name))
572
+ this.ctx.notifyInstanceTopic(name, t("inst.context_lost", name, tries));
573
+ const general = this.findGeneralInstance();
574
+ if (general && general !== name)
575
+ this.ctx.notifyInstanceTopic(general, t("inst.context_lost_general", name, tries));
576
+ this.ctx.webhookEmit("context_lost", name, { reason, ...(attempts != null ? { attempts } : {}) });
577
+ }, this.ctx.logger, `daemon.context_lost[${name}]`));
578
+ }
557
579
  /**
558
580
  * Daemon delivery events → the status reaction on the inbound message. The
559
581
  * emoji for each status comes from config (#1005); this only names it.
@@ -787,9 +809,8 @@ export class InstanceLifecycle {
787
809
  recovered: data.recovered,
788
810
  ...(data.recoveryStarted ? { recoveryStarted: true } : {}),
789
811
  });
790
- // The reply guard posts its own immediate, exact-target status before
791
- // asking for one recovery turn. Do not duplicate that with the older
792
- // instance-topic malformed-call notice.
812
+ // The reply guard owns recovery and log-only detection. Do not duplicate
813
+ // a possible false alarm with the older instance-topic malformed-call notice.
793
814
  if (data.recoveryStarted)
794
815
  return;
795
816
  const notificationTarget = this.ptyErrorNotificationTarget(name);
@@ -803,6 +824,7 @@ export class InstanceLifecycle {
803
824
  generation: data.generation,
804
825
  reason: data.reason,
805
826
  recoveryStarted: data.recoveryStarted,
827
+ ...(data.message ? { message: data.message } : {}),
806
828
  });
807
829
  this.ctx.logger.warn(data, "Turn ended without an adapter-confirmed reply");
808
830
  }, this.ctx.logger, `daemon.reply_drop_detected[${name}]`));
@@ -818,6 +840,7 @@ export class InstanceLifecycle {
818
840
  correlationId: data.correlationId,
819
841
  generation: data.generation,
820
842
  reason: data.reason,
843
+ ...(data.message ? { message: data.message } : {}),
821
844
  });
822
845
  this.ctx.logger.error(data, "Reply-drop recovery ended without a delivered reply");
823
846
  }, this.ctx.logger, `daemon.reply_drop_unrecovered[${name}]`));
@@ -917,6 +940,13 @@ export class InstanceLifecycle {
917
940
  }
918
941
  await this.ctx.notifyInteractivePrompt(name, data.kind);
919
942
  }, this.ctx.logger, `daemon.interactive_prompt[${name}]`));
943
+ daemon.on("remote_card", safeHandler(async (data) => {
944
+ this.ctx.eventLog?.insert(name, "remote_card", { kind: data.card.kind });
945
+ await this.ctx.postRemoteCard?.(name, data.card);
946
+ }, this.ctx.logger, `daemon.remote_card[${name}]`));
947
+ daemon.on("remote_card_gone", safeHandler((data) => {
948
+ this.ctx.retireRemoteCard?.(name, data.identity);
949
+ }, this.ctx.logger, `daemon.remote_card_gone[${name}]`));
920
950
  daemon.on("pty_error", safeHandler(async (data) => {
921
951
  this.ctx.eventLog?.insert(name, "pty_error", { type: data.type, action: data.action });
922
952
  this.ctx.logger.warn({ name, errorType: data.type, action: data.action }, `PTY error: ${data.message}`);
@@ -989,15 +1019,30 @@ export class InstanceLifecycle {
989
1019
  return;
990
1020
  }
991
1021
  }
1022
+ // #2648: a kiro model error — the resumed conversation's saved model retired, or the instance's own model
1023
+ // unavailable. Restart once on kiro's default (no model of its own), else say it once; never on every start.
1024
+ const kiroVerdict = data.type === "model_error" && this.backendOf(name) === "kiro-cli" ? daemon.kiroModelError?.() ?? null : null;
1025
+ if (kiroVerdict?.kind === "restart") {
1026
+ this.ctx.logger.warn({ name, model: kiroVerdict.model }, "kiro model unavailable on a resumed conversation — restarting once on kiro's default model");
1027
+ this.ctx.clearCancelButton(name);
1028
+ this.ctx.restartSingleInstance(name).catch(err => this.ctx.logger.error({ err, name }, "kiro model-switch restart failed"));
1029
+ return;
1030
+ }
1031
+ if (kiroVerdict?.kind === "quiet") {
1032
+ this.ctx.logger.info({ name }, "kiro model unavailable — already said for this conversation and model");
1033
+ return;
1034
+ }
992
1035
  const emoji = data.type === "rate_limit" || data.type === "timeout" ? "⏳" : data.type === "auth_error" ? "🔑" : "⚠️";
993
- const incidentMessage = data.type === "model_error" && this.backendOf(name) === "claude-code"
994
- ? (() => {
995
- const liveModel = readStatuslineModel(this.ctx.dataDir, name);
996
- return liveModel
997
- ? t("inst.claude_model_fallback", liveModel)
998
- : t("inst.claude_model_unavailable");
999
- })()
1000
- : data.message;
1036
+ const incidentMessage = kiroVerdict?.kind === "notify"
1037
+ ? (kiroVerdict.configured ? t("kiro.model_unavailable_configured", name, kiroVerdict.configured) : t("kiro.model_unavailable_once", name))
1038
+ : data.type === "model_error" && this.backendOf(name) === "claude-code"
1039
+ ? (() => {
1040
+ const liveModel = readStatuslineModel(this.ctx.dataDir, name);
1041
+ return liveModel
1042
+ ? t("inst.claude_model_fallback", liveModel)
1043
+ : t("inst.claude_model_unavailable");
1044
+ })()
1045
+ : data.message;
1001
1046
  const notificationTarget = this.ptyErrorNotificationTarget(name);
1002
1047
  // Auth failures are a property of the BACKEND's shared credentials, not of
1003
1048
  // one instance: every instance on that CLI fails at once, and one re-login
@@ -1363,6 +1408,7 @@ export class InstanceLifecycle {
1363
1408
  // warning synchronously inside Daemon.start, long before
1364
1409
  // attachIncidentHandlers runs (#984).
1365
1410
  this.attachLaunchWarningHandler(name, daemon);
1411
+ this.attachContextLostHandler(name, daemon);
1366
1412
  daemon.on("durable_delivery_deferred", (data) => {
1367
1413
  // A daemon without its outbox port cannot update the row directly. The
1368
1414
  // lifecycle owns the same-process store and records a bounded pre-write
@@ -2110,6 +2156,10 @@ export class InstanceLifecycle {
2110
2156
  && !isModelCompatible(instanceConfig.backend, instanceConfig.model)) {
2111
2157
  delete instanceConfig.model;
2112
2158
  }
2159
+ // #2598: a new kiro instance is written with the TUI engine, explicitly (an unset one is classic).
2160
+ const newKiroUi = newInstanceKiroUi(instanceConfig.backend, this.ctx.fleetConfig?.defaults);
2161
+ if (newKiroUi)
2162
+ instanceConfig.kiro_ui = newKiroUi;
2113
2163
  createdConfig = instanceConfig;
2114
2164
  const beforeCreate = structuredClone(this.ctx.fleetConfig);
2115
2165
  const persist = () => {