@songsid/agend 2.3.0 → 2.3.2-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 (201) hide show
  1. package/README.md +1 -1
  2. package/README.zh-TW.md +1 -1
  3. package/dist/authority/authority-state.d.ts +4 -0
  4. package/dist/authority/authority-state.js +16 -10
  5. package/dist/authority/authority-state.js.map +1 -1
  6. package/dist/authority/session-authorizations.d.ts +7 -1
  7. package/dist/authority/session-authorizations.js +6 -4
  8. package/dist/authority/session-authorizations.js.map +1 -1
  9. package/dist/authority/web-authority.d.ts +19 -6
  10. package/dist/authority/web-authority.js +22 -8
  11. package/dist/authority/web-authority.js.map +1 -1
  12. package/dist/backend/muse.d.ts +20 -2
  13. package/dist/backend/muse.js +154 -16
  14. package/dist/backend/muse.js.map +1 -1
  15. package/dist/channel/adapters/discord.d.ts +2 -0
  16. package/dist/channel/adapters/discord.js +33 -3
  17. package/dist/channel/adapters/discord.js.map +1 -1
  18. package/dist/channel/adapters/telegram.d.ts +1 -1
  19. package/dist/channel/adapters/telegram.js +3 -35
  20. package/dist/channel/adapters/telegram.js.map +1 -1
  21. package/dist/channel/mcp-tools.js +5 -5
  22. package/dist/channel/mcp-tools.js.map +1 -1
  23. package/dist/channel/types.d.ts +11 -0
  24. package/dist/cli.js +6 -3
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config-validator.js +42 -5
  27. package/dist/config-validator.js.map +1 -1
  28. package/dist/daemon.d.ts +47 -3
  29. package/dist/daemon.js +380 -60
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/delivery-outbox.d.ts +23 -1
  32. package/dist/delivery-outbox.js +114 -17
  33. package/dist/delivery-outbox.js.map +1 -1
  34. package/dist/doctor.d.ts +3 -0
  35. package/dist/doctor.js +9 -0
  36. package/dist/doctor.js.map +1 -1
  37. package/dist/event-log.d.ts +5 -0
  38. package/dist/event-log.js +13 -0
  39. package/dist/event-log.js.map +1 -1
  40. package/dist/fleet-context.d.ts +1 -1
  41. package/dist/fleet-lock.d.ts +6 -0
  42. package/dist/fleet-lock.js +19 -0
  43. package/dist/fleet-lock.js.map +1 -1
  44. package/dist/fleet-manager.d.ts +174 -2
  45. package/dist/fleet-manager.js +678 -68
  46. package/dist/fleet-manager.js.map +1 -1
  47. package/dist/fleet-process-handlers.d.ts +1 -0
  48. package/dist/fleet-process-handlers.js +9 -1
  49. package/dist/fleet-process-handlers.js.map +1 -1
  50. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +11 -0
  51. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +4 -4
  52. package/dist/general-knowledge/skills/web-appearance/SKILL.md +7 -7
  53. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +109 -57
  54. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +110 -58
  55. package/dist/guest-seen-people.d.ts +38 -0
  56. package/dist/guest-seen-people.js +78 -0
  57. package/dist/guest-seen-people.js.map +1 -0
  58. package/dist/instance-config-impact.js +4 -1
  59. package/dist/instance-config-impact.js.map +1 -1
  60. package/dist/instance-lifecycle.d.ts +2 -0
  61. package/dist/instance-lifecycle.js +27 -1
  62. package/dist/instance-lifecycle.js.map +1 -1
  63. package/dist/locale.js +62 -12
  64. package/dist/locale.js.map +1 -1
  65. package/dist/log-service.js +1 -0
  66. package/dist/log-service.js.map +1 -1
  67. package/dist/mac-auto-restore.d.ts +117 -0
  68. package/dist/mac-auto-restore.js +294 -0
  69. package/dist/mac-auto-restore.js.map +1 -0
  70. package/dist/needs-you.js +1 -0
  71. package/dist/needs-you.js.map +1 -1
  72. package/dist/outbound-handlers.d.ts +2 -2
  73. package/dist/outbound-handlers.js +5 -5
  74. package/dist/outbound-handlers.js.map +1 -1
  75. package/dist/outbound-schemas.d.ts +2 -0
  76. package/dist/outbound-schemas.js +2 -0
  77. package/dist/outbound-schemas.js.map +1 -1
  78. package/dist/public-web-gateway.js +9 -1
  79. package/dist/public-web-gateway.js.map +1 -1
  80. package/dist/search/search-index.d.ts +10 -2
  81. package/dist/search/search-index.js +17 -4
  82. package/dist/search/search-index.js.map +1 -1
  83. package/dist/service-installer.d.ts +23 -1
  84. package/dist/service-installer.js +40 -11
  85. package/dist/service-installer.js.map +1 -1
  86. package/dist/session-oom-stop.d.ts +45 -0
  87. package/dist/session-oom-stop.js +259 -0
  88. package/dist/session-oom-stop.js.map +1 -0
  89. package/dist/session-oom.d.ts +13 -0
  90. package/dist/session-oom.js +119 -7
  91. package/dist/session-oom.js.map +1 -1
  92. package/dist/settings-api.d.ts +27 -1
  93. package/dist/settings-api.js +108 -2
  94. package/dist/settings-api.js.map +1 -1
  95. package/dist/settings-change.js +37 -3
  96. package/dist/settings-change.js.map +1 -1
  97. package/dist/settings-effect.js +5 -2
  98. package/dist/settings-effect.js.map +1 -1
  99. package/dist/spawn-gate.d.ts +2 -0
  100. package/dist/spawn-gate.js +17 -4
  101. package/dist/spawn-gate.js.map +1 -1
  102. package/dist/start-attempt.d.ts +15 -1
  103. package/dist/start-attempt.js +35 -5
  104. package/dist/start-attempt.js.map +1 -1
  105. package/dist/start-failure-chat.d.ts +41 -0
  106. package/dist/start-failure-chat.js +159 -0
  107. package/dist/start-failure-chat.js.map +1 -0
  108. package/dist/start-failure-notice.d.ts +4 -0
  109. package/dist/start-failure-notice.js +8 -0
  110. package/dist/start-failure-notice.js.map +1 -1
  111. package/dist/start-failure.d.ts +49 -0
  112. package/dist/start-failure.js +141 -1
  113. package/dist/start-failure.js.map +1 -1
  114. package/dist/telegram-api-root.d.ts +1 -0
  115. package/dist/telegram-api-root.js +40 -0
  116. package/dist/telegram-api-root.js.map +1 -0
  117. package/dist/turn-reply-guard.d.ts +25 -0
  118. package/dist/turn-reply-guard.js +111 -12
  119. package/dist/turn-reply-guard.js.map +1 -1
  120. package/dist/types.d.ts +21 -3
  121. package/dist/ui/backend-signin.js +5 -2
  122. package/dist/ui/chat-ambient.js +1 -1
  123. package/dist/ui/chat-effects.js +4 -4
  124. package/dist/ui/chat-render.js +5 -2
  125. package/dist/ui/chat-strings.js +2 -2
  126. package/dist/ui/chat-thread.js +2 -2
  127. package/dist/ui/first-run.js +2 -2
  128. package/dist/ui/fleet-canvas-view.js +114 -0
  129. package/dist/ui/fleet-canvas.js +15 -77
  130. package/dist/ui/fleet-office-editor.js +80 -5
  131. package/dist/ui/fleet-office-layout.js +197 -0
  132. package/dist/ui/fleet-office-model.js +6 -3
  133. package/dist/ui/fleet-office-pack.d.ts +39 -0
  134. package/dist/ui/fleet-office-pack.js +240 -29
  135. package/dist/ui/fleet-office-skin.js +130 -21
  136. package/dist/ui/fleet-office-store.js +75 -4
  137. package/dist/ui/fleet-office-view.js +154 -0
  138. package/dist/ui/fleet-office-zones.js +95 -33
  139. package/dist/ui/fleet-office.js +530 -94
  140. package/dist/ui/fleet-usage.js +7 -6
  141. package/dist/ui/panel-chat.js +20 -7
  142. package/dist/ui/panel-details.js +2 -2
  143. package/dist/ui/panel-fleet.js +11 -77
  144. package/dist/ui/panel-log.js +5 -5
  145. package/dist/ui/panel-settings.js +586 -164
  146. package/dist/ui/search-dialog.js +26 -7
  147. package/dist/ui/settings-appearance.js +82 -29
  148. package/dist/ui/settings-apply.js +42 -7
  149. package/dist/ui/settings-dialogs.js +68 -22
  150. package/dist/ui/settings-draft.js +51 -0
  151. package/dist/ui/settings-guests.js +244 -78
  152. package/dist/ui/settings-learn.js +2 -2
  153. package/dist/ui/settings-model.js +2 -0
  154. package/dist/ui/settings-registry.js +142 -0
  155. package/dist/ui/settings-strings.js +108 -44
  156. package/dist/ui/settings-web-authority.js +34 -23
  157. package/dist/ui/shared/app-i18n.js +14 -0
  158. package/dist/ui/shared/app-nav.js +10 -5
  159. package/dist/ui/shared/app-prefs.js +80 -2
  160. package/dist/ui/shared/app-route.js +39 -5
  161. package/dist/ui/shared/app-shell.js +80 -8
  162. package/dist/ui/shared/app-stream.js +2 -1
  163. package/dist/ui/shared/app.css +251 -20
  164. package/dist/ui/shared/app.js +3 -0
  165. package/dist/ui/shared/effect-stock-trust.js +1 -1
  166. package/dist/ui/shared/identity-color.js +4 -4
  167. package/dist/ui/shared/signin.js +2 -2
  168. package/dist/ui/shared/ui-dialog.js +6 -1
  169. package/dist/ui/shared/ui-icons.js +2 -0
  170. package/dist/ui/shared/usage-dialog.js +21 -11
  171. package/dist/ui/shared/view-strings.js +2 -0
  172. package/dist/ui/shared/web-authorize.js +13 -12
  173. package/dist/web-api.d.ts +9 -3
  174. package/dist/web-api.js +161 -6
  175. package/dist/web-api.js.map +1 -1
  176. package/dist/web-auth.js +7 -1
  177. package/dist/web-auth.js.map +1 -1
  178. package/dist/web-experimental.d.ts +1 -1
  179. package/dist/web-experimental.js +1 -1
  180. package/dist/web-experimental.js.map +1 -1
  181. package/dist/web-mod-agent.js +2 -2
  182. package/dist/web-mod-agent.js.map +1 -1
  183. package/dist/web-office-skins.d.ts +108 -0
  184. package/dist/web-office-skins.js +298 -0
  185. package/dist/web-office-skins.js.map +1 -0
  186. package/dist/web-office-store.d.ts +8 -2
  187. package/dist/web-office-store.js +37 -7
  188. package/dist/web-office-store.js.map +1 -1
  189. package/dist/web-settings-patch.d.ts +6 -0
  190. package/dist/web-settings-patch.js +61 -4
  191. package/dist/web-settings-patch.js.map +1 -1
  192. package/dist/web-shell-routes.d.ts +4 -2
  193. package/dist/web-shell-routes.js +17 -7
  194. package/dist/web-shell-routes.js.map +1 -1
  195. package/dist/working-recovery.d.ts +104 -0
  196. package/dist/working-recovery.js +263 -0
  197. package/dist/working-recovery.js.map +1 -0
  198. package/dist/working-state-journal.d.ts +70 -0
  199. package/dist/working-state-journal.js +106 -0
  200. package/dist/working-state-journal.js.map +1 -0
  201. package/package.json +1 -1
@@ -5,6 +5,7 @@ interface FleetProcessOptions {
5
5
  manager: {
6
6
  stopAll(): Promise<void>;
7
7
  notifyFleetError(message: string): void;
8
+ noteRequestedShutdown?(): void;
8
9
  };
9
10
  runtime: Pick<NodeJS.Process, "on" | "exit">;
10
11
  describeSignal: () => string;
@@ -26,7 +26,15 @@ export function installFleetProcessHandlers(options) {
26
26
  stopping = true;
27
27
  output.log("\nStopping fleet...");
28
28
  // stopAll fences new controls and drains CPU profiles before disposal.
29
- await manager.stopAll().catch(error => output.error("Shutdown error:", error));
29
+ try {
30
+ await manager.stopAll();
31
+ // Only a completed signal shutdown is an explicit requested boundary.
32
+ // Fatal cleanup below must never manufacture a manual-restart cause.
33
+ manager.noteRequestedShutdown?.();
34
+ }
35
+ catch (error) {
36
+ output.error("Shutdown error:", error);
37
+ }
30
38
  runtime.exit(0);
31
39
  };
32
40
  runtime.on("SIGINT", shutdown);
@@ -1 +1 @@
1
- {"version":3,"file":"fleet-process-handlers.js","sourceRoot":"","sources":["../src/fleet-process-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fleet-process-handlers.js","sourceRoot":"","sources":["../src/fleet-process-handlers.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,17 @@ roles: [general]
20
20
  The **general** instance is never auto-paused.
21
21
  - You don't need to wake before sending work: delivery wakes a paused instance first.
22
22
 
23
+ ## Session-OOM stop
24
+
25
+ A repeated, confirmed same-session OOM is a terminal stop, not an idle pause.
26
+ The stop survives fleet restarts; incoming messages and queued work cannot lift it.
27
+ Free memory and investigate before choosing an explicit per-instance Start, Restart
28
+ or Wake (including the authorized lifecycle tools) to retry. This preserves the
29
+ session and transcript. A fleet-wide restart is not that choice. If another restart
30
+ is already finishing, wait and retry the per-instance action. Unknown or damaged
31
+ stop evidence also holds automatic launches. A save-failure notice means storage
32
+ must be repaired before restarting the fleet; do not promise the stop is durable.
33
+
23
34
  ## Monitoring state
24
35
 
25
36
  - `describe_instance("<name>")` / `list_instances` — status + `instance_state` (idle / working /
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: web-appearance
3
- description: How you look on the AgEnD web dashboard — check it, change your own theme, identity card, identity colour and widgets, set an ambient effect (falling petals, click stars), and preview the result; and, for General, changing Settings → Web appearance for the user
3
+ description: How you look on the AgEnD web dashboard — check it, change your own theme, identity card, identity colour and widgets, set an ambient effect (falling petals, click stars), and preview the result; and, for General, changing Settings → Look for the user
4
4
  roles: [general, worker, classic]
5
5
  ---
6
6
 
@@ -24,9 +24,9 @@ can shape how you look there — **only your own look, and only on the surfaces
24
24
  None of these tools takes a target: they always act on you. You can't change another instance, the dashboard's own
25
25
  chrome (beyond your colours on it while your chat is open), a person's sidebar widget, or a person's custom CSS.
26
26
 
27
- ## For the user: Settings → Web appearance (General, coordinators, full)
27
+ ## For the user: Settings → Look (General, coordinators, full)
28
28
 
29
- If you are General (or a coordinator or full profile), you can change the user's **Settings → Web appearance** for
29
+ If you are General (or a coordinator or full profile), you can change the user's **Settings → Look** for
30
30
  them, exactly as the page changes it: the same checks, the same refusals. Custom CSS keeps its safe rules: no remote
31
31
  URLs, assets only as `url("asset:<id>")`, at most 64 KiB. Other instances can't; they shape only their own look (the rest
32
32
  of this skill).
@@ -180,7 +180,7 @@ your picture. Set yours with `set_web_theme({ set: { identity: { color, show } }
180
180
  themes) > your own bot's Discord **role** colour > an **automatic** soft colour chosen from your name (two instances
181
181
  may share one).
182
182
  - **Where it shows**: a person's choice for you > yours (`identity.show`; again only while themes are shown) > the
183
- host's default (Settings → Web appearance; name, bar and ring unless changed).
183
+ host's default (Settings → Look; name, bar and ring unless changed).
184
184
  - The host can **turn colours off** for everyone: nothing is drawn, and every pick, yours included, is kept for when
185
185
  they come back.
186
186
  - `get_web_appearance`'s `identity_color` shows what is in force: `color`, `source` (`person`, `agent`, `role`, `auto`),
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: web-appearance
3
- description: How you look on the AgEnD web dashboard — check it, change your own theme, identity card, identity colour and widgets, set an ambient effect (falling petals, click stars), play Canvas Worker effects in your chat (and offer a Try), preview the result, share it as a mod; and, for General, changing Settings → Web appearance for the user
3
+ description: How you look on the AgEnD web dashboard — check it, change your own theme, identity card, identity colour and widgets, set an ambient effect (falling petals, click stars), play Canvas Worker effects in your chat (and offer a Try), preview the result, share it as a mod; and, for General, changing Settings → Look for the user
4
4
  roles: [general, worker, classic]
5
5
  ---
6
6
 
@@ -26,9 +26,9 @@ can shape how you look there — **only your own look, and only on the surfaces
26
26
  None of these tools takes a target: they always act on you. You can't change another instance, the dashboard's own
27
27
  chrome (beyond your colours on it while your chat is open), a person's sidebar widget, or a person's custom CSS.
28
28
 
29
- ## For the user: Settings → Web appearance (General, coordinators, full)
29
+ ## For the user: Settings → Look (General, coordinators, full)
30
30
 
31
- If you are General (or a coordinator or full profile), you can change the user's **Settings → Web appearance** for
31
+ If you are General (or a coordinator or full profile), you can change the user's **Settings → Look** for
32
32
  them, exactly as the page changes it: the same checks, the same refusals. Custom CSS keeps its safe rules: no remote
33
33
  URLs, assets only as `url("asset:<id>")`, at most 64 KiB. Other instances can't; they shape only their own look (the rest
34
34
  of this skill).
@@ -187,7 +187,7 @@ your picture. Set yours with `set_web_theme({ set: { identity: { color, show } }
187
187
  themes) > your own bot's Discord **role** colour > an **automatic** soft colour chosen from your name (two instances
188
188
  may share one).
189
189
  - **Where it shows**: a person's choice for you > yours (`identity.show`; again only while themes are shown) > the
190
- host's default (Settings → Web appearance; name, bar and ring unless changed).
190
+ host's default (Settings → Look; name, bar and ring unless changed).
191
191
  - The host can **turn colours off** for everyone: nothing is drawn, and every pick, yours included, is kept for when
192
192
  they come back.
193
193
  - `get_web_appearance`'s `identity_color` shows what is in force: `color`, `source` (`person`, `agent`, `role`, `auto`),
@@ -276,7 +276,7 @@ Then stars on a click, alongside: `set_web_ambient { "preset": "burst-on-click",
276
276
  ## Mods
277
277
 
278
278
  A mod is one file, `<name>-<version>.agendmod.json`, that carries a look: a theme with its pictures, card text,
279
- widgets and effects. People import mods in **Settings → Web appearance → Mods**. **You never import**: a person reviews
279
+ widgets and effects. People import mods in **Settings → Look → Mods**. **You never import**: a person reviews
280
280
  everything in a mod and ticks what to apply.
281
281
 
282
282
  - `export_web_mod { name, version, title? }` writes **your own** look to `.agend/mods/<name>-<version>.agendmod.json`
@@ -464,9 +464,9 @@ from being collected until cleared. This is deliberately stricter than chat plac
464
464
  a personal choice keeps following its person's current own/shared access, while a chat preserves the exact effect
465
465
  placed there. A reference is not a sharing or export grant. Do not keep retrying a denied personal selection.
466
466
 
467
- Owner selectors are available in Settings → Web appearance. With effects enabled, personal page/header/sidebar/box choices play across supported stock pages in the same pool
467
+ Owner selectors are available in Settings → Look. With effects enabled, personal page/header/sidebar/box choices play across supported stock pages in the same pool
468
468
  as signed-in Chat. HTML-preview consent and its service are not involved.
469
- Web appearance offers slot Pause/Resume and unavailable/Clear controls. The personal cursor uses a static PNG on the host shell without HTML-preview consent: no Worker/code read or frame slot. It preserves explicit pointer/text/resize cursors, falls back while dragging or on failure, and has status/Clear rather than Worker Pause/Resume. Before revealing paint, the host must prove stock content
469
+ Look offers slot Pause/Resume and unavailable/Clear controls. The personal cursor uses a static PNG on the host shell without HTML-preview consent: no Worker/code read or frame slot. It preserves explicit pointer/text/resize cursors, falls back while dragging or on failure, and has status/Clear rather than Worker Pause/Resume. Before revealing paint, the host must prove stock content
470
470
  ordering and trust paint coverage. Agent front effects must remain paused when custom CSS is active, loading or
471
471
  unknown; a person sees the reason and can open the causing setting. Human placements retain their exemption from
472
472
  that agent restriction, and behind effects still require proven ordering. Saving a placement alone is not proof of
@@ -27,7 +27,7 @@ For how *you* look on the dashboard (theme, identity card, colour, widgets and a
27
27
  | subscription meters, plan badges, profiles, keep-warm, prompt cache | [Usage and the cache report](#usage-and-the-cache-report) |
28
28
  | what an agent did step by step | [The Log tab](#the-log-tab) |
29
29
  | any Settings control | [Settings](#settings) |
30
- | themes, cards, widgets, ambient effects (petals, click stars) | [Web appearance](#web-appearance) |
30
+ | themes, cards, widgets, ambient effects (petals, click stars) | [Look](#look) |
31
31
  | blank page, preview refused, link fails, signed out, "live" missing | [Troubleshooting](#troubleshooting) |
32
32
 
33
33
  Addresses: the dashboard is served on the host at `http://localhost:<health_port>` (default 19280), on 127.0.0.1
@@ -59,7 +59,7 @@ hostname (named tunnel, `web.public_link.hostname`) the minutes go up to 10080,
59
59
  `web.public_link.auto_open` reopens the link after AgEnD starts for the admin who last opened it (nothing posted; sign-in
60
60
  still needs a code).
61
61
  Close it with **Close public link** → **Close link (signs public browsers out)**, `/web revoke`, or let it expire.
62
- A public link is limited on purpose: no live stream (the page polls), no custom CSS, and Settings → Web, appearance,
62
+ A public link is limited on purpose: no live stream (the page polls), no custom CSS, and Settings → Access & security, Look,
63
63
  schedule edits and preference writes are refused. HTML previews work over it through a second tunnel
64
64
  of their own (`web.preview_on_public_link`, default on).
65
65
 
@@ -78,14 +78,24 @@ the local address sees every instance's live terminal and the roster (status, co
78
78
  tags, name, description, avatars, cards) and the usage meters — read only; editing says "Sign in to edit". Over a
79
79
  public link `/view` always needs sign-in.
80
80
 
81
- **Guests (#1920).** Off by default: `web.guests.enabled` (or Settings → Web → Guests). Then someone who is
82
- not a fleet admin sends `/web` and gets a code privately, signing in as their own Discord or Telegram account. A guest
83
- sees only the agents they can already use in chat: their connection's fleet topics and General (an `open` connection:
84
- only `web.guests.open_instances`), their own Telegram private ClassicBot room, and ClassicBot group rooms while their
85
- membership is verified, minus any `web.guests.narrow`. They can chat there unless `web.guests.chat` is false, never send
86
- a command (text starting with `/` is refused), and the agent sees them as `via web (guest)`. A guest's app has no Fleet,
87
- View, Settings or Needs you. To invite someone: turn it on, then tell them to send `/web`. The Guests card is not in
88
- Settings over the public link.
81
+ **Guests (#1920, #2348).** Off by default: `web.guests.enabled` (or Settings → Access & security → Guests). Then someone
82
+ who is not a fleet admin gets a code privately, by sending `/web` or from an admin's **Send sign-in code**, and signs in
83
+ as their own Discord or Telegram account. What a guest sees:
84
+ - **With explicit grants** (`web.guests.grants`, set in Settings → Access & security → Guests): exactly the agents an
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
87
+ General; taking away applies at once and ends their sessions), then presses **Send sign-in code**, a DM, never a post.
88
+ Each code sent and each change to someone's access is in the event log (`guest_code_sent`, `guest_grant_changed`),
89
+ shown to admins under **Recent changes** in that section (no agent's Log tab shows them).
90
+ - **Without grants** (before an admin saves the first one): the agents they can already use in chat: their connection's
91
+ fleet topics and General (an `open` connection: only `web.guests.open_instances`), their own Telegram private
92
+ ClassicBot room, and ClassicBot group rooms while their membership is verified, minus any `web.guests.narrow`.
93
+ **Start from today's guests** turns that into grants.
94
+
95
+ They can chat there unless `web.guests.chat` is false, never send a command (text starting with `/` is refused), and the
96
+ agent sees them as `via web (guest)`. A guest's app has no Fleet, View, Settings or Needs you. To invite someone: turn it
97
+ on, grant them their agents in Settings → Access & security → Guests, and press **Send sign-in code** (or tell them to
98
+ send `/web`). The Guests section is not in Settings over the public link.
89
99
 
90
100
  **Web authority (#1939).** A signed-in fleet admin's browser can speak as their own Discord or Telegram
91
101
  account. The one row under the composer (bottom left, before the Enter hint) says **Not verified · Authorize**; the
@@ -96,14 +106,14 @@ again. Confirm within 5 minutes and the session menu says **Verified · speaks a
96
106
  just **✓ Verified**, with the until-when in its tooltip, its accessible name and a tap. That
97
107
  browser's messages then carry the account's authority in their delivery receipt for `max_session_hours` (default 48).
98
108
  Not me signs that browser out, also after Confirm, from the same card. At most one card waits per browser, and 3 an hour
99
- per account. Never for a guest or on a quick-tunnel public link. Over the admin's own named link (#2453) only with
100
- **Also over my named link** (`named_link`, off by default). That authority ends with the link, and the card says "over
101
- your named link". When a browser can't be authorized, the line says why (with a link to Settings when the switch, "Only
102
- this computer" or the named-link option is the reason). Settings → Web → **Web authority** (`web.verified_authority`, on
109
+ per account. Never for a guest. Over the admin's own named link (#2453) only with **Also over my named link**
110
+ (`named_link`, off by default); over the temporary public link `/web` opens only with **Also over the temporary public
111
+ link** (`quick_link`, off by default, §0.3). That authority ends with the link, and the card says "over your named link"
112
+ or "over the temporary public link". When a browser can't be authorized, the line says why (with a link to Settings when the switch, "Only
113
+ this computer" or the named-link option is the reason). Settings → Access & security → **Web authority** (`web.verified_authority`, on
103
114
  by default) has the switch, **Only this computer can authorize** (`loopback_only`), **Also over my named link** (shown
104
- with a fixed hostname), the hours, the authorized sessions, and **Revoke web authority** (or `/web revoke`). Every change
105
- there applies at once, except turning the named-link option on: a General or the host confirms that, never the browser
106
- asking.
115
+ with a fixed hostname), **Also over the temporary public link**, the hours, the authorized sessions, and **Revoke web authority** (or `/web revoke`). Every change
116
+ there applies at once, except turning a link's option on: a General or the host confirms that, never the browser asking.
107
117
  Agents then see that browser's messages as `via web (verified)` and check their receipt like a Discord or Telegram message.
108
118
 
109
119
  ## Chat
@@ -163,8 +173,8 @@ restored; files that can't be served again show as unavailable.
163
173
 
164
174
  **Copies in Discord/Telegram (web echo).** For a fleet topic instance, each web message is also posted to its topic as
165
175
  `🌐 web · <name>: …` (the first 500 characters plus attachment names; longer text says "(full text in web chat)").
166
- Turn it off with Settings → Web → **Web echo** (`web.echo_to_channel`). ClassicBot rooms: per room,
167
- `classicBot.yaml` `channels.<key>.web_echo` (Settings → ClassicBot → the room → **Web echo**). Since 2.2.5
176
+ Turn it off with Settings → Chat & connections → **Web echo** (`web.echo_to_channel`). ClassicBot rooms: per room,
177
+ `classicBot.yaml` `channels.<key>.web_echo` (Settings → Chat & connections → ClassicBot → the room → **Web echo**). Since 2.2.5
168
178
  (#2054) a room echoes by default: an unset room follows `web.echo_to_channel`, `web_echo: false` keeps it off and
169
179
  `web_echo: true` keeps it on. Before 2.2.5, a room echoed only with `web_echo: true`.
170
180
 
@@ -195,7 +205,7 @@ first, badged Chat / Message / Task; 1–2 character words work (alone: the newe
195
205
  ↑↓ / Enter / Esc / click outside; **Filters**: agent, team, time, kinds, **Only mine**; recent searches when empty.
196
206
  A chat result opens the chat at the message (flashed); a message between agents, a task or a chat row the history no
197
207
  longer keeps opens as the index's copy. Admins only, over the temporary public link and on a phone too (no guests). Config: `web.search.enabled`
198
- (default on, off everywhere), `web.search.public_link` (default on; false keeps it off the public link), `web.search.retention_days` (default 90). Secrets are masked; a hidden `cross_instance_visibility`
208
+ (default on, off everywhere), `web.search.public_link` (default on; false keeps it off the public link), `web.search.retention_days` (unset and 0 = no age limit; 1–3650 days; daily prune still caps at 300,000). Secrets are masked; a hidden `cross_instance_visibility`
199
209
  agent's messages are not found. "Search is off or not available": `web.search.enabled: false`, or the index could not
200
210
  open (the fleet log says why); "Still indexing": the first fill after an upgrade.
201
211
 
@@ -211,7 +221,8 @@ values reloaded after Save. Password fields keep the browser's behaviour.
211
221
 
212
222
  ## Fleet
213
223
 
214
- `/ui/fleet/<tab>`: **Tasks**, **Schedules**, **Teams**, **Org chart**, **Cache**, **Config**, plus a **Docs** link.
224
+ `/ui/fleet/<tab>`: **Tasks**, **Schedules**, **Teams**, **Org chart**, **Cache**, plus a **Docs** link
225
+ (`/ui/fleet/config` leads to Settings → Agent defaults: each of its settings lives in Settings, #2347).
215
226
  The sidebar's **Fleet** (zh "Fleet 概覽", at the top) and the phone's Fleet tab open the Fleet tab this device used last
216
227
  (`agend_last_fleet_tab`; the Org chart the first time). The sidebar has no separate Fleet (Details) or View row.
217
228
  - **Tasks** — the task board: Home lists **projects** (with % done) and what waits for the person (**Confirm** /
@@ -231,8 +242,6 @@ The sidebar's **Fleet** (zh "Fleet 概覽", at the top) and the phone's Fleet ta
231
242
  - **Teams** — **New team**, **Edit** (members, description; no rename), **Delete**. Read only on a public link.
232
243
  - **Org chart** — see below.
233
244
  - **Cache** — see [the cache report](#usage-and-the-cache-report).
234
- - **Config** — the main channel, access (Locked/Open, allowed users), default backend and project roots; **Save
235
- changes** rewrites fleet.yaml (its comments are lost).
236
245
 
237
246
  **Org chart (#1918).** **Canvas** or **List** (remembered per device). The canvas: General at the top, then teams in
238
247
  fleet.yaml order, then "Not in a team". Drag to pan, wheel or pinch to zoom (0.2–2.5), **Zoom in / Zoom out / Fit to
@@ -248,11 +257,42 @@ blinking light (needs you, crashed, looks stuck). With **Live** on, each message
248
257
  desk to desk along the corridors in the Key's colours; a delegation in progress is a purple folder on the worker's
249
258
  desk. Hover (or tap once) a desk for its name, state and backend; click (or tap again) opens the chat. **Find** dims
250
259
  the rest. **Show** picks a team or the Lobby and **People** pins chosen instances (both kept per browser); the
251
- **Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`; changing them takes
252
- an admin session, never the public link — v1 has no editor). **Style** (per browser): **Desks** (the default) or
253
- **Studio** — one scene (Work, Lounge, Help desk, Nap corner) where each instance walks to the area for its state.
254
- Now and then someone says a short line for their state in a bubble (never message content). Reduced motion: still
255
- poses, nothing in the air, bubbles shown whole.
260
+ **Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`). An admin session
261
+ (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
263
+ artist's pictures: `manifest.json` plus PNGs, format v1, kept in `web-office-skins/` in the AgEnD home; the host
264
+ checks every rule — PNG only, each strip exactly frames·w × h, a 16:9 background, size caps — and never changes a
265
+ 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** (the default),
267
+ **Studio** — one scene (Work, Lounge, Help desk, Nap corner) where each instance walks to the area for its state —
268
+ or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio or a pack,
269
+ **Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
270
+ waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
271
+ corridors; **Save layout** keeps the moves as that office's overrides (the pack stays as uploaded), **Reset** goes
272
+ back to the pack's own. While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
273
+ 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
274
+ only calls and work get bubbles (a few at most) and name tags show on hover or focus. **Hide paused and stopped**
275
+ (per browser, off by default) leaves the sleepers out. Now and then someone says a short line for their state in a
276
+ bubble (never message content). Reduced motion: still poses, nothing in the air, bubbles shown whole.
277
+ The Office fills the Fleet panel and moves like the Canvas (#2540): drag to pan, the wheel or a pinch to zoom,
278
+ **+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them) or the `+ - 0` keys
279
+ (with the office focused), an overview at the bottom right to jump (not on a phone). It takes the whole panel: the
280
+ Fleet area's full width, down to the window's foot. **Fit** shows the whole scene as large as the panel allows
281
+ (any scale, so it fills the panel's width or height); **Fill** (a toggle, kept per office) fills the panel instead,
282
+ cropping what overflows — drag to see it. **+** / **−** step in pixel levels (each logical unit a whole number of
283
+ screen pixels); drawing is always unsmoothed. A resize fits a fitted view again; the scene can never be dragged off
284
+ the panel. The zoom, centre and Fit/Fill are kept per device for each office and style. Around the 16:9 scene the
285
+ whole panel is a matte: a pack's own `matte` (`#rrggbb`), else its background's edge colour, else the skin's own
286
+ (Studio's hall floor; Desks: the dashboard's background). Hover, click, name tags and Edit layout all work at any zoom: a drag on a handle moves it,
287
+ anywhere else pans; zoom and pan are never animated.
288
+ **Fullscreen** (the button under **Fit**, or `f`; Esc leaves) shows the office alone: the dashboard's header, tabs
289
+ and bars go, and the zoom buttons, the overview (not on a phone), a small office switcher and Exit float over it. It
290
+ uses the browser's fullscreen; where a page cannot have it (an iPhone) or the browser refuses, the office covers the
291
+ window instead. Opening a chat leaves it, and it is never remembered.
292
+ A pack may add a `foreground` (a 16:9 PNG over the whole scene, zones packs only): drawn above the people, furniture
293
+ and items in the air, below name tags, bubbles and "+N" — door frames, pillars, table fronts that hide whoever walks
294
+ behind them. A furniture item's `depth` may be `"y"`: drawn among the people by base y (whoever stands lower is in
295
+ front). Numeric depths keep their meaning (under 1000 under the people, 1000 and up over them).
256
296
 
257
297
  **Live traffic** (**Live** switch, on by default; **Key** in the toolbar explains it, as a strip above the canvas): a line for each message between instances.
258
298
  Colour by kind — task (delegate_task) purple, send/query/update teal, report pink, broadcast orange; between teams
@@ -345,7 +385,7 @@ they are never a $0 row, and what such an instance measured before still shows.
345
385
  by backend they go under its backend now. Coverage only says "read" for a catch-up that listed and read every source
346
386
  (an unreadable directory or transcript is not covered, never a 0). Scope as
347
387
  `get_cache_report`. The dashboard reaches it over the public link only with `web.usage_report_on_public_link: true`
348
- (Settings → Web → **Usage report over the public link**, applies at once; otherwise the page says "Not offered over
388
+ (Settings → Web dashboard → **Usage report over the public link**, applies at once; otherwise the page says "Not offered over
349
389
  the public link" and links to that switch on the dashboard reached directly); guests never. The page adds a daily trend (top 5 and
350
390
  others), a heatmap that tells a day read with nothing used from a day not collected, and **Download CSV** (the shown
351
391
  answer's daily rows, with the basis). Claude subagent (sidechain) turns aren't counted yet. A long range whose daily rows
@@ -362,38 +402,45 @@ still being designed). If the report says **Switch to 1-hour cache**, the remedy
362
402
  What an agent was asked, its replies (never its thinking), each tool call (Read, Edit, Search, Run, Web, MCP,
363
403
  Sub-agent…, with **Show output**), errors, turn ends, compactions and fleet events, on one timeline. Filters **All /
364
404
  Tools / Errors**; **Live** while it updates. Opens with the newest 200 steps; **Load older steps** adds 100 at a time
365
- (the page keeps 1000). Off by default: `web.log_tab` (Settings → Web → **Log tab: each agent's steps**; turning it on
405
+ (the page keeps 1000). Off by default: `web.log_tab` (Settings → Web dashboard → **Log tab: each agent's steps**; turning it on
366
406
  from the tab itself needs a fleet admin's confirmation). Full for Claude Code (also after it stopped) and Codex while
367
407
  running; kiro shows fleet events only; other backends say they have no readable transcript. Secrets are masked.
368
408
 
369
409
  ## Settings
370
410
 
371
- **Connections → Retry now** retries a disconnected connection without a fleet restart; a running login is reused. Startup retries continue with a five-minute cap. Local admin only, unavailable over public links. It changes no token or binding; refresh to read the later result.
411
+ **Chat & connections → Retry now** retries a disconnected connection without a fleet restart; a running login is reused. Startup retries continue with a five-minute cap. Local admin only, unavailable over public links. It changes no token or binding; refresh to read the later result.
372
412
 
373
- Tabs (`/settings/<tab>`): **Preferences**, **Web appearance**, **Agents**, **Connections**, **ClassicBot**,
374
- **General**, **Web**, **Developer**. Header: version, **Setup wizard**, **Help**.
413
+ Sections (`/settings/<section>`, #2347), in two groups. **You**: **Preferences**, **Look**. **Fleet**: **Agents**,
414
+ **Agent defaults**, **Chat & connections**, **Web dashboard**, **Access & security**, **Advanced**. Old addresses (`device`,
415
+ `appearance`, `general`, `bots`, `classic`, `web`) lead to the new sections. **Search settings** (top of the sections, **/**;
416
+ also Ctrl K → Settings) finds a setting by name, `fleet.yaml` key or synonym in either language and goes to the field.
417
+ Header: version, **Setup wizard**, **Help**.
375
418
 
376
- **How changes apply.** Agents, Connections, ClassicBot, General, Web and Developer edits are *staged*: a dialog's
377
- **Stage change** (General/Web: **Review changes**) adds it to the bar **Changes not applied yet**, which shows the
378
- cost — **Immediately**, **Restart this Agent** or **Restart AgEnD** — then **Apply changes** or **Discard**.
419
+ **How changes apply (#2347).** Every Fleet section's edits are unsaved until
420
+ **Save**: a field edit (Agent defaults, Chat & connections, Web dashboard, Access & security) is unsaved at once (a straight bar on its left); a dialog's **Done**
421
+ adds its changes. The bar **N unsaved change(s)** shows the cost — **Immediately**, **Restart this Agent** or **Restart
422
+ AgEnD** — then **Save** or **Discard**; an invalid field keeps Save waiting (**Fix 1 field(s) to save**). Over a public
423
+ link an admin can change the fleet's settings too (not the dashboard's own web settings, Guests or Web authority).
379
424
  Confirmations (e.g. opening access) are asked at Apply. A change that loosens access waits for a fleet admin to confirm
380
425
  in the General chat ("Waiting for confirmation", **Withdraw**) — unless the browser is web-verified (#2170): an
381
426
  account that is a fleet admin of every connection the change affects, on their platform, confirms it by its own Apply
382
427
  ("Confirmed by your account"; General gets a notice; every check runs again at execution). Not for a guest, the public
383
428
  link, an unverified browser or a change that needs the host CLI. After a failure, unapplied changes are staged again
384
- (secrets must be re-entered). **Restart AgEnD** restarts every agent. Preferences and Web appearance save directly.
429
+ (secrets must be re-entered). **Restart AgEnD** restarts every agent
430
+ (never automatic); until then every page shows **N saved change(s) take effect after AgEnD restarts** · **Restart now** ·
431
+ **Later**. Preferences and Look save with the same bar (**Your preferences**; device-only switches count on their own; Restore defaults saves at once).
385
432
 
386
433
  **Preferences** — follows you across devices unless marked:
387
434
  | Control | What it does | Stored |
388
435
  |---|---|---|
389
436
  | Your name (**Save**, **Use web-user** / **Use <account>**) | the name agents see on your web messages | your profile |
390
437
  | Theme: System / Light / Dark | page theme | host prefs `theme` |
391
- | Language: English / 中文 | page language (not the bots' replies — that is General → Language) | host prefs `lang` |
438
+ | Language: English / 中文 | page language (not the bots' replies — that is Agent defaults → Language) | host prefs `lang` |
392
439
  | Names: Nickname first / Real name first | sidebar names | host prefs `names.primary` |
393
440
  | Allow HTML previews | the preview opt-in | host prefs `preview.optIn` |
394
441
  | Chat tour (this device) | replays the chat tour | browser |
395
442
 
396
- **Web appearance** — see [Web appearance](#web-appearance) for the cards and what they mean.
443
+ **Look** — see [Look](#look) for the cards and what they mean.
397
444
 
398
445
  **Signing a backend in (#2233)** — local admin sessions only (never a guest or the public link): Settings → Agents →
399
446
  **Sign-ins** (each backend's login and each credential profile an agent uses: state, **Sign in** / **Sign in again**,
@@ -407,7 +454,8 @@ opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`).
407
454
 
408
455
  **Agents** — **New agent**; per agent **Settings**, **Pause / Wake**, **Start / Stop** (direct), ⋯ **Delete agent**
409
456
  (staged; on Apply it waits for a fleet admin's confirmation in General, then the agent is stopped and removed, as
410
- `delete_instance` does — no restart). The agent dialog writes `instances.<name>.*` (an "Inherit" box removes the key):
457
+ `delete_instance` does — no restart). The agent dialog writes `instances.<name>.*` (an "Inherit" box removes the key, and the field then says what it inherits:
458
+ "Inherited: 30 min · change in Agent defaults"; a value nobody set anywhere is marked "default"):
411
459
  | Label | Key | Applies |
412
460
  |---|---|---|
413
461
  | Display name, Description | `display_name`, `description` | now |
@@ -424,7 +472,7 @@ opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`).
424
472
  | General topic (fleet dispatcher) | `general_topic` | AgEnD |
425
473
  | Status emojis (Received, Queued, Processing, Delivered, Failed, …) | `status_emojis` | agent |
426
474
 
427
- **Connections** (the bots) — **New connection**: type, bot token (**Verify**), Discord server or Telegram group,
475
+ **Chat & connections** — connections (the bots): **New connection**: type, bot token (**Verify**), Discord server or Telegram group,
428
476
  your user ID. It starts without a restart when AgEnD already runs another connection and nothing else at fleet level
429
477
  changed; a fleet's first connection (or a change to an existing one) offers **Restart AgEnD**. Per bot: **Access mode** (locked / open / pairing) and **Allowed users** —
430
478
  `channels[i].access.*`, staged, restarts AgEnD, asks before opening access; **Guild/Group id** and General channel /
@@ -432,17 +480,18 @@ forum topic with **Verify the new binding** (applies directly after a confirmati
432
480
  **Replace** the token (saved to `~/.agend/.env`); **Delete this bot** (the token stays in `.env`). **Provider API keys**:
433
481
  **Verify & apply**, used by new processes.
434
482
 
435
- **ClassicBot** — per room **Settings**, **Pause / Wake**. The room dialog writes `classicBot.yaml`
483
+ ClassicBot (in **Chat & connections**, `/settings/chat#classicbot`) — per room **Settings**, **Pause / Wake**. The room dialog writes `classicBot.yaml`
436
484
  `channels.<key>.*`: Backend, Model, Auto-pause after, **Collaboration mode** (`collab`), **Web echo** (`web_echo`),
437
485
  Advanced **Context lines** (these restart the room's agent); Tool progress and Require a delivered reply (now).
438
486
 
439
- **General** — fleet defaults (`defaults.*`): **Language (bot replies)** (`locale`: Auto / en / zh-TW), default
487
+ **Agent defaults** — **Project folders** (`project_roots`: where New agent may put an agent; empty = anywhere;
488
+ changing it waits for a fleet admin's OK) and the fleet defaults (`defaults.*`): **Language (bot replies)** (`locale`: Auto / en / zh-TW), default
440
489
  backend and model, auto-pause, tool progress, bot-to-bot visibility, reply guard; Advanced: tool set, agent mode, log
441
490
  level, **Hang detector enabled** / **Stuck timeout** (`hang_detector.*`), **Startup concurrency** (1–20) and
442
- **Stagger delay** (`startup.*`, restart AgEnD). ClassicBot card (`classicBot.yaml defaults.*`): default backend, tool
491
+ **Stagger delay** (`startup.*`, restart AgEnD). ClassicBot defaults (in Chat & connections; `classicBot.yaml defaults.*`): default backend, tool
443
492
  progress, reply guard, **ClassicBot admins**, **Allowed guilds**.
444
493
 
445
- **Web** — all apply at once; loosening waits for an admin; disabled over a public link.
494
+ **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.
446
495
  | Label | Key |
447
496
  |---|---|
448
497
  | Session length, hours (1–720) | `web.session.local.absolute_hours` |
@@ -456,23 +505,23 @@ progress, reply guard, **ClassicBot admins**, **Allowed guilds**.
456
505
  | Reopen the public link when AgEnD starts (fixed hostname only) | `web.public_link.auto_open` |
457
506
  | Tunnel protocol (http2 / quic / auto) | `web.public_link.protocol` |
458
507
  Shown read-only ("Set in fleet.yaml"): `web.allowed_hosts`, `view_access`, `notify_login`, `preview`, `preview_port`,
459
- `preview_origin`, `preview_on_public_link`, `usage_panel`, `provider_secrets`, `upload_max_file_mb`,
508
+ `preview_origin`, `preview_on_public_link`, `usage_panel`, `search` (`retention_days`: unset and 0 = no age limit,
509
+ 300,000-row cap), `provider_secrets`, `upload_max_file_mb`,
460
510
  `upload_max_total_mb`, `web_terminal.bind`, `web_terminal.tunnel`.
461
511
 
462
- **Developer** — fleet.yaml as **YAML / JSON**, **Edit / View**, **Copy**, **Download fleet.yaml**; **Apply & save**
463
- (edit mode) applies at once, without the bar.
512
+ **Advanced** — fleet.yaml as **YAML / JSON**, **Edit / View**, **Copy**, **Download fleet.yaml**; **Apply**
513
+ (edit mode) adds the edit to the bar, and Save writes it. While it waits, Agents, Agent defaults and the
514
+ connections are off (and the setup wizard); while those have unsaved changes, the editor only reads.
464
515
 
465
516
  **Setup wizard** — agent (backend, directory, name) → platform → token and server/group, your user ID → preview →
466
517
  **Create and start**.
467
518
 
468
- ## Web appearance
519
+ ## Look
469
520
 
470
521
  For an agent changing its *own* look, the `web-appearance` skill has the tools and limits. What a person sees in
471
- Settings → **Web appearance**, card by card:
522
+ Settings → **Look**, card by card (the app icon and card upload limits are in **Web dashboard**; following reduced motion and custom CSS off here are in **Preferences**):
472
523
  - **Agents' themes** — **Show agents' themes, effects and widgets**; off, every chat looks the same and pictures and
473
- ring colours fall back to the bots' own (all devices). **Effects: follow the system's reduced-motion setting** (this
474
- device only, off by default): on, ambient effects stay still while the system asks for reduced
475
- motion. Otherwise they play, with one shared one-time chat note and a local action to follow the system.
524
+ ring colours fall back to the bots' own (all devices).
476
525
  - **Ambient effects** — an agent's falling petals, snow, rising lanterns, twinkles or stars on a click, drawn behind
477
526
  its chat by the dashboard (data only, no consent needed). They show by default, the public link too; the chat's ⋯
478
527
  menu says why one is not showing (choosing the line fixes it there) and offers **Clear the ambient effect** /
@@ -488,11 +537,14 @@ Settings → **Web appearance**, card by card:
488
537
  can't load from the internet (put pictures and fonts under Assets: PNG, WebP, JPEG, GIF, WOFF2, 1 MiB in total).
489
538
  **Save and try**, then **Keep** within 15 s or it reverts; **Turn off (all devices)**; earlier versions **Use
490
539
  this**. If something is hidden or broken, open the page with `?safe=1`, or tick **Turn off custom CSS on this
491
- device**.
492
- - **Identity card upload limits** — portrait and banner size limits and per-agent picture quota
493
- (`web.appearance.*`); lowering applies at once, raising waits for an admin.
540
+ device** (in Preferences).
494
541
  - **Restore defaults** — resets this host's appearance settings (it lists what it resets first).
495
542
 
543
+ Moved out of Look in 2.3.2 (#2347). **Preferences** (this device only): **Effects: follow the system's reduced-motion
544
+ setting** (off by default): on, ambient effects stay still while the system asks for reduced motion. Otherwise they play, with one shared one-time chat note and a local action to follow the system. And **Turn off custom CSS on this device**. **Web dashboard**: the **App icon**;
545
+ **Identity card upload limits** — portrait and banner size limits and per-agent picture quota (`web.appearance.*`);
546
+ lowering applies at once, raising waits for an admin.
547
+
496
548
  **What an agent can change for the user.** A worker changes only its own look (the `web-appearance` tools); before
497
549
  #2064 everything on this page was the person's. Since #2064 (2.2.5) General, coordinators and
498
550
  full-profile instances get `get_web_settings` / `set_web_settings`, which go through the same checks as the page;
@@ -550,4 +602,4 @@ no instance uses that provider.
550
602
 
551
603
  **Settings won't change something.** Over a public link, Web settings and appearance are read only; a loosening
552
604
  change waits for an admin's confirmation in General chat; a value in the "Set in fleet.yaml" list must be edited in
553
- fleet.yaml (Developer tab, or the file) and `agend reload`.
605
+ fleet.yaml (Advanced, or the file) and `agend reload`.