@songsid/agend 2.3.1 → 2.3.2-beta.10
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/THIRD_PARTY_NOTICES.md +40 -0
- package/dist/agent-cli.js +21 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +5 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/antigravity-usage-scan.d.ts +58 -0
- package/dist/antigravity-usage-scan.js +257 -0
- package/dist/antigravity-usage-scan.js.map +1 -0
- package/dist/antigravity-usage-worker.d.ts +1 -0
- package/dist/antigravity-usage-worker.js +10 -0
- package/dist/antigravity-usage-worker.js.map +1 -0
- package/dist/auth-api.js +4 -0
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +4 -0
- package/dist/authority/authority-state.js +16 -10
- package/dist/authority/authority-state.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +7 -1
- package/dist/authority/session-authorizations.js +6 -4
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +19 -6
- package/dist/authority/web-authority.js +22 -8
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +64 -0
- package/dist/backend/kiro-identity.js +101 -0
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro-retired-model.d.ts +62 -0
- package/dist/backend/kiro-retired-model.js +160 -0
- package/dist/backend/kiro-retired-model.js.map +1 -0
- package/dist/backend/kiro.d.ts +71 -2
- package/dist/backend/kiro.js +352 -11
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/types.d.ts +59 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-signin-guide.d.ts +1 -0
- package/dist/backend-signin-guide.js +9 -0
- package/dist/backend-signin-guide.js.map +1 -0
- package/dist/backend-signin-pending.d.ts +10 -0
- package/dist/backend-signin-pending.js +44 -0
- package/dist/backend-signin-pending.js.map +1 -0
- package/dist/browser-backend-signins.d.ts +56 -0
- package/dist/browser-backend-signins.js +189 -0
- package/dist/browser-backend-signins.js.map +1 -0
- package/dist/cache-ledger.d.ts +38 -2
- package/dist/cache-ledger.js +133 -8
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-prices.d.ts +2 -1
- package/dist/cache-prices.js +5 -2
- package/dist/cache-prices.js.map +1 -1
- package/dist/cache-service.d.ts +68 -0
- package/dist/cache-service.js +355 -13
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +13 -0
- package/dist/channel/adapters/discord.js +103 -16
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +34 -7
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.js +2 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +11 -0
- package/dist/classic-channel-manager.d.ts +11 -0
- package/dist/classic-channel-manager.js +39 -1
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +21 -2
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.d.ts +7 -1
- package/dist/config-validator.js +92 -12
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.js +31 -1
- package/dist/config.js.map +1 -1
- package/dist/cpu-quota.d.ts +23 -0
- package/dist/cpu-quota.js +86 -0
- package/dist/cpu-quota.js.map +1 -0
- package/dist/daemon.d.ts +57 -3
- package/dist/daemon.js +330 -50
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +20 -6
- package/dist/dashboard-permissions.js +58 -9
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-outbox.d.ts +12 -1
- package/dist/delivery-outbox.js +67 -15
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +11 -1
- package/dist/doctor.js.map +1 -1
- package/dist/event-log.d.ts +5 -0
- package/dist/event-log.js +13 -0
- package/dist/event-log.js.map +1 -1
- package/dist/fleet-manager.d.ts +212 -0
- package/dist/fleet-manager.js +914 -111
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +1 -0
- package/dist/fleet-process-handlers.js +9 -1
- package/dist/fleet-process-handlers.js.map +1 -1
- package/dist/forged-envelope-scan.d.ts +9 -0
- package/dist/forged-envelope-scan.js +30 -5
- package/dist/forged-envelope-scan.js.map +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +14 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +28 -5
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +31 -8
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +138 -59
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +145 -61
- package/dist/guest-seen-people.d.ts +38 -0
- package/dist/guest-seen-people.js +78 -0
- package/dist/guest-seen-people.js.map +1 -0
- package/dist/instance-config-impact.js +14 -6
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +20 -0
- package/dist/instance-lifecycle.js +71 -13
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/kiro-db-reader.d.ts +5 -0
- package/dist/kiro-db-reader.js +18 -0
- package/dist/kiro-db-reader.js.map +1 -1
- package/dist/kiro-engine-status.d.ts +2 -0
- package/dist/kiro-engine-status.js +9 -0
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-migrate.d.ts +49 -0
- package/dist/kiro-migrate.js +105 -0
- package/dist/kiro-migrate.js.map +1 -0
- package/dist/kiro-transcript-lane.d.ts +2 -0
- package/dist/kiro-transcript-lane.js.map +1 -1
- package/dist/kiro-transcript-worker.js +1 -0
- package/dist/kiro-transcript-worker.js.map +1 -1
- package/dist/kiro-tui-forensic.d.ts +7 -0
- package/dist/kiro-tui-forensic.js +110 -0
- package/dist/kiro-tui-forensic.js.map +1 -0
- package/dist/kiro-usage-run.d.ts +7 -0
- package/dist/kiro-usage-run.js +39 -0
- package/dist/kiro-usage-run.js.map +1 -0
- package/dist/kiro-usage-scan.d.ts +49 -0
- package/dist/kiro-usage-scan.js +223 -0
- package/dist/kiro-usage-scan.js.map +1 -0
- package/dist/kiro-usage-worker.d.ts +1 -0
- package/dist/kiro-usage-worker.js +10 -0
- package/dist/kiro-usage-worker.js.map +1 -0
- package/dist/kiro-usage.d.ts +58 -0
- package/dist/kiro-usage.js +310 -0
- package/dist/kiro-usage.js.map +1 -0
- package/dist/locale.js +120 -12
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -1
- package/dist/log-service.js.map +1 -1
- package/dist/login-url.d.ts +4 -0
- package/dist/login-url.js +22 -0
- package/dist/login-url.js.map +1 -0
- package/dist/mac-auto-restore.d.ts +117 -0
- package/dist/mac-auto-restore.js +294 -0
- package/dist/mac-auto-restore.js.map +1 -0
- package/dist/needs-you-hub.d.ts +2 -1
- package/dist/needs-you-hub.js +1 -1
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +8 -2
- package/dist/needs-you.js +6 -0
- package/dist/needs-you.js.map +1 -1
- package/dist/notice-delivery.d.ts +16 -0
- package/dist/notice-delivery.js +35 -0
- package/dist/notice-delivery.js.map +1 -0
- package/dist/office-share-page.d.ts +16 -0
- package/dist/office-share-page.js +85 -0
- package/dist/office-share-page.js.map +1 -0
- package/dist/office-share-service.d.ts +91 -0
- package/dist/office-share-service.js +176 -0
- package/dist/office-share-service.js.map +1 -0
- package/dist/office-share.d.ts +258 -0
- package/dist/office-share.js +549 -0
- package/dist/office-share.js.map +1 -0
- package/dist/opencode-usage-scan.d.ts +28 -0
- package/dist/opencode-usage-scan.js +92 -0
- package/dist/opencode-usage-scan.js.map +1 -0
- package/dist/opencode-usage-worker.d.ts +1 -0
- package/dist/opencode-usage-worker.js +10 -0
- package/dist/opencode-usage-worker.js.map +1 -0
- package/dist/outbound-handlers.js +22 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +28 -2
- package/dist/outbound-schemas.js +29 -2
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +16 -2
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/quickstart-api.js +13 -2
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.js +2 -1
- package/dist/quickstart.js.map +1 -1
- package/dist/remote-card-answer.d.ts +83 -0
- package/dist/remote-card-answer.js +208 -0
- package/dist/remote-card-answer.js.map +1 -0
- package/dist/reply-triggers.d.ts +2 -0
- package/dist/reply-triggers.js +3 -0
- package/dist/reply-triggers.js.map +1 -0
- package/dist/settings-api.d.ts +28 -0
- package/dist/settings-api.js +148 -17
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +54 -17
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +12 -3
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-instance-patch.js +4 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +55 -6
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-host.d.ts +9 -0
- package/dist/setup-host.js +127 -6
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-signin-assets.d.ts +2 -0
- package/dist/setup-signin-assets.js +6 -0
- package/dist/setup-signin-assets.js.map +1 -0
- package/dist/setup-wizard.js +2 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/start-attempt.d.ts +9 -5
- package/dist/start-attempt.js +27 -8
- package/dist/start-attempt.js.map +1 -1
- package/dist/start-failure-chat.d.ts +4 -0
- package/dist/start-failure-chat.js +23 -6
- package/dist/start-failure-chat.js.map +1 -1
- package/dist/start-failure-notice.d.ts +4 -0
- package/dist/start-failure-notice.js +8 -0
- package/dist/start-failure-notice.js.map +1 -1
- package/dist/start-failure.d.ts +25 -0
- package/dist/start-failure.js +75 -2
- package/dist/start-failure.js.map +1 -1
- package/dist/structured-signin-transport.d.ts +8 -0
- package/dist/structured-signin-transport.js +79 -0
- package/dist/structured-signin-transport.js.map +1 -0
- package/dist/structured-signin.d.ts +131 -0
- package/dist/structured-signin.js +388 -0
- package/dist/structured-signin.js.map +1 -0
- package/dist/tool-permissions.js +12 -0
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.js +6 -2
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-sources.d.ts +26 -2
- package/dist/transcript-sources.js +103 -40
- package/dist/transcript-sources.js.map +1 -1
- package/dist/turn-reply-guard.d.ts +25 -0
- package/dist/turn-reply-guard.js +111 -12
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/types.d.ts +46 -9
- package/dist/ui/backend-signin.js +68 -12
- package/dist/ui/chat-ambient.js +1 -1
- package/dist/ui/chat-effects.js +4 -4
- package/dist/ui/chat-render.js +5 -2
- package/dist/ui/chat-strings.js +4 -4
- package/dist/ui/chat-thread.js +2 -2
- package/dist/ui/first-run.js +2 -2
- package/dist/ui/fleet-canvas-view.js +114 -0
- package/dist/ui/fleet-canvas.js +15 -77
- package/dist/ui/fleet-office-editor.js +94 -14
- package/dist/ui/fleet-office-layout.js +235 -0
- package/dist/ui/fleet-office-model.js +12 -6
- package/dist/ui/fleet-office-overview.js +167 -0
- package/dist/ui/fleet-office-pack.d.ts +44 -0
- package/dist/ui/fleet-office-pack.js +352 -37
- package/dist/ui/fleet-office-skin.js +220 -36
- package/dist/ui/fleet-office-store.js +112 -7
- package/dist/ui/fleet-office-view.js +155 -0
- package/dist/ui/fleet-office-zones.js +264 -42
- package/dist/ui/fleet-office.js +957 -160
- package/dist/ui/fleet-usage.js +26 -21
- package/dist/ui/office-share-dialog.js +145 -0
- package/dist/ui/office-share-page.js +164 -0
- package/dist/ui/panel-chat.js +9 -2
- package/dist/ui/panel-details.js +2 -2
- package/dist/ui/panel-fleet.js +11 -77
- package/dist/ui/panel-log.js +4 -4
- package/dist/ui/panel-needs.js +4 -4
- package/dist/ui/panel-settings.js +608 -167
- package/dist/ui/search-dialog.js +26 -7
- package/dist/ui/settings-appearance.js +82 -29
- package/dist/ui/settings-apply.js +42 -7
- package/dist/ui/settings-dialogs.js +76 -23
- package/dist/ui/settings-draft.js +51 -0
- package/dist/ui/settings-guests.js +255 -79
- package/dist/ui/settings-learn.js +2 -2
- package/dist/ui/settings-model.js +16 -6
- package/dist/ui/settings-registry.js +146 -0
- package/dist/ui/settings-strings.js +116 -44
- package/dist/ui/settings-web-authority.js +34 -23
- package/dist/ui/shared/app-i18n.js +18 -2
- package/dist/ui/shared/app-nav.js +10 -5
- package/dist/ui/shared/app-prefs.js +80 -2
- package/dist/ui/shared/app-route.js +39 -5
- package/dist/ui/shared/app-shell.js +73 -10
- package/dist/ui/shared/app-stream.js +3 -1
- package/dist/ui/shared/app.css +307 -17
- package/dist/ui/shared/app.js +3 -0
- package/dist/ui/shared/effect-stock-trust.js +1 -1
- package/dist/ui/shared/identity-color.js +4 -4
- package/dist/ui/shared/office/cozy.png +0 -0
- package/dist/ui/shared/side-panel.js +95 -0
- package/dist/ui/shared/signin.js +2 -2
- package/dist/ui/shared/ui-dialog.js +6 -1
- package/dist/ui/shared/ui-icons.js +2 -0
- package/dist/ui/shared/web-authorize.js +13 -12
- package/dist/ui/structured-signin.js +115 -0
- package/dist/usage-report.d.ts +20 -0
- package/dist/usage-report.js +54 -17
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.d.ts +9 -1
- package/dist/usage-rollup.js +20 -4
- package/dist/usage-rollup.js.map +1 -1
- package/dist/web-api.d.ts +26 -2
- package/dist/web-api.js +361 -5
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.js +8 -2
- package/dist/web-auth.js.map +1 -1
- package/dist/web-backend-login.d.ts +1 -7
- package/dist/web-backend-login.js +2 -24
- package/dist/web-backend-login.js.map +1 -1
- package/dist/web-experimental.d.ts +1 -1
- package/dist/web-experimental.js +1 -1
- package/dist/web-experimental.js.map +1 -1
- package/dist/web-mod-agent.js +2 -2
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-office-acts.d.ts +173 -0
- package/dist/web-office-acts.js +285 -0
- package/dist/web-office-acts.js.map +1 -0
- package/dist/web-office-skins.d.ts +109 -0
- package/dist/web-office-skins.js +299 -0
- package/dist/web-office-skins.js.map +1 -0
- package/dist/web-office-store.d.ts +8 -2
- package/dist/web-office-store.js +77 -14
- package/dist/web-office-store.js.map +1 -1
- package/dist/web-settings-patch.d.ts +8 -1
- package/dist/web-settings-patch.js +65 -5
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-shell-routes.d.ts +4 -2
- package/dist/web-shell-routes.js +17 -7
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/working-recovery.d.ts +104 -0
- package/dist/working-recovery.js +298 -0
- package/dist/working-recovery.js.map +1 -0
- package/dist/working-state-journal.d.ts +5 -1
- package/dist/working-state-journal.js +31 -3
- package/dist/working-state-journal.js.map +1 -1
- package/package.json +3 -2
- package/templates/windows-shortcuts.ps1 +155 -140
|
@@ -34,7 +34,7 @@ For how *you* look on the dashboard (theme, identity card, colour, widgets, ambi
|
|
|
34
34
|
| subscription meters, plan badges, profiles, keep-warm, prompt cache | [Usage and the cache report](#usage-and-the-cache-report) |
|
|
35
35
|
| what an agent did step by step | [The Log tab](#the-log-tab) |
|
|
36
36
|
| any Settings control | [Settings](#settings) |
|
|
37
|
-
| themes, cards, widgets, ambient effects (petals, click stars), effects, mods | [
|
|
37
|
+
| themes, cards, widgets, ambient effects (petals, click stars), effects, mods | [Look](#look) |
|
|
38
38
|
| blank page, preview refused, link fails, signed out, "live" missing | [Troubleshooting](#troubleshooting) |
|
|
39
39
|
|
|
40
40
|
Addresses: the dashboard is served on the host at `http://localhost:<health_port>` (default 19280), on 127.0.0.1
|
|
@@ -66,7 +66,7 @@ hostname (named tunnel, `web.public_link.hostname`) the minutes go up to 10080,
|
|
|
66
66
|
`web.public_link.auto_open` reopens the link after AgEnD starts for the admin who last opened it (nothing posted; sign-in
|
|
67
67
|
still needs a code).
|
|
68
68
|
Close it with **Close public link** → **Close link (signs public browsers out)**, `/web revoke`, or let it expire.
|
|
69
|
-
A public link is limited on purpose: no live stream (the page polls), no custom CSS, and Settings →
|
|
69
|
+
A public link is limited on purpose: no live stream (the page polls), no custom CSS, and Settings → Access & security, Look,
|
|
70
70
|
mods, effect-library/personal-selection management, schedule edits and preference writes are refused. Current in-scope
|
|
71
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
|
|
72
72
|
of their own (`web.preview_on_public_link`, default on).
|
|
@@ -86,14 +86,24 @@ the local address sees every instance's live terminal and the roster (status, co
|
|
|
86
86
|
tags, name, description, avatars, cards) and the usage meters — read only; editing says "Sign in to edit". Over a
|
|
87
87
|
public link `/view` always needs sign-in.
|
|
88
88
|
|
|
89
|
-
**Guests (#1920).** Off by default: `web.guests.enabled` (or Settings →
|
|
90
|
-
not a fleet admin
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
89
|
+
**Guests (#1920, #2348).** Off by default: `web.guests.enabled` (or Settings → Access & security → Guests). Then someone
|
|
90
|
+
who is not a fleet admin gets a code privately, by sending `/web` or from an admin's **Send sign-in code**, and signs in
|
|
91
|
+
as their own Discord or Telegram account. What a guest sees:
|
|
92
|
+
- **With explicit grants** (`web.guests.grants`, set in Settings → Access & security → Guests): exactly the agents an
|
|
93
|
+
admin granted that person, nothing else (default deny once the key exists). The admin picks the person from people
|
|
94
|
+
AgEnD has seen writing to an agent, ticks their agents, saves (giving access or more agents waits for a fleet admin in
|
|
95
|
+
General; taking away applies at once and ends their sessions), then presses **Send sign-in code**, a DM, never a post.
|
|
96
|
+
Each code sent and each change to someone's access is in the event log (`guest_code_sent`, `guest_grant_changed`),
|
|
97
|
+
shown to admins under **Recent changes** in that section (no agent's Log tab shows them).
|
|
98
|
+
- **Without grants** (before an admin saves the first one): the agents they can already use in chat: their connection's
|
|
99
|
+
fleet topics and General (an `open` connection: only `web.guests.open_instances`), their own Telegram private
|
|
100
|
+
ClassicBot room, and ClassicBot group rooms while their membership is verified, minus any `web.guests.narrow`.
|
|
101
|
+
**Start from today's guests** turns that into grants.
|
|
102
|
+
|
|
103
|
+
They can chat there unless `web.guests.chat` is false, never send a command (text starting with `/` is refused), and the
|
|
104
|
+
agent sees them as `via web (guest)`. A guest's app has no Fleet, View, Settings or Needs you. To invite someone: turn it
|
|
105
|
+
on, grant them their agents in Settings → Access & security → Guests, and press **Send sign-in code** (or tell them to
|
|
106
|
+
send `/web`). The Guests section is not in Settings over the public link.
|
|
97
107
|
|
|
98
108
|
**Web authority (#1939).** A signed-in fleet admin's browser can speak as their own Discord or Telegram
|
|
99
109
|
account. The one row under the composer (bottom left, before the Enter hint) says **Not verified · Authorize**; the
|
|
@@ -104,14 +114,14 @@ again. Confirm within 5 minutes and the session menu says **Verified · speaks a
|
|
|
104
114
|
just **✓ Verified**, with the until-when in its tooltip, its accessible name and a tap. That
|
|
105
115
|
browser's messages then carry the account's authority in their delivery receipt for `max_session_hours` (default 48).
|
|
106
116
|
Not me signs that browser out, also after Confirm, from the same card. At most one card waits per browser, and 3 an hour
|
|
107
|
-
per account. Never for a guest
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
117
|
+
per account. Never for a guest. Over the admin's own named link (#2453) only with **Also over my named link**
|
|
118
|
+
(`named_link`, off by default); over the temporary public link `/web` opens only with **Also over the temporary public
|
|
119
|
+
link** (`quick_link`, off by default, §0.3). That authority ends with the link, and the card says "over your named link"
|
|
120
|
+
or "over the temporary public link". When a browser can't be authorized, the line says why (with a link to Settings when the switch, "Only
|
|
121
|
+
this computer" or the named-link option is the reason). Settings → Access & security → **Web authority** (`web.verified_authority`, on
|
|
111
122
|
by default) has the switch, **Only this computer can authorize** (`loopback_only`), **Also over my named link** (shown
|
|
112
|
-
with a fixed hostname), the hours, the authorized sessions, and **Revoke web authority** (or `/web revoke`). Every change
|
|
113
|
-
there applies at once, except turning
|
|
114
|
-
asking.
|
|
123
|
+
with a fixed hostname), **Also over the temporary public link**, the hours, the authorized sessions, and **Revoke web authority** (or `/web revoke`). Every change
|
|
124
|
+
there applies at once, except turning a link's option on: a General or the host confirms that, never the browser asking.
|
|
115
125
|
Agents then see that browser's messages as `via web (verified)` and check their receipt like a Discord or Telegram message.
|
|
116
126
|
|
|
117
127
|
## Chat
|
|
@@ -142,7 +152,8 @@ workspace `inbox/`; an unused upload is deleted after 30 minutes.
|
|
|
142
152
|
|
|
143
153
|
**In replies.** Images inline; video and audio play inline; Markdown, CSV, JSON, code and text files get a **Show**
|
|
144
154
|
card (200 lines, then "Show all … lines"); other files download. Code blocks have a language tag, **Wrap** and
|
|
145
|
-
**Copy**, and fold after 30 lines.
|
|
155
|
+
**Copy**, and fold after 30 lines. **⋯ → Full width** (desk only, off by default, this browser's choice) widens the
|
|
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/
|
|
146
157
|
strike, links, and tables (header row plus separator, alignment, up to 20 columns). Discord mentions show as names;
|
|
147
158
|
a Discord server emoji (`<:name:id>`) of the fleet's servers shows as its picture, and any other (or one whose picture
|
|
148
159
|
can't load) as `:name:`. Unicode emoji are drawn by the system's colour emoji font under every theme font (boxes on
|
|
@@ -171,8 +182,8 @@ restored; files that can't be served again show as unavailable.
|
|
|
171
182
|
|
|
172
183
|
**Copies in Discord/Telegram (web echo).** For a fleet topic instance, each web message is also posted to its topic as
|
|
173
184
|
`🌐 web · <name>: …` (the first 500 characters plus attachment names; longer text says "(full text in web chat)").
|
|
174
|
-
Turn it off with Settings →
|
|
175
|
-
`classicBot.yaml` `channels.<key>.web_echo` (Settings → ClassicBot → the room → **Web echo**). Since 2.2.5
|
|
185
|
+
Turn it off with Settings → Chat & connections → **Web echo** (`web.echo_to_channel`). ClassicBot rooms: per room,
|
|
186
|
+
`classicBot.yaml` `channels.<key>.web_echo` (Settings → Chat & connections → ClassicBot → the room → **Web echo**). Since 2.2.5
|
|
176
187
|
(#2054) a room echoes by default: an unset room follows `web.echo_to_channel`, `web_echo: false` keeps it off and
|
|
177
188
|
`web_echo: true` keeps it on. Before 2.2.5, a room echoed only with `web_echo: true`.
|
|
178
189
|
|
|
@@ -219,7 +230,8 @@ values reloaded after Save. Password fields keep the browser's behaviour.
|
|
|
219
230
|
|
|
220
231
|
## Fleet
|
|
221
232
|
|
|
222
|
-
`/ui/fleet/<tab>`: **Tasks**, **Schedules**, **Teams**, **Org chart**, **Cache**,
|
|
233
|
+
`/ui/fleet/<tab>`: **Tasks**, **Schedules**, **Teams**, **Org chart**, **Cache**, plus a **Docs** link
|
|
234
|
+
(`/ui/fleet/config` leads to Settings → Agent defaults: each of its settings lives in Settings, #2347).
|
|
223
235
|
The sidebar's **Fleet** (zh "Fleet 概覽", at the top) and the phone's Fleet tab open the Fleet tab this device used last
|
|
224
236
|
(`agend_last_fleet_tab`; the Org chart the first time). The sidebar has no separate Fleet (Details) or View row.
|
|
225
237
|
- **Tasks** — the task board: Home lists **projects** (with % done) and what waits for the person (**Confirm** /
|
|
@@ -241,8 +253,6 @@ The sidebar's **Fleet** (zh "Fleet 概覽", at the top) and the phone's Fleet ta
|
|
|
241
253
|
- **Teams** — **New team**, **Edit** (members, description; no rename), **Delete**. Read only on a public link.
|
|
242
254
|
- **Org chart** — see below.
|
|
243
255
|
- **Cache** — see [the cache report](#usage-and-the-cache-report).
|
|
244
|
-
- **Config** — the main channel, access (Locked/Open, allowed users), default backend and project roots; **Save
|
|
245
|
-
changes** rewrites fleet.yaml (its comments are lost).
|
|
246
256
|
|
|
247
257
|
**Org chart (#1918).** **Canvas** or **List** (remembered per device). The canvas: General at the top, then teams in
|
|
248
258
|
fleet.yaml order, then "Not in a team". Drag to pan, wheel or pinch to zoom (0.2–2.5), **Zoom in / Zoom out / Fit to
|
|
@@ -258,11 +268,69 @@ blinking light (needs you, crashed, looks stuck). With **Live** on, each message
|
|
|
258
268
|
desk to desk along the corridors in the Key's colours; a delegation in progress is a purple folder on the worker's
|
|
259
269
|
desk. Hover (or tap once) a desk for its name, state and backend; click (or tap again) opens the chat. **Find** dims
|
|
260
270
|
the rest. **Show** picks a team or the Lobby and **People** pins chosen instances (both kept per browser); the
|
|
261
|
-
**Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
271
|
+
**Office** switcher lists offices kept on the host (`web-offices.json`, `GET`/`PUT /ui/offices`). An admin session
|
|
272
|
+
(never a read-only one, a guest or the public link) gets **Edit offices** (≥1200 px: a panel docked on the right in the
|
|
273
|
+
usage rail's place, the Office in use beside it, × or Esc closes it and the rail returns; narrower: a centred dialog): add, rename and delete offices, pick who is
|
|
274
|
+
in each (whole teams or single instances; none = everyone) and its style, and upload or delete **skin packs** (an
|
|
275
|
+
artist's pictures: `manifest.json` plus PNGs, format v1, kept in `web-office-skins/` in the AgEnD home; the host
|
|
276
|
+
checks every rule — PNG only, each strip exactly frames·w × h, a 16:9 background, size caps — and never changes a
|
|
277
|
+
pack; a strip may give its displayed size, `dw`/`dh`, apart from its pictures' size, and a character may walk four
|
|
278
|
+
ways with `walkDown`, `walkUp` and `walkSide`, the side one mirrored for left). **Style** (per browser for the whole fleet, per office for a stored one): **Desks**,
|
|
279
|
+
**Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
|
|
280
|
+
**Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
|
|
281
|
+
restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
|
|
282
|
+
own) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
|
|
283
|
+
Cozy or a pack,
|
|
284
|
+
**Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door and
|
|
285
|
+
waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
|
|
286
|
+
corridors; an item that sleeps at bedtime (a pack's `night`) has a night handle too ("Item {id} (night)": its night
|
|
287
|
+
picture faint, a moon, a line to its day place; on the day place while it sleeps in place) — drag it to give the item
|
|
288
|
+
its own night place, **Back to the pack's night place** undoes it (#2665); **Save layout** keeps the moves as that
|
|
289
|
+
office's overrides (the pack stays as uploaded), **Reset** goes back to the pack's own. On a screen ≥1200 px its controls sit in the right-hand panel (the canvas whole for the
|
|
290
|
+
handles); narrower, or in fullscreen, they are the bar along the canvas's bottom. Esc is Cancel. While either editor
|
|
291
|
+
is docked the page beside it works, Ctrl+K search included; leaving the page with unsaved changes asks first
|
|
292
|
+
("Discard changes"). While it is open the office picker and Edit offices wait (**Cancel** closes it); if someone
|
|
293
|
+
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
|
|
294
|
+
only calls and work get bubbles (a few at most) and name tags show on hover or focus. **Hide paused and stopped**
|
|
295
|
+
(per browser, off by default) leaves the sleepers out. Now and then someone says a short line for their state in a
|
|
296
|
+
bubble (never message content). Reduced motion: still poses, nothing in the air, bubbles shown whole.
|
|
297
|
+
**All offices** (in the switcher once two or more offices are stored, kept per device) shows every stored office as
|
|
298
|
+
a tile on one canvas, each exactly as its own view (its style, members, seats, bubbles, walking), labelled with its
|
|
299
|
+
name and head count, each as large as its office's content, packed to fill the panel; **Lobby tile** (on by
|
|
300
|
+
default; disabled when everyone is in an office) adds the instances in no office. Below 75% name tags show on hover
|
|
301
|
+
only. Hover and click work across
|
|
302
|
+
tiles; a tile's label, or a double-click on it, opens that office; traffic between offices flies straight across.
|
|
303
|
+
Edit offices and Edit layout wait for a single office.
|
|
304
|
+
**Share…** (#2636; an admin session, on the dashboard reached directly or over the public link — never read-only or a guest; the URL shows only to its maker, in the dialog) makes an Office share
|
|
305
|
+
link: anyone who opens it watches one office (or **All offices**) live, read-only, with no sign-in — names, identity
|
|
306
|
+
colours and states, every 5 s; no chat, no clicks into anything, no settings; agents' `office_set` lines only when
|
|
307
|
+
**Include agents' own status lines** is ticked; hidden instances never. 1 h by default, 15 min to 24 h
|
|
308
|
+
(`web.office_share.max_hours`); at most 10 open. Its own quick tunnel (`https://<random>.trycloudflare.com/o/<token>`)
|
|
309
|
+
starts with the first link and stops with the last; the token is shown once. There is no chat command: the button only. Open links and **Revoke** are in **Settings → Access
|
|
310
|
+
& security → Office share links**; each made or revoked link is announced in General (never its URL). A Cloudflare 429
|
|
311
|
+
says to try again in a few minutes (no retry). `web.office_share.enabled: false` turns it off and ends open links.
|
|
312
|
+
|
|
313
|
+
The Office fills the Fleet panel and moves like the Canvas (#2540): drag to pan, the wheel or a pinch to zoom,
|
|
314
|
+
**+** / **−** / **Fit** / **Fill** at the top right (the zoom shown as a percentage above them) or the `+ - 0` keys
|
|
315
|
+
(with the office focused), an overview at the bottom right to jump (not on a phone). It takes the whole panel: the
|
|
316
|
+
Fleet area's full width, down to the window's foot. **Fit** shows the whole scene as large as the panel allows
|
|
317
|
+
(any scale, so it fills the panel's width or height); **Fill** (a toggle, kept per office) fills the panel instead,
|
|
318
|
+
cropping what overflows — drag to see it. **+** / **−** step in pixel levels (each logical unit a whole number of
|
|
319
|
+
screen pixels); drawing is always unsmoothed. A resize fits a fitted view again; the scene can never be dragged off
|
|
320
|
+
the panel. The zoom, centre and Fit/Fill are kept per device for each office and style. Around the 16:9 scene the
|
|
321
|
+
whole panel is a matte: a pack's own `matte` (`#rrggbb`), else its background's edge colour, else the skin's own
|
|
322
|
+
(Studio's hall floor; Desks: the dashboard's background). Hover, click, name tags and Edit layout all work at any zoom: a drag on a handle moves it,
|
|
323
|
+
anywhere else pans; zoom and pan are never animated.
|
|
324
|
+
**Fullscreen** (the button under **Fit**, or `f`; Esc leaves) shows the office alone: the dashboard's header, tabs
|
|
325
|
+
and bars go, and the zoom buttons, the overview (not on a phone), a small office switcher and Exit float over it. It
|
|
326
|
+
uses the browser's fullscreen; where a page cannot have it (an iPhone) or the browser refuses, the office covers the
|
|
327
|
+
window instead. Opening a chat leaves it, and it is never remembered.
|
|
328
|
+
A pack may add a `foreground` (a 16:9 PNG over the whole scene, zones packs only): drawn above the people, furniture
|
|
329
|
+
and items in the air, below name tags, bubbles and "+N" — door frames, pillars, table fronts that hide whoever walks
|
|
330
|
+
behind them. A furniture item's `depth` may be `"y"`: drawn among the people by base y (whoever stands lower is in
|
|
331
|
+
front). Numeric depths keep their meaning (under 1000 under the people, 1000 and up over them).
|
|
332
|
+
A pack may set `"straight": true` (#2634): each diagonal leg of a walk becomes an L (across, then up or down), so the
|
|
333
|
+
three walking strips always fit; lay its graph out with horizontal and vertical edges and the corners land on the aisles.
|
|
266
334
|
|
|
267
335
|
**Live traffic** (**Live** switch, on by default; **Key** in the toolbar explains it, as a strip above the canvas): a line for each message between instances.
|
|
268
336
|
Colour by kind — task (delegate_task) purple, send/query/update teal, report pink, broadcast orange; between teams
|
|
@@ -340,11 +408,14 @@ coordinators and full-profile instances, and each other instance only its own ro
|
|
|
340
408
|
|
|
341
409
|
**The usage report** (the `get_usage_report` tool, and Fleet → **Usage**, `/ui/fleet/usage`, #2122; the ◔ dialog's
|
|
342
410
|
**By agent →** opens it). Per instance (or backend,
|
|
343
|
-
model, credential profile, team): input, output, cache read and cache write tokens, requests, delivered messages,
|
|
411
|
+
model, credential profile, team): input, output, reasoning, cache read and cache write tokens, requests, delivered messages,
|
|
344
412
|
and an amount, over today / 7d / month / all / custom days in the fleet's timezone. **Every amount is the
|
|
345
413
|
API-equivalent at list price — not money spent** (subscriptions aren't billed per token): say "API-equivalent", never
|
|
346
|
-
"spent". Measured for Claude Code and
|
|
347
|
-
- `
|
|
414
|
+
"spent". Measured for Claude Code, Codex, Grok, Muse, OpenCode and Antigravity; **estimated** for Kiro (it records no token counts). Marks to repeat in words:
|
|
415
|
+
- `cost_reported`: the model has no list price in AgEnD's table, so the amount is what the CLI (Grok, OpenCode's provider) reported.
|
|
416
|
+
- `estimated` (a row) / `includes_estimates` (the totals, with `amountEstimated`): Kiro's tokens are estimated from text
|
|
417
|
+
size, not measured — say "estimated" and give the estimated part apart.
|
|
418
|
+
- `cache_write_not_reported`: Codex and Muse record no cache writes, so they are neither shown as 0 nor priced.
|
|
348
419
|
- `not_priced`: the tokens are shown, the amount isn't.
|
|
349
420
|
- `source_unknown`: read before #2122, when which backend and profile read it was not recorded (backend and profile
|
|
350
421
|
"unknown" — never today's).
|
|
@@ -355,7 +426,7 @@ they are never a $0 row, and what such an instance measured before still shows.
|
|
|
355
426
|
by backend they go under its backend now. Coverage only says "read" for a catch-up that listed and read every source
|
|
356
427
|
(an unreadable directory or transcript is not covered, never a 0). Scope as
|
|
357
428
|
`get_cache_report`. The dashboard reaches it over the public link only with `web.usage_report_on_public_link: true`
|
|
358
|
-
(Settings → Web → **Usage report over the public link**, applies at once; otherwise the page says "Not offered over
|
|
429
|
+
(Settings → Web dashboard → **Usage report over the public link**, applies at once; otherwise the page says "Not offered over
|
|
359
430
|
the public link" and links to that switch on the dashboard reached directly); guests never. The page adds a daily trend (top 5 and
|
|
360
431
|
others), a heatmap that tells a day read with nothing used from a day not collected, and **Download CSV** (the shown
|
|
361
432
|
answer's daily rows, with the basis). Claude subagent (sidechain) turns aren't counted yet. A long range whose daily rows
|
|
@@ -372,38 +443,45 @@ still being designed). If the report says **Switch to 1-hour cache**, the remedy
|
|
|
372
443
|
What an agent was asked, its replies (never its thinking), each tool call (Read, Edit, Search, Run, Web, MCP,
|
|
373
444
|
Sub-agent…, with **Show output**), errors, turn ends, compactions and fleet events, on one timeline. Filters **All /
|
|
374
445
|
Tools / Errors**; **Live** while it updates. Opens with the newest 200 steps; **Load older steps** adds 100 at a time
|
|
375
|
-
(the page keeps 1000). Off by default: `web.log_tab` (Settings → Web → **Log tab: each agent's steps**; turning it on
|
|
446
|
+
(the page keeps 1000). Off by default: `web.log_tab` (Settings → Web dashboard → **Log tab: each agent's steps**; turning it on
|
|
376
447
|
from the tab itself needs a fleet admin's confirmation). Full for Claude Code (also after it stopped) and Codex while
|
|
377
448
|
running; kiro shows fleet events only; other backends say they have no readable transcript. Secrets are masked.
|
|
378
449
|
|
|
379
450
|
## Settings
|
|
380
451
|
|
|
381
|
-
**
|
|
452
|
+
**Chat & connections → Retry now** retries a disconnected connection without a fleet restart; a running login is reused. Startup retries continue with a five-minute cap. Local admin only, unavailable over public links. It changes no token or binding; refresh to read the later result.
|
|
382
453
|
|
|
383
|
-
|
|
384
|
-
**
|
|
454
|
+
Sections (`/settings/<section>`, #2347), in two groups. **You**: **Preferences**, **Look**. **Fleet**: **Agents**,
|
|
455
|
+
**Agent defaults**, **Chat & connections**, **Web dashboard**, **Access & security**, **Advanced**. Old addresses (`device`,
|
|
456
|
+
`appearance`, `general`, `bots`, `classic`, `web`) lead to the new sections. **Search settings** (top of the sections, **/**;
|
|
457
|
+
also Ctrl K → Settings) finds a setting by name, `fleet.yaml` key or synonym in either language and goes to the field.
|
|
458
|
+
Header: version, **Setup wizard**, **Help**.
|
|
385
459
|
|
|
386
|
-
**How changes apply.**
|
|
387
|
-
**
|
|
388
|
-
|
|
460
|
+
**How changes apply (#2347).** Every Fleet section's edits are unsaved until
|
|
461
|
+
**Save**: a field edit (Agent defaults, Chat & connections, Web dashboard, Access & security) is unsaved at once (a straight bar on its left); a dialog's **Done**
|
|
462
|
+
adds its changes. The bar **N unsaved change(s)** shows the cost — **Immediately**, **Restart this Agent** or **Restart
|
|
463
|
+
AgEnD** — then **Save** or **Discard**; an invalid field keeps Save waiting (**Fix 1 field(s) to save**). Over a public
|
|
464
|
+
link an admin can change the fleet's settings too (not the dashboard's own web settings, Guests or Web authority).
|
|
389
465
|
Confirmations (e.g. opening access) are asked at Apply. A change that loosens access waits for a fleet admin to confirm
|
|
390
466
|
in the General chat ("Waiting for confirmation", **Withdraw**) — unless the browser is web-verified (#2170): an
|
|
391
467
|
account that is a fleet admin of every connection the change affects, on their platform, confirms it by its own Apply
|
|
392
468
|
("Confirmed by your account"; General gets a notice; every check runs again at execution). Not for a guest, the public
|
|
393
469
|
link, an unverified browser or a change that needs the host CLI. After a failure, unapplied changes are staged again
|
|
394
|
-
(secrets must be re-entered). **Restart AgEnD** restarts every agent
|
|
470
|
+
(secrets must be re-entered). **Restart AgEnD** restarts every agent
|
|
471
|
+
(never automatic); until then every page shows **N saved change(s) take effect after AgEnD restarts** · **Restart now** ·
|
|
472
|
+
**Later**. Preferences and Look save with the same bar (**Your preferences**; device-only switches count on their own; Restore defaults saves at once).
|
|
395
473
|
|
|
396
474
|
**Preferences** — follows you across devices unless marked:
|
|
397
475
|
| Control | What it does | Stored |
|
|
398
476
|
|---|---|---|
|
|
399
477
|
| Your name (**Save**, **Use web-user** / **Use <account>**) | the name agents see on your web messages | your profile |
|
|
400
478
|
| Theme: System / Light / Dark | page theme | host prefs `theme` |
|
|
401
|
-
| Language: English / 中文 | page language (not the bots' replies — that is
|
|
479
|
+
| Language: English / 中文 | page language (not the bots' replies — that is Agent defaults → Language) | host prefs `lang` |
|
|
402
480
|
| Names: Nickname first / Real name first | sidebar names | host prefs `names.primary` |
|
|
403
481
|
| Allow HTML previews | the preview opt-in | host prefs `preview.optIn` |
|
|
404
482
|
| Chat tour (this device) | replays the chat tour | browser |
|
|
405
483
|
|
|
406
|
-
**
|
|
484
|
+
**Look** — see [Look](#look) for the cards and what they mean.
|
|
407
485
|
|
|
408
486
|
**Signing a backend in (#2233)** — local admin sessions only (never a guest or the public link): Settings → Agents →
|
|
409
487
|
**Sign-ins** (each backend's login and each credential profile an agent uses: state, **Sign in** / **Sign in again**,
|
|
@@ -417,7 +495,8 @@ opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`).
|
|
|
417
495
|
|
|
418
496
|
**Agents** — **New agent**; per agent **Settings**, **Pause / Wake**, **Start / Stop** (direct), ⋯ **Delete agent**
|
|
419
497
|
(staged; on Apply it waits for a fleet admin's confirmation in General, then the agent is stopped and removed, as
|
|
420
|
-
`delete_instance` does — no restart). The agent dialog writes `instances.<name>.*` (an "Inherit" box removes the key
|
|
498
|
+
`delete_instance` does — no restart). The agent dialog writes `instances.<name>.*` (an "Inherit" box removes the key, and the field then says what it inherits:
|
|
499
|
+
"Inherited: 30 min · change in Agent defaults"; a value nobody set anywhere is marked "default"):
|
|
421
500
|
| Label | Key | Applies |
|
|
422
501
|
|---|---|---|
|
|
423
502
|
| Display name, Description | `display_name`, `description` | now |
|
|
@@ -428,13 +507,14 @@ opencode: no dashboard sign-in. Config: `web_terminal.*` (as `/login`).
|
|
|
428
507
|
| Agent mode, Tool set | `agent_mode`, `tool_set` | agent |
|
|
429
508
|
| Tool progress; Bot-to-bot messages in topics (full / summary / hidden); Log level | `tool_progress`, `cross_instance_visibility`, `log_level` | now |
|
|
430
509
|
| Require a delivered reply | `reply_completion_guard` | now |
|
|
510
|
+
| Daily tips (Topic / Off; always posted in General, never by DM) | `tips` | now |
|
|
431
511
|
| Lightweight mode, Fallback model | `lightweight`, `model_failover` | agent |
|
|
432
512
|
| System prompt | `systemPrompt` | agent |
|
|
433
513
|
| Tags | `tags` | now |
|
|
434
514
|
| General topic (fleet dispatcher) | `general_topic` | AgEnD |
|
|
435
515
|
| Status emojis (Received, Queued, Processing, Delivered, Failed, …) | `status_emojis` | agent |
|
|
436
516
|
|
|
437
|
-
**
|
|
517
|
+
**Chat & connections** — connections (the bots): **New connection**: type, bot token (**Verify**), Discord server or Telegram group,
|
|
438
518
|
your user ID. It starts without a restart when AgEnD already runs another connection and nothing else at fleet level
|
|
439
519
|
changed; a fleet's first connection (or a change to an existing one) offers **Restart AgEnD**. Per bot: **Access mode** (locked / open / pairing) and **Allowed users** —
|
|
440
520
|
`channels[i].access.*`, staged, restarts AgEnD, asks before opening access; **Guild/Group id** and General channel /
|
|
@@ -442,17 +522,18 @@ forum topic with **Verify the new binding** (applies directly after a confirmati
|
|
|
442
522
|
**Replace** the token (saved to `~/.agend/.env`); **Delete this bot** (the token stays in `.env`). **Provider API keys**:
|
|
443
523
|
**Verify & apply**, used by new processes.
|
|
444
524
|
|
|
445
|
-
|
|
525
|
+
ClassicBot (in **Chat & connections**, `/settings/chat#classicbot`) — per room **Settings**, **Pause / Wake**. The room dialog writes `classicBot.yaml`
|
|
446
526
|
`channels.<key>.*`: Backend, Model, Auto-pause after, **Collaboration mode** (`collab`), **Web echo** (`web_echo`),
|
|
447
527
|
Advanced **Context lines** (these restart the room's agent); Tool progress and Require a delivered reply (now).
|
|
448
528
|
|
|
449
|
-
**
|
|
529
|
+
**Agent defaults** — **Project folders** (`project_roots`: where New agent may put an agent; empty = anywhere;
|
|
530
|
+
changing it waits for a fleet admin's OK) and the fleet defaults (`defaults.*`): **Language (bot replies)** (`locale`: Auto / en / zh-TW; read at startup: restart AgEnD), default
|
|
450
531
|
backend and model, auto-pause, tool progress, bot-to-bot visibility, reply guard; Advanced: tool set, agent mode, log
|
|
451
532
|
level, **Hang detector enabled** / **Stuck timeout** (`hang_detector.*`), **Startup concurrency** (1–20) and
|
|
452
|
-
**Stagger delay** (`startup.*`, used from the next agent start, no restart). ClassicBot
|
|
533
|
+
**Stagger delay** (`startup.*`, used from the next agent start, no restart). ClassicBot defaults (in Chat & connections; `classicBot.yaml defaults.*`): default backend, tool
|
|
453
534
|
progress, reply guard, **ClassicBot admins**, **Allowed guilds**.
|
|
454
535
|
|
|
455
|
-
**Web** — all apply at once; loosening waits for an admin; disabled over a public link.
|
|
536
|
+
**Access & security** (sessions, browser terminal, public link and fixed address, guests, web authority; web echo is in Chat & connections, the Log tab and usage over the link in **Web dashboard**) — all apply at once; loosening waits for an admin; disabled over a public link.
|
|
456
537
|
| Label | Key |
|
|
457
538
|
|---|---|
|
|
458
539
|
| Session length, hours (1–720) | `web.session.local.absolute_hours` |
|
|
@@ -461,29 +542,29 @@ progress, reply guard, **ClassicBot admins**, **Allowed guilds**.
|
|
|
461
542
|
| Terminal session minutes (1–20) | `web_terminal.ttl_minutes` |
|
|
462
543
|
| Web echo | `web.echo_to_channel` |
|
|
463
544
|
| Log tab: each agent's steps | `web.log_tab` |
|
|
545
|
+
| Web sign-in notices (Topic / Off; never by DM, guest and public-link notices always post) | `web.notify_login` |
|
|
464
546
|
| Offer temporary public web links | `web.public_link.allow_public` |
|
|
465
547
|
| Public link minutes (1–480; with a fixed hostname 0–10080, 0 = no expiry) | `web.public_link.ttl_minutes` |
|
|
466
548
|
| Reopen the public link when AgEnD starts (fixed hostname only) | `web.public_link.auto_open` |
|
|
467
549
|
| Tunnel protocol (http2 / quic / auto) | `web.public_link.protocol` |
|
|
468
|
-
Shown read-only ("Set in fleet.yaml"): `web.allowed_hosts`, `view_access`, `
|
|
550
|
+
Shown read-only ("Set in fleet.yaml"): `web.allowed_hosts`, `view_access`, `preview`, `preview_port`,
|
|
469
551
|
`preview_origin`, `preview_on_public_link`, `usage_panel`, `search` (`retention_days`: unset and 0 = no age limit,
|
|
470
552
|
300,000-row cap), `provider_secrets`, `upload_max_file_mb`,
|
|
471
553
|
`upload_max_total_mb`, `web_terminal.bind`, `web_terminal.tunnel`.
|
|
472
554
|
|
|
473
|
-
**
|
|
474
|
-
(edit mode)
|
|
555
|
+
**Advanced** — fleet.yaml as **YAML / JSON**, **Edit / View**, **Copy**, **Download fleet.yaml**; **Apply**
|
|
556
|
+
(edit mode) adds the edit to the bar, and Save writes it. While it waits, Agents, Agent defaults and the
|
|
557
|
+
connections are off (and the setup wizard); while those have unsaved changes, the editor only reads.
|
|
475
558
|
|
|
476
559
|
**Setup wizard** — agent (backend, directory, name) → platform → token and server/group, your user ID → preview →
|
|
477
560
|
**Create and start**.
|
|
478
561
|
|
|
479
|
-
##
|
|
562
|
+
## Look
|
|
480
563
|
|
|
481
564
|
For an agent changing its *own* look, the `web-appearance` skill has the tools and limits. What a person sees in
|
|
482
|
-
Settings → **
|
|
565
|
+
Settings → **Look**, card by card (the app icon, card upload limits and Canvas Worker effects are in **Web dashboard**; following reduced motion and custom CSS off here are in **Preferences**):
|
|
483
566
|
- **Agents' themes** — **Show agents' themes, effects and widgets**; off, every chat looks the same and pictures and
|
|
484
|
-
ring colours fall back to the bots' own (all devices).
|
|
485
|
-
device only, off by default): on, both ambient and Canvas Worker effects stay still while the system asks for reduced
|
|
486
|
-
motion. Otherwise both play, with one shared one-time chat note and a local action to follow the system.
|
|
567
|
+
ring colours fall back to the bots' own (all devices).
|
|
487
568
|
- **Ambient effects** — an agent's falling petals, snow, rising lanterns, twinkles or stars on a click, drawn behind
|
|
488
569
|
its chat by the dashboard (data only, no consent needed). They show by default, the public link too; the chat's ⋯
|
|
489
570
|
menu says why one is not showing (choosing the line fixes it there) and offers **Clear the ambient effect** /
|
|
@@ -499,7 +580,7 @@ Settings → **Web appearance**, card by card:
|
|
|
499
580
|
can't load from the internet (put pictures and fonts under Assets: PNG, WebP, JPEG, GIF, WOFF2, 1 MiB in total).
|
|
500
581
|
**Save and try**, then **Keep** within 15 s or it reverts; **Turn off (all devices)**; earlier versions **Use
|
|
501
582
|
this**. If something is hidden or broken, open the page with `?safe=1`, or tick **Turn off custom CSS on this
|
|
502
|
-
device
|
|
583
|
+
device** (in Preferences).
|
|
503
584
|
- **Mods** — one `.agendmod.json` file carrying a look; importing shows everything first and applies only what you
|
|
504
585
|
tick (custom CSS is never pre-ticked); agents can propose mods (**Review** / **Dismiss**); **Export a mod** writes one.
|
|
505
586
|
Uninstalling removes the mod, not what it applied.
|
|
@@ -512,14 +593,17 @@ Settings → **Web appearance**, card by card:
|
|
|
512
593
|
click, with no extra consent. The show switch, safe mode, hidden tab, browser support and live performance guard remain.
|
|
513
594
|
No startup FPS calibration; data saver does not block. Reduced motion blocks only if this device chose to follow it.
|
|
514
595
|
A blocked placement keeps an exact named notice. On ordinary dashboard sessions, Show/custom-CSS actions open
|
|
515
|
-
**
|
|
596
|
+
**Look**. Public/guest Show-off has **Turn effects on here**; a guest CSS refusal offers Reload.
|
|
516
597
|
An unavailable
|
|
517
598
|
isolated transport offers Reload, never an HTML-preview setup step. A motion refusal offers **Play effects anyway**;
|
|
518
599
|
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.
|
|
519
|
-
- **Identity card upload limits** — portrait and banner size limits and per-agent picture quota
|
|
520
|
-
(`web.appearance.*`); lowering applies at once, raising waits for an admin.
|
|
521
600
|
- **Restore defaults** — resets this host's appearance settings (it lists what it resets first).
|
|
522
601
|
|
|
602
|
+
Moved out of Look in 2.3.2 (#2347). **Preferences** (this device only): **Effects: follow the system's reduced-motion
|
|
603
|
+
setting** (off by default): on, both ambient and Canvas Worker effects stay still while the system asks for reduced motion. Otherwise both 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**;
|
|
604
|
+
**Identity card upload limits** — portrait and banner size limits and per-agent picture quota (`web.appearance.*`);
|
|
605
|
+
lowering applies at once, raising waits for an admin; and **Experimental: Canvas Worker effects**.
|
|
606
|
+
|
|
523
607
|
**What an agent can change for the user.** A worker changes only its own look (the `web-appearance` tools); before
|
|
524
608
|
#2064 everything on this page was the person's. Since #2064 (2.2.5) General, coordinators and
|
|
525
609
|
full-profile instances get `get_web_settings` / `set_web_settings`, which go through the same checks as the page;
|
|
@@ -578,7 +662,7 @@ no instance uses that provider.
|
|
|
578
662
|
|
|
579
663
|
**Settings won't change something.** Over a public link, Web settings and appearance are read only; a loosening
|
|
580
664
|
change waits for an admin's confirmation in General chat; a value in the "Set in fleet.yaml" list must be edited in
|
|
581
|
-
fleet.yaml (
|
|
665
|
+
fleet.yaml (Advanced, or the file) and `agend reload`.
|
|
582
666
|
|
|
583
667
|
### Canvas Worker playback diagnostics
|
|
584
668
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #2348: the people AgEnD has seen in chat — the Settings → Guests picker's source. One row per platform account
|
|
3
|
+
* (`adapter_id`, `user_id`), written where a platform message is admitted as human input (a human receipt: never a bot,
|
|
4
|
+
* never the web), so only real senders appear. Kept 400 days since last seen (the receipts themselves are pruned at
|
|
5
|
+
* `retention_days`, 30 by default — too short for "pick someone who wrote last month"). Backfilled once from the
|
|
6
|
+
* receipts still kept. Ids leave this table only through the admin's Settings read.
|
|
7
|
+
*/
|
|
8
|
+
import type Database from "better-sqlite3";
|
|
9
|
+
export declare const SEEN_PEOPLE_KEEP_DAYS = 400;
|
|
10
|
+
/** The picker reads at most this many, most recently seen first. */
|
|
11
|
+
export declare const SEEN_PEOPLE_LIST_MAX = 500;
|
|
12
|
+
export interface SeenPerson {
|
|
13
|
+
adapterId: string;
|
|
14
|
+
userId: string;
|
|
15
|
+
username: string | null;
|
|
16
|
+
firstSeen: string;
|
|
17
|
+
lastSeen: string;
|
|
18
|
+
/** The instances they wrote to, most recent first, with when. */
|
|
19
|
+
instances: Array<{
|
|
20
|
+
name: string;
|
|
21
|
+
at: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export declare function initializeSeenPeople(db: Database.Database): void;
|
|
25
|
+
/** A platform sender seen writing to `instance` at `at` (ISO). */
|
|
26
|
+
export declare function noteSeenPerson(db: Database.Database, p: {
|
|
27
|
+
adapterId: string;
|
|
28
|
+
userId: string;
|
|
29
|
+
username: string | null;
|
|
30
|
+
instance: string;
|
|
31
|
+
at: string;
|
|
32
|
+
}): void;
|
|
33
|
+
/** The picker's list: most recently seen first, at most SEEN_PEOPLE_LIST_MAX. */
|
|
34
|
+
export declare function listSeenPeople(db: Database.Database, limit?: number): SeenPerson[];
|
|
35
|
+
/** Whether an account was ever seen (and is still kept): a grant may only name one (or one already granted). */
|
|
36
|
+
export declare function isSeenPerson(db: Database.Database, adapterId: string, userId: string): boolean;
|
|
37
|
+
/** Forget whoever was last seen before `cutoffIso`. */
|
|
38
|
+
export declare function pruneSeenPeople(db: Database.Database, cutoffIso: string): number;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export const SEEN_PEOPLE_KEEP_DAYS = 400;
|
|
2
|
+
/** The picker reads at most this many, most recently seen first. */
|
|
3
|
+
export const SEEN_PEOPLE_LIST_MAX = 500;
|
|
4
|
+
/** Instances remembered per person (the most recent). */
|
|
5
|
+
const INSTANCES_MAX = 20;
|
|
6
|
+
export function initializeSeenPeople(db) {
|
|
7
|
+
const existed = !!db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'seen_people'").get();
|
|
8
|
+
db.exec(`CREATE TABLE IF NOT EXISTS seen_people (
|
|
9
|
+
adapter_id TEXT NOT NULL, user_id TEXT NOT NULL, username TEXT, first_seen TEXT NOT NULL, last_seen TEXT NOT NULL,
|
|
10
|
+
instances_json TEXT NOT NULL DEFAULT '[]', PRIMARY KEY (adapter_id, user_id));
|
|
11
|
+
CREATE INDEX IF NOT EXISTS idx_seen_people_last ON seen_people(last_seen);`);
|
|
12
|
+
if (existed)
|
|
13
|
+
return;
|
|
14
|
+
// Once, when the table is new: everyone the receipts still name (platform messages only).
|
|
15
|
+
const rows = db.prepare("SELECT target_instance, origin_json, created_at FROM human_delivery_receipts ORDER BY created_at").all();
|
|
16
|
+
const tx = db.transaction(() => {
|
|
17
|
+
for (const r of rows) {
|
|
18
|
+
let o;
|
|
19
|
+
try {
|
|
20
|
+
o = JSON.parse(r.origin_json);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if ((o.platform !== "discord" && o.platform !== "telegram") || typeof o.adapter_id !== "string" || typeof o.user_id !== "string")
|
|
26
|
+
continue;
|
|
27
|
+
noteSeenPerson(db, { adapterId: o.adapter_id, userId: o.user_id, username: typeof o.username === "string" ? o.username : null, instance: r.target_instance, at: r.created_at });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
tx();
|
|
31
|
+
}
|
|
32
|
+
/** A platform sender seen writing to `instance` at `at` (ISO). */
|
|
33
|
+
export function noteSeenPerson(db, p) {
|
|
34
|
+
if (!p.adapterId || !p.userId)
|
|
35
|
+
return;
|
|
36
|
+
const row = db.prepare("SELECT first_seen, last_seen, instances_json, username FROM seen_people WHERE adapter_id = ? AND user_id = ?").get(p.adapterId, p.userId);
|
|
37
|
+
let instances = [];
|
|
38
|
+
if (row) {
|
|
39
|
+
try {
|
|
40
|
+
instances = JSON.parse(row.instances_json);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
instances = [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
instances = [{ name: p.instance, at: p.at }, ...instances.filter((i) => i.name !== p.instance)]
|
|
47
|
+
.sort((a, b) => b.at.localeCompare(a.at)).slice(0, INSTANCES_MAX);
|
|
48
|
+
const last = row && row.last_seen > p.at ? row.last_seen : p.at;
|
|
49
|
+
const first = row && row.first_seen < p.at ? row.first_seen : p.at;
|
|
50
|
+
// The handle as last seen (a rename shows up); an older message never overwrites a newer one's.
|
|
51
|
+
const username = row && row.last_seen > p.at ? row.username : (p.username ?? row?.username ?? null);
|
|
52
|
+
db.prepare(`INSERT INTO seen_people (adapter_id, user_id, username, first_seen, last_seen, instances_json) VALUES (?, ?, ?, ?, ?, ?)
|
|
53
|
+
ON CONFLICT(adapter_id, user_id) DO UPDATE SET username = excluded.username, first_seen = excluded.first_seen, last_seen = excluded.last_seen, instances_json = excluded.instances_json`)
|
|
54
|
+
.run(p.adapterId, p.userId, username, first, last, JSON.stringify(instances));
|
|
55
|
+
}
|
|
56
|
+
/** The picker's list: most recently seen first, at most SEEN_PEOPLE_LIST_MAX. */
|
|
57
|
+
export function listSeenPeople(db, limit = SEEN_PEOPLE_LIST_MAX) {
|
|
58
|
+
const rows = db.prepare("SELECT * FROM seen_people ORDER BY last_seen DESC LIMIT ?").all(Math.max(1, Math.min(limit, SEEN_PEOPLE_LIST_MAX)));
|
|
59
|
+
return rows.map((r) => {
|
|
60
|
+
let instances = [];
|
|
61
|
+
try {
|
|
62
|
+
instances = JSON.parse(r.instances_json);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
instances = [];
|
|
66
|
+
}
|
|
67
|
+
return { adapterId: r.adapter_id, userId: r.user_id, username: r.username, firstSeen: r.first_seen, lastSeen: r.last_seen, instances };
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Whether an account was ever seen (and is still kept): a grant may only name one (or one already granted). */
|
|
71
|
+
export function isSeenPerson(db, adapterId, userId) {
|
|
72
|
+
return !!db.prepare("SELECT 1 FROM seen_people WHERE adapter_id = ? AND user_id = ?").get(adapterId, userId);
|
|
73
|
+
}
|
|
74
|
+
/** Forget whoever was last seen before `cutoffIso`. */
|
|
75
|
+
export function pruneSeenPeople(db, cutoffIso) {
|
|
76
|
+
return db.prepare("DELETE FROM seen_people WHERE last_seen < ?").run(cutoffIso).changes;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=guest-seen-people.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-seen-people.js","sourceRoot":"","sources":["../src/guest-seen-people.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,9 @@ export const IMPACT_ORDER = ["now", "instance", "fleet"];
|
|
|
25
25
|
export const HOT_INSTANCE_CONFIG_KEYS = new Set([
|
|
26
26
|
"tool_progress",
|
|
27
27
|
"reply_completion_guard",
|
|
28
|
+
"reply_triggers",
|
|
28
29
|
"mcp_proxy_reply",
|
|
30
|
+
"resume_interrupted_work",
|
|
29
31
|
"auto_pause_after",
|
|
30
32
|
"warm_cap",
|
|
31
33
|
"display_name",
|
|
@@ -37,7 +39,7 @@ export const HOT_INSTANCE_CONFIG_KEYS = new Set([
|
|
|
37
39
|
// #2303: the fleet reads it at each task board claim; the daemon only keeps it current.
|
|
38
40
|
"board_cards_at_once",
|
|
39
41
|
// The fleet reads it at each tool call; the daemon keeps it current for the next spawn's tool menu.
|
|
40
|
-
"dashboard",
|
|
42
|
+
"dashboard", "office_access",
|
|
41
43
|
]);
|
|
42
44
|
/**
|
|
43
45
|
* The hot keys a ClassicBot channel edit can use.
|
|
@@ -48,7 +50,7 @@ export const HOT_INSTANCE_CONFIG_KEYS = new Set([
|
|
|
48
50
|
* dropped on the way. Derived, not re-listed: dropping a key from the hot set
|
|
49
51
|
* drops it here too.
|
|
50
52
|
*/
|
|
51
|
-
export const CLASSIC_HOT_CONFIG_KEYS = new Set(["tool_progress", "reply_completion_guard"]
|
|
53
|
+
export const CLASSIC_HOT_CONFIG_KEYS = new Set(["tool_progress", "reply_completion_guard", "reply_triggers"]
|
|
52
54
|
.filter(key => HOT_INSTANCE_CONFIG_KEYS.has(key)));
|
|
53
55
|
/**
|
|
54
56
|
* Instance keys that are not the instance's own business: they change how the
|
|
@@ -62,8 +64,8 @@ const FLEET_SCOPED_INSTANCE_KEYS = new Set([
|
|
|
62
64
|
/** Instance-scoped fields the settings page renders. */
|
|
63
65
|
const INSTANCE_FIELDS = [
|
|
64
66
|
"display_name", "description", "backend", "model", "working_directory",
|
|
65
|
-
"auto_pause_after", "warm_cap", "topic_id", "channel_id", "general_topic",
|
|
66
|
-
"tool_progress", "reply_completion_guard", "mcp_proxy_reply", "log_level",
|
|
67
|
+
"resume_interrupted_work", "auto_pause_after", "warm_cap", "topic_id", "channel_id", "general_topic",
|
|
68
|
+
"tool_progress", "reply_completion_guard", "reply_triggers", "mcp_proxy_reply", "log_level",
|
|
67
69
|
"systemPrompt", "tags", "hang_detector", "agent_mode", "tool_set",
|
|
68
70
|
"lightweight", "model_failover", "effort", "pre_task_command",
|
|
69
71
|
// #1005: the status reactions follow at once, but the instructions' avoid
|
|
@@ -73,12 +75,12 @@ const INSTANCE_FIELDS = [
|
|
|
73
75
|
// #2303: read by the fleet at each task board claim.
|
|
74
76
|
"board_cards_at_once",
|
|
75
77
|
// Read by the fleet at each tool call (dashboard-permissions.ts).
|
|
76
|
-
"dashboard",
|
|
78
|
+
"dashboard", "office_access",
|
|
77
79
|
];
|
|
78
80
|
/** ClassicBot channel fields the settings page renders. */
|
|
79
81
|
const CLASSIC_FIELDS = [
|
|
80
82
|
"backend", "model", "auto_pause_after", "tool_progress",
|
|
81
|
-
"reply_completion_guard", "collab", "context_lines", "pre_task_command",
|
|
83
|
+
"reply_completion_guard", "reply_triggers", "collab", "context_lines", "pre_task_command",
|
|
82
84
|
"web_echo",
|
|
83
85
|
];
|
|
84
86
|
/**
|
|
@@ -86,6 +88,10 @@ const CLASSIC_FIELDS = [
|
|
|
86
88
|
* fleet process or the channel binding rather than to an instance's config.
|
|
87
89
|
*/
|
|
88
90
|
const FLEET_FIELD_IMPACTS = {
|
|
91
|
+
"defaults.tips": "now",
|
|
92
|
+
"web.notify_login": "now",
|
|
93
|
+
"web.notice_delivery": "now",
|
|
94
|
+
"defaults.reply_triggers": "now",
|
|
89
95
|
"web.experimental.canvas_worker": "now",
|
|
90
96
|
"web.echo_to_channel": "now",
|
|
91
97
|
"web.log_tab": "now",
|
|
@@ -121,6 +127,8 @@ const FLEET_FIELD_IMPACTS = {
|
|
|
121
127
|
// #2346: read at each spawn by the SpawnGate (fleet-level-config.ts RUNTIME_READ_FLEET_KEYS): the next start uses it.
|
|
122
128
|
"fleet.spawn_concurrency": "now",
|
|
123
129
|
"fleet.spawn_stagger_ms": "now",
|
|
130
|
+
// #2347 §10: checked at each create (instance-lifecycle's project_roots boundary), so the next New agent uses it.
|
|
131
|
+
"fleet.project_roots": "now",
|
|
124
132
|
"classic.admin_users": "fleet",
|
|
125
133
|
"classic.allowed_guilds": "fleet",
|
|
126
134
|
// #2168: a confirmed delete stops and removes the agent at once (removeInstance) — no AgEnD restart.
|