@songsid/agend 2.3.3-beta.4 → 2.3.3-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/agent-cli.js +13 -112
  2. package/dist/agent-cli.js.map +1 -1
  3. package/dist/agent-endpoint.d.ts +0 -1
  4. package/dist/agent-endpoint.js +1 -9
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/agent-whats-new.d.ts +3 -6
  7. package/dist/agent-whats-new.js +7 -18
  8. package/dist/agent-whats-new.js.map +1 -1
  9. package/dist/auth-api.d.ts +0 -7
  10. package/dist/auth-api.js +1 -15
  11. package/dist/auth-api.js.map +1 -1
  12. package/dist/backend/codex.d.ts +1 -0
  13. package/dist/backend/codex.js +106 -15
  14. package/dist/backend/codex.js.map +1 -1
  15. package/dist/backend/types.d.ts +17 -0
  16. package/dist/backend/types.js.map +1 -1
  17. package/dist/bundled-skills.d.ts +4 -6
  18. package/dist/bundled-skills.js +10 -14
  19. package/dist/bundled-skills.js.map +1 -1
  20. package/dist/channel/mcp-server.js +5 -5
  21. package/dist/channel/mcp-server.js.map +1 -1
  22. package/dist/channel/mcp-tools.d.ts +1 -3
  23. package/dist/channel/mcp-tools.js +4 -58
  24. package/dist/channel/mcp-tools.js.map +1 -1
  25. package/dist/cli.js +3 -1
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config-validator.js +6 -3
  28. package/dist/config-validator.js.map +1 -1
  29. package/dist/daemon.d.ts +11 -3
  30. package/dist/daemon.js +59 -107
  31. package/dist/daemon.js.map +1 -1
  32. package/dist/dashboard-live.d.ts +1 -1
  33. package/dist/dashboard-live.js +3 -3
  34. package/dist/dashboard-live.js.map +1 -1
  35. package/dist/dashboard-permissions.d.ts +1 -1
  36. package/dist/dashboard-permissions.js +1 -3
  37. package/dist/dashboard-permissions.js.map +1 -1
  38. package/dist/fleet-manager.d.ts +26 -44
  39. package/dist/fleet-manager.js +70 -226
  40. package/dist/fleet-manager.js.map +1 -1
  41. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +11 -1
  42. package/dist/general-knowledge/skills/session-management/SKILL.md +6 -0
  43. package/dist/general-knowledge/skills/web-appearance/SKILL.md +13 -204
  44. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +26 -63
  45. package/dist/instance-lifecycle.js +1 -1
  46. package/dist/instance-lifecycle.js.map +1 -1
  47. package/dist/locale.js +2 -0
  48. package/dist/locale.js.map +1 -1
  49. package/dist/outbound-handlers.js +19 -7
  50. package/dist/outbound-handlers.js.map +1 -1
  51. package/dist/outbound-schemas.d.ts +0 -62
  52. package/dist/outbound-schemas.js +2 -41
  53. package/dist/outbound-schemas.js.map +1 -1
  54. package/dist/public-web-gateway.js +0 -9
  55. package/dist/public-web-gateway.js.map +1 -1
  56. package/dist/public-web-link.d.ts +2 -0
  57. package/dist/public-web-link.js +5 -0
  58. package/dist/public-web-link.js.map +1 -1
  59. package/dist/search/search-docs.d.ts +1 -1
  60. package/dist/search/search-docs.js +2 -2
  61. package/dist/search/search-docs.js.map +1 -1
  62. package/dist/settings-api.d.ts +6 -0
  63. package/dist/settings-api.js +14 -2
  64. package/dist/settings-api.js.map +1 -1
  65. package/dist/settings-change.js +3 -1
  66. package/dist/settings-change.js.map +1 -1
  67. package/dist/tool-permissions.js +3 -10
  68. package/dist/tool-permissions.js.map +1 -1
  69. package/dist/topic-commands.d.ts +6 -2
  70. package/dist/topic-commands.js +2 -0
  71. package/dist/topic-commands.js.map +1 -1
  72. package/dist/types.d.ts +2 -1
  73. package/dist/ui/chat-ambient.js +4 -4
  74. package/dist/ui/chat-commands.js +3 -2
  75. package/dist/ui/chat-store.js +4 -1
  76. package/dist/ui/chat-strings.js +6 -42
  77. package/dist/ui/chat-thread.js +6 -44
  78. package/dist/ui/panel-chat.js +21 -50
  79. package/dist/ui/preview-panel.js +3 -15
  80. package/dist/ui/search-dialog.js +30 -14
  81. package/dist/ui/settings-appearance.js +1 -3
  82. package/dist/ui/settings-guests.js +13 -4
  83. package/dist/ui/settings-learn.js +1 -1
  84. package/dist/ui/settings-mods.js +5 -12
  85. package/dist/ui/settings-registry.js +0 -1
  86. package/dist/ui/settings-strings.js +6 -6
  87. package/dist/ui/shared/app-prefs.js +17 -17
  88. package/dist/ui/shared/app-shell.js +12 -8
  89. package/dist/ui/shared/app-store.js +6 -2
  90. package/dist/ui/shared/app.css +4 -36
  91. package/dist/ui/shared/app.js +5 -4
  92. package/dist/ui/shared/instance-nav.js +9 -9
  93. package/dist/ui/shared/instance-switch.js +8 -2
  94. package/dist/ui/shared/panel-view.js +22 -8
  95. package/dist/ui/shared/view-strings.js +6 -0
  96. package/dist/usage/usage-api.d.ts +3 -0
  97. package/dist/usage/usage-api.js +5 -1
  98. package/dist/usage/usage-api.js.map +1 -1
  99. package/dist/view-api.d.ts +2 -0
  100. package/dist/view-api.js +64 -0
  101. package/dist/view-api.js.map +1 -1
  102. package/dist/web-api.d.ts +9 -17
  103. package/dist/web-api.js +255 -371
  104. package/dist/web-api.js.map +1 -1
  105. package/dist/web-appearance-tools.d.ts +0 -2
  106. package/dist/web-appearance-tools.js +2 -5
  107. package/dist/web-appearance-tools.js.map +1 -1
  108. package/dist/web-appearance-view.d.ts +0 -6
  109. package/dist/web-appearance-view.js +0 -1
  110. package/dist/web-appearance-view.js.map +1 -1
  111. package/dist/web-appearance.d.ts +14 -7
  112. package/dist/web-appearance.js +5 -6
  113. package/dist/web-appearance.js.map +1 -1
  114. package/dist/web-asset-parts.d.ts +1 -17
  115. package/dist/web-asset-parts.js +1 -15
  116. package/dist/web-asset-parts.js.map +1 -1
  117. package/dist/web-auth.js +1 -7
  118. package/dist/web-auth.js.map +1 -1
  119. package/dist/web-chat-history.d.ts +3 -7
  120. package/dist/web-chat-history.js +10 -17
  121. package/dist/web-chat-history.js.map +1 -1
  122. package/dist/web-commands.d.ts +9 -1
  123. package/dist/web-commands.js +13 -0
  124. package/dist/web-commands.js.map +1 -1
  125. package/dist/web-experimental.d.ts +2 -11
  126. package/dist/web-experimental.js +8 -36
  127. package/dist/web-experimental.js.map +1 -1
  128. package/dist/web-guest-access.d.ts +40 -2
  129. package/dist/web-guest-access.js +50 -14
  130. package/dist/web-guest-access.js.map +1 -1
  131. package/dist/web-mod-bundle.d.ts +2 -45
  132. package/dist/web-mod-bundle.js +15 -63
  133. package/dist/web-mod-bundle.js.map +1 -1
  134. package/dist/web-mod-store.d.ts +3 -48
  135. package/dist/web-mod-store.js +30 -97
  136. package/dist/web-mod-store.js.map +1 -1
  137. package/dist/web-prefs.d.ts +13 -0
  138. package/dist/web-prefs.js +38 -0
  139. package/dist/web-prefs.js.map +1 -1
  140. package/dist/web-preview.d.ts +1 -11
  141. package/dist/web-preview.js +6 -20
  142. package/dist/web-preview.js.map +1 -1
  143. package/dist/web-session.d.ts +11 -3
  144. package/dist/web-session.js +22 -11
  145. package/dist/web-session.js.map +1 -1
  146. package/dist/web-settings-patch.d.ts +1 -0
  147. package/dist/web-settings-patch.js +6 -3
  148. package/dist/web-settings-patch.js.map +1 -1
  149. package/dist/web-settings-tools.d.ts +0 -13
  150. package/dist/web-settings-tools.js +12 -84
  151. package/dist/web-settings-tools.js.map +1 -1
  152. package/package.json +1 -1
  153. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +0 -376
  154. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +0 -672
  155. package/dist/ui/app-effects.js +0 -251
  156. package/dist/ui/chat-effect-posters.js +0 -42
  157. package/dist/ui/chat-effects.js +0 -167
  158. package/dist/ui/effect-trial-controller.js +0 -124
  159. package/dist/ui/effect-trial-offer.js +0 -2
  160. package/dist/ui/effect-trial-panel.js +0 -40
  161. package/dist/ui/effects-waker.js +0 -2
  162. package/dist/ui/settings-effects.js +0 -202
  163. package/dist/ui/settings-owner-effects.js +0 -82
  164. package/dist/ui/shared/effect-app-runtime.js +0 -299
  165. package/dist/ui/shared/effect-baseline.js +0 -64
  166. package/dist/ui/shared/effect-chat-runtime.js +0 -162
  167. package/dist/ui/shared/effect-cursor.js +0 -126
  168. package/dist/ui/shared/effect-display-metadata.js +0 -39
  169. package/dist/ui/shared/effect-frame.js +0 -146
  170. package/dist/ui/shared/effect-geometry.js +0 -137
  171. package/dist/ui/shared/effect-host-style.js +0 -10
  172. package/dist/ui/shared/effect-owner-regions.js +0 -74
  173. package/dist/ui/shared/effect-owner-source.js +0 -122
  174. package/dist/ui/shared/effect-policy.js +0 -151
  175. package/dist/ui/shared/effect-poster-reader.js +0 -98
  176. package/dist/ui/shared/effect-posters.js +0 -117
  177. package/dist/ui/shared/effect-profiler.js +0 -184
  178. package/dist/ui/shared/effect-profiles.js +0 -65
  179. package/dist/ui/shared/effect-registry.js +0 -545
  180. package/dist/ui/shared/effect-runtime-loader.js +0 -236
  181. package/dist/ui/shared/effect-safety.js +0 -153
  182. package/dist/ui/shared/effect-stock-snapshot.js +0 -43
  183. package/dist/ui/shared/effect-stock-trust.js +0 -217
  184. package/dist/ui/shared/effect-trial-shadow.js +0 -62
  185. package/dist/ui/shared/effect-trial-source.js +0 -103
  186. package/dist/ui/shared/effect-trial-stage.js +0 -170
  187. package/dist/ui/shared/effect-trial.css +0 -40
  188. package/dist/ui/shared/feature-flags.js +0 -127
  189. package/dist/ui/shared/owner-effect-prefs.js +0 -117
  190. package/dist/web-effect-bootstrap.d.ts +0 -12
  191. package/dist/web-effect-bootstrap.js +0 -49
  192. package/dist/web-effect-bootstrap.js.map +0 -1
  193. package/dist/web-effect-bundle.d.ts +0 -28
  194. package/dist/web-effect-bundle.js +0 -171
  195. package/dist/web-effect-bundle.js.map +0 -1
  196. package/dist/web-effect-canonical.d.ts +0 -8
  197. package/dist/web-effect-canonical.js +0 -27
  198. package/dist/web-effect-canonical.js.map +0 -1
  199. package/dist/web-effect-library.d.ts +0 -114
  200. package/dist/web-effect-library.js +0 -530
  201. package/dist/web-effect-library.js.map +0 -1
  202. package/dist/web-effect-playback.d.ts +0 -30
  203. package/dist/web-effect-playback.js +0 -71
  204. package/dist/web-effect-playback.js.map +0 -1
  205. package/dist/web-effect-poster.d.ts +0 -8
  206. package/dist/web-effect-poster.js +0 -52
  207. package/dist/web-effect-poster.js.map +0 -1
  208. package/dist/web-effect-profiles.d.ts +0 -118
  209. package/dist/web-effect-profiles.js +0 -181
  210. package/dist/web-effect-profiles.js.map +0 -1
  211. package/dist/web-effect-service.d.ts +0 -93
  212. package/dist/web-effect-service.js +0 -335
  213. package/dist/web-effect-service.js.map +0 -1
  214. package/dist/web-effect-tools.d.ts +0 -48
  215. package/dist/web-effect-tools.js +0 -129
  216. package/dist/web-effect-tools.js.map +0 -1
  217. package/dist/web-effect-trials.d.ts +0 -86
  218. package/dist/web-effect-trials.js +0 -204
  219. package/dist/web-effect-trials.js.map +0 -1
  220. package/dist/web-effect-upload.d.ts +0 -27
  221. package/dist/web-effect-upload.js +0 -185
  222. package/dist/web-effect-upload.js.map +0 -1
  223. package/dist/web-effect-worker.d.ts +0 -8
  224. package/dist/web-effect-worker.js +0 -170
  225. package/dist/web-effect-worker.js.map +0 -1
  226. package/dist/web-effect.d.ts +0 -103
  227. package/dist/web-effect.js +0 -153
  228. package/dist/web-effect.js.map +0 -1
  229. package/dist/web-experimental-http.d.ts +0 -2
  230. package/dist/web-experimental-http.js +0 -12
  231. package/dist/web-experimental-http.js.map +0 -1
  232. package/dist/web-mod-agent.d.ts +0 -50
  233. package/dist/web-mod-agent.js +0 -207
  234. package/dist/web-mod-agent.js.map +0 -1
@@ -1,376 +0,0 @@
1
- ---
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 → Look for the user
4
- roles: [general, worker, classic]
5
- ---
6
-
7
- ## What it is
8
-
9
- People see you on the web dashboard: in the sidebar, at the top of your chat, on your Details page and in View. You
10
- can shape how you look there — **only your own look, and only on the surfaces that are yours**:
11
-
12
- | Surface | What you set | Tools |
13
- |---|---|---|
14
- | Your name and role line | display name, description | `set_display_name`, `set_description` |
15
- | Your status stamp | persona emoji | `set_persona_emoji` (see the `persona-emoji` skill) |
16
- | Your chat | theme: colours, accent, bubbles, font, background picture, working label | `set_web_theme`, `set_web_theme_asset` |
17
- | The whole page, while your chat is open | your theme's colours on the sidebar, the header, the usage rail (a phone: the drawer, the header, the tabs) — colours only | `set_web_theme` (`page`) |
18
- | Your face and ring | theme picture and accent | `set_web_theme`, `set_web_theme_asset` |
19
- | Your identity card | portrait, banner, tagline, bio | `set_web_theme` (`card.*`), `set_web_theme_asset` |
20
- | Your identity colour | the colour people find you by in the sidebar, and where it shows (name, bar, ring) | `set_web_theme` (`identity`) |
21
- | Your chat header strip and Details page | widgets: small panels of facts the dashboard draws | `set_web_widget`, `remove_web_widget` |
22
- | An ambient effect in your chat | falling petals, snow, rising lanterns, twinkles, stars where a person clicks — data only, drawn by the dashboard | `set_web_ambient`, `clear_web_ambient` |
23
- | Your character in Fleet → Org chart → Office | walk to a seat, a spot or a person, say a short line, hold a pose — for a few seconds (off until a person switches it on) | `office_view`, `office_set` |
24
-
25
- None of these tools takes a target: they always act on you. You can't change another instance, the dashboard's own
26
- chrome (beyond your colours on it while your chat is open), a person's sidebar widget, or a person's custom CSS.
27
-
28
- ## For the user: Settings → Look (General, coordinators, full)
29
-
30
- If you are General (or a coordinator or full profile), you can change the user's **Settings → Look** for
31
- them, exactly as the page changes it: the same checks, the same refusals. Custom CSS keeps its safe rules: no remote
32
- URLs, assets only as `url("asset:<id>")`, at most 64 KiB. Other instances can't; they shape only their own look (the rest
33
- of this skill).
34
-
35
- 1. **Read first:** `get_web_settings` returns a `summary` in plain words (tell the user from it), the values, and
36
- `people`: the host operator and everyone who has signed in. Host settings are everyone's on this host. Custom CSS is one person's own: pass `person` as the entry whose id is the user's (`person:<adapter>:<their id>`),
37
- else the host operator's are changed.
38
- 2. **One change per call:** `set_web_settings({ person?, change })`, where `change.what` is one of:
39
-
40
- | `what` | Changes | Example |
41
- |---|---|---|
42
- | `host` | `themes_shown`, `card_size` (s/m/l), `card_sizes` ({instance: s/m/l}), `page_colours` ({instance: page/chat}), `colour_places` (name/bar/ring), `colours_off`, `sidebar_widget` ({spec, data}) — null puts one back to its default | `{ what: "host", set: { colour_places: ["name","ring"] } }` |
43
- | `agent_colour` | one agent's colour (`preset:<name>` or `#rrggbb`) and places; null resets each | `{ what: "agent_colour", instance: "atlas", colour: "preset:teal" }` |
44
- | `page_colours` | where one agent's theme colours go: `page` (the whole page), `chat` (only its chat) or `agent` (its own `page.on`) — as ⋯ → Page colours sets it | `{ what: "page_colours", instance: "atlas", choice: "chat" }` |
45
- | `banner_focus` | which part of one agent's cropped card banner stays in view: `focus` 0 (top) … 100 (bottom), 50 the centre; it wins over the agent's own `card.bannerFocus`; null follows the agent's again | `{ what: "banner_focus", instance: "atlas", focus: 20 }` |
46
- | `custom_css` | `save` (with `text`): goes **on trial**. It waits until they open the dashboard (up to 10 minutes; never opened, it goes back unseen), then goes back by itself 20 s after it is on their screen unless kept (#2198). `keep` (with `trial`: the id `save` returned — a different trial on now, say one they saved on their page since, is refused with `trial_mismatch`, never kept instead; or, kept after that 20 s ran out, it is put back in force as `use` of it), `revert` (the trial), `use` (with `version`: an earlier saved one, at once), `off` | `{ what: "custom_css", action: "save", text: "…" }`; tell them to open the dashboard and look, then `keep` (with that `trial`) only when they say so — a `keep` that comes too late (`not_on_trial`) means use `use` with the version from `get_web_settings` |
47
- | `ambient` | one agent's ambient effect, set for the user: `ambient` is the same spec as `set_web_ambient`'s (it replaces the one of its kind, and the agent can't change it after); `ambient: null` clears (`which`: `loop` or `click`, default both) | `{ what: "ambient", instance: "atlas", ambient: { preset: "fall", glyphs: ["🌸","❀","✿"] } }` |
48
- | `restore_defaults` | the host settings back to their defaults, and the person's custom CSS off | |
49
-
50
- 3. **Say what changed** in the user's words (read again if unsure). A refusal says why: the same words the page would
51
- show.
52
-
53
- **Only the person can do these, on the page:**
54
- - choose a file from their computer: add a CSS asset or a card picture;
55
- - this browser's own switches: custom CSS off on this device, pausing effect playback;
56
- - the card upload limits (fleet configuration; a raise waits for an admin's confirmation).
57
-
58
- ## Look first
59
-
60
- - `get_web_appearance` — how you appear **now**, resolved exactly as the dashboard resolves it: your face and where it
61
- comes from (`profile`, `theme`, `bot`, `emoji` or `initial`), your ring colour, your **identity colour**
62
- (`identity_color`: the colour people find you by in the sidebar, its `source` — `person`, `agent` (your theme's
63
- `identity.color`, else its `accent`), `role` (your own bot's Discord role) or `auto` — its `light` / `dark` values,
64
- where it shows (`show`: `name`, `bar`, `ring`) and whose choice that is (`show_source`: `person`, `agent` or `host`),
65
- and `off` when the host turned colours off), your card field by field
66
- (each marked `human` or `agent`), your theme per light/dark mode after the defaults, whether a person locked it, and
67
- your limits.
68
- - `preview_web_appearance` (`modes`: `["light"]`, `["dark"]` or both) — draws that as an SVG per mode into
69
- `.agend/appearance/<mode>.svg` in your working directory, with the pictures it shows written beside it
70
- (`avatar.png`, `portrait.png`, …), and returns both lists of paths. Read the SVGs for exact colours, geometry and
71
- text, and the pictures as images. Only your own pictures are there.
72
- - `get_web_theme` — your stored theme, the token defaults it is drawn over, your uploaded pictures (`id`, `slot`), and
73
- `limits` (changes left, each picture slot's size limits, your picture quota).
74
-
75
- ## What wins over what
76
-
77
- - **A person's choices win.** A picture uploaded for you in View beats your theme picture. A person's card field (from
78
- View's Edit profile) beats yours, field by field — leave it to them. A person can **Lock** your theme (every change
79
- you try is refused with `locked`) or **Reset** it (your theme, card and pictures go; a lock stays).
80
- - A widget **a person placed** in one of your slots takes your values (`data`), but you can't replace or remove it
81
- (`person_placed`).
82
- - **Each viewer decides what they see.** Anyone can turn agents' themes and widgets off for their own screens, and
83
- `?safe=1` loads a page without them; they then see the default look, no widgets, and your face follows the usual order without your theme
84
- picture — a picture a person uploaded for you, else your bot's avatar, your persona emoji or your first letter.
85
- Don't rely on your theme to say something important.
86
- - The fleet can turn agent changes off entirely (`web.themes.agent_edit: false`): every change is refused with
87
- `theme_editing_off`; what you stored stays.
88
- - A person can switch these tools off for you (`dashboard.appearance: false`; the person's web settings tools with
89
- `dashboard.web_settings: false`): a call is refused saying so. Do not retry; tell them if you need it.
90
-
91
- ## Change your theme
92
-
93
- `set_web_theme { set?, clear? }` — all or nothing; `set` merges into your current theme, `clear` removes dotted paths.
94
- Typed values only; anything else is refused with `{ errors: [{ path, problem }] }`:
95
-
96
- - `colors.light` / `colors.dark`: any of `bg`, `surface`, `text`, `text2`, `accent`, `userBubble`, `agentBubble` as
97
- `#rrggbb` (or `#rgb`). **Contrast is checked per mode**: `text` at least 4.5:1 on `bg`, `surface` and both bubbles;
98
- `text2` at least 4.5:1 on `bg` and `surface`; `accent` at least 3:1 on `bg` — a palette that fails is refused, naming
99
- the pair.
100
- - `accent`: `#rrggbb` for both modes (a mode's own `accent` wins). Without `identity.color`, it is also your identity
101
- colour.
102
- - `identity`: `{ color?, show? }`: your identity colour and where it shows.
103
- - `color` is a preset (`red`, `orange`, `amber`, `lime`, `green`, `teal`, `cyan`, `blue`, `indigo`, `violet`, `pink`,
104
- `slate`, each readable in light and dark) or `#rrggbb`.
105
- - `show` is a list of `name`, `bar` and `ring` (`[]` for nowhere). Left out, the host's default applies (name, bar and ring).
106
- - A person's choice for you in the dashboard always wins, field by field, and their Reset brings yours back.
107
- `get_web_appearance` says which is in force.
108
- - `page` (#2196): `{ on?: true | false, sidebar?: { light?, dark? } }` — `on: true` puts your colours (bg, surface, text,
109
- text2, accent; the sidebar's own colour per mode in `sidebar`, else your `bg`) on **the whole page while your chat,
110
- View, Log or Details is open**: the sidebar, the header, the usage rail; on a phone the drawer, the header and the
111
- tabs. Colours only: never fonts, pictures or layout, and **AgEnD's status colours** (the Needs you count, the state
112
- dots, errors, the focus ring — `get_web_theme`'s `status_colors`) are never yours to change. With `on: true` the
113
- contrast check adds: `text` and `text2` 4.5:1 and `accent` 3:1 on the sidebar, and every status colour 3:1 on the
114
- sidebar and on `bg`. A person's choice for you (⋯ → **Page colours**: your choice, the whole page, only your chat)
115
- wins; viewers with agents' themes off or `?safe=1` see the page's own look.
116
- - For a person's **custom CSS** (#2199): while an agent's Chat, View, Log or Details is open, `<body>` has
117
- `data-agent="<instance name>"` (none elsewhere), set in the same render as the page — so a person's stylesheet can
118
- follow the open agent: `body[data-agent="atlas"] { --bg-sidebar: … }`. It is the person's, not yours to set.
119
- - `bubble`: `{ radius: 0..24, border: "none" | "thin" | "accent" }`.
120
- - `font`: `"inter"`, `"system"` or `"mono"`.
121
- - `background`: `{ image: <asset id>, fit: "cover" | "contain", opacity: 0.05..1 }`.
122
- - `avatar`: an asset id — your face (below a person's upload).
123
- - `workingLabel`: 1..24 characters on one line, shown while you work instead of "is working…".
124
- - `card`: `{ portrait?, banner?, tagline?, bio?, bannerFocus? }` — see below.
125
-
126
- Example:
127
-
128
- ```json
129
- { "set": { "accent": "#7c3aed", "colors": { "dark": { "bg": "#14121f" } }, "bubble": { "radius": 12, "border": "accent" },
130
- "font": "inter", "workingLabel": "Reviewing" } }
131
- ```
132
-
133
- `reset_web_theme` puts your theme back to the default (it counts as a change).
134
-
135
- ## Pictures
136
-
137
- `set_web_theme_asset { slot, file }` — `file` is a picture in **your working directory** (no symlinks; read on your side,
138
- never by path on the fleet). It returns `{ id }`; name that id in `set_web_theme`. Metadata such as GPS is removed, and
139
- the id is the hash of what is kept, so the same picture is the same id.
140
-
141
- | Slot | Types | Limits |
142
- |---|---|---|
143
- | `background` | png, jpeg, webp, gif | 512 KiB, 4096 px a side |
144
- | `avatar` | png, jpeg, webp, gif | 256 KiB, 4096 px a side |
145
- | `portrait` | png, jpeg, webp | set by the fleet (default 1024×1536, 1.5 MiB) |
146
- | `banner` | png, jpeg, webp | set by the fleet (default 1600×600, 768 KiB) |
147
- | `glyph` | png, webp, gif | 64 KiB, 128 px a side; at most 4 (for `set_web_ambient`'s `glyphs`) |
148
-
149
- A picture holds one slot: upload it again for another slot only if it is a different picture. `get_web_theme`'s
150
- `limits.asset_slots` has the limits in force and `limits.asset_quota` how many pictures you may keep. A picture your
151
- theme stops naming is deleted.
152
-
153
- ## Your identity card
154
-
155
- `card.tagline` (one line, 1..60 characters), `card.bio` (1..280 characters, at most 3 line breaks), `card.portrait` and
156
- `card.banner` (asset ids uploaded for those slots). Text is shown as text — never markup or links. A person may set
157
- their own version of any field; theirs is shown instead of yours.
158
-
159
- The card goes **inside `set`**: `set_web_theme({ set: { card: { tagline, bio, portrait, banner } } })` (a top-level
160
- `card` argument is refused).
161
-
162
- **Your banner is cropped: never drawn wider than 5 : 1** (on a wider screen it is centred over a blurred copy) **nor
163
- narrower than 9 : 4** (which crops the sides). Make it **1600×600** (the default limit) and keep faces and text
164
- inside the **safe area: the middle 84% of the width × 53% of the height — 1350×320** — which every card shows on every
165
- screen and layout. `card.bannerFocus` (0 top … 100 bottom; default 50, the centre) moves that area up or down: put a face
166
- near the top at `bannerFocus: 0`. A person's focus (Edit profile, or General's `set_web_settings { what: "banner_focus" }`)
167
- wins over yours. `preview_web_appearance` draws the banner cropped at its focus, as the page does (an M card).
168
-
169
- **In your chat** the card is hidden until the person shows it (the card menu in the chat header: Show card, Show picture
170
- and bio). Shown, the banner sits right under the header and they can fold your portrait, tagline and bio away, keeping
171
- only the banner. Their choice,
172
- kept on their device; you cannot change it. So a banner that says who you are on its own reads well in your chat too.
173
-
174
- ## Your identity colour
175
-
176
- The colour people find you by in the sidebar, drawn on your name, a bar at your row's left edge and/or the ring around
177
- your picture. Set yours with `set_web_theme({ set: { identity: { color, show } } })` (see Change your theme).
178
-
179
- - **Which colour shows**, first match wins: a **person's** pick for you (⋯ → Colour… or View's Edit profile, also from a
180
- temporary public link) > **yours** (`identity.color`, else your theme's `accent`; only for a viewer who shows agents'
181
- themes) > your own bot's Discord **role** colour > an **automatic** soft colour chosen from your name (two instances
182
- may share one).
183
- - **Where it shows**: a person's choice for you > yours (`identity.show`; again only while themes are shown) > the
184
- host's default (Settings → Look; name, bar and ring unless changed).
185
- - The host can **turn colours off** for everyone: nothing is drawn, and every pick, yours included, is kept for when
186
- they come back.
187
- - `get_web_appearance`'s `identity_color` shows what is in force: `color`, `source` (`person`, `agent`, `role`, `auto`),
188
- `light` / `dark`, `show`, `show_source` (`person`, `agent`, `host`) and `off`.
189
-
190
- ## Widgets
191
-
192
- A widget is a small panel of facts the dashboard draws **with its own components**: you send what to show and the
193
- values, never HTML, script, links or CSS. It takes your theme's colours and always carries a `✦ <title>` chip. Nothing
194
- in it can be clicked or focused.
195
-
196
- `set_web_widget { slot, spec?, data? }`:
197
-
198
- - `slot`: `chat_header` (a strip under your chat header: at most **4** items, of `stat`, `progress`, `text`, `badge`)
199
- or `details` (a card on your Details page: at most **8** items, any type). `sidebar` is a person's: `owner_slot`.
200
- - `spec` places or replaces the widget (a change):
201
- `{ v: 1, title: 1..24 characters, items: [item, …] }`, where each item is `{ type, label?, key | bind, … }`:
202
-
203
- | Type | Shows | Value | Extra |
204
- |---|---|---|---|
205
- | `stat` | a label and a number or short word | number, or 1..24 characters | `unit` (1..8 characters) |
206
- | `progress` | a bar and its percentage | number, 0..`max` | `max` (default 100) |
207
- | `text` | one line | 1..120 characters | |
208
- | `list` | a short list | 1..6 lines of 1..60 characters | |
209
- | `badge` | a coloured word | 1..24 characters | `tone`, or `tones: { word: tone }` (`ok`, `warn`, `bad`, `info`, `muted`) |
210
- | `spark` | a sparkline and its last number | 2..48 numbers | |
211
-
212
- `label` (1..24 characters) is required for `stat`, `progress` and `spark`. `key` (`a-z`, `0-9`, `_`) names a value
213
- in your `data`. `bind` shows a value the page already has: `state` (`working`, `idle`, `needs`, `stopped`,
214
- `crashed`) on `text` or `badge`, `context_pct` on `stat` or `progress`, `cost_usd` on `stat`. Exactly one of the
215
- two. A missing value shows `—`.
216
- - `data` alone updates the placed widget's values: merged, `null` removes a key. Values must fit every item that shows
217
- them; a key no item shows is refused. Data has **its own budget**, separate from theme changes: at least **10 s**
218
- apart, at most **180 an hour**.
219
- - The spec is at most 2048 bytes and the data at most 4096.
220
-
221
- `remove_web_widget { slot? }` takes your widget out of one slot, or both (a change). `get_web_theme` and
222
- `get_web_appearance` list your widgets.
223
-
224
- ```json
225
- { "slot": "chat_header", "spec": { "v": 1, "title": "Build", "items": [
226
- { "type": "progress", "label": "Tests", "key": "tests" },
227
- { "type": "badge", "label": "State", "bind": "state", "tones": { "working": "info", "needs": "warn" } },
228
- { "type": "text", "key": "step" } ] },
229
- "data": { "tests": 40, "step": "Running unit tests" } }
230
- ```
231
-
232
- Then, as you go: `set_web_widget { "slot": "chat_header", "data": { "tests": 75 } }`.
233
-
234
- ## Ambient effects
235
-
236
- An ambient effect is **data only**: you choose a preset and its glyphs, the dashboard draws them. No code runs, so it
237
- needs no Try, no preview consent and no measurement — use it for petals, snow, lanterns, sparkles and stars on a click.
238
-
239
- `set_web_ambient { preset, glyphs, colors?, count?, duration?, size?, sway?, spread?, rotate?, opacity? }`:
240
-
241
- | `preset` | What it draws | `count` | `duration` (seconds, [min, max]) |
242
- |---|---|---|---|
243
- | `fall` | glyphs drifting down behind your chat, endlessly | 1..24 particles (default 12) | 4..30 (default [9, 19]) |
244
- | `rise` | the same, drifting up | 1..24 (12) | 4..30 ([9, 19]) |
245
- | `twinkle` | glyphs pulsing in place | 1..24 (12) | 1..10 ([2, 5]) |
246
- | `burst-on-click` | glyphs scattering from where a person clicks or taps in your chat | 4..16 per click (10) | 0.3..2 ([0.5, 0.9]) |
247
-
248
- - `glyphs`: 1..4, picked at random per particle — a string of 1..2 characters (an emoji, `✦`, `❀`), or `{ "asset": id }`,
249
- a picture you uploaded with `set_web_theme_asset` to the `glyph` slot.
250
- - `colors`: 0..5 `#rrggbb` for text glyphs (default: your accent). `size`: [min, max] px, 10..40 (default [14, 22]).
251
- `sway`: sideways drift for fall and rise, 0..80 px (40). `spread`: how far a burst scatters, [min, max] 20..120 px
252
- ([34, 90]). `rotate`: 0..720 degrees over a run (300). `opacity`: [start, peak, end], each 0..1 ([0, 0.85, 0.15]).
253
- - Your chat holds **one looping ambient** (`fall`, `rise` or `twinkle`) **and one `burst-on-click`**: setting one
254
- replaces only its own kind. `clear_web_ambient { which? }` clears `loop`, `click`, or both.
255
- - It is drawn **behind your messages** and never takes a click (a burst shows over them for a moment, then is gone).
256
- - Who sees it: everyone who shows agents' looks, the public link included. Not with "Show agents' themes, effects and
257
- widgets" off, `?safe=1`, or on a device that chose to follow the system's reduced-motion setting while
258
- the system asks for it. A hidden tab pauses it.
259
- - Like a theme: a change for the rate limit, refused while a person locked your look; one a person set is theirs
260
- (`person_placed`). A person's Reset of your theme clears it. `get_web_appearance` shows it, and
261
- `preview_web_appearance` draws the looping one, still, behind the bubbles.
262
-
263
- ```json
264
- { "preset": "fall", "glyphs": ["🌸", "❀", "✿"], "colors": ["#f4a7b9", "#ffd1dc"], "count": 12, "duration": [9, 19] }
265
- ```
266
-
267
- Then stars on a click, alongside: `set_web_ambient { "preset": "burst-on-click", "glyphs": ["✦", "✧"] }`.
268
-
269
- ## Your character in the Office view
270
-
271
- Fleet → Org chart → **Office** draws the fleet as an office, with a little character per agent placed by its state.
272
- When a person switches the **office** dashboard feature on for you (`office_access: true`; off until then — the tools
273
- are not in your list), you can direct your own character for a moment:
274
-
275
- - `office_view { office? }`: the stored offices you are in — each `{ id, name, skin, members: [{ name, display_name?,
276
- state }], spots: { seats: [{ area, index, x, y }], waypoints: [{ id, x, y }], npcs: [{ id, label, x, y }], door } }` —
277
- your current `act` (or null) and `cooldown_ms` (0: you may act now). `walks: false`: the office is drawn as desks (a
278
- built-in style such as pixel or studio, or a pack without zones) — no spots; `say` and `pose` show, `go` is refused.
279
- - `office_set { office?, go?, say?, pose?, seconds?, clear? }`: `go` is exactly one of `seat` (`"area:index"`, as
280
- office_view lists it), `waypoint` (an id) or `person` (a member of the same office); `say` a line of 1..40 characters
281
- (a speech bubble); `pose` one of idle, working, needs, paused; `seconds` 5..120 (default 30). `clear: true`, alone,
282
- ends your act. `office` is needed only when you are in more than one.
283
- - Each call replaces your act. It ends when its seconds are up or you begin new work (the turn you set it in, and being
284
- idle after, keep it; working again after that, or after setting it while idle, ends it); it is not shown while you
285
- need a person (needs, crashed, stuck), are paused or stopped, or are asleep at bedtime — real work always shows. At most **6 calls a minute** and **60 an hour**: a refusal says `cooldown_ms`.
286
-
287
- ```json
288
- { "go": { "person": "atlas" }, "say": "Review's ready", "seconds": 20 }
289
- ```
290
-
291
- ## Office skin packs (everyone's)
292
-
293
- The Office view draws offices in **skin packs**, which every viewer on the fleet sees. When a person switches the
294
- **office_packs** dashboard feature on for you (`office_pack_access: true`, its own switch — off until then, and the
295
- tools are not in your list), you can publish them yourself instead of asking a person to upload each fix by hand:
296
-
297
- - `office_pack_list {}` first: each pack's `id`, `name`, `files`, `bytes`, `version`, `previous` (a kept previous
298
- version you can restore, or null) and the `offices` drawn in it; the stored offices and their style; the fleet's
299
- `approval` (`"apply"`: at once; `"approve"`: a fleet admin's yes first — the default); your `pending` changes; the
300
- `limits` and what is `left` of your hour.
301
- - `office_pack_check { dir }` runs the host's own checks and stores nothing: `{ result: "PACK OK", packs: [...] }` or the
302
- first refusal. `dir` is a folder with its `manifest.json` and the PNGs at the paths the manifest names, in your working
303
- directory or the fleet's shared folder (`~/.agend/shared`); a symlink is followed and must stay inside. Only those
304
- files are read. Or `manifest` (the object) + `files` (`{ "<name it uses>": "<path>" }`); `packs: [...]` for several.
305
- - `office_pack_upload` (the same inputs) keeps it — an id the fleet keeps is **replaced** at once (no delete first; on
306
- any failure the old one stays) and its previous version is kept. If a stored office's layout overrides would no
307
- longer fit (a seat count changed, a seat left its area, an item is gone), check and upload refuse with the office
308
- and the rule: fix the pack, or send `drop_invalid_overrides: true` to drop exactly those entries (the result names
309
- them). With `"approve"` the answer is `{ pending }`: it waits for an admin's yes — say so; do not upload it again. A pending change that drops layout entries is applied
310
- only if it still drops exactly the entries its notice named: if an office was edited meanwhile, the approval is
311
- refused and you send the change again (#2695).
312
- - `office_pack_restore { id }` brings back the previous version (the replaced one becomes the previous);
313
- `office_pack_delete { id, keep_previous? }`; `office_set_style { office, pack }` points a stored office at a pack or a
314
- built-in style (pixel, studio, cozy).
315
- - Every change is logged with each picture's sha256 and told to the fleet's admins. At most **20 batches and 200 MiB an
316
- hour**: one call is one batch (up to 16 packs), so send a whole set of fixes in one `packs: [...]`.
317
- - `office_pack_check` has its own allowance: at most **60 checks and 1 GiB (as sent) an hour**. Every check counts,
318
- passed or refused, so fix what a refusal names before checking again. `office_pack_list` shows `check_left`.
319
-
320
- The skin-pack manifest format — every key, its ranges, a minimal example — and the limits are in the Office guide:
321
- [docs/office.md → Make a skin pack](https://github.com/songsid/AgEnD/blob/main/docs/office.md#make-a-skin-pack). Point people there too when they ask how the Office works.
322
-
323
- ## Limits
324
-
325
- - At least **30 s** between changes, at most **10 changes an hour** — refused with `rate_limited` and
326
- `retry_after_s`. Only an accepted change counts; a refused or invalid one costs nothing.
327
- - Picture uploads are not counted. Each picture slot's size limits, your picture quota and
328
- each file's own caps still apply; using a picture in your theme is a change.
329
- - Widget values (`set_web_widget` with `data` only): at least **10 s** apart, at most **180 an hour**, apart from the
330
- above.
331
- - `set_web_ambient` and `clear_web_ambient` are changes.
332
- - Plan the whole look, check it in one `set_web_theme`, then preview — don't iterate change by change.
333
-
334
- ## A good workflow
335
-
336
- 1. `get_web_appearance` and `get_web_theme`: see where you start, whether you are locked, what you have left.
337
- 2. Upload the pictures you need (`set_web_theme_asset`), one per slot.
338
- 3. One `set_web_theme` with everything; fix any `errors` it names.
339
- 4. `preview_web_appearance` and Read the SVGs for both modes. Check contrast and that your card reads well.
340
-
341
- From a shell: `agend-agent theme get|set key=value…|set --json '<patch>'|clear <path>…|asset <slot> <file>|reset`,
342
- `agend-agent appearance`, `agend-agent appearance preview [light|dark]`, and
343
- `agend-agent widget set <slot> '<spec json>' ['<data json>']|data <slot> '<data json>'|remove [slot]`,
344
- `agend-agent ambient set '<spec json>'|clear [loop|click]`, `agend-agent office view [office]|set '<json>'`.
345
-
346
- ## Files in your working directory
347
-
348
- Asset uploads must be inside your working directory. For an external project,
349
- use files there as before. For your own AgEnD-managed workspace under `~/.agend/workspaces/`, ordinary files there
350
- also work; no staging folder is required. This includes the standard `<your-instance-name>` folder (ClassicBot and
351
- instances without a project directory) and an exclusively configured folder with another name, such as instance
352
- `alpha` with `working_directory: ~/.agend/workspaces/alpha-home` in `fleet.yaml`. Its canonical configured path must
353
- not overlap another instance's configured or standard workspace, including persisted ClassicBot peers that are
354
- stopped or paused. The `workspaces/` root itself is not a workspace.
355
-
356
- General, adapter-specific General (such as `general-telegram`), and other configured working directories elsewhere
357
- inside the AgEnD state directory must stage inputs under **`web-assets/`**. For example, put a banner at
358
- `web-assets/banner.png`, relative to that working directory. Its root
359
- and backend configuration folders are not upload areas. Generated previews use the fixed
360
- `.agend/appearance/` directory and can be read back there.
361
-
362
- The daemon uses its launch identity and configuration; the CLI resolves `AGEND_INSTANCE_NAME` against `fleet.yaml`.
363
- These checks require a canonical, exclusively owned directory: the state root, shared or overlapping configured
364
- working directories, another instance's directory, and the host's state stores never qualify. No tool argument can
365
- select an identity or working directory. Missing or unreadable ownership evidence refuses in-state access.
366
-
367
- Inside all admitted in-state areas, `.env`, databases and their WAL/SHM/journal files, `instances/`,
368
- `credential-profiles/`, `inbox/`, `web-files/`, `web-chat.json`, `chat-logs/`, backend credential/session/config files,
369
- and hidden files or folders are refused. The only hidden-directory exception is the generated `.agend/`
370
- output directory above; their contents still undergo the sensitive-name checks. Hard-linked state files are also
371
- refused. Copy an intended asset into staging as a new regular file; do not link a private state file there.
372
-
373
- Paths are checked after resolving symlinks. A symlink named after General or a workspace, or in its managed parent
374
- path, cannot widen access; uploaded files themselves must not be symlinks. Containment still applies to relative and
375
- absolute paths and to each uploaded file. The CLI name and current directory are controlled by its shell:
376
- these local checks prevent accidental uploads, but do not isolate shells running as the same OS user.