@songsid/agend 2.3.2-beta.9 → 2.3.3-beta.1

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 (285) hide show
  1. package/README.md +6 -0
  2. package/README.zh-TW.md +6 -0
  3. package/dist/agent-cli-instructions.md +2 -2
  4. package/dist/agent-cli.js +48 -0
  5. package/dist/agent-cli.js.map +1 -1
  6. package/dist/agent-endpoint.js +6 -0
  7. package/dist/agent-endpoint.js.map +1 -1
  8. package/dist/agent-whats-new.d.ts +21 -0
  9. package/dist/agent-whats-new.js +53 -21
  10. package/dist/agent-whats-new.js.map +1 -1
  11. package/dist/auth-api.js +2 -0
  12. package/dist/auth-api.js.map +1 -1
  13. package/dist/backend/claude-code.d.ts +13 -1
  14. package/dist/backend/claude-code.js +43 -2
  15. package/dist/backend/claude-code.js.map +1 -1
  16. package/dist/backend/codex-session-lookup.d.ts +15 -0
  17. package/dist/backend/codex-session-lookup.js +58 -0
  18. package/dist/backend/codex-session-lookup.js.map +1 -1
  19. package/dist/backend/codex.js +15 -4
  20. package/dist/backend/codex.js.map +1 -1
  21. package/dist/backend/kiro-classic-archive.d.ts +57 -0
  22. package/dist/backend/kiro-classic-archive.js +622 -0
  23. package/dist/backend/kiro-classic-archive.js.map +1 -0
  24. package/dist/backend/kiro-classic-links.d.ts +24 -0
  25. package/dist/backend/kiro-classic-links.js +135 -0
  26. package/dist/backend/kiro-classic-links.js.map +1 -0
  27. package/dist/backend/kiro-identity.d.ts +100 -1
  28. package/dist/backend/kiro-identity.js +262 -31
  29. package/dist/backend/kiro-identity.js.map +1 -1
  30. package/dist/backend/kiro-migration-verify.d.ts +10 -0
  31. package/dist/backend/kiro-migration-verify.js +52 -0
  32. package/dist/backend/kiro-migration-verify.js.map +1 -0
  33. package/dist/backend/kiro-reconcile-store.d.ts +27 -0
  34. package/dist/backend/kiro-reconcile-store.js +351 -0
  35. package/dist/backend/kiro-reconcile-store.js.map +1 -0
  36. package/dist/backend/kiro-v2-store-worker.js +35 -1
  37. package/dist/backend/kiro-v2-store-worker.js.map +1 -1
  38. package/dist/backend/kiro-v2-store.d.ts +31 -1
  39. package/dist/backend/kiro-v2-store.js +22 -12
  40. package/dist/backend/kiro-v2-store.js.map +1 -1
  41. package/dist/backend/kiro.d.ts +124 -6
  42. package/dist/backend/kiro.js +553 -39
  43. package/dist/backend/kiro.js.map +1 -1
  44. package/dist/backend/types.d.ts +109 -4
  45. package/dist/backend/types.js +9 -0
  46. package/dist/backend/types.js.map +1 -1
  47. package/dist/cache-service.d.ts +13 -1
  48. package/dist/cache-service.js +45 -2
  49. package/dist/cache-service.js.map +1 -1
  50. package/dist/channel/ipc-timeouts.js +3 -0
  51. package/dist/channel/ipc-timeouts.js.map +1 -1
  52. package/dist/channel/mcp-tools.js +40 -5
  53. package/dist/channel/mcp-tools.js.map +1 -1
  54. package/dist/channel/tool-router.js +2 -1
  55. package/dist/channel/tool-router.js.map +1 -1
  56. package/dist/classic-channel-manager.d.ts +6 -0
  57. package/dist/classic-channel-manager.js +25 -0
  58. package/dist/classic-channel-manager.js.map +1 -1
  59. package/dist/cli.js +52 -6
  60. package/dist/cli.js.map +1 -1
  61. package/dist/config-validator.d.ts +7 -1
  62. package/dist/config-validator.js +20 -9
  63. package/dist/config-validator.js.map +1 -1
  64. package/dist/config.js +2 -0
  65. package/dist/config.js.map +1 -1
  66. package/dist/cross-instance-envelope.d.ts +10 -5
  67. package/dist/cross-instance-envelope.js +20 -17
  68. package/dist/cross-instance-envelope.js.map +1 -1
  69. package/dist/daemon.d.ts +125 -63
  70. package/dist/daemon.js +694 -330
  71. package/dist/daemon.js.map +1 -1
  72. package/dist/dashboard-permissions.d.ts +15 -4
  73. package/dist/dashboard-permissions.js +49 -23
  74. package/dist/dashboard-permissions.js.map +1 -1
  75. package/dist/delivery-outbox.d.ts +27 -22
  76. package/dist/delivery-outbox.js +109 -161
  77. package/dist/delivery-outbox.js.map +1 -1
  78. package/dist/delivery-outbox.test.js +10 -25
  79. package/dist/delivery-outbox.test.js.map +1 -1
  80. package/dist/doctor.js +2 -1
  81. package/dist/doctor.js.map +1 -1
  82. package/dist/fleet-control-audit.d.ts +1 -1
  83. package/dist/fleet-control-audit.js +3 -0
  84. package/dist/fleet-control-audit.js.map +1 -1
  85. package/dist/fleet-manager.d.ts +94 -15
  86. package/dist/fleet-manager.js +597 -133
  87. package/dist/fleet-manager.js.map +1 -1
  88. package/dist/forged-envelope-scan.d.ts +9 -0
  89. package/dist/forged-envelope-scan.js +30 -5
  90. package/dist/forged-envelope-scan.js.map +1 -1
  91. package/dist/general-instance.d.ts +24 -0
  92. package/dist/general-instance.js +53 -0
  93. package/dist/general-instance.js.map +1 -1
  94. package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +1 -1
  95. package/dist/general-knowledge/skills/docker-install/SKILL.md +25 -0
  96. package/dist/general-knowledge/skills/fleet-config/SKILL.md +5 -3
  97. package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -1
  98. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +34 -0
  99. package/dist/general-knowledge/skills/session-management/SKILL.md +2 -2
  100. package/dist/general-knowledge/skills/tui-effort/SKILL.md +1 -1
  101. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +32 -0
  102. package/dist/general-knowledge/skills/web-appearance/SKILL.md +32 -0
  103. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +57 -17
  104. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +57 -17
  105. package/dist/instance-config-impact.js +3 -2
  106. package/dist/instance-config-impact.js.map +1 -1
  107. package/dist/instance-lifecycle.d.ts +4 -0
  108. package/dist/instance-lifecycle.js +28 -5
  109. package/dist/instance-lifecycle.js.map +1 -1
  110. package/dist/instructions.js +6 -7
  111. package/dist/instructions.js.map +1 -1
  112. package/dist/kiro-migrate.d.ts +19 -2
  113. package/dist/kiro-migrate.js +133 -35
  114. package/dist/kiro-migrate.js.map +1 -1
  115. package/dist/kiro-reconcile.d.ts +21 -0
  116. package/dist/kiro-reconcile.js +88 -0
  117. package/dist/kiro-reconcile.js.map +1 -0
  118. package/dist/kiro-session-proof.d.ts +41 -0
  119. package/dist/kiro-session-proof.js +89 -0
  120. package/dist/kiro-session-proof.js.map +1 -0
  121. package/dist/kiro-tui-forensic.d.ts +19 -0
  122. package/dist/kiro-tui-forensic.js +124 -0
  123. package/dist/kiro-tui-forensic.js.map +1 -0
  124. package/dist/locale.js +202 -16
  125. package/dist/locale.js.map +1 -1
  126. package/dist/log-service.js +3 -3
  127. package/dist/log-service.js.map +1 -1
  128. package/dist/needs-you.d.ts +3 -1
  129. package/dist/needs-you.js +4 -2
  130. package/dist/needs-you.js.map +1 -1
  131. package/dist/office-levels.d.ts +64 -0
  132. package/dist/office-levels.js +66 -0
  133. package/dist/office-levels.js.map +1 -0
  134. package/dist/office-share-page.d.ts +3 -1
  135. package/dist/office-share-page.js +8 -3
  136. package/dist/office-share-page.js.map +1 -1
  137. package/dist/office-share-service.d.ts +6 -3
  138. package/dist/office-share-service.js +12 -8
  139. package/dist/office-share-service.js.map +1 -1
  140. package/dist/office-share.d.ts +45 -8
  141. package/dist/office-share.js +75 -15
  142. package/dist/office-share.js.map +1 -1
  143. package/dist/outbound-handlers.js +21 -2
  144. package/dist/outbound-handlers.js.map +1 -1
  145. package/dist/outbound-schemas.d.ts +47 -2
  146. package/dist/outbound-schemas.js +42 -3
  147. package/dist/outbound-schemas.js.map +1 -1
  148. package/dist/public-web-gateway.js +1 -1
  149. package/dist/public-web-gateway.js.map +1 -1
  150. package/dist/quickstart-api.d.ts +39 -1
  151. package/dist/quickstart-api.js +115 -17
  152. package/dist/quickstart-api.js.map +1 -1
  153. package/dist/remote-card-answer.d.ts +83 -0
  154. package/dist/remote-card-answer.js +208 -0
  155. package/dist/remote-card-answer.js.map +1 -0
  156. package/dist/remote-card-prompt.d.ts +38 -0
  157. package/dist/remote-card-prompt.js +86 -0
  158. package/dist/remote-card-prompt.js.map +1 -0
  159. package/dist/scheduler/task-board.d.ts +44 -17
  160. package/dist/scheduler/task-board.js +95 -36
  161. package/dist/scheduler/task-board.js.map +1 -1
  162. package/dist/sd-notify.d.ts +13 -14
  163. package/dist/sd-notify.js +62 -28
  164. package/dist/sd-notify.js.map +1 -1
  165. package/dist/service-installer.d.ts +13 -0
  166. package/dist/service-installer.js +15 -0
  167. package/dist/service-installer.js.map +1 -1
  168. package/dist/service-owner.d.ts +25 -0
  169. package/dist/service-owner.js +43 -2
  170. package/dist/service-owner.js.map +1 -1
  171. package/dist/settings-api.d.ts +2 -1
  172. package/dist/settings-api.js +19 -26
  173. package/dist/settings-api.js.map +1 -1
  174. package/dist/settings-change.js +10 -5
  175. package/dist/settings-change.js.map +1 -1
  176. package/dist/settings-effect.js +7 -6
  177. package/dist/settings-effect.js.map +1 -1
  178. package/dist/settings-instance-patch.js +1 -1
  179. package/dist/settings-instance-patch.js.map +1 -1
  180. package/dist/setup-form.d.ts +2 -2
  181. package/dist/setup-form.js +139 -93
  182. package/dist/setup-form.js.map +1 -1
  183. package/dist/setup-i18n.d.ts +25 -0
  184. package/dist/setup-i18n.js +226 -0
  185. package/dist/setup-i18n.js.map +1 -0
  186. package/dist/task-board-waker.d.ts +40 -1
  187. package/dist/task-board-waker.js +115 -9
  188. package/dist/task-board-waker.js.map +1 -1
  189. package/dist/tmux-control.d.ts +1 -1
  190. package/dist/tmux-control.js +3 -2
  191. package/dist/tmux-control.js.map +1 -1
  192. package/dist/tmux-manager.js +18 -16
  193. package/dist/tmux-manager.js.map +1 -1
  194. package/dist/tmux-read.d.ts +2 -0
  195. package/dist/tmux-read.js +7 -1
  196. package/dist/tmux-read.js.map +1 -1
  197. package/dist/tool-permissions.js +18 -0
  198. package/dist/tool-permissions.js.map +1 -1
  199. package/dist/topic-commands.d.ts +2 -0
  200. package/dist/topic-commands.js +2 -1
  201. package/dist/topic-commands.js.map +1 -1
  202. package/dist/transcript-sources.d.ts +1 -0
  203. package/dist/transcript-sources.js +20 -3
  204. package/dist/transcript-sources.js.map +1 -1
  205. package/dist/types.d.ts +11 -5
  206. package/dist/ui/backend-signin.js +4 -3
  207. package/dist/ui/chat-store.js +3 -2
  208. package/dist/ui/chat-strings.js +2 -2
  209. package/dist/ui/fleet-office-card.js +114 -0
  210. package/dist/ui/fleet-office-editor.js +81 -9
  211. package/dist/ui/fleet-office-layout.js +56 -11
  212. package/dist/ui/fleet-office-levels.js +105 -0
  213. package/dist/ui/fleet-office-model.js +9 -1
  214. package/dist/ui/fleet-office-pack.d.ts +15 -3
  215. package/dist/ui/fleet-office-pack.js +177 -23
  216. package/dist/ui/fleet-office-skin.js +39 -3
  217. package/dist/ui/fleet-office-store.js +74 -3
  218. package/dist/ui/fleet-office-view.js +8 -0
  219. package/dist/ui/fleet-office-zones.js +102 -19
  220. package/dist/ui/fleet-office.js +308 -44
  221. package/dist/ui/fleet-org.js +2 -0
  222. package/dist/ui/fleet-task-card.js +2 -2
  223. package/dist/ui/fleet-task-common.js +30 -7
  224. package/dist/ui/fleet-task-work.js +2 -2
  225. package/dist/ui/fleet-tasks.js +10 -11
  226. package/dist/ui/office-share-dialog.js +31 -7
  227. package/dist/ui/office-share-page.js +1 -0
  228. package/dist/ui/panel-chat.js +14 -2
  229. package/dist/ui/panel-log.js +6 -6
  230. package/dist/ui/panel-needs.js +1 -1
  231. package/dist/ui/panel-settings.js +16 -8
  232. package/dist/ui/settings-appearance.js +3 -35
  233. package/dist/ui/settings-discord.js +3 -2
  234. package/dist/ui/settings-guests.js +17 -7
  235. package/dist/ui/settings-model.js +17 -9
  236. package/dist/ui/settings-registry.js +1 -1
  237. package/dist/ui/settings-strings.js +18 -6
  238. package/dist/ui/settings-token.js +3 -2
  239. package/dist/ui/settings-wizard.js +25 -9
  240. package/dist/ui/shared/app-i18n.js +2 -2
  241. package/dist/ui/shared/app-stream.js +1 -1
  242. package/dist/ui/shared/app.css +70 -2
  243. package/dist/ui/shared/setup-host-text.js +107 -0
  244. package/dist/ui/structured-signin.js +89 -38
  245. package/dist/update-check.d.ts +13 -4
  246. package/dist/update-check.js +17 -4
  247. package/dist/update-check.js.map +1 -1
  248. package/dist/usage-rollup.d.ts +34 -3
  249. package/dist/usage-rollup.js +56 -3
  250. package/dist/usage-rollup.js.map +1 -1
  251. package/dist/web-api.d.ts +10 -1
  252. package/dist/web-api.js +207 -17
  253. package/dist/web-api.js.map +1 -1
  254. package/dist/web-auth.js +1 -1
  255. package/dist/web-auth.js.map +1 -1
  256. package/dist/web-experimental.d.ts +6 -2
  257. package/dist/web-experimental.js +8 -4
  258. package/dist/web-experimental.js.map +1 -1
  259. package/dist/web-office-acts.d.ts +5 -2
  260. package/dist/web-office-acts.js +9 -4
  261. package/dist/web-office-acts.js.map +1 -1
  262. package/dist/web-office-pack-read.d.ts +35 -0
  263. package/dist/web-office-pack-read.js +252 -0
  264. package/dist/web-office-pack-read.js.map +1 -0
  265. package/dist/web-office-pack-tools.d.ts +241 -0
  266. package/dist/web-office-pack-tools.js +785 -0
  267. package/dist/web-office-pack-tools.js.map +1 -0
  268. package/dist/web-office-skins.d.ts +68 -4
  269. package/dist/web-office-skins.js +324 -33
  270. package/dist/web-office-skins.js.map +1 -1
  271. package/dist/web-office-store.d.ts +47 -4
  272. package/dist/web-office-store.js +124 -23
  273. package/dist/web-office-store.js.map +1 -1
  274. package/dist/web-settings-patch.d.ts +3 -2
  275. package/dist/web-settings-patch.js +7 -5
  276. package/dist/web-settings-patch.js.map +1 -1
  277. package/dist/workflow-templates/default.md +3 -3
  278. package/dist/working-recovery.d.ts +0 -2
  279. package/dist/working-recovery.js +2 -23
  280. package/dist/working-recovery.js.map +1 -1
  281. package/package.json +2 -2
  282. package/templates/windows-shortcuts.ps1 +18 -17
  283. package/dist/upgrade-notices.d.ts +0 -17
  284. package/dist/upgrade-notices.js +0 -93
  285. package/dist/upgrade-notices.js.map +0 -1
@@ -83,7 +83,7 @@ who is not a fleet admin gets a code privately, by sending `/web` or from an adm
83
83
  as their own Discord or Telegram account. What a guest sees:
84
84
  - **With explicit grants** (`web.guests.grants`, set in Settings → Access & security → Guests): exactly the agents an
85
85
  admin granted that person, nothing else (default deny once the key exists). The admin picks the person from people
86
- AgEnD has seen writing to an agent, ticks their agents, saves (giving access or more agents waits for a fleet admin in
86
+ AgEnD has seen writing to an agent, ticks their agents (or ClassicBot rooms, #2667), saves (giving access or more agents waits for a fleet admin in
87
87
  General; taking away applies at once and ends their sessions), then presses **Send sign-in code**, a DM, never a post.
88
88
  Each code sent and each change to someone's access is in the event log (`guest_code_sent`, `guest_grant_changed`),
89
89
  shown to admins under **Recent changes** in that section (no agent's Log tab shows them).
@@ -187,6 +187,9 @@ tab title. Items, grouped by instance, oldest first:
187
187
  - the instance: "Paused: sign-in needed", "Crashed";
188
188
  - deliveries from the last 24 h: "Could not confirm delivery", "Delivery failed" (source → target · kind).
189
189
 
190
+ "Asking you a question" is a kiro V3 question card, posted to the instance's chat with a button per answer and a box
191
+ for answering in words (on Discord/Telegram: reply to the post); an MCP input request offers Decline / Cancel and is
192
+ filled in at the terminal (View).
190
193
  A prompt shows its own answer buttons (first answer wins); a delivery has **Acknowledge** (clears it everywhere);
191
194
  "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
192
195
  tab is hidden — per browser, not on phones or plain-HTTP addresses. Config: `needs_you.live_message` (default on),
@@ -226,8 +229,9 @@ values reloaded after Save. Password fields keep the browser's behaviour.
226
229
  The sidebar's **Fleet** (zh "Fleet 概覽", at the top) and the phone's Fleet tab open the Fleet tab this device used last
227
230
  (`agend_last_fleet_tab`; the Org chart the first time). The sidebar has no separate Fleet (Details) or View row.
228
231
  - **Tasks** — the task board: Home lists **projects** (with % done) and what waits for the person (**Confirm** /
229
- **Send back** finished work, **Answer** a blocked card); **No project** holds `task`-tool tasks. A project is a board
230
- of main tasks (M-n) by status — To do, In progress, Blocked, Waiting for you, Done — with drag to move, an assignee
232
+ **Send back** finished work, **Answer** a blocked card — #2756: only the cards the person handed out, as Needs you;
233
+ an agent's card in review says "Waiting for <agent>"); **No project** holds `task`-tool tasks. A project is a board
234
+ of main tasks (M-n) by status — To do, In progress, Blocked, To confirm, Done — with drag to move, an assignee
231
235
  filter and each main task's sub tasks (S-n). A card opens in a dialog: every field editable, its sub tasks, comments,
232
236
  progress log, history. **Search cards** in the header. Only a signed-in person confirms the work they handed out
233
237
  (an instance's `done` on such a card is review); a card an agent handed out, that agent confirms (#2434). No
@@ -250,30 +254,46 @@ Click a team header to fold it. **Find** dims everything that doesn't match. A c
250
254
  and backend; clicking it opens the chat. List mode adds the description, model, a link to the Discord thread or
251
255
  Telegram topic, and **Open chat**.
252
256
 
257
+ **The Office guide** (`docs/office.md` in the AgEnD repository; `docs/office.zh-TW.md` in Traditional Chinese) is the one page for people: setting up offices, the
258
+ skin-pack manifest format and its limits, Edit layout and seat reservations, bedtime, share links, agents' office and
259
+ pack tools, and rolling back. Point people there for more than the summary below; it lists the version each feature came in.
260
+
253
261
  **Office** (the third view, remembered per device) draws the same fleet as a pixel office: a room per team, a desk
254
262
  per instance with a name tag, General and "Not in a team" in the **Lobby**. Each little person is its state: typing
255
263
  with the lamp on (working), tea break (idle), asleep behind a **Closed** sign (paused/stopped), a hand up under a
256
264
  blinking light (needs you, crashed, looks stuck). With **Live** on, each message, delegation and report is carried
257
265
  desk to desk along the corridors in the Key's colours; a delegation in progress is a purple folder on the worker's
258
- desk. Hover (or tap once) a desk for its name, state and backend; click (or tap again) opens the chat. **Find** dims
266
+ desk. Hover a desk for its name, state and backend; a click or tap (or Enter in the desk list) opens the
267
+ person's profile card (#2661: a 320 px popover beside them, following them; Esc, a press elsewhere or the same person
268
+ again closes it; on a phone a bottom sheet): level and XP, office and area, model, backend, today, first seen, the
269
+ activity line, **Find in office** and **Chat**. A double-click opens the chat directly. Each name tag has a level badge
270
+ (lifetime work, docs/office.md § Levels; **Settings → Web dashboard → Office levels**, `web.office_levels`). **Find** dims
259
271
  the rest. **Show** picks a team or the Lobby and **People** pins chosen instances (both kept per browser); the
260
272
  **Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`). An admin session
261
273
  (never a read-only one, a guest or the public link) gets **Edit offices**: add, rename and delete offices, pick who is
262
- in each (whole teams or single instances; none = everyone) and its style, and upload or delete **skin packs** (an
274
+ in each (Everyone, Picked: whole teams or single instances, or #2752 Nobody: its style's NPCs only; none picked = everyone) and its style, and upload or delete **skin packs** (an
263
275
  artist's pictures: `manifest.json` plus PNGs, format v1, kept in `web-office-skins/` in the AgEnD home; the host
264
276
  checks every rule — PNG only, each strip exactly frames·w × h, a 16:9 background, size caps — and never changes a
265
277
  pack; a strip may give its displayed size, `dw`/`dh`, apart from its pictures' size, and a character may walk four
266
- 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**,
278
+ ways with `walkDown`, `walkUp` and `walkSide`, the side one mirrored for left). #2692: an agent with **Office skin
279
+ packs** on (`office_pack_access`, Dashboard access) can check, upload, replace, delete and restore packs itself (one
280
+ previous version kept per pack); **Agents changing packs** under the packs names those agents, sets whether their changes
281
+ **Need my yes** (the default) or **Apply at once**, and approves or rejects the waiting ones (also from the notice's
282
+ buttons in General); every change is logged and told in General. **Style** (per office for a stored one; for the whole fleet, #2716, an admin's pick is kept on the host for every device and share link, anyone else's stays in their browser): **Desks**,
267
283
  **Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
268
284
  **Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
269
285
  restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
270
286
  own) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
271
287
  Cozy or a pack,
272
- **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
288
+ **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door, the mail drop
289
+ (an envelope: where letters from other offices land; dashed on a pack without a `mailDrop`, #2736) and
273
290
  waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
274
291
  corridors; an item that sleeps at bedtime (a pack's `night`) has a night handle too ("Item {id} (night)": its night
275
292
  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
276
- its own night place, **Back to the pack's night place** undoes it (#2665); **Save layout** keeps the moves as that
293
+ its own night place, **Back to the pack's night place** undoes it (#2665); a selected seat has **Reserved for** (the
294
+ office's members, several allowed) and **Lend when away** (#2691) — whoever it is for sits there first when they come
295
+ to its area, nobody else does unless it is lent while they are all away (a borrower moves off when one comes), and a
296
+ reserved seat's handle is ringed; a pack can reserve seats as well; **Save layout** keeps the moves as that
277
297
  office's overrides (the pack stays as uploaded), **Reset** goes back to the pack's own. While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
278
298
  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
279
299
  only calls and work get bubbles (a few at most) and name tags show on hover or focus. **Hide paused and stopped**
@@ -287,8 +307,8 @@ only. Hover and click work across
287
307
  tiles; a tile's label, or a double-click on it, opens that office; traffic between offices flies straight across.
288
308
  Edit offices and Edit layout wait for a single office.
289
309
  **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
290
- link: anyone who opens it watches one office (or **All offices**) live, read-only, with no sign-in — names, identity
291
- colours and states, every 5 s; no chat, no clicks into anything, no settings; agents' `office_set` lines only when
310
+ link: anyone who opens it watches **Whole fleet** (#2716, in the fleet's style), one office or **All offices** live, in the link's **Look** (#2715: Light, Dark or the viewer's device; default what the maker's dashboard shows now), read-only, with no sign-in — names, identity
311
+ colours and states, every 5 s; no chat, no settings (a click shows a card with name, title, state, office and level only); agents' `office_set` lines only when
292
312
  **Include agents' own status lines** is ticked; hidden instances never. 1 h by default, 15 min to 24 h
293
313
  (`web.office_share.max_hours`); at most 10 open. Its own quick tunnel (`https://<random>.trycloudflare.com/o/<token>`)
294
314
  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
@@ -296,8 +316,9 @@ starts with the first link and stops with the last; the token is shown once. The
296
316
  says to try again in a few minutes (no retry). `web.office_share.enabled: false` turns it off and ends open links.
297
317
 
298
318
  The Office fills the Fleet panel and moves like the Canvas (#2540): drag to pan, the wheel or a pinch to zoom,
299
- **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them) or the `+ - 0` keys
300
- (with the office focused), an overview at the bottom right to jump (not on a phone). It takes the whole panel: the
319
+ **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them; on a phone, outside
320
+ fullscreen, a row along the top of the scene) or the `+ - 0` keys (with the office focused), an overview at the bottom right to jump (not on a phone; hidden while a single office
321
+ is all in view, #2737). It takes the whole panel: the
301
322
  Fleet area's full width, down to the window's foot. **Fit** shows the whole scene as large as the panel allows
302
323
  (any scale, so it fills the panel's width or height); **Fill** (a toggle, kept per office) fills the panel instead,
303
324
  cropping what overflows — drag to see it. **+** / **−** step in pixel levels (each logical unit a whole number of
@@ -314,6 +335,10 @@ A pack may add a `foreground` (a 16:9 PNG over the whole scene, zones packs only
314
335
  and items in the air, below name tags, bubbles and "+N" — door frames, pillars, table fronts that hide whoever walks
315
336
  behind them. A furniture item's `depth` may be `"y"`: drawn among the people by base y (whoever stands lower is in
316
337
  front). Numeric depths keep their meaning (under 1000 under the people, 1000 and up over them).
338
+ An item with `activeWhen` may wait for its person (#2698): `"activeOn": "seated"` turns it active only once one of its
339
+ `activeFor` people in that state has arrived at their seat, and back as they walk off (default `"state"`: as the state
340
+ changes); `"hides": true` (needs `activeFor`) stops drawing those people while it is active (walking, they are drawn),
341
+ puts their name tags (one row at the item's tag point) and bubbles on it, and makes hovering or clicking it hit them.
317
342
  A pack may set `"straight": true` (#2634): each diagonal leg of a walk becomes an L (across, then up or down), so the
318
343
  three walking strips always fit; lay its graph out with horizontal and vertical edges and the corners land on the aisles.
319
344
 
@@ -359,7 +384,8 @@ to that instance's Log).
359
384
  colours only; status colours (Needs you count, state dots, errors, focus ring) never change. The header follows the
360
385
  page, not the chat. Off with agents' themes off or `?safe=1`.
361
386
 
362
- Phone layout: bottom tabs Chat, Needs you, Fleet, Settings. Chat is current on any of an agent's pages and goes to its
387
+ Phone layout: bottom tabs Chat, Needs you, Fleet, Settings. Settings opens on its list of sections (search on top);
388
+ each section opens on its own page with "‹ Settings", and dialogs and the setup wizard are full-screen sheets. Chat is current on any of an agent's pages and goes to its
363
389
  chat; View, Log and Details are the switch under the header.
364
390
 
365
391
  ## Usage and the cache report
@@ -476,7 +502,10 @@ signed in? kiro logs out first; **Use a temporary public link** where allowed),
476
502
  sign-in terminal** + its one-time access code (this browser only, no DM). While it runs every admin page shows
477
503
  "Signing in to X (started on <device>)" with **Open**; another browser sees no code and may **Cancel sign-in**. Ends
478
504
  when the browser session ends. A missing CLI is not installed here (the dialog says the install command). agy and
479
- opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`).
505
+ opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`). Default Kiro, Claude Code and Codex
506
+ accounts sign in with named browser controls instead (#2599): Kiro's account method, Start URL and region and Claude's
507
+ code are entered in the browser, Codex shows its link and device code; credential profiles keep the dialog above. A
508
+ backend skipped at first setup shows in Needs you even before an agent uses it.
480
509
 
481
510
  **Agents** — **New agent**; per agent **Settings**, **Pause / Wake**, **Start / Stop** (direct), ⋯ **Delete agent**
482
511
  (staged; on Apply it waits for a fleet admin's confirmation in General, then the agent is stopped and removed, as
@@ -513,10 +542,12 @@ Advanced **Context lines** (these restart the room's agent); Tool progress and R
513
542
 
514
543
  **Agent defaults** — **Project folders** (`project_roots`: where New agent may put an agent; empty = anywhere;
515
544
  changing it waits for a fleet admin's OK) and the fleet defaults (`defaults.*`): **Language (bot replies)** (`locale`: Auto / en / zh-TW), default
516
- backend and model, auto-pause, tool progress, bot-to-bot visibility, reply guard; Advanced: tool set, agent mode, log
545
+ backend and model, auto-pause, tool progress, bot-to-bot visibility, reply guard, **Native replies trigger ClassicBot**
546
+ (`reply_triggers`: a native reply triggers a ClassicBot bot; off by default, #2576); Advanced: tool set, agent mode, log
517
547
  level, **Hang detector enabled** / **Stuck timeout** (`hang_detector.*`), **Startup concurrency** (1–20) and
518
548
  **Stagger delay** (`startup.*`, restart AgEnD). ClassicBot defaults (in Chat & connections; `classicBot.yaml defaults.*`): default backend, tool
519
- progress, reply guard, **ClassicBot admins**, **Allowed guilds**.
549
+ progress, reply guard, **Native replies trigger ClassicBot** (`reply_triggers`, also per room), **ClassicBot admins**,
550
+ **Allowed guilds**.
520
551
 
521
552
  **Access & security** (sessions, browser terminal, public link and fixed address, guests, web authority; web echo is in Chat & connections, the Log tab and usage over the link in **Web dashboard**) — all apply at once; loosening waits for an admin; disabled over a public link.
522
553
  | Label | Key |
@@ -542,7 +573,16 @@ Shown read-only ("Set in fleet.yaml"): `web.allowed_hosts`, `view_access`, `prev
542
573
  connections are off (and the setup wizard); while those have unsaved changes, the editor only reads.
543
574
 
544
575
  **Setup wizard** — agent (backend, directory, name) → platform → token and server/group, your user ID → preview →
545
- **Create and start**.
576
+ **Create and start**. The directory may be left empty: the agent gets its own folder, `~/.agend/workspaces/<name>`
577
+ (shown under the field); one that is entered must be absolute. On a Telegram or Discord connection the first agent
578
+ is named `general` by default and becomes the fleet's General, in the chat's General topic or channel, when its
579
+ directory is left empty; with a directory it is the worker `agent-1` and the fleet adds its General in its own folder.
580
+ Once a fleet has a connection or a General, a new agent can't be called `general`.
581
+
582
+ **First setup, before any fleet** (`agend setup`, the page the Windows installer opens): the same steps on its own
583
+ page, in English or 繁體中文 (the browser's language; the button at the top switches). The working directory may be
584
+ left empty: the agent then gets its own folder, `~/.agend/workspaces/<name>`, shown under the field and created
585
+ when the host confirms; a directory that is entered must be absolute.
546
586
 
547
587
  ## Look
548
588
 
@@ -91,7 +91,7 @@ who is not a fleet admin gets a code privately, by sending `/web` or from an adm
91
91
  as their own Discord or Telegram account. What a guest sees:
92
92
  - **With explicit grants** (`web.guests.grants`, set in Settings → Access & security → Guests): exactly the agents an
93
93
  admin granted that person, nothing else (default deny once the key exists). The admin picks the person from people
94
- AgEnD has seen writing to an agent, ticks their agents, saves (giving access or more agents waits for a fleet admin in
94
+ AgEnD has seen writing to an agent, ticks their agents (or ClassicBot rooms, #2667), saves (giving access or more agents waits for a fleet admin in
95
95
  General; taking away applies at once and ends their sessions), then presses **Send sign-in code**, a DM, never a post.
96
96
  Each code sent and each change to someone's access is in the event log (`guest_code_sent`, `guest_grant_changed`),
97
97
  shown to admins under **Recent changes** in that section (no agent's Log tab shows them).
@@ -196,6 +196,9 @@ tab title. Items, grouped by instance, oldest first:
196
196
  - the instance: "Paused: sign-in needed", "Crashed";
197
197
  - deliveries from the last 24 h: "Could not confirm delivery", "Delivery failed" (source → target · kind).
198
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).
199
202
  A prompt shows its own answer buttons (first answer wins); a delivery has **Acknowledge** (clears it everywhere);
200
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
201
204
  tab is hidden — per browser, not on phones or plain-HTTP addresses. Config: `needs_you.live_message` (default on),
@@ -235,8 +238,9 @@ values reloaded after Save. Password fields keep the browser's behaviour.
235
238
  The sidebar's **Fleet** (zh "Fleet 概覽", at the top) and the phone's Fleet tab open the Fleet tab this device used last
236
239
  (`agend_last_fleet_tab`; the Org chart the first time). The sidebar has no separate Fleet (Details) or View row.
237
240
  - **Tasks** — the task board: Home lists **projects** (with % done) and what waits for the person (**Confirm** /
238
- **Send back** finished work, **Answer** a blocked card); **No project** holds `task`-tool tasks. A project is a board
239
- of main tasks (M-n) by status — To do, In progress, Blocked, Waiting for you, Done — with drag to move, an assignee
241
+ **Send back** finished work, **Answer** a blocked card — #2756: only the cards the person handed out, as Needs you;
242
+ an agent's card in review says "Waiting for <agent>"); **No project** holds `task`-tool tasks. A project is a board
243
+ of main tasks (M-n) by status — To do, In progress, Blocked, To confirm, Done — with drag to move, an assignee
240
244
  filter and each main task's sub tasks (S-n). A card opens in a dialog: every field editable, its sub tasks, comments,
241
245
  progress log, history. **Search cards** in the header. Only a signed-in person confirms the work they handed out
242
246
  (an instance's `done` on such a card is review); a card an agent handed out, that agent confirms (#2434). No
@@ -261,31 +265,47 @@ Click a team header to fold it. **Find** dims everything that doesn't match. A c
261
265
  and backend; clicking it opens the chat. List mode adds the description, model, a link to the Discord thread or
262
266
  Telegram topic, and **Open chat**.
263
267
 
268
+ **The Office guide** (`docs/office.md` in the AgEnD repository; `docs/office.zh-TW.md` in Traditional Chinese) is the one page for people: setting up offices, the
269
+ skin-pack manifest format and its limits, Edit layout and seat reservations, bedtime, share links, agents' office and
270
+ pack tools, and rolling back. Point people there for more than the summary below; it lists the version each feature came in.
271
+
264
272
  **Office** (the third view, remembered per device) draws the same fleet as a pixel office: a room per team, a desk
265
273
  per instance with a name tag, General and "Not in a team" in the **Lobby**. Each little person is its state: typing
266
274
  with the lamp on (working), tea break (idle), asleep behind a **Closed** sign (paused/stopped), a hand up under a
267
275
  blinking light (needs you, crashed, looks stuck). With **Live** on, each message, delegation and report is carried
268
276
  desk to desk along the corridors in the Key's colours; a delegation in progress is a purple folder on the worker's
269
- desk. Hover (or tap once) a desk for its name, state and backend; click (or tap again) opens the chat. **Find** dims
277
+ desk. Hover a desk for its name, state and backend; a click or tap (or Enter in the desk list) opens the
278
+ person's profile card (#2661: a 320 px popover beside them, following them; Esc, a press elsewhere or the same person
279
+ again closes it; on a phone a bottom sheet): level and XP, office and area, model, backend, today, first seen, the
280
+ activity line, **Find in office** and **Chat**. A double-click opens the chat directly. Each name tag has a level badge
281
+ (lifetime work, docs/office.md § Levels; **Settings → Web dashboard → Office levels**, `web.office_levels`). **Find** dims
270
282
  the rest. **Show** picks a team or the Lobby and **People** pins chosen instances (both kept per browser); the
271
283
  **Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`). An admin session
272
284
  (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
285
  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
274
- in each (whole teams or single instances; none = everyone) and its style, and upload or delete **skin packs** (an
286
+ in each (Everyone, Picked: whole teams or single instances, or #2752 Nobody: its style's NPCs only; none picked = everyone) and its style, and upload or delete **skin packs** (an
275
287
  artist's pictures: `manifest.json` plus PNGs, format v1, kept in `web-office-skins/` in the AgEnD home; the host
276
288
  checks every rule — PNG only, each strip exactly frames·w × h, a 16:9 background, size caps — and never changes a
277
289
  pack; a strip may give its displayed size, `dw`/`dh`, apart from its pictures' size, and a character may walk four
278
- 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**,
290
+ ways with `walkDown`, `walkUp` and `walkSide`, the side one mirrored for left). #2692: an agent with **Office skin
291
+ packs** on (`office_pack_access`, Dashboard access) can check, upload, replace, delete and restore packs itself (one
292
+ previous version kept per pack); **Agents changing packs** under the packs names those agents, sets whether their changes
293
+ **Need my yes** (the default) or **Apply at once**, and approves or rejects the waiting ones (also from the notice's
294
+ buttons in General); every change is logged and told in General. **Style** (per office for a stored one; for the whole fleet, #2716, an admin's pick is kept on the host for every device and share link, anyone else's stays in their browser): **Desks**,
279
295
  **Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
280
296
  **Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
281
297
  restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
282
298
  own) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
283
299
  Cozy or a pack,
284
- **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
300
+ **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door, the mail drop
301
+ (an envelope: where letters from other offices land; dashed on a pack without a `mailDrop`, #2736) and
285
302
  waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
286
303
  corridors; an item that sleeps at bedtime (a pack's `night`) has a night handle too ("Item {id} (night)": its night
287
304
  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
288
- its own night place, **Back to the pack's night place** undoes it (#2665); **Save layout** keeps the moves as that
305
+ its own night place, **Back to the pack's night place** undoes it (#2665); a selected seat has **Reserved for** (the
306
+ office's members, several allowed) and **Lend when away** (#2691) — whoever it is for sits there first when they come
307
+ to its area, nobody else does unless it is lent while they are all away (a borrower moves off when one comes), and a
308
+ reserved seat's handle is ringed; a pack can reserve seats as well; **Save layout** keeps the moves as that
289
309
  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
290
310
  handles); narrower, or in fullscreen, they are the bar along the canvas's bottom. Esc is Cancel. While either editor
291
311
  is docked the page beside it works, Ctrl+K search included; leaving the page with unsaved changes asks first
@@ -302,8 +322,8 @@ only. Hover and click work across
302
322
  tiles; a tile's label, or a double-click on it, opens that office; traffic between offices flies straight across.
303
323
  Edit offices and Edit layout wait for a single office.
304
324
  **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
305
- link: anyone who opens it watches one office (or **All offices**) live, read-only, with no sign-in — names, identity
306
- colours and states, every 5 s; no chat, no clicks into anything, no settings; agents' `office_set` lines only when
325
+ link: anyone who opens it watches **Whole fleet** (#2716, in the fleet's style), one office or **All offices** live, in the link's **Look** (#2715: Light, Dark or the viewer's device; default what the maker's dashboard shows now), read-only, with no sign-in — names, identity
326
+ colours and states, every 5 s; no chat, no settings (a click shows a card with name, title, state, office and level only); agents' `office_set` lines only when
307
327
  **Include agents' own status lines** is ticked; hidden instances never. 1 h by default, 15 min to 24 h
308
328
  (`web.office_share.max_hours`); at most 10 open. Its own quick tunnel (`https://<random>.trycloudflare.com/o/<token>`)
309
329
  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
@@ -311,8 +331,9 @@ starts with the first link and stops with the last; the token is shown once. The
311
331
  says to try again in a few minutes (no retry). `web.office_share.enabled: false` turns it off and ends open links.
312
332
 
313
333
  The Office fills the Fleet panel and moves like the Canvas (#2540): drag to pan, the wheel or a pinch to zoom,
314
- **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them) or the `+ - 0` keys
315
- (with the office focused), an overview at the bottom right to jump (not on a phone). It takes the whole panel: the
334
+ **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them; on a phone, outside
335
+ fullscreen, a row along the top of the scene) or the `+ - 0` keys (with the office focused), an overview at the bottom right to jump (not on a phone; hidden while a single office
336
+ is all in view, #2737). It takes the whole panel: the
316
337
  Fleet area's full width, down to the window's foot. **Fit** shows the whole scene as large as the panel allows
317
338
  (any scale, so it fills the panel's width or height); **Fill** (a toggle, kept per office) fills the panel instead,
318
339
  cropping what overflows — drag to see it. **+** / **−** step in pixel levels (each logical unit a whole number of
@@ -329,6 +350,10 @@ A pack may add a `foreground` (a 16:9 PNG over the whole scene, zones packs only
329
350
  and items in the air, below name tags, bubbles and "+N" — door frames, pillars, table fronts that hide whoever walks
330
351
  behind them. A furniture item's `depth` may be `"y"`: drawn among the people by base y (whoever stands lower is in
331
352
  front). Numeric depths keep their meaning (under 1000 under the people, 1000 and up over them).
353
+ An item with `activeWhen` may wait for its person (#2698): `"activeOn": "seated"` turns it active only once one of its
354
+ `activeFor` people in that state has arrived at their seat, and back as they walk off (default `"state"`: as the state
355
+ changes); `"hides": true` (needs `activeFor`) stops drawing those people while it is active (walking, they are drawn),
356
+ puts their name tags (one row at the item's tag point) and bubbles on it, and makes hovering or clicking it hit them.
332
357
  A pack may set `"straight": true` (#2634): each diagonal leg of a walk becomes an L (across, then up or down), so the
333
358
  three walking strips always fit; lay its graph out with horizontal and vertical edges and the corners land on the aisles.
334
359
 
@@ -374,7 +399,8 @@ to that instance's Log).
374
399
  colours only; status colours (Needs you count, state dots, errors, focus ring) never change. The header follows the
375
400
  page, not the chat. Off with agents' themes off or `?safe=1`.
376
401
 
377
- Phone layout: bottom tabs Chat, Needs you, Fleet, Settings. Chat is current on any of an agent's pages and goes to its
402
+ Phone layout: bottom tabs Chat, Needs you, Fleet, Settings. Settings opens on its list of sections (search on top);
403
+ each section opens on its own page with "‹ Settings", and dialogs and the setup wizard are full-screen sheets. Chat is current on any of an agent's pages and goes to its
378
404
  chat; View, Log and Details are the switch under the header.
379
405
 
380
406
  ## Usage and the cache report
@@ -491,7 +517,10 @@ signed in? kiro logs out first; **Use a temporary public link** where allowed),
491
517
  sign-in terminal** + its one-time access code (this browser only, no DM). While it runs every admin page shows
492
518
  "Signing in to X (started on <device>)" with **Open**; another browser sees no code and may **Cancel sign-in**. Ends
493
519
  when the browser session ends. A missing CLI is not installed here (the dialog says the install command). agy and
494
- opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`).
520
+ opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`). Default Kiro, Claude Code and Codex
521
+ accounts sign in with named browser controls instead (#2599): Kiro's account method, Start URL and region and Claude's
522
+ code are entered in the browser, Codex shows its link and device code; credential profiles keep the dialog above. A
523
+ backend skipped at first setup shows in Needs you even before an agent uses it.
495
524
 
496
525
  **Agents** — **New agent**; per agent **Settings**, **Pause / Wake**, **Start / Stop** (direct), ⋯ **Delete agent**
497
526
  (staged; on Apply it waits for a fleet admin's confirmation in General, then the agent is stopped and removed, as
@@ -528,10 +557,12 @@ Advanced **Context lines** (these restart the room's agent); Tool progress and R
528
557
 
529
558
  **Agent defaults** — **Project folders** (`project_roots`: where New agent may put an agent; empty = anywhere;
530
559
  changing it waits for a fleet admin's OK) and the fleet defaults (`defaults.*`): **Language (bot replies)** (`locale`: Auto / en / zh-TW; read at startup: restart AgEnD), default
531
- backend and model, auto-pause, tool progress, bot-to-bot visibility, reply guard; Advanced: tool set, agent mode, log
560
+ backend and model, auto-pause, tool progress, bot-to-bot visibility, reply guard, **Native replies trigger ClassicBot**
561
+ (`reply_triggers`: a native reply triggers a ClassicBot bot; off by default, #2576); Advanced: tool set, agent mode, log
532
562
  level, **Hang detector enabled** / **Stuck timeout** (`hang_detector.*`), **Startup concurrency** (1–20) and
533
563
  **Stagger delay** (`startup.*`, used from the next agent start, no restart). ClassicBot defaults (in Chat & connections; `classicBot.yaml defaults.*`): default backend, tool
534
- progress, reply guard, **ClassicBot admins**, **Allowed guilds**.
564
+ progress, reply guard, **Native replies trigger ClassicBot** (`reply_triggers`, also per room), **ClassicBot admins**,
565
+ **Allowed guilds**.
535
566
 
536
567
  **Access & security** (sessions, browser terminal, public link and fixed address, guests, web authority; web echo is in Chat & connections, the Log tab and usage over the link in **Web dashboard**) — all apply at once; loosening waits for an admin; disabled over a public link.
537
568
  | Label | Key |
@@ -557,7 +588,16 @@ Shown read-only ("Set in fleet.yaml"): `web.allowed_hosts`, `view_access`, `prev
557
588
  connections are off (and the setup wizard); while those have unsaved changes, the editor only reads.
558
589
 
559
590
  **Setup wizard** — agent (backend, directory, name) → platform → token and server/group, your user ID → preview →
560
- **Create and start**.
591
+ **Create and start**. The directory may be left empty: the agent gets its own folder, `~/.agend/workspaces/<name>`
592
+ (shown under the field); one that is entered must be absolute. On a Telegram or Discord connection the first agent
593
+ is named `general` by default and becomes the fleet's General, in the chat's General topic or channel, when its
594
+ directory is left empty; with a directory it is the worker `agent-1` and the fleet adds its General in its own folder.
595
+ Once a fleet has a connection or a General, a new agent can't be called `general`.
596
+
597
+ **First setup, before any fleet** (`agend setup`, the page the Windows installer opens): the same steps on its own
598
+ page, in English or 繁體中文 (the browser's language; the button at the top switches). The working directory may be
599
+ left empty: the agent then gets its own folder, `~/.agend/workspaces/<name>`, shown under the field and created
600
+ when the host confirms; a directory that is entered must be absolute.
561
601
 
562
602
  ## Look
563
603
 
@@ -39,7 +39,7 @@ export const HOT_INSTANCE_CONFIG_KEYS = new Set([
39
39
  // #2303: the fleet reads it at each task board claim; the daemon only keeps it current.
40
40
  "board_cards_at_once",
41
41
  // The fleet reads it at each tool call; the daemon keeps it current for the next spawn's tool menu.
42
- "dashboard", "office_access",
42
+ "dashboard", "office_access", "office_pack_access",
43
43
  ]);
44
44
  /**
45
45
  * The hot keys a ClassicBot channel edit can use.
@@ -75,7 +75,7 @@ const INSTANCE_FIELDS = [
75
75
  // #2303: read by the fleet at each task board claim.
76
76
  "board_cards_at_once",
77
77
  // Read by the fleet at each tool call (dashboard-permissions.ts).
78
- "dashboard", "office_access",
78
+ "dashboard", "office_access", "office_pack_access",
79
79
  ];
80
80
  /** ClassicBot channel fields the settings page renders. */
81
81
  const CLASSIC_FIELDS = [
@@ -96,6 +96,7 @@ const FLEET_FIELD_IMPACTS = {
96
96
  "web.echo_to_channel": "now",
97
97
  "web.log_tab": "now",
98
98
  "web.usage_report_on_public_link": "now",
99
+ "web.office_levels": "now",
99
100
  "web.public_link.allow_public": "now",
100
101
  "web.public_link.ttl_minutes": "now",
101
102
  "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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"}
@@ -108,6 +108,10 @@ export interface LifecycleContext {
108
108
  notifyInstanceTopic(name: string, text: string): boolean | void;
109
109
  /** Notify the blocked instance and offer an interactive assist action in General. */
110
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;
111
115
  /** #1386: an instance's interaction observation, pause or wake changed ("Needs you" recomputes at once, not at its tick). */
112
116
  onAttentionChanged?(name: string): void;
113
117
  /**
@@ -603,6 +603,22 @@ export class InstanceLifecycle {
603
603
  else
604
604
  this.ctx.reactMessageStatus(name, data.chatId, data.messageId, "failed", data.threadId);
605
605
  }, this.ctx.logger, `daemon.message_failed[${name}]`));
606
+ // #2770: a cancel dropped these before they reached the CLI. Each is marked ❌ and the person is told once, instead of
607
+ // the messages quietly ending "uncertain".
608
+ daemon.on("human_messages_cancelled", safeHandler((data) => {
609
+ const messages = Array.isArray(data?.messages) ? data.messages : [];
610
+ if (!messages.length)
611
+ return;
612
+ this.ctx.eventLog?.insert(name, "messages_cancelled", { count: messages.length });
613
+ this.ctx.logger.info({ name, count: messages.length }, "Messages dropped by a cancel before delivery — telling the person");
614
+ for (const m of messages) {
615
+ if (this.ctx.finishDeliveryStatus)
616
+ this.ctx.finishDeliveryStatus(name, m.chatId, m.messageId, "failed", m.threadId);
617
+ else
618
+ this.ctx.reactMessageStatus(name, m.chatId, m.messageId, "failed", m.threadId);
619
+ }
620
+ this.ctx.notifyInstanceTopic(name, t("delivery.cancelled_unsent", messages.length, name));
621
+ }, this.ctx.logger, `daemon.human_messages_cancelled[${name}]`));
606
622
  }
607
623
  attachIncidentHandlers(name, daemon) {
608
624
  daemon.on("capacity_nudge_cancelled", safeHandler((data) => {
@@ -940,6 +956,13 @@ export class InstanceLifecycle {
940
956
  }
941
957
  await this.ctx.notifyInteractivePrompt(name, data.kind);
942
958
  }, this.ctx.logger, `daemon.interactive_prompt[${name}]`));
959
+ daemon.on("remote_card", safeHandler(async (data) => {
960
+ this.ctx.eventLog?.insert(name, "remote_card", { kind: data.card.kind });
961
+ await this.ctx.postRemoteCard?.(name, data.card);
962
+ }, this.ctx.logger, `daemon.remote_card[${name}]`));
963
+ daemon.on("remote_card_gone", safeHandler((data) => {
964
+ this.ctx.retireRemoteCard?.(name, data.identity);
965
+ }, this.ctx.logger, `daemon.remote_card_gone[${name}]`));
943
966
  daemon.on("pty_error", safeHandler(async (data) => {
944
967
  this.ctx.eventLog?.insert(name, "pty_error", { type: data.type, action: data.action });
945
968
  this.ctx.logger.warn({ name, errorType: data.type, action: data.action }, `PTY error: ${data.message}`);
@@ -1003,14 +1026,14 @@ export class InstanceLifecycle {
1003
1026
  if (data.type === "auth_error") {
1004
1027
  const verdict = authVerdict = await this.verifyAuthError(name);
1005
1028
  if (verdict === "valid") {
1006
- this.ctx.logger.info({ name, backend: this.backendOf(name) }, "auth-error pattern ignored — token-free auth check passed (likely conversation text)");
1007
- // Dropping the incident is not enough: the daemon armed its auth
1008
- // suspicion and recovery gate before emitting, and leaving those set
1009
- // would silently suppress hang notifications and MCP auto-restart for
1010
- // an instance whose credentials are demonstrably fine.
1029
+ this.ctx.logger.debug({ name, backend: this.backendOf(name) }, "auth-error pattern ignored — token-free auth check passed (likely conversation text)");
1030
+ // #2795: a pattern match armed nothing, so this only drops it. A login-screen report did arm the auth
1031
+ // suspicion, and leaving that set would suppress hang notifications and MCP auto-restart.
1011
1032
  this.daemons.get(name)?.clearSuspectedAuthFailure();
1012
1033
  return;
1013
1034
  }
1035
+ // #2795: not vouched for — only now is a pattern match an auth failure on the daemon.
1036
+ this.daemons.get(name)?.confirmAuthFailure?.();
1014
1037
  }
1015
1038
  // #2648: a kiro model error — the resumed conversation's saved model retired, or the instance's own model
1016
1039
  // unavailable. Restart once on kiro's default (no model of its own), else say it once; never on every start.