@songsid/agend 2.3.2-beta.3 → 2.3.2-beta.5

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 (223) hide show
  1. package/THIRD_PARTY_NOTICES.md +40 -0
  2. package/dist/agent-cli.js +21 -2
  3. package/dist/agent-cli.js.map +1 -1
  4. package/dist/agent-endpoint.js +5 -0
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/antigravity-usage-scan.d.ts +58 -0
  7. package/dist/antigravity-usage-scan.js +257 -0
  8. package/dist/antigravity-usage-scan.js.map +1 -0
  9. package/dist/antigravity-usage-worker.d.ts +1 -0
  10. package/dist/antigravity-usage-worker.js +10 -0
  11. package/dist/antigravity-usage-worker.js.map +1 -0
  12. package/dist/auth-api.js +2 -0
  13. package/dist/auth-api.js.map +1 -1
  14. package/dist/backend/kiro-identity.d.ts +45 -0
  15. package/dist/backend/kiro-identity.js +74 -0
  16. package/dist/backend/kiro-identity.js.map +1 -1
  17. package/dist/backend/kiro.d.ts +36 -1
  18. package/dist/backend/kiro.js +131 -6
  19. package/dist/backend/kiro.js.map +1 -1
  20. package/dist/backend/types.d.ts +6 -0
  21. package/dist/backend/types.js.map +1 -1
  22. package/dist/backend-signin-guide.d.ts +1 -0
  23. package/dist/backend-signin-guide.js +9 -0
  24. package/dist/backend-signin-guide.js.map +1 -0
  25. package/dist/backend-signin-pending.d.ts +10 -0
  26. package/dist/backend-signin-pending.js +44 -0
  27. package/dist/backend-signin-pending.js.map +1 -0
  28. package/dist/browser-backend-signins.d.ts +56 -0
  29. package/dist/browser-backend-signins.js +189 -0
  30. package/dist/browser-backend-signins.js.map +1 -0
  31. package/dist/cache-ledger.d.ts +38 -2
  32. package/dist/cache-ledger.js +133 -8
  33. package/dist/cache-ledger.js.map +1 -1
  34. package/dist/cache-prices.d.ts +2 -1
  35. package/dist/cache-prices.js +5 -2
  36. package/dist/cache-prices.js.map +1 -1
  37. package/dist/cache-service.d.ts +68 -0
  38. package/dist/cache-service.js +355 -13
  39. package/dist/cache-service.js.map +1 -1
  40. package/dist/channel/adapters/discord.js +7 -4
  41. package/dist/channel/adapters/discord.js.map +1 -1
  42. package/dist/channel/mcp-tools.js +7 -1
  43. package/dist/channel/mcp-tools.js.map +1 -1
  44. package/dist/classic-channel-manager.d.ts +5 -0
  45. package/dist/classic-channel-manager.js +14 -1
  46. package/dist/classic-channel-manager.js.map +1 -1
  47. package/dist/cli.js +21 -2
  48. package/dist/cli.js.map +1 -1
  49. package/dist/config-validator.js +22 -5
  50. package/dist/config-validator.js.map +1 -1
  51. package/dist/config.d.ts +19 -0
  52. package/dist/config.js +31 -1
  53. package/dist/config.js.map +1 -1
  54. package/dist/cpu-quota.d.ts +23 -0
  55. package/dist/cpu-quota.js +86 -0
  56. package/dist/cpu-quota.js.map +1 -0
  57. package/dist/daemon.js +22 -7
  58. package/dist/daemon.js.map +1 -1
  59. package/dist/dashboard-permissions.d.ts +20 -6
  60. package/dist/dashboard-permissions.js +58 -9
  61. package/dist/dashboard-permissions.js.map +1 -1
  62. package/dist/fleet-manager.d.ts +51 -1
  63. package/dist/fleet-manager.js +416 -32
  64. package/dist/fleet-manager.js.map +1 -1
  65. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
  66. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +14 -1
  67. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +24 -1
  68. package/dist/general-knowledge/skills/web-appearance/SKILL.md +24 -1
  69. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +6 -3
  70. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +12 -5
  71. package/dist/instance-config-impact.js +10 -5
  72. package/dist/instance-config-impact.js.map +1 -1
  73. package/dist/instance-lifecycle.d.ts +17 -0
  74. package/dist/instance-lifecycle.js +32 -4
  75. package/dist/instance-lifecycle.js.map +1 -1
  76. package/dist/kiro-db-reader.d.ts +5 -0
  77. package/dist/kiro-db-reader.js +18 -0
  78. package/dist/kiro-db-reader.js.map +1 -1
  79. package/dist/kiro-engine-status.d.ts +2 -0
  80. package/dist/kiro-engine-status.js +9 -0
  81. package/dist/kiro-engine-status.js.map +1 -1
  82. package/dist/kiro-migrate.d.ts +49 -0
  83. package/dist/kiro-migrate.js +105 -0
  84. package/dist/kiro-migrate.js.map +1 -0
  85. package/dist/kiro-transcript-lane.d.ts +2 -0
  86. package/dist/kiro-transcript-lane.js.map +1 -1
  87. package/dist/kiro-transcript-worker.js +1 -0
  88. package/dist/kiro-transcript-worker.js.map +1 -1
  89. package/dist/kiro-usage-run.d.ts +7 -0
  90. package/dist/kiro-usage-run.js +39 -0
  91. package/dist/kiro-usage-run.js.map +1 -0
  92. package/dist/kiro-usage-scan.d.ts +49 -0
  93. package/dist/kiro-usage-scan.js +223 -0
  94. package/dist/kiro-usage-scan.js.map +1 -0
  95. package/dist/kiro-usage-worker.d.ts +1 -0
  96. package/dist/kiro-usage-worker.js +10 -0
  97. package/dist/kiro-usage-worker.js.map +1 -0
  98. package/dist/kiro-usage.d.ts +58 -0
  99. package/dist/kiro-usage.js +310 -0
  100. package/dist/kiro-usage.js.map +1 -0
  101. package/dist/locale.js +72 -8
  102. package/dist/locale.js.map +1 -1
  103. package/dist/log-service.js +1 -1
  104. package/dist/log-service.js.map +1 -1
  105. package/dist/login-url.d.ts +4 -0
  106. package/dist/login-url.js +22 -0
  107. package/dist/login-url.js.map +1 -0
  108. package/dist/needs-you-hub.d.ts +2 -1
  109. package/dist/needs-you-hub.js +1 -1
  110. package/dist/needs-you-hub.js.map +1 -1
  111. package/dist/needs-you.d.ts +8 -2
  112. package/dist/needs-you.js +6 -0
  113. package/dist/needs-you.js.map +1 -1
  114. package/dist/notice-delivery.d.ts +15 -0
  115. package/dist/notice-delivery.js +37 -0
  116. package/dist/notice-delivery.js.map +1 -0
  117. package/dist/opencode-usage-scan.d.ts +28 -0
  118. package/dist/opencode-usage-scan.js +92 -0
  119. package/dist/opencode-usage-scan.js.map +1 -0
  120. package/dist/opencode-usage-worker.d.ts +1 -0
  121. package/dist/opencode-usage-worker.js +10 -0
  122. package/dist/opencode-usage-worker.js.map +1 -0
  123. package/dist/outbound-handlers.js +22 -2
  124. package/dist/outbound-handlers.js.map +1 -1
  125. package/dist/outbound-schemas.d.ts +24 -0
  126. package/dist/outbound-schemas.js +21 -0
  127. package/dist/outbound-schemas.js.map +1 -1
  128. package/dist/public-web-gateway.js +1 -1
  129. package/dist/public-web-gateway.js.map +1 -1
  130. package/dist/quickstart-api.js +13 -2
  131. package/dist/quickstart-api.js.map +1 -1
  132. package/dist/quickstart.js +4 -1
  133. package/dist/quickstart.js.map +1 -1
  134. package/dist/reply-triggers.d.ts +2 -0
  135. package/dist/reply-triggers.js +3 -0
  136. package/dist/reply-triggers.js.map +1 -0
  137. package/dist/settings-api.js +27 -4
  138. package/dist/settings-api.js.map +1 -1
  139. package/dist/settings-change.js +17 -14
  140. package/dist/settings-change.js.map +1 -1
  141. package/dist/settings-effect.js +7 -1
  142. package/dist/settings-effect.js.map +1 -1
  143. package/dist/settings-instance-patch.js +4 -1
  144. package/dist/settings-instance-patch.js.map +1 -1
  145. package/dist/setup-form.d.ts +1 -1
  146. package/dist/setup-form.js +7 -1
  147. package/dist/setup-form.js.map +1 -1
  148. package/dist/setup-host.d.ts +9 -0
  149. package/dist/setup-host.js +126 -6
  150. package/dist/setup-host.js.map +1 -1
  151. package/dist/setup-signin-assets.d.ts +2 -0
  152. package/dist/setup-signin-assets.js +6 -0
  153. package/dist/setup-signin-assets.js.map +1 -0
  154. package/dist/setup-wizard.js +4 -0
  155. package/dist/setup-wizard.js.map +1 -1
  156. package/dist/structured-signin-transport.d.ts +8 -0
  157. package/dist/structured-signin-transport.js +79 -0
  158. package/dist/structured-signin-transport.js.map +1 -0
  159. package/dist/structured-signin.d.ts +131 -0
  160. package/dist/structured-signin.js +388 -0
  161. package/dist/structured-signin.js.map +1 -0
  162. package/dist/tool-permissions.js +12 -0
  163. package/dist/tool-permissions.js.map +1 -1
  164. package/dist/topic-commands.js +6 -2
  165. package/dist/topic-commands.js.map +1 -1
  166. package/dist/transcript-sources.d.ts +26 -2
  167. package/dist/transcript-sources.js +87 -40
  168. package/dist/transcript-sources.js.map +1 -1
  169. package/dist/turn-reply-guard.d.ts +1 -1
  170. package/dist/turn-reply-guard.js +1 -1
  171. package/dist/turn-reply-guard.js.map +1 -1
  172. package/dist/types.d.ts +19 -8
  173. package/dist/ui/backend-signin.js +63 -10
  174. package/dist/ui/fleet-office-editor.js +10 -6
  175. package/dist/ui/fleet-office-layout.js +34 -28
  176. package/dist/ui/fleet-office-model.js +6 -3
  177. package/dist/ui/fleet-office-overview.js +2 -2
  178. package/dist/ui/fleet-office-pack.d.ts +3 -1
  179. package/dist/ui/fleet-office-pack.js +58 -7
  180. package/dist/ui/fleet-office-skin.js +13 -4
  181. package/dist/ui/fleet-office-store.js +27 -1
  182. package/dist/ui/fleet-office-view.js +5 -4
  183. package/dist/ui/fleet-office-zones.js +155 -6
  184. package/dist/ui/fleet-office.js +169 -41
  185. package/dist/ui/fleet-usage.js +19 -15
  186. package/dist/ui/panel-log.js +2 -2
  187. package/dist/ui/panel-needs.js +4 -4
  188. package/dist/ui/panel-settings.js +32 -10
  189. package/dist/ui/settings-dialogs.js +8 -1
  190. package/dist/ui/settings-model.js +14 -6
  191. package/dist/ui/settings-registry.js +4 -0
  192. package/dist/ui/settings-strings.js +14 -0
  193. package/dist/ui/shared/app-i18n.js +4 -2
  194. package/dist/ui/shared/app-shell.js +14 -6
  195. package/dist/ui/shared/app-stream.js +2 -1
  196. package/dist/ui/shared/app.css +18 -2
  197. package/dist/ui/shared/side-panel.js +95 -0
  198. package/dist/ui/structured-signin.js +115 -0
  199. package/dist/usage-report.d.ts +20 -0
  200. package/dist/usage-report.js +54 -17
  201. package/dist/usage-report.js.map +1 -1
  202. package/dist/usage-rollup.d.ts +9 -1
  203. package/dist/usage-rollup.js +20 -4
  204. package/dist/usage-rollup.js.map +1 -1
  205. package/dist/web-api.d.ts +4 -0
  206. package/dist/web-api.js +110 -0
  207. package/dist/web-api.js.map +1 -1
  208. package/dist/web-auth.js +1 -1
  209. package/dist/web-auth.js.map +1 -1
  210. package/dist/web-backend-login.d.ts +1 -7
  211. package/dist/web-backend-login.js +2 -24
  212. package/dist/web-backend-login.js.map +1 -1
  213. package/dist/web-office-acts.d.ts +173 -0
  214. package/dist/web-office-acts.js +285 -0
  215. package/dist/web-office-acts.js.map +1 -0
  216. package/dist/web-office-skins.d.ts +1 -1
  217. package/dist/web-office-skins.js +1 -1
  218. package/dist/web-office-skins.js.map +1 -1
  219. package/dist/web-settings-patch.d.ts +2 -1
  220. package/dist/web-settings-patch.js +4 -1
  221. package/dist/web-settings-patch.js.map +1 -1
  222. package/package.json +2 -1
  223. package/templates/windows-shortcuts.ps1 +18 -7
@@ -156,8 +156,11 @@ left untouched; the switch copies, never moves.
156
156
  - `conversation_carried_over: true` — the copy succeeded and the agent resumed
157
157
  the same conversation on the new account. The reply also carries
158
158
  `conversation_note`: relay it. It says the old copy is still there and
159
- warns that the next turn re-reads the full history from a cold cache — one
160
- slower, full-price turn on the new subscription.
159
+ notes that the switch does not by itself make the prompt cache cold: within
160
+ the same cache scope (organization, and workspace where the provider isolates
161
+ them) an unchanged model and prompt prefix are usually reused. The next turn
162
+ may rebuild it (one slower, full-price turn) when the scope, the model or the
163
+ profile's settings differ, or the cache has expired. Don't promise either.
161
164
 
162
165
  - `conversation_carried_over: false` + `carry_failed: "<reason>"` — the copy
163
166
  could not be made. Common reasons: no session id recorded, not enough free
@@ -51,10 +51,23 @@ The user has already been shown the plain notice in this topic. When they ask, e
51
51
 
52
52
  - Never start, restart, recreate or replace a stopped kiro instance to "try again". It will refuse the same way.
53
53
  - Never change `kiro_ui` or `backend` to get an instance running. A different engine starts a different
54
- conversation, and the move cannot be undone.
54
+ conversation, and the move cannot be undone. The one way an instance changes engine is the move below.
55
55
  - Never run `kiro-cli` yourself, and never delete or edit anything under `~/.kiro` or kiro's data directory.
56
56
  - Never reply to the `[system:kiro-incompat]` notice itself. It is information, not a request.
57
57
 
58
+ ## Moving an instance from classic to the TUI engine (#2598)
59
+
60
+ kiro-cli 3.0 drops the classic engine (`kiro_ui: legacy`), so classic instances are being moved to the TUI engine,
61
+ **one batch at a time and only with the user's OK for that batch**. The move is `migrate_kiro_instance` (a
62
+ coordinator-level tool; you do not have it). It carries the conversation: the instance's classic conversation is
63
+ resumed once under the TUI and becomes its own. A fleet admin confirms each move in this General topic: a
64
+ "Move it / Cancel" prompt. Explain it if asked; never press it on the user's behalf.
65
+
66
+ - After the move, `kiro_engine_status` shows `kiro_ui: tui` and `engine_floor: "tui"`.
67
+ - It is one-way. AgEnD refuses to launch a moved instance on classic again, because that would resume the frozen
68
+ classic copy and lose everything done since. A refusal that names the engine floor means someone set `kiro_ui`
69
+ back. The fix is to set it to `tui` again, never to remove the floor.
70
+
58
71
  ## One kiro agent per instance (#906)
59
72
 
60
73
  Since kiro-cli 2.21, each AgEnD kiro instance (tui / v2 engine) runs as its own kiro agent, holding only its own
@@ -20,6 +20,7 @@ can shape how you look there — **only your own look, and only on the surfaces
20
20
  | Your identity colour | the colour people find you by in the sidebar, and where it shows (name, bar, ring) | `set_web_theme` (`identity`) |
21
21
  | Your chat header strip and Details page | widgets: small panels of facts the dashboard draws | `set_web_widget`, `remove_web_widget` |
22
22
  | An ambient effect in your chat | falling petals, snow, rising lanterns, twinkles, stars where a person clicks — data only, drawn by the dashboard | `set_web_ambient`, `clear_web_ambient` |
23
+ | Your character in Fleet → Org chart → Office | walk to a seat, a spot or a person, say a short line, hold a pose — for a few seconds (off until a person switches it on) | `office_view`, `office_set` |
23
24
 
24
25
  None of these tools takes a target: they always act on you. You can't change another instance, the dashboard's own
25
26
  chrome (beyond your colours on it while your chat is open), a person's sidebar widget, or a person's custom CSS.
@@ -265,6 +266,28 @@ needs no Try, no preview consent and no measurement — use it for petals, snow,
265
266
 
266
267
  Then stars on a click, alongside: `set_web_ambient { "preset": "burst-on-click", "glyphs": ["✦", "✧"] }`.
267
268
 
269
+ ## Your character in the Office view
270
+
271
+ Fleet → Org chart → **Office** draws the fleet as an office, with a little character per agent placed by its state.
272
+ When a person switches the **office** dashboard feature on for you (`office_access: true`; off until then — the tools
273
+ are not in your list), you can direct your own character for a moment:
274
+
275
+ - `office_view { office? }`: the stored offices you are in — each `{ id, name, skin, members: [{ name, display_name?,
276
+ state }], spots: { seats: [{ area, index, x, y }], waypoints: [{ id, x, y }], npcs: [{ id, label, x, y }], door } }` —
277
+ your current `act` (or null) and `cooldown_ms` (0: you may act now). `walks: false`: the office is drawn as desks (a
278
+ built-in style such as pixel or studio, or a pack without zones) — no spots; `say` and `pose` show, `go` is refused.
279
+ - `office_set { office?, go?, say?, pose?, seconds?, clear? }`: `go` is exactly one of `seat` (`"area:index"`, as
280
+ office_view lists it), `waypoint` (an id) or `person` (a member of the same office); `say` a line of 1..40 characters
281
+ (a speech bubble); `pose` one of idle, working, needs, paused; `seconds` 5..120 (default 30). `clear: true`, alone,
282
+ ends your act. `office` is needed only when you are in more than one.
283
+ - Each call replaces your act. It ends when its seconds are up or you begin new work (the turn you set it in, and being
284
+ idle after, keep it; working again after that, or after setting it while idle, ends it); it is not shown while you
285
+ need a person (needs, crashed, stuck), are paused or stopped, or are asleep at bedtime — real work always shows. At most **6 calls a minute** and **60 an hour**: a refusal says `cooldown_ms`.
286
+
287
+ ```json
288
+ { "go": { "person": "atlas" }, "say": "Review's ready", "seconds": 20 }
289
+ ```
290
+
268
291
  ## Limits
269
292
 
270
293
  - At least **30 s** between changes, at most **10 changes an hour** — refused with `rate_limited` and
@@ -286,7 +309,7 @@ Then stars on a click, alongside: `set_web_ambient { "preset": "burst-on-click",
286
309
  From a shell: `agend-agent theme get|set key=value…|set --json '<patch>'|clear <path>…|asset <slot> <file>|reset`,
287
310
  `agend-agent appearance`, `agend-agent appearance preview [light|dark]`, and
288
311
  `agend-agent widget set <slot> '<spec json>' ['<data json>']|data <slot> '<data json>'|remove [slot]`,
289
- `agend-agent ambient set '<spec json>'|clear [loop|click]`.
312
+ `agend-agent ambient set '<spec json>'|clear [loop|click]`, `agend-agent office view [office]|set '<json>'`.
290
313
 
291
314
  ## Files in your working directory
292
315
 
@@ -20,6 +20,7 @@ can shape how you look there — **only your own look, and only on the surfaces
20
20
  | Your identity colour | the colour people find you by in the sidebar, and where it shows (name, bar, ring) | `set_web_theme` (`identity`) |
21
21
  | Your chat header strip and Details page | widgets: small panels of facts the dashboard draws | `set_web_widget`, `remove_web_widget` |
22
22
  | An ambient effect in your chat | falling petals, snow, rising lanterns, twinkles, stars where a person clicks — data only, drawn by the dashboard | `set_web_ambient`, `clear_web_ambient` |
23
+ | Your character in Fleet → Org chart → Office | walk to a seat, a spot or a person, say a short line, hold a pose — for a few seconds (off until a person switches it on) | `office_view`, `office_set` |
23
24
  | A file of your look | a mod: export yours, or propose one for a person | `export_web_mod`, `propose_web_mod` |
24
25
  | Effects in your chat | Canvas Worker animations, and Try cards an admin outside the public link may start | `upload_web_effect`, `apply_web_effect`, `preview_web_effect`, … (see Effects) |
25
26
 
@@ -273,6 +274,28 @@ Use a Canvas Worker effect (below) only for what a preset can't express.
273
274
 
274
275
  Then stars on a click, alongside: `set_web_ambient { "preset": "burst-on-click", "glyphs": ["✦", "✧"] }`.
275
276
 
277
+ ## Your character in the Office view
278
+
279
+ Fleet → Org chart → **Office** draws the fleet as an office, with a little character per agent placed by its state.
280
+ When a person switches the **office** dashboard feature on for you (`office_access: true`; off until then — the tools
281
+ are not in your list), you can direct your own character for a moment:
282
+
283
+ - `office_view { office? }`: the stored offices you are in — each `{ id, name, skin, members: [{ name, display_name?,
284
+ state }], spots: { seats: [{ area, index, x, y }], waypoints: [{ id, x, y }], npcs: [{ id, label, x, y }], door } }` —
285
+ your current `act` (or null) and `cooldown_ms` (0: you may act now). `walks: false`: the office is drawn as desks (a
286
+ built-in style such as pixel or studio, or a pack without zones) — no spots; `say` and `pose` show, `go` is refused.
287
+ - `office_set { office?, go?, say?, pose?, seconds?, clear? }`: `go` is exactly one of `seat` (`"area:index"`, as
288
+ office_view lists it), `waypoint` (an id) or `person` (a member of the same office); `say` a line of 1..40 characters
289
+ (a speech bubble); `pose` one of idle, working, needs, paused; `seconds` 5..120 (default 30). `clear: true`, alone,
290
+ ends your act. `office` is needed only when you are in more than one.
291
+ - Each call replaces your act. It ends when its seconds are up or you begin new work (the turn you set it in, and being
292
+ idle after, keep it; working again after that, or after setting it while idle, ends it); it is not shown while you
293
+ need a person (needs, crashed, stuck), are paused or stopped, or are asleep at bedtime — real work always shows. At most **6 calls a minute** and **60 an hour**: a refusal says `cooldown_ms`.
294
+
295
+ ```json
296
+ { "go": { "person": "atlas" }, "say": "Review's ready", "seconds": 20 }
297
+ ```
298
+
276
299
  ## Mods
277
300
 
278
301
  A mod is one file, `<name>-<version>.agendmod.json`, that carries a look: a theme with its pictures, card text,
@@ -322,7 +345,7 @@ with the tools above, then `export_web_mod`.
322
345
  From a shell: `agend-agent theme get|set key=value…|set --json '<patch>'|clear <path>…|asset <slot> <file>|reset`,
323
346
  `agend-agent appearance`, `agend-agent appearance preview [light|dark]`, and
324
347
  `agend-agent widget set <slot> '<spec json>' ['<data json>']|data <slot> '<data json>'|remove [slot]`,
325
- `agend-agent ambient set '<spec json>'|clear [loop|click]`, and
348
+ `agend-agent ambient set '<spec json>'|clear [loop|click]`, `agend-agent office view [office]|set '<json>'`, and
326
349
  `agend-agent mod export <name> <version> [title]|propose <file>`.
327
350
 
328
351
  ## Files in your working directory
@@ -377,11 +377,14 @@ coordinators and full-profile instances, and each other instance only its own ro
377
377
 
378
378
  **The usage report** (the `get_usage_report` tool, and Fleet → **Usage**, `/ui/fleet/usage`, #2122; the ◔ dialog's
379
379
  **By agent →** opens it). Per instance (or backend,
380
- model, credential profile, team): input, output, cache read and cache write tokens, requests, delivered messages,
380
+ model, credential profile, team): input, output, reasoning, cache read and cache write tokens, requests, delivered messages,
381
381
  and an amount, over today / 7d / month / all / custom days in the fleet's timezone. **Every amount is the
382
382
  API-equivalent at list price — not money spent** (subscriptions aren't billed per token): say "API-equivalent", never
383
- "spent". Measured for Claude Code and Codex. Marks to repeat in words:
384
- - `cache_write_not_reported`: Codex records no cache writes, so they are neither shown as 0 nor priced.
383
+ "spent". Measured for Claude Code, Codex, Grok, Muse, OpenCode and Antigravity; **estimated** for Kiro (it records no token counts). Marks to repeat in words:
384
+ - `cost_reported`: the model has no list price in AgEnD's table, so the amount is what the CLI (Grok, OpenCode's provider) reported.
385
+ - `estimated` (a row) / `includes_estimates` (the totals, with `amountEstimated`): Kiro's tokens are estimated from text
386
+ size, not measured — say "estimated" and give the estimated part apart.
387
+ - `cache_write_not_reported`: Codex and Muse record no cache writes, so they are neither shown as 0 nor priced.
385
388
  - `not_priced`: the tokens are shown, the amount isn't.
386
389
  - `source_unknown`: read before #2122, when which backend and profile read it was not recorded (backend and profile
387
390
  "unknown" — never today's).
@@ -269,7 +269,8 @@ desk to desk along the corridors in the Key's colours; a delegation in progress
269
269
  desk. Hover (or tap once) a desk for its name, state and backend; click (or tap again) opens the chat. **Find** dims
270
270
  the rest. **Show** picks a team or the Lobby and **People** pins chosen instances (both kept per browser); the
271
271
  **Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`). An admin session
272
- (never a read-only one, a guest or the public link) gets **Edit offices**: add, rename and delete offices, pick who is
272
+ (never a read-only one, a guest or the public link) gets **Edit offices** (≥1200 px: a panel docked on the right in the
273
+ 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
273
274
  in each (whole teams or single instances; none = everyone) and its style, and upload or delete **skin packs** (an
274
275
  artist's pictures: `manifest.json` plus PNGs, format v1, kept in `web-office-skins/` in the AgEnD home; the host
275
276
  checks every rule — PNG only, each strip exactly frames·w × h, a 16:9 background, size caps — and never changes a
@@ -280,7 +281,10 @@ or an uploaded pack; one the page cannot load is drawn as Desks with a note. On
280
281
  **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
281
282
  waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
282
283
  corridors; **Save layout** keeps the moves as that office's overrides (the pack stays as uploaded), **Reset** goes
283
- back to the pack's own. While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
284
+ back to the pack's own. On a screen ≥1200 px its controls sit in the right-hand panel (the canvas whole for the
285
+ handles); narrower, or in fullscreen, they are the bar along the canvas's bottom. Esc is Cancel. While either editor
286
+ is docked the page beside it works, Ctrl+K search included; leaving the page with unsaved changes asks first
287
+ ("Discard changes"). While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
284
288
  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
285
289
  only calls and work get bubbles (a few at most) and name tags show on hover or focus. **Hide paused and stopped**
286
290
  (per browser, off by default) leaves the sleepers out. Now and then someone says a short line for their state in a
@@ -388,11 +392,14 @@ coordinators and full-profile instances, and each other instance only its own ro
388
392
 
389
393
  **The usage report** (the `get_usage_report` tool, and Fleet → **Usage**, `/ui/fleet/usage`, #2122; the ◔ dialog's
390
394
  **By agent →** opens it). Per instance (or backend,
391
- model, credential profile, team): input, output, cache read and cache write tokens, requests, delivered messages,
395
+ model, credential profile, team): input, output, reasoning, cache read and cache write tokens, requests, delivered messages,
392
396
  and an amount, over today / 7d / month / all / custom days in the fleet's timezone. **Every amount is the
393
397
  API-equivalent at list price — not money spent** (subscriptions aren't billed per token): say "API-equivalent", never
394
- "spent". Measured for Claude Code and Codex. Marks to repeat in words:
395
- - `cache_write_not_reported`: Codex records no cache writes, so they are neither shown as 0 nor priced.
398
+ "spent". Measured for Claude Code, Codex, Grok, Muse, OpenCode and Antigravity; **estimated** for Kiro (it records no token counts). Marks to repeat in words:
399
+ - `cost_reported`: the model has no list price in AgEnD's table, so the amount is what the CLI (Grok, OpenCode's provider) reported.
400
+ - `estimated` (a row) / `includes_estimates` (the totals, with `amountEstimated`): Kiro's tokens are estimated from text
401
+ size, not measured — say "estimated" and give the estimated part apart.
402
+ - `cache_write_not_reported`: Codex and Muse record no cache writes, so they are neither shown as 0 nor priced.
396
403
  - `not_priced`: the tokens are shown, the amount isn't.
397
404
  - `source_unknown`: read before #2122, when which backend and profile read it was not recorded (backend and profile
398
405
  "unknown" — never today's).
@@ -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",
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",
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
@@ -435,6 +443,15 @@ export declare class InstanceLifecycle {
435
443
  * up, and the operator needs to know which conversation each instance is in.
436
444
  */
437
445
  attachLaunchWarningHandler(name: string, daemon: IncidentEventSource): void;
446
+ /**
447
+ * The daemon gave up resuming after repeated startup failures and started a
448
+ * fresh conversation (#737, #749). Without this the only trace was an error
449
+ * line in daemon.log. Attached before start, because the startup spawn is
450
+ * where it happens; and never suppressed for a planned restart, which is
451
+ * exactly when the user expects the conversation to carry on. A ClassicBot's
452
+ * channel is the end user's chat, so its notice goes to General only.
453
+ */
454
+ attachContextLostHandler(name: string, daemon: IncidentEventSource): void;
438
455
  /**
439
456
  * Daemon delivery events → the status reaction on the inbound message. The
440
457
  * 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}]`));
@@ -1363,6 +1386,7 @@ export class InstanceLifecycle {
1363
1386
  // warning synchronously inside Daemon.start, long before
1364
1387
  // attachIncidentHandlers runs (#984).
1365
1388
  this.attachLaunchWarningHandler(name, daemon);
1389
+ this.attachContextLostHandler(name, daemon);
1366
1390
  daemon.on("durable_delivery_deferred", (data) => {
1367
1391
  // A daemon without its outbox port cannot update the row directly. The
1368
1392
  // lifecycle owns the same-process store and records a bounded pre-write
@@ -2110,6 +2134,10 @@ export class InstanceLifecycle {
2110
2134
  && !isModelCompatible(instanceConfig.backend, instanceConfig.model)) {
2111
2135
  delete instanceConfig.model;
2112
2136
  }
2137
+ // #2598: a new kiro instance is written with the TUI engine, explicitly (an unset one is classic).
2138
+ const newKiroUi = newInstanceKiroUi(instanceConfig.backend, this.ctx.fleetConfig?.defaults);
2139
+ if (newKiroUi)
2140
+ instanceConfig.kiro_ui = newKiroUi;
2113
2141
  createdConfig = instanceConfig;
2114
2142
  const beforeCreate = structuredClone(this.ctx.fleetConfig);
2115
2143
  const persist = () => {