@songsid/agend 2.3.3-beta.3 → 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.
- package/dist/agent-cli.js +13 -112
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +0 -1
- package/dist/agent-endpoint.js +1 -9
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-whats-new.d.ts +3 -6
- package/dist/agent-whats-new.js +7 -18
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/auth-api.d.ts +0 -7
- package/dist/auth-api.js +1 -15
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/codex.d.ts +1 -0
- package/dist/backend/codex.js +106 -15
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/types.d.ts +17 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/bundled-skills.d.ts +4 -6
- package/dist/bundled-skills.js +10 -14
- package/dist/bundled-skills.js.map +1 -1
- package/dist/channel/mcp-server.js +5 -5
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +1 -3
- package/dist/channel/mcp-tools.js +4 -58
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +6 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/daemon.d.ts +11 -3
- package/dist/daemon.js +59 -107
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard-live.d.ts +1 -1
- package/dist/dashboard-live.js +3 -3
- package/dist/dashboard-live.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +1 -1
- package/dist/dashboard-permissions.js +1 -3
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/fleet-manager.d.ts +26 -44
- package/dist/fleet-manager.js +70 -226
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +11 -1
- package/dist/general-knowledge/skills/session-management/SKILL.md +6 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +13 -204
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +26 -63
- package/dist/instance-lifecycle.js +1 -1
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +2 -0
- package/dist/locale.js.map +1 -1
- package/dist/outbound-handlers.js +19 -7
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +0 -62
- package/dist/outbound-schemas.js +2 -41
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +0 -9
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +2 -0
- package/dist/public-web-link.js +5 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/search/search-docs.d.ts +1 -1
- package/dist/search/search-docs.js +2 -2
- package/dist/search/search-docs.js.map +1 -1
- package/dist/settings-api.d.ts +6 -0
- package/dist/settings-api.js +14 -2
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +3 -1
- package/dist/settings-change.js.map +1 -1
- package/dist/task-board-waker.d.ts +4 -1
- package/dist/task-board-waker.js +13 -2
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tool-permissions.js +3 -10
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +6 -2
- package/dist/topic-commands.js +2 -0
- package/dist/topic-commands.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/ui/chat-ambient.js +4 -4
- package/dist/ui/chat-commands.js +3 -2
- package/dist/ui/chat-store.js +4 -1
- package/dist/ui/chat-strings.js +6 -42
- package/dist/ui/chat-thread.js +6 -44
- package/dist/ui/panel-chat.js +21 -50
- package/dist/ui/preview-panel.js +3 -15
- package/dist/ui/search-dialog.js +30 -14
- package/dist/ui/settings-appearance.js +1 -3
- package/dist/ui/settings-guests.js +13 -4
- package/dist/ui/settings-learn.js +1 -1
- package/dist/ui/settings-mods.js +5 -12
- package/dist/ui/settings-registry.js +0 -1
- package/dist/ui/settings-strings.js +6 -6
- package/dist/ui/shared/app-prefs.js +17 -17
- package/dist/ui/shared/app-shell.js +12 -8
- package/dist/ui/shared/app-store.js +6 -2
- package/dist/ui/shared/app.css +4 -36
- package/dist/ui/shared/app.js +5 -4
- package/dist/ui/shared/instance-nav.js +9 -9
- package/dist/ui/shared/instance-switch.js +8 -2
- package/dist/ui/shared/panel-view.js +22 -8
- package/dist/ui/shared/view-strings.js +6 -0
- package/dist/usage/usage-api.d.ts +3 -0
- package/dist/usage/usage-api.js +5 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/view-api.d.ts +2 -0
- package/dist/view-api.js +64 -0
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +9 -17
- package/dist/web-api.js +255 -371
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +0 -2
- package/dist/web-appearance-tools.js +2 -5
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.d.ts +0 -6
- package/dist/web-appearance-view.js +0 -1
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +14 -7
- package/dist/web-appearance.js +5 -6
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-asset-parts.d.ts +1 -17
- package/dist/web-asset-parts.js +1 -15
- package/dist/web-asset-parts.js.map +1 -1
- package/dist/web-auth.js +1 -7
- package/dist/web-auth.js.map +1 -1
- package/dist/web-chat-history.d.ts +3 -7
- package/dist/web-chat-history.js +10 -17
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +9 -1
- package/dist/web-commands.js +13 -0
- package/dist/web-commands.js.map +1 -1
- package/dist/web-experimental.d.ts +2 -11
- package/dist/web-experimental.js +8 -36
- package/dist/web-experimental.js.map +1 -1
- package/dist/web-guest-access.d.ts +40 -2
- package/dist/web-guest-access.js +50 -14
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-mod-bundle.d.ts +2 -45
- package/dist/web-mod-bundle.js +15 -63
- package/dist/web-mod-bundle.js.map +1 -1
- package/dist/web-mod-store.d.ts +3 -48
- package/dist/web-mod-store.js +30 -97
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-prefs.d.ts +13 -0
- package/dist/web-prefs.js +38 -0
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +1 -11
- package/dist/web-preview.js +6 -20
- package/dist/web-preview.js.map +1 -1
- package/dist/web-session.d.ts +11 -3
- package/dist/web-session.js +22 -11
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +1 -0
- package/dist/web-settings-patch.js +6 -3
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +0 -13
- package/dist/web-settings-tools.js +12 -84
- package/dist/web-settings-tools.js.map +1 -1
- package/launcher/fleet-service-owner.cjs +4 -1
- package/package.json +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +0 -376
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +0 -672
- package/dist/ui/app-effects.js +0 -251
- package/dist/ui/chat-effect-posters.js +0 -42
- package/dist/ui/chat-effects.js +0 -167
- package/dist/ui/effect-trial-controller.js +0 -124
- package/dist/ui/effect-trial-offer.js +0 -2
- package/dist/ui/effect-trial-panel.js +0 -40
- package/dist/ui/effects-waker.js +0 -2
- package/dist/ui/settings-effects.js +0 -202
- package/dist/ui/settings-owner-effects.js +0 -82
- package/dist/ui/shared/effect-app-runtime.js +0 -299
- package/dist/ui/shared/effect-baseline.js +0 -64
- package/dist/ui/shared/effect-chat-runtime.js +0 -162
- package/dist/ui/shared/effect-cursor.js +0 -126
- package/dist/ui/shared/effect-display-metadata.js +0 -39
- package/dist/ui/shared/effect-frame.js +0 -146
- package/dist/ui/shared/effect-geometry.js +0 -137
- package/dist/ui/shared/effect-host-style.js +0 -10
- package/dist/ui/shared/effect-owner-regions.js +0 -74
- package/dist/ui/shared/effect-owner-source.js +0 -122
- package/dist/ui/shared/effect-policy.js +0 -151
- package/dist/ui/shared/effect-poster-reader.js +0 -98
- package/dist/ui/shared/effect-posters.js +0 -117
- package/dist/ui/shared/effect-profiler.js +0 -184
- package/dist/ui/shared/effect-profiles.js +0 -65
- package/dist/ui/shared/effect-registry.js +0 -545
- package/dist/ui/shared/effect-runtime-loader.js +0 -236
- package/dist/ui/shared/effect-safety.js +0 -153
- package/dist/ui/shared/effect-stock-snapshot.js +0 -43
- package/dist/ui/shared/effect-stock-trust.js +0 -217
- package/dist/ui/shared/effect-trial-shadow.js +0 -62
- package/dist/ui/shared/effect-trial-source.js +0 -103
- package/dist/ui/shared/effect-trial-stage.js +0 -170
- package/dist/ui/shared/effect-trial.css +0 -40
- package/dist/ui/shared/feature-flags.js +0 -127
- package/dist/ui/shared/owner-effect-prefs.js +0 -117
- package/dist/web-effect-bootstrap.d.ts +0 -12
- package/dist/web-effect-bootstrap.js +0 -49
- package/dist/web-effect-bootstrap.js.map +0 -1
- package/dist/web-effect-bundle.d.ts +0 -28
- package/dist/web-effect-bundle.js +0 -171
- package/dist/web-effect-bundle.js.map +0 -1
- package/dist/web-effect-canonical.d.ts +0 -8
- package/dist/web-effect-canonical.js +0 -27
- package/dist/web-effect-canonical.js.map +0 -1
- package/dist/web-effect-library.d.ts +0 -114
- package/dist/web-effect-library.js +0 -530
- package/dist/web-effect-library.js.map +0 -1
- package/dist/web-effect-playback.d.ts +0 -30
- package/dist/web-effect-playback.js +0 -71
- package/dist/web-effect-playback.js.map +0 -1
- package/dist/web-effect-poster.d.ts +0 -8
- package/dist/web-effect-poster.js +0 -52
- package/dist/web-effect-poster.js.map +0 -1
- package/dist/web-effect-profiles.d.ts +0 -118
- package/dist/web-effect-profiles.js +0 -181
- package/dist/web-effect-profiles.js.map +0 -1
- package/dist/web-effect-service.d.ts +0 -93
- package/dist/web-effect-service.js +0 -335
- package/dist/web-effect-service.js.map +0 -1
- package/dist/web-effect-tools.d.ts +0 -48
- package/dist/web-effect-tools.js +0 -129
- package/dist/web-effect-tools.js.map +0 -1
- package/dist/web-effect-trials.d.ts +0 -86
- package/dist/web-effect-trials.js +0 -204
- package/dist/web-effect-trials.js.map +0 -1
- package/dist/web-effect-upload.d.ts +0 -27
- package/dist/web-effect-upload.js +0 -185
- package/dist/web-effect-upload.js.map +0 -1
- package/dist/web-effect-worker.d.ts +0 -8
- package/dist/web-effect-worker.js +0 -170
- package/dist/web-effect-worker.js.map +0 -1
- package/dist/web-effect.d.ts +0 -103
- package/dist/web-effect.js +0 -153
- package/dist/web-effect.js.map +0 -1
- package/dist/web-experimental-http.d.ts +0 -2
- package/dist/web-experimental-http.js +0 -12
- package/dist/web-experimental-http.js.map +0 -1
- package/dist/web-mod-agent.d.ts +0 -50
- package/dist/web-mod-agent.js +0 -207
- package/dist/web-mod-agent.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: credential-profiles
|
|
3
|
-
description: Run agents on more than one subscription of the same backend. Use when someone asks for a worker on a different account,
|
|
3
|
+
description: Run agents on more than one subscription or login of the same backend (credential profiles). Use when someone asks for a worker on a different account; to switch, change or move an agent's profile, credential profile, account or login (codex, claude-code, kiro-cli); whether its session or conversation continues after the switch; or which subscription an agent is using. Also 換帳號、換 profile、切換 codex/claude/kiro 登入、換訂閱、切換後接續 session. Currently kiro-cli, codex and claude-code.
|
|
4
4
|
roles: [general]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -97,6 +97,15 @@ update_instance_config(
|
|
|
97
97
|
)
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
+
For codex (or claude-code) the call is the same with that backend's key:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
update_instance_config(
|
|
104
|
+
name: "research-a",
|
|
105
|
+
config: { backend_options: { codex: { credential_profile: "personal" } } },
|
|
106
|
+
)
|
|
107
|
+
```
|
|
108
|
+
|
|
100
109
|
The credentials are read when the CLI starts, so a running instance **is
|
|
101
110
|
restarted for you** and the reply says `restarted: true`. A paused or stopped one
|
|
102
111
|
is not started: the reply says `restarted: false`, and the switch applies at its
|
|
@@ -127,6 +136,7 @@ it is not a check that the new process opened the same thread. If there is no
|
|
|
127
136
|
suitable session (or the DB is unreadable), Codex starts fresh as it would on any
|
|
128
137
|
other launch. **Never** copy `state_5.sqlite`, the `cx/` hash dirs or rollout
|
|
129
138
|
JSONL by hand. That can fork or corrupt the thread index.
|
|
139
|
+
Do not run `codex resume <id>` by hand or look up session ids in `~/.codex/sessions`: the restart takes AgEnD's normal resume path itself.
|
|
130
140
|
|
|
131
141
|
**Claude Code — copy nothing yourself.** AgEnD copies the transcript and its
|
|
132
142
|
folder into the new profile and resumes it there with `--continue`. The
|
|
@@ -40,6 +40,8 @@ Verified by running each one, not read from docs.
|
|
|
40
40
|
|
|
41
41
|
## kiro-cli
|
|
42
42
|
|
|
43
|
+
Switching an agent's profile or login and keeping its session → the `credential-profiles` skill (update_instance_config); never resume by hand.
|
|
44
|
+
|
|
43
45
|
- **Store:** `~/.kiro/sessions/cli/<uuid>.json`
|
|
44
46
|
- **DB:** `~/.local/share/kiro-cli/data.sqlite3`, table `conversations_v2`
|
|
45
47
|
- `key` — the instance's working directory
|
|
@@ -103,6 +105,8 @@ cur.execute("SELECT session_id FROM session_docs_fts WHERE session_docs_fts MATC
|
|
|
103
105
|
|
|
104
106
|
## claude-code
|
|
105
107
|
|
|
108
|
+
Switching an agent's profile or login and keeping its session → the `credential-profiles` skill (update_instance_config); never resume by hand.
|
|
109
|
+
|
|
106
110
|
- **Store:** `~/.claude/projects/<path-encoded>/<session-uuid>.jsonl` — **the filename is the session ID**.
|
|
107
111
|
- `<path-encoded>` = the absolute cwd with every `/` replaced by `-`.
|
|
108
112
|
|
|
@@ -127,6 +131,8 @@ A session with no `ai-title` line is simply untitled — say so rather than inve
|
|
|
127
131
|
|
|
128
132
|
## codex
|
|
129
133
|
|
|
134
|
+
Switching an agent's profile or login and keeping its session → the `credential-profiles` skill (update_instance_config); never resume by hand.
|
|
135
|
+
|
|
130
136
|
Restoring works well; **listing is the weak part — there is no index table.**
|
|
131
137
|
|
|
132
138
|
- **Store:** `~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<uuid>.jsonl`
|
|
@@ -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),
|
|
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
|
|
|
@@ -21,8 +21,6 @@ can shape how you look there — **only your own look, and only on the surfaces
|
|
|
21
21
|
| Your chat header strip and Details page | widgets: small panels of facts the dashboard draws | `set_web_widget`, `remove_web_widget` |
|
|
22
22
|
| An ambient effect in your chat | falling petals, snow, rising lanterns, twinkles, stars where a person clicks — data only, drawn by the dashboard | `set_web_ambient`, `clear_web_ambient` |
|
|
23
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
|
-
| A file of your look | a mod: export yours, or propose one for a person | `export_web_mod`, `propose_web_mod` |
|
|
25
|
-
| Effects in your chat | Canvas Worker animations, and Try cards an admin outside the public link may start | `upload_web_effect`, `apply_web_effect`, `preview_web_effect`, … (see Effects) |
|
|
26
24
|
|
|
27
25
|
None of these tools takes a target: they always act on you. You can't change another instance, the dashboard's own
|
|
28
26
|
chrome (beyond your colours on it while your chat is open), a person's sidebar widget, or a person's custom CSS.
|
|
@@ -35,8 +33,7 @@ URLs, assets only as `url("asset:<id>")`, at most 64 KiB. Other instances can't;
|
|
|
35
33
|
of this skill).
|
|
36
34
|
|
|
37
35
|
1. **Read first:** `get_web_settings` returns a `summary` in plain words (tell the user from it), the values, and
|
|
38
|
-
`people`: the host operator and everyone who has signed in. Host settings are everyone's on this host. Custom CSS
|
|
39
|
-
effect slots are one person's own: pass `person` as the entry whose id is the user's (`person:<adapter>:<their id>`),
|
|
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>`),
|
|
40
37
|
else the host operator's are changed.
|
|
41
38
|
2. **One change per call:** `set_web_settings({ person?, change })`, where `change.what` is one of:
|
|
42
39
|
|
|
@@ -47,19 +44,15 @@ of this skill).
|
|
|
47
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" }` |
|
|
48
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 }` |
|
|
49
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` |
|
|
50
|
-
| `mod` | an agent's proposal: `review` (instance → `stage`, `plan`, `plan_hash`), then `install` (stage, plan_hash, `include`: the parts, `target`: the agent); `cancel`, `dismiss`, `uninstall` (id) | review, show the user the plan, install only what they asked for — never custom CSS unasked. A person has one review open at a time: while theirs is open (`mod_review_open`) ask them to finish it; a mod they imported from a file is theirs to install (`mod_not_from_an_agent`) |
|
|
51
|
-
| `effect` | `apply` (instance, id, params?) or `remove` (instance, id?) an effect on a chat | |
|
|
52
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: ["🌸","❀","✿"] } }` |
|
|
53
|
-
| `effect_slot` | a person's `sidebar` / `header` / `page` / `box` / `cursor` effect (an id, or null) | |
|
|
54
48
|
| `restore_defaults` | the host settings back to their defaults, and the person's custom CSS off | |
|
|
55
49
|
|
|
56
50
|
3. **Say what changed** in the user's words (read again if unsure). A refusal says why: the same words the page would
|
|
57
51
|
show.
|
|
58
52
|
|
|
59
53
|
**Only the person can do these, on the page:**
|
|
60
|
-
- choose a file from their computer:
|
|
54
|
+
- choose a file from their computer: add a CSS asset or a card picture;
|
|
61
55
|
- this browser's own switches: custom CSS off on this device, pausing effect playback;
|
|
62
|
-
- download an export;
|
|
63
56
|
- the card upload limits (fleet configuration; a raise waits for an admin's confirmation).
|
|
64
57
|
|
|
65
58
|
## Look first
|
|
@@ -242,7 +235,6 @@ Then, as you go: `set_web_widget { "slot": "chat_header", "data": { "tests": 75
|
|
|
242
235
|
|
|
243
236
|
An ambient effect is **data only**: you choose a preset and its glyphs, the dashboard draws them. No code runs, so it
|
|
244
237
|
needs no Try, no preview consent and no measurement — use it for petals, snow, lanterns, sparkles and stars on a click.
|
|
245
|
-
Use a Canvas Worker effect (below) only for what a preset can't express.
|
|
246
238
|
|
|
247
239
|
`set_web_ambient { preset, glyphs, colors?, count?, duration?, size?, sway?, spread?, rotate?, opacity? }`:
|
|
248
240
|
|
|
@@ -328,43 +320,15 @@ tools are not in your list), you can publish them yourself instead of asking a p
|
|
|
328
320
|
The skin-pack manifest format — every key, its ranges, a minimal example — and the limits are in the Office guide:
|
|
329
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.
|
|
330
322
|
|
|
331
|
-
## Mods
|
|
332
|
-
|
|
333
|
-
A mod is one file, `<name>-<version>.agendmod.json`, that carries a look: a theme with its pictures, card text,
|
|
334
|
-
widgets and effects. People import mods in **Settings → Look → Mods**. **You never import**: a person reviews
|
|
335
|
-
everything in a mod and ticks what to apply.
|
|
336
|
-
|
|
337
|
-
- `export_web_mod { name, version, title? }` writes **your own** look to `.agend/mods/<name>-<version>.agendmod.json`
|
|
338
|
-
in your working directory and returns `{ path, bytes }`. It carries your theme with its pictures, the effects your
|
|
339
|
-
theme places (with their params) when they are yours or shared with you, your own card text (not a person's card
|
|
340
|
-
fields), the widgets and ambient effects you set yourself. A person's private effect placed on you stays out (`effects_omitted` counts it).
|
|
341
|
-
It never carries custom CSS or the sidebar widget, which are a person's. `name` is a-z, 0-9 and -, `version` is
|
|
342
|
-
MAJOR.MINOR.PATCH.
|
|
343
|
-
- `propose_web_mod { file }` sends a mod file from your working directory (at most 8 MiB) for a person to review. It
|
|
344
|
-
is checked whole and answers with its problems if it isn't valid. **A mod carrying custom CSS is refused**
|
|
345
|
-
(`owner_css_not_from_agent`). A muted line in your chat says it was proposed. Nothing changes until a person
|
|
346
|
-
installs it. One proposal at a time: a new one replaces yours.
|
|
347
|
-
- A widget a person placed from a mod is theirs: you may give it values (`set_web_widget` with `data`), but not replace
|
|
348
|
-
or remove it (`person_placed`).
|
|
349
|
-
|
|
350
|
-
The file format: `{ "format": "agend-mod", "v": 1, "manifest": { name, version, title, description?, author?,
|
|
351
|
-
requires?: { agend: ">=X.Y.Z" }, contents: { theme?, identity?, widgets?: { chat_header?, details? }, ambient?, effects? } },
|
|
352
|
-
"files": { "<path>": { "sha256", "b64" } } }`. Every file is listed with its sha256 and used by exactly one part, paths
|
|
353
|
-
are lowercase with no `..`, and a theme names its pictures by path (an ambient's glyph pictures too: `{ "asset": "<path>" }`). The easiest way to get one right is to set your look
|
|
354
|
-
with the tools above, then `export_web_mod`.
|
|
355
|
-
|
|
356
323
|
## Limits
|
|
357
324
|
|
|
358
325
|
- At least **30 s** between changes, at most **10 changes an hour** — refused with `rate_limited` and
|
|
359
326
|
`retry_after_s`. Only an accepted change counts; a refused or invalid one costs nothing.
|
|
360
|
-
-
|
|
327
|
+
- Picture uploads are not counted. Each picture slot's size limits, your picture quota and
|
|
361
328
|
each file's own caps still apply; using a picture in your theme is a change.
|
|
362
329
|
- Widget values (`set_web_widget` with `data` only): at least **10 s** apart, at most **180 an hour**, apart from the
|
|
363
330
|
above.
|
|
364
331
|
- `set_web_ambient` and `clear_web_ambient` are changes.
|
|
365
|
-
- Effects: `apply_web_effect` and `remove_web_effect` are changes; `upload_web_effect` and `propose_web_mod` are not
|
|
366
|
-
counted.
|
|
367
|
-
At most 10 effects and 8 MiB of your own, at most two placed in your chat.
|
|
368
332
|
- Plan the whole look, check it in one `set_web_theme`, then preview — don't iterate change by change.
|
|
369
333
|
|
|
370
334
|
## A good workflow
|
|
@@ -377,12 +341,11 @@ with the tools above, then `export_web_mod`.
|
|
|
377
341
|
From a shell: `agend-agent theme get|set key=value…|set --json '<patch>'|clear <path>…|asset <slot> <file>|reset`,
|
|
378
342
|
`agend-agent appearance`, `agend-agent appearance preview [light|dark]`, and
|
|
379
343
|
`agend-agent widget set <slot> '<spec json>' ['<data json>']|data <slot> '<data json>'|remove [slot]`,
|
|
380
|
-
`agend-agent ambient set '<spec json>'|clear [loop|click]`, `agend-agent office view [office]|set '<json>'
|
|
381
|
-
`agend-agent mod export <name> <version> [title]|propose <file>`.
|
|
344
|
+
`agend-agent ambient set '<spec json>'|clear [loop|click]`, `agend-agent office view [office]|set '<json>'`.
|
|
382
345
|
|
|
383
346
|
## Files in your working directory
|
|
384
347
|
|
|
385
|
-
Asset uploads
|
|
348
|
+
Asset uploads must be inside your working directory. For an external project,
|
|
386
349
|
use files there as before. For your own AgEnD-managed workspace under `~/.agend/workspaces/`, ordinary files there
|
|
387
350
|
also work; no staging folder is required. This includes the standard `<your-instance-name>` folder (ClassicBot and
|
|
388
351
|
instances without a project directory) and an exclusively configured folder with another name, such as instance
|
|
@@ -391,10 +354,10 @@ not overlap another instance's configured or standard workspace, including persi
|
|
|
391
354
|
stopped or paused. The `workspaces/` root itself is not a workspace.
|
|
392
355
|
|
|
393
356
|
General, adapter-specific General (such as `general-telegram`), and other configured working directories elsewhere
|
|
394
|
-
inside the AgEnD state directory must stage inputs under **`web-assets
|
|
395
|
-
`web-assets/banner.png
|
|
396
|
-
and backend configuration folders are not upload areas. Generated previews
|
|
397
|
-
`.agend/appearance/`
|
|
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.
|
|
398
361
|
|
|
399
362
|
The daemon uses its launch identity and configuration; the CLI resolves `AGEND_INSTANCE_NAME` against `fleet.yaml`.
|
|
400
363
|
These checks require a canonical, exclusively owned directory: the state root, shared or overlapping configured
|
|
@@ -403,165 +366,11 @@ select an identity or working directory. Missing or unreadable ownership evidenc
|
|
|
403
366
|
|
|
404
367
|
Inside all admitted in-state areas, `.env`, databases and their WAL/SHM/journal files, `instances/`,
|
|
405
368
|
`credential-profiles/`, `inbox/`, `web-files/`, `web-chat.json`, `chat-logs/`, backend credential/session/config files,
|
|
406
|
-
and hidden files or folders are refused. The only hidden-directory exception is the
|
|
407
|
-
output
|
|
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
|
|
408
371
|
refused. Copy an intended asset into staging as a new regular file; do not link a private state file there.
|
|
409
372
|
|
|
410
373
|
Paths are checked after resolving symlinks. A symlink named after General or a workspace, or in its managed parent
|
|
411
374
|
path, cannot widen access; uploaded files themselves must not be symlinks. Containment still applies to relative and
|
|
412
|
-
absolute paths and to each file
|
|
375
|
+
absolute paths and to each uploaded file. The CLI name and current directory are controlled by its shell:
|
|
413
376
|
these local checks prevent accidental uploads, but do not isolate shells running as the same OS user.
|
|
414
|
-
|
|
415
|
-
## Effects
|
|
416
|
-
|
|
417
|
-
A Canvas Worker effect is a small animation drawn by code that runs in an isolated Worker: no page, no DOM, no
|
|
418
|
-
network. For petals, snow or stars on a click, an ambient effect (above) is simpler and plays without a Try. You place
|
|
419
|
-
effects **only in your own chat**; a person can place them in the regions an effect's manifest
|
|
420
|
-
allows. None of these tools takes a target.
|
|
421
|
-
|
|
422
|
-
**The package** (CW1): a directory in your working directory with `effect.json` and `worker.js`, optionally
|
|
423
|
-
`poster.png`, `cursor.png` and `assets/*.png|jpg|jpeg|webp|gif`. No HTML or CSS, at most 20 files and 16 assets. The
|
|
424
|
-
smallest valid `effect.json`:
|
|
425
|
-
|
|
426
|
-
```json
|
|
427
|
-
{ "v": 1, "kind": "effect", "runtime": "canvas-worker-v1", "worker": "worker.js", "name": "spark", "title": "Spark", "regions": ["chat"], "layer": "behind", "wants": [] }
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
- Optional fields: `description`, `poster` (`"poster.png"`), `box`, `cursor` (its `hotspot` inside the image) and
|
|
431
|
-
`params`.
|
|
432
|
-
- `name`: 1..32 characters, starting with a-z or 0-9, then a-z, 0-9 and -.
|
|
433
|
-
- `title` (1..40) and `description` (up to 200): one line each, counted in characters as people see them.
|
|
434
|
-
- `regions`: 1–5 of `chat`, `sidebar`, `header`, `page`, `box`. **Include `chat` to place it in a chat**: applying
|
|
435
|
-
one without it is refused (`effect_region`), and so is a mod placing it. The other regions are ones a person may
|
|
436
|
-
choose it for.
|
|
437
|
-
- `layer`: `behind` (under the content) or `front` (over it).
|
|
438
|
-
- `wants`: up to 5 of `pointer`, `state`, `reply`, `mention`, `theme`. **`mention` is reserved and never fires in
|
|
439
|
-
2.3.0** (see Effect event availability).
|
|
440
|
-
- `params`: up to 16 typed parameters (`number`, `int`, `bool`, `enum`, `color`) a placement may set.
|
|
441
|
-
- `worker.js` (at most 1 MiB, a classic script: static `import` / `export` are refused) draws through the `agend` API:
|
|
442
|
-
`canvas`, `params`, `asset()`, `on()`, `frame()` and `ready()`. Call `ready()` within 10 s, or it is stopped. Network
|
|
443
|
-
and dynamic imports are blocked at run time; the upload may warn `network_or_import_api_unsupported`, but don't rely
|
|
444
|
-
on the warning to catch every use.
|
|
445
|
-
- Size: `effect.json` at most 64 KiB; the whole effect at most 8 MiB as uploaded and **1 MiB normalized**. Pictures:
|
|
446
|
-
at most 4096 px a side, and **8,388,608 pixels in total** across the assets, poster and cursor together. A cursor is
|
|
447
|
-
a square PNG of at most 64 px and 32 KiB (after metadata is stripped).
|
|
448
|
-
|
|
449
|
-
**Reusable pointer example:** [`docs/examples/click-sparks`](https://github.com/songsid/AgEnD/blob/main/docs/examples/click-sparks.md) has a small two-file CW1 package: click for a burst, hold the primary button and move for a trail. Copy it into your working directory before uploading. Protected controls receive no pointer input; samples are coalesced (up to 60 Hz, 30 at reduced quality), so do not use it as a required click or drag control.
|
|
450
|
-
|
|
451
|
-
**The tools:**
|
|
452
|
-
|
|
453
|
-
- `upload_web_effect { dir }` → `{ id, warnings }`. Uploads are not counted; the effect's own size caps apply.
|
|
454
|
-
**Your own** copies are at most **10 effects and 8 MiB**; effects a person shared with you don't count.
|
|
455
|
-
- `list_web_effects` — your own effects and those a person shared with you: `id`, `name`, `title`, `regions`, `layer`,
|
|
456
|
-
`bytes`, `latest_profile`. A currently placed effect also has `playback`: `status: "reported_blocked"` with closed
|
|
457
|
-
`reasons`, or `status: "unknown"`. `get_web_appearance.effects` lists your current placements with the same projection.
|
|
458
|
-
This means **some recent viewers reported blocked**, not all viewers and not a live permission or health check.
|
|
459
|
-
Observations expire after five minutes and stay in memory. Agents receive no viewer identifiers, counts, device/OS,
|
|
460
|
-
text, URLs or observation timestamps. Unknown means unknown; do not keep reapplying to bypass a viewer's choice.
|
|
461
|
-
- `apply_web_effect { id, params? }` places one in your chat, **at most two at a time**, with the declared `params`
|
|
462
|
-
(unknown or out of range → `effect_params`; regions without `chat` → `effect_region`). `remove_web_effect { id? }`
|
|
463
|
-
takes one out, or all of them. Both are changes (30 s apart, 10 an hour), and are refused while a person has locked
|
|
464
|
-
your theme (`locked`) or when the fleet turned agent changes off (`theme_editing_off`).
|
|
465
|
-
- `delete_web_effect { id }` deletes your own copy once nothing uses it; a placement, mod, stage or Try offer gives
|
|
466
|
-
`effect_in_use`. Another's copy is never removed.
|
|
467
|
-
- `profile_web_effect { id }` — how it ran on viewers' pages, per device class: `unmeasured`, or `reported` with
|
|
468
|
-
records carrying a `verdict` (`ok`, `degraded`, `paused`, `off`) and a `reason` (`host_budget`, `hidden`,
|
|
469
|
-
`reduced_motion`, `save_data`, `viewer_off`, `clock_unavailable`, `gates_unknown`, or none).
|
|
470
|
-
`list_web_effects`' `latest_profile` has the latest one. These are best-effort reports of what happened, not live
|
|
471
|
-
notices. No measurement means unknown, never healthy.
|
|
472
|
-
- `preview_web_effect { id }` offers a Try card in your chat (see Try below).
|
|
473
|
-
- **Sharing is a person's act.** You can't share an effect. You may use one a person shared with you (list, apply,
|
|
474
|
-
Try, profile, put in a mod) while it is shared. When they unshare it, a placement already in your chat stays
|
|
475
|
-
eligible for playback (subject to the viewer's and the safety rules); applying, Try, listing, profiling or exporting
|
|
476
|
-
it again needs your own copy or another share, else `not_found`. A placement is never a grant to export it.
|
|
477
|
-
|
|
478
|
-
**On a viewer's page:**
|
|
479
|
-
|
|
480
|
-
- At most **3** effects play at once, at most **2** of them `front` (1 and 1 on a constrained device); the rest wait
|
|
481
|
-
(`frame_limit`, `front_limit`).
|
|
482
|
-
- CW uses an opaque isolated document on the dashboard listener: no HTML-preview consent, separate preview port or
|
|
483
|
-
localhost requirement. Signed-in public/guest viewers may read and play only current effects in chats they can see;
|
|
484
|
-
this grants no library management, personal-slot, private-image, Trial or profile access. Their Chat header has a
|
|
485
|
-
browser-local show/off switch, including on phones, and an inline recovery action. It never writes host preferences.
|
|
486
|
-
- Playback starts without an empty-page FPS calibration. Safe mode, hidden tabs and the viewer's show switch still
|
|
487
|
-
stop it. **Effects: follow the system's reduced-motion setting** is device-local and **off by default**, shared with
|
|
488
|
-
ambient effects. The OS request alone does not block playback; data saver is informational. A one-time chat note
|
|
489
|
-
offers to follow reduced motion, and a motion refusal offers **Play effects anyway** right there, including public/guest
|
|
490
|
-
viewers. Safe mode offers **Leave safe mode**. A poster may replace unsupported playback or a chosen motion block
|
|
491
|
-
(see Static Chat fallback). Menus/dialogs stop `front` effects temporarily.
|
|
492
|
-
- A layout refusal keeps its local code in the Chat notice and Effects dialog (for example `stock_order_unknown`);
|
|
493
|
-
the browser console also names it. Report that code rather than repeatedly applying the effect. A failed Try leaves
|
|
494
|
-
its stop code on the offer card. Pointer-leave does not stop Try; window blur, closing, navigation or lost stage proof do.
|
|
495
|
-
Agent playback summaries still contain only the closed reporting reasons, never raw local diagnostics.
|
|
496
|
-
- **Safety pause** — it measures the page's responsiveness, not your Worker's CPU. Host rAF observations learn a live
|
|
497
|
-
cadence during warm-up, then fix the mount's floor at 90% of a faster observed cadence, capped at 55 fps (50 on a
|
|
498
|
-
constrained device). A steady 30 Hz display has a 27 fps floor. This is not an empty-page health certificate; uniformly
|
|
499
|
-
slow startup can look like a low-refresh display. Where reported, long tasks may take at most 50 ms a second (25 ms
|
|
500
|
-
constrained); unknown observations never count as free. Overlapping 2-second windows are judged at most once a second
|
|
501
|
-
after warm-up, and three bad judgements in a row pause the effect (`host_budget`).
|
|
502
|
-
- Only a viewer's explicit **Resume** restarts a safety-paused effect, and it doesn't clear the history: three such
|
|
503
|
-
pauses within 24 hours turn the effect **off** for that viewer's browser and device class, across tabs and reloads,
|
|
504
|
-
and Resume then refuses. It doesn't come back by itself after 24 hours.
|
|
505
|
-
- **Your `front` effects are paused while the viewer's custom CSS is on, loading or unknown**; `behind` effects play
|
|
506
|
-
once the page's stock layout is proven. A person's placement is exempt. Don't keep re-applying (see below).
|
|
507
|
-
|
|
508
|
-
## Owner-level effect selections
|
|
509
|
-
|
|
510
|
-
The five owner keys `fx.sidebar`, `fx.header`, `fx.page`, `fx.box` and `fx.cursor` are a signed-in person's web
|
|
511
|
-
preferences, never agent tool targets. Platform-bound sessions use separate adapter/user buckets (no account merge).
|
|
512
|
-
A web-only `agend web --code` session uses the explicit **host-wide operator** bucket, shared by everyone signed in
|
|
513
|
-
as that host operator. Header tokens cannot read or write these five keys. Existing visible host preferences are
|
|
514
|
-
unchanged; there is no local-key migration. Profile/custom-CSS internal pointers keep their existing identity rules.
|
|
515
|
-
|
|
516
|
-
When a shared effect is unshared, a personal selection remains stored but becomes unavailable at its next resource
|
|
517
|
-
authorization. It supplies no further code or cursor image; the person can clear it. Its reference keeps the blob
|
|
518
|
-
from being collected until cleared. This is deliberately stricter than chat placements' retained-runtime reads:
|
|
519
|
-
a personal choice keeps following its person's current own/shared access, while a chat preserves the exact effect
|
|
520
|
-
placed there. A reference is not a sharing or export grant. Do not keep retrying a denied personal selection.
|
|
521
|
-
|
|
522
|
-
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
|
|
523
|
-
as signed-in Chat. HTML-preview consent and its service are not involved.
|
|
524
|
-
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
|
|
525
|
-
ordering and trust paint coverage. Agent front effects must remain paused when custom CSS is active, loading or
|
|
526
|
-
unknown; a person sees the reason and can open the causing setting. Human placements retain their exemption from
|
|
527
|
-
that agent restriction, and behind effects still require proven ordering. Saving a placement alone is not proof of
|
|
528
|
-
playback.
|
|
529
|
-
|
|
530
|
-
Visible menus, dialogs and Keep/tour notices suppress foreground effects; a human placement does not bypass them.
|
|
531
|
-
Editable focus suppresses pointer signals, not unrelated drawing. Protected controls stay clipped out of front paint;
|
|
532
|
-
keyboard events never enter the Worker. Unknown stock layout refuses admission. A trusted foreground plane is
|
|
533
|
-
deferred to #1940; do not keep reapplying an agent front while custom CSS is on, loading or unknown.
|
|
534
|
-
|
|
535
|
-
### Try: offer first, signed-in admin click to start
|
|
536
|
-
|
|
537
|
-
`preview_web_effect({id})` posts a volatile Try card in your own web chat, using your current own/shared read rights. It starts nothing and changes no appearance. The sample is physically clipped inside its own host panel or sheet. Only an explicit
|
|
538
|
-
click by a signed-in **admin outside the public link** may start it (localhost is not required); never an agent, public link, header token or automatic action.
|
|
539
|
-
The host owns a visible Trial label and Stop control. Closing the panel/sheet, navigating, window blur, or another
|
|
540
|
-
menu/dialog stops it. The explicit Try click consents to this sample only; no global HTML-preview opt-in is needed or changed.
|
|
541
|
-
The host isolates the Trial controls and clipped stage in a closed Shadow DOM with fixed styles and reset typography.
|
|
542
|
-
Custom CSS stays active elsewhere. The same caps, profiler and safety stops apply. Ordinary foreground effects stay suppressed. A volatile offer lasts at most ten minutes (offering the same effect again keeps that offer and its expiry; a different effect replaces it); every read
|
|
543
|
-
rechecks the originating agent's current own/shared access, with the trial bound to the admin's session and epoch.
|
|
544
|
-
There is no saved placement, claim, share, export or new saved profile record. Cards are memory-only and become inert when expired; a restart never restores them. Try uses manifest defaults and the existing app pool, not a second runtime. Do not treat an offer id or ordinary reply button
|
|
545
|
-
as permission to run or fetch an effect, and do not keep retrying an unavailable Try.
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
## Static Chat fallback
|
|
549
|
-
|
|
550
|
-
When Worker/transport support is unavailable, the chosen motion preference prevents playback, or the page has no playback session,
|
|
551
|
-
a current chat placement with a poster can show its static PNG **behind** the content; a front declaration does not
|
|
552
|
-
make its poster foreground. No poster means nothing is drawn. Safe mode and the viewer's show switch hide posters
|
|
553
|
-
too; unknown stock ordering refuses paint. Explicit Pause, queued effects and a failed live read are not replaced by
|
|
554
|
-
this surface fallback. A failed static read/decode stops its poster pool until a changed revision or page reload;
|
|
555
|
-
there is no automatic network retry. Public viewers can read current Chat Worker code, with fresh session/exposure/placement checks; they acquire no library or personal-slot grant. They have no placement-management or Try controls.
|
|
556
|
-
|
|
557
|
-
The public-link show switch is this browser's choice, kept separately from boot-cached host defaults; it never writes
|
|
558
|
-
a host preference. The ordinary signed-in switch keeps its existing host preference. Do not depend on decoration to
|
|
559
|
-
carry an important message.
|
|
560
|
-
|
|
561
|
-
## Effect event availability
|
|
562
|
-
|
|
563
|
-
Canvas Worker manifests may reserve `wants: ["mention"]`, but **mention is reserved and never emitted in 2.3.0**.
|
|
564
|
-
Do not build an effect that depends on it, infer mentions from reply text, or retry to obtain that signal. Provider-confirmed,
|
|
565
|
-
viewer-scoped direct-ID mention pulses are deferred to [#1963](https://github.com/songsid/AgEnD/issues/1963).
|
|
566
|
-
Reply pulses are transient: only a newly accepted live SSE agent reply can qualify. History, reconnect replay and polling
|
|
567
|
-
never create a pulse; a live receipt delayed over five seconds is dropped. No reply text, author or mention targets reach effects.
|
|
@@ -11,14 +11,7 @@ English UI labels (the page also has 中文). Before you state a value the user
|
|
|
11
11
|
it: `get_fleet_config` shows fleet.yaml; this skill gives defaults. Never invent a control that is not listed here.
|
|
12
12
|
Never tell anyone to kill `wslrelay` or run `wsl --shutdown` (see Troubleshooting).
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
starting N/M** counts successful starts among runnable instances (persisted pauses excluded); queued/starting labels
|
|
16
|
-
are visible in the sidebar, chat header and Org chart. Reads remain available; messages and changes are refused with
|
|
17
|
-
a retry hint until startup finishes. Returning guests may wait for their connection scope without being signed out.
|
|
18
|
-
Needs you may still be empty while its hub initializes. A brief reconnect gap
|
|
19
|
-
is normal while a full restart replaces the process; the starting banner then replaces the unreachable message.
|
|
20
|
-
|
|
21
|
-
For how *you* look on the dashboard (theme, identity card, colour, widgets, ambient effects, effects, mods), load `web-appearance`.
|
|
14
|
+
For how *you* look on the dashboard (theme, identity card, colour, widgets and ambient effects), load `web-appearance`.
|
|
22
15
|
|
|
23
16
|
## Index
|
|
24
17
|
|
|
@@ -34,7 +27,7 @@ For how *you* look on the dashboard (theme, identity card, colour, widgets, ambi
|
|
|
34
27
|
| subscription meters, plan badges, profiles, keep-warm, prompt cache | [Usage and the cache report](#usage-and-the-cache-report) |
|
|
35
28
|
| what an agent did step by step | [The Log tab](#the-log-tab) |
|
|
36
29
|
| any Settings control | [Settings](#settings) |
|
|
37
|
-
| themes, cards, widgets, ambient effects (petals, click stars)
|
|
30
|
+
| themes, cards, widgets, ambient effects (petals, click stars) | [Look](#look) |
|
|
38
31
|
| blank page, preview refused, link fails, signed out, "live" missing | [Troubleshooting](#troubleshooting) |
|
|
39
32
|
|
|
40
33
|
Addresses: the dashboard is served on the host at `http://localhost:<health_port>` (default 19280), on 127.0.0.1
|
|
@@ -67,14 +60,14 @@ hostname (named tunnel, `web.public_link.hostname`) the minutes go up to 10080,
|
|
|
67
60
|
still needs a code).
|
|
68
61
|
Close it with **Close public link** → **Close link (signs public browsers out)**, `/web revoke`, or let it expire.
|
|
69
62
|
A public link is limited on purpose: no live stream (the page polls), no custom CSS, and Settings → Access & security, Look,
|
|
70
|
-
|
|
71
|
-
Chat effect metadata/code reads are allowed, with session/epoch/exposure checks; the public viewer’s show switch is browser-local. HTML previews work over it through a second tunnel
|
|
63
|
+
schedule edits and preference writes are refused. HTML previews work over it through a second tunnel
|
|
72
64
|
of their own (`web.preview_on_public_link`, default on).
|
|
73
65
|
|
|
74
66
|
**Sessions.**
|
|
75
67
|
- Local: 48 h from sign-in and 48 h unused (`web.session.local.absolute_hours` / `idle_hours`, 1–720). Background
|
|
76
68
|
polling and the live stream don't count as use. Sessions survive a fleet restart.
|
|
77
|
-
- Public link:
|
|
69
|
+
- Public link: as long as the link, at most 8 h (never longer than the account's own limit: `web.session.local` for
|
|
70
|
+
an admin, `web.guests.session` for a guest), 30 min unused, and they end when the link closes.
|
|
78
71
|
- At most 8 sessions; the least recently used is dropped.
|
|
79
72
|
- The session menu (sidebar): "Signed in · …", "Ends by <time> at the latest, or after <span> unused". With more than
|
|
80
73
|
one session it lists **Signed-in devices** (this one marked "· This device", others with **Sign out**) and **Sign
|
|
@@ -100,8 +93,12 @@ as their own Discord or Telegram account. What a guest sees:
|
|
|
100
93
|
ClassicBot room, and ClassicBot group rooms while their membership is verified, minus any `web.guests.narrow`.
|
|
101
94
|
**Start from today's guests** turns that into grants.
|
|
102
95
|
|
|
103
|
-
They can chat there unless `web.guests.chat` is false,
|
|
104
|
-
agent
|
|
96
|
+
They can chat there unless `web.guests.chat` is false, run only the commands the command table lets anyone run in that
|
|
97
|
+
agent's channel (on the web: `/ctx`, `/steer`, `/btw`, `/cancel`; anything else is refused), open the usage panel, and the
|
|
98
|
+
agent sees them as `via web (guest)`. A guest's app has no Fleet, Settings or Needs you. Each person is **Chat** (the
|
|
99
|
+
default) or **Trusted** (#2855, `level: trusted` on the grant; Chat → Trusted waits for a fleet admin): a Trusted guest
|
|
100
|
+
also gets a read-only **View** of those agents (no typing; 2 reads a second, 2 agents at once) and **search** of the chat
|
|
101
|
+
messages it can already see (6 a minute, 20 results; no messages between agents, tasks or settings). To invite someone: turn it
|
|
105
102
|
on, grant them their agents in Settings → Access & security → Guests, and press **Send sign-in code** (or tell them to
|
|
106
103
|
send `/web`). The Guests section is not in Settings over the public link.
|
|
107
104
|
|
|
@@ -152,8 +149,7 @@ workspace `inbox/`; an unused upload is deleted after 30 minutes.
|
|
|
152
149
|
|
|
153
150
|
**In replies.** Images inline; video and audio play inline; Markdown, CSV, JSON, code and text files get a **Show**
|
|
154
151
|
card (200 lines, then "Show all … lines"); other files download. Code blocks have a language tag, **Wrap** and
|
|
155
|
-
**Copy**, and fold after 30 lines.
|
|
156
|
-
thread and the composer to the whole chat panel for wide tables and code; a person's bubbles keep their size. Each reply has **Copy this reply**. Markdown: headings, lists, quotes, bold/italic/
|
|
152
|
+
**Copy**, and fold after 30 lines. Each reply has **Copy this reply**. Markdown: headings, lists, quotes, bold/italic/
|
|
157
153
|
strike, links, and tables (header row plus separator, alignment, up to 20 columns). Discord mentions show as names;
|
|
158
154
|
a Discord server emoji (`<:name:id>`) of the fleet's servers shows as its picture, and any other (or one whose picture
|
|
159
155
|
can't load) as `:name:`. Unicode emoji are drawn by the system's colour emoji font under every theme font (boxes on
|
|
@@ -215,7 +211,7 @@ Board tasks — never a CLI's own transcript (that is the Log). Results come as
|
|
|
215
211
|
first, badged Chat / Message / Task; 1–2 character words work (alone: the newest 5,000 entries, said in the dialog).
|
|
216
212
|
↑↓ / Enter / Esc / click outside; **Filters**: agent, team, time, kinds, **Only mine**; recent searches when empty.
|
|
217
213
|
A chat result opens the chat at the message (flashed); a message between agents, a task or a chat row the history no
|
|
218
|
-
longer keeps opens as the index's copy. Admins
|
|
214
|
+
longer keeps opens as the index's copy. Admins, over the temporary public link and on a phone too; a Trusted guest (#2855) searches only its own agents' chat messages it can see. Config: `web.search.enabled`
|
|
219
215
|
(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`
|
|
220
216
|
agent's messages are not found. "Search is off or not available": `web.search.enabled: false`, or the index could not
|
|
221
217
|
open (the fleet log says why); "Still indexing": the first fill after an upgrade.
|
|
@@ -246,9 +242,7 @@ The sidebar's **Fleet** (zh "Fleet 概覽", at the top) and the phone's Fleet ta
|
|
|
246
242
|
delete: cancel. Alt+arrows on a card's title move it (no drag needed; the card's Position row on a phone). A main
|
|
247
243
|
task's tile shows the sub task at work and who is on it; a card waiting for review that is not wrapped up says
|
|
248
244
|
**To fill in** and Confirm asks first. A card's **Dispatched by** row: who handed it out (a blocked question goes
|
|
249
|
-
to them first). Read-only over the public link.
|
|
250
|
-
blocked, are also **Needs you** items: on the web they open the card; in each bot's live message in General they
|
|
251
|
-
have **Confirm** / **Send back** / **Answer** (the words are a reply to the bot's prompt).
|
|
245
|
+
to them first). Read-only over the public link.
|
|
252
246
|
- **Schedules** — every schedule (silent ones included): when it runs in words, "next …", the target. **New
|
|
253
247
|
schedule** (Repeat with a cron expression, or Once at a date and time; message, target, label, timezone),
|
|
254
248
|
**Edit** (with an **Enabled** box — that is how you pause one), **Delete**. There is no "run now", and silent can't
|
|
@@ -280,8 +274,7 @@ activity line, **Find in office** and **Chat**. A double-click opens the chat di
|
|
|
280
274
|
(lifetime work, docs/office.md § Levels; **Settings → Web dashboard → Office levels**, `web.office_levels`). **Find** dims
|
|
281
275
|
the rest. **Show** picks a team or the Lobby and **People** pins chosen instances (both kept per browser); the
|
|
282
276
|
**Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`). An admin session
|
|
283
|
-
(never a read-only one, a guest or the public link) gets **Edit offices
|
|
284
|
-
usage rail's place, the Office in use beside it, × or Esc closes it and the rail returns; narrower: a centred dialog): add, rename and delete offices, pick who is
|
|
277
|
+
(never a read-only one, a guest or the public link) gets **Edit offices**: add, rename and delete offices, pick who is
|
|
285
278
|
in each (Everyone, Picked: whole teams or single instances, or #2752 Nobody: its style's NPCs only; none picked = everyone) and its style, and upload or delete **skin packs** (an
|
|
286
279
|
artist's pictures: `manifest.json` plus PNGs, format v1, kept in `web-office-skins/` in the AgEnD home; the host
|
|
287
280
|
checks every rule — PNG only, each strip exactly frames·w × h, a 16:9 background, size caps — and never changes a
|
|
@@ -305,10 +298,7 @@ its own night place, **Back to the pack's night place** undoes it (#2665); a sel
|
|
|
305
298
|
office's members, several allowed) and **Lend when away** (#2691) — whoever it is for sits there first when they come
|
|
306
299
|
to its area, nobody else does unless it is lent while they are all away (a borrower moves off when one comes), and a
|
|
307
300
|
reserved seat's handle is ringed; a pack can reserve seats as well; **Save layout** keeps the moves as that
|
|
308
|
-
office's overrides (the pack stays as uploaded), **Reset** goes back to the pack's own.
|
|
309
|
-
handles); narrower, or in fullscreen, they are the bar along the canvas's bottom. Esc is Cancel. While either editor
|
|
310
|
-
is docked the page beside it works, Ctrl+K search included; leaving the page with unsaved changes asks first
|
|
311
|
-
("Discard changes"). While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
|
|
301
|
+
office's overrides (the pack stays as uploaded), **Reset** goes back to the pack's own. While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
|
|
312
302
|
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
|
|
313
303
|
only calls and work get bubbles (a few at most) and name tags show on hover or focus. **Hide paused and stopped**
|
|
314
304
|
(per browser, off by default) leaves the sleepers out. Now and then someone says a short line for their state in a
|
|
@@ -378,7 +368,8 @@ Each row (#2179): name and context % on the first line, the time of the agent's
|
|
|
378
368
|
second ("2 min ago"; cross-instance messages don't count); a reply under 10 minutes old is highlighted, fading by itself
|
|
379
369
|
(nothing to mark read). The sort button beside Edit: **Custom** (default; a reply never moves a row) or **Recent replies**
|
|
380
370
|
(the rest by last reply, no groups, no dragging; favorites pinned in their order, or **Sorted by last reply too**); synced
|
|
381
|
-
as `nav.sort`. Guests and
|
|
371
|
+
as `nav.sort`. Guests sort, star and filter as their own preferences (kept on the host under their account; reply times
|
|
372
|
+
count only replies their channel showed; no dragging); the anonymous View reader: no times, no sort (always Custom).
|
|
382
373
|
**Filter: name, model, backend** (Esc clears), facets **Status** and **CLI**, "N / M shown".
|
|
383
374
|
While a filter is on, the instance you have open stays on top under **Current**. **Favorites**: the star on a row;
|
|
384
375
|
**Edit** to reorder (at most 50; "Clear the filter to reorder favorites"). Drag to reorder the full list; groups fold.
|
|
@@ -555,11 +546,11 @@ ClassicBot (in **Chat & connections**, `/settings/chat#classicbot`) — per room
|
|
|
555
546
|
Advanced **Context lines** (these restart the room's agent); Tool progress and Require a delivered reply (now).
|
|
556
547
|
|
|
557
548
|
**Agent defaults** — **Project folders** (`project_roots`: where New agent may put an agent; empty = anywhere;
|
|
558
|
-
changing it waits for a fleet admin's OK) and the fleet defaults (`defaults.*`): **Language (bot replies)** (`locale`: Auto / en / zh-TW
|
|
549
|
+
changing it waits for a fleet admin's OK) and the fleet defaults (`defaults.*`): **Language (bot replies)** (`locale`: Auto / en / zh-TW), default
|
|
559
550
|
backend and model, auto-pause, tool progress, bot-to-bot visibility, reply guard, **Native replies trigger ClassicBot**
|
|
560
551
|
(`reply_triggers`: a native reply triggers a ClassicBot bot; off by default, #2576); Advanced: tool set, agent mode, log
|
|
561
552
|
level, **Hang detector enabled** / **Stuck timeout** (`hang_detector.*`), **Startup concurrency** (1–20) and
|
|
562
|
-
**Stagger delay** (`startup.*`,
|
|
553
|
+
**Stagger delay** (`startup.*`, restart AgEnD). ClassicBot defaults (in Chat & connections; `classicBot.yaml defaults.*`): default backend, tool
|
|
563
554
|
progress, reply guard, **Native replies trigger ClassicBot** (`reply_triggers`, also per room), **ClassicBot admins**,
|
|
564
555
|
**Allowed guilds**.
|
|
565
556
|
|
|
@@ -601,7 +592,7 @@ when the host confirms; a directory that is entered must be absolute.
|
|
|
601
592
|
## Look
|
|
602
593
|
|
|
603
594
|
For an agent changing its *own* look, the `web-appearance` skill has the tools and limits. What a person sees in
|
|
604
|
-
Settings → **Look**, card by card (the app icon
|
|
595
|
+
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**):
|
|
605
596
|
- **Agents' themes** — **Show agents' themes, effects and widgets**; off, every chat looks the same and pictures and
|
|
606
597
|
ring colours fall back to the bots' own (all devices).
|
|
607
598
|
- **Ambient effects** — an agent's falling petals, snow, rising lanterns, twinkles or stars on a click, drawn behind
|
|
@@ -620,38 +611,21 @@ Settings → **Look**, card by card (the app icon, card upload limits and Canvas
|
|
|
620
611
|
**Save and try**, then **Keep** within 15 s or it reverts; **Turn off (all devices)**; earlier versions **Use
|
|
621
612
|
this**. If something is hidden or broken, open the page with `?safe=1`, or tick **Turn off custom CSS on this
|
|
622
613
|
device** (in Preferences).
|
|
623
|
-
- **Mods** — one `.agendmod.json` file carrying a look; importing shows everything first and applies only what you
|
|
624
|
-
tick (custom CSS is never pre-ticked); agents can propose mods (**Review** / **Dismiss**); **Export a mod** writes one.
|
|
625
|
-
Uninstalling removes the mod, not what it applied.
|
|
626
|
-
- **Effects** — the effect library (upload a folder with `effect.json` and `worker.js`, up to 1 MiB), save one for a
|
|
627
|
-
chat, share your copy; **Your effect choices** for Sidebar / Header / Page / Box (each with Pause / Resume and
|
|
628
|
-
Clear) and a Cursor (its state, and Clear). CW uses the dashboard's opaque isolated document, independently of
|
|
629
|
-
**Allow HTML previews**, its listener and port. Signed-in public/guest viewers can play current effects in chats they
|
|
630
|
-
may see, without library, personal-slot, Trial or profile grants. Their Chat header offers a browser-local show/off
|
|
631
|
-
switch and recovery, on desktop and phone; it never changes host preferences. A Try sample starts on a signed-in non-public admin's
|
|
632
|
-
click, with no extra consent. The show switch, safe mode, hidden tab, browser support and live performance guard remain.
|
|
633
|
-
No startup FPS calibration; data saver does not block. Reduced motion blocks only if this device chose to follow it.
|
|
634
|
-
A blocked placement keeps an exact named notice. On ordinary dashboard sessions, Show/custom-CSS actions open
|
|
635
|
-
**Look**. Public/guest Show-off has **Turn effects on here**; a guest CSS refusal offers Reload.
|
|
636
|
-
An unavailable
|
|
637
|
-
isolated transport offers Reload, never an HTML-preview setup step. A motion refusal offers **Play effects anyway**;
|
|
638
|
-
safe mode offers **Leave safe mode**. The dialog names loading, safety and raw unknown codes. Codes stay local; agents get only closed recent blocked reasons without viewer identifiers or counts.
|
|
639
614
|
- **Restore defaults** — resets this host's appearance settings (it lists what it resets first).
|
|
640
615
|
|
|
641
616
|
Moved out of Look in 2.3.2 (#2347). **Preferences** (this device only): **Effects: follow the system's reduced-motion
|
|
642
|
-
setting** (off by default): on,
|
|
617
|
+
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**;
|
|
643
618
|
**Identity card upload limits** — portrait and banner size limits and per-agent picture quota (`web.appearance.*`);
|
|
644
|
-
lowering applies at once, raising waits for an admin
|
|
619
|
+
lowering applies at once, raising waits for an admin.
|
|
645
620
|
|
|
646
621
|
**What an agent can change for the user.** A worker changes only its own look (the `web-appearance` tools); before
|
|
647
622
|
#2064 everything on this page was the person's. Since #2064 (2.2.5) General, coordinators and
|
|
648
623
|
full-profile instances get `get_web_settings` / `set_web_settings`, which go through the same checks as the page;
|
|
649
624
|
workers don't. The `web-appearance` skill's **For the user** section has the details. In short: General can change
|
|
650
|
-
the host's appearance settings, one agent's identity colour,
|
|
651
|
-
effects and the effect slots, and Restore defaults; for custom CSS it can save a version **on trial**, keep or revert
|
|
625
|
+
the host's appearance settings, one agent's identity colour, ambient effects and Restore defaults; for custom CSS it can save a version **on trial**, keep or revert
|
|
652
626
|
the trial, switch to an earlier saved version, or turn CSS off — and it keeps a trial only once the user says they like
|
|
653
627
|
it (the user's decision). Still the person's own click on the page: choosing files from their computer
|
|
654
|
-
(
|
|
628
|
+
(upload CSS assets), the per-browser switches (custom CSS off on this device, Pause/Resume), and the
|
|
655
629
|
card upload limits. The docs' "Asking General to change it for you" says the same for people.
|
|
656
630
|
|
|
657
631
|
## Troubleshooting
|
|
@@ -686,7 +660,7 @@ off).
|
|
|
686
660
|
- "Cloudflare gave no public address in time" — only after a real 60 s wait;
|
|
687
661
|
- no steps at all: `web.public_link.allow_public: false`, or the sender is not a fleet admin.
|
|
688
662
|
|
|
689
|
-
**"Your session has ended."** It lasted its 48 h (or the idle limit), a public link closed or ran
|
|
663
|
+
**"Your session has ended."** It lasted its 48 h (or the idle limit), a public link closed or ran out (at most 8 h) or sat 30 min idle,
|
|
690
664
|
or someone ran `/web revoke`, **Sign out everywhere** or `agend web-token rotate`. Get a new code: `/web`, **Send me
|
|
691
665
|
a new code**, or `agend web` on the host. "No session — open the dashboard link again" means the browser keeps no
|
|
692
666
|
cookies for the site.
|
|
@@ -702,14 +676,3 @@ no instance uses that provider.
|
|
|
702
676
|
**Settings won't change something.** Over a public link, Web settings and appearance are read only; a loosening
|
|
703
677
|
change waits for an admin's confirmation in General chat; a value in the "Set in fleet.yaml" list must be edited in
|
|
704
678
|
fleet.yaml (Advanced, or the file) and `agend reload`.
|
|
705
|
-
|
|
706
|
-
### Canvas Worker playback diagnostics
|
|
707
|
-
|
|
708
|
-
The effect player loads only when there is something to play: the open chat has a placed effect, the person chose a
|
|
709
|
-
personal effect, or a Try card is shown (#2193). Before that, nothing of it is in the page, by design. Ambient effects
|
|
710
|
-
and custom CSS never need it.
|
|
711
|
-
|
|
712
|
-
If an effect cannot play, the Chat notice and Effects dialog show its local refusal code. A failed Try retains its stop
|
|
713
|
-
code on the offer card; the browser console also names refusals. Include the code when reporting a problem. Long chat
|
|
714
|
-
history is checked separately from the bounded set of current paint holes. Moving the pointer away does not stop Try;
|
|
715
|
-
window blur, navigation, closing or loss of the verified stage does. Local raw codes are not sent in agent summaries.
|
|
@@ -990,7 +990,7 @@ export class InstanceLifecycle {
|
|
|
990
990
|
// ChatGPT-plan feature, so an account that cannot be asked is almost
|
|
991
991
|
// always a plain one, and a wrongly paused reserve wakes with /wake while
|
|
992
992
|
// a missed pause fails silently forever.
|
|
993
|
-
if (data.type === "quota" && data.action === "pause" && this.backendOf(name) === "codex") {
|
|
993
|
+
if (data.type === "quota" && data.action === "pause" && !data.skipUsageVerify && this.backendOf(name) === "codex") {
|
|
994
994
|
const verdict = await this.verifyCodexQuota();
|
|
995
995
|
this.ctx.logger.info({ name, backend: "codex", decision: verdict === "available" || verdict === "reserve" ? "ignore" : "pause", evidence: `usage-${verdict}` }, `codex usage-limit decision: decision=${verdict === "available" || verdict === "reserve" ? "ignore" : "pause"} evidence=usage-${verdict}`);
|
|
996
996
|
if (verdict === "available") {
|