@songsid/agend 2.3.3 → 2.3.4-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/README.md +3 -3
- package/README.zh-TW.md +3 -3
- package/THIRD_PARTY_NOTICES.md +37 -0
- package/dist/agend-home.d.ts +13 -0
- package/dist/agend-home.js +42 -0
- package/dist/agend-home.js.map +1 -1
- package/dist/agent-cli-instructions.md +2 -2
- package/dist/agent-credentials.d.ts +24 -0
- package/dist/agent-credentials.js +66 -0
- package/dist/agent-credentials.js.map +1 -0
- package/dist/agent-endpoint.d.ts +3 -1
- package/dist/agent-endpoint.js +13 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/auth-api.d.ts +16 -3
- package/dist/auth-api.js +32 -8
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +28 -4
- package/dist/authority/session-authorizations.js +63 -17
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +15 -1
- package/dist/authority/web-authority.js +27 -10
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/antigravity.js +3 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +3 -0
- package/dist/backend/claude-code.js +100 -5
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-footer-hints.d.ts +4 -0
- package/dist/backend/codex-footer-hints.js +27 -0
- package/dist/backend/codex-footer-hints.js.map +1 -0
- package/dist/backend/codex-session-lookup.d.ts +35 -0
- package/dist/backend/codex-session-lookup.js +93 -0
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex.d.ts +27 -0
- package/dist/backend/codex.js +136 -23
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +2 -0
- package/dist/backend/kiro-identity.js +13 -6
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -0
- package/dist/backend/kiro.js +68 -5
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +5 -3
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +13 -1
- package/dist/backend/types.js +3 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +6 -0
- package/dist/backend-availability.js +13 -5
- package/dist/backend-availability.js.map +1 -1
- package/dist/cache-ledger.d.ts +85 -0
- package/dist/cache-ledger.js +236 -1
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-service.d.ts +5 -0
- package/dist/cache-service.js +16 -4
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.js +27 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +51 -0
- package/dist/channel/adapters/telegram.js +238 -18
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/inbox-temp-name.d.ts +9 -0
- package/dist/channel/inbox-temp-name.js +13 -0
- package/dist/channel/inbox-temp-name.js.map +1 -0
- package/dist/channel/mcp-tools.js +3 -3
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +2 -0
- package/dist/chat-log-ids.d.ts +48 -0
- package/dist/chat-log-ids.js +182 -0
- package/dist/chat-log-ids.js.map +1 -0
- package/dist/classic-channel-manager.d.ts +8 -1
- package/dist/classic-channel-manager.js +24 -2
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +4 -6
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +18 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +10 -0
- package/dist/cross-instance-notice.js +67 -5
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +52 -0
- package/dist/daemon.js +538 -35
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +23 -1
- package/dist/delivery-consumed-watch.js +30 -3
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +7 -0
- package/dist/delivery-reconciliation.js +9 -1
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/dialog-screen-text.d.ts +16 -0
- package/dist/dialog-screen-text.js +51 -0
- package/dist/dialog-screen-text.js.map +1 -0
- package/dist/env-file.d.ts +2 -0
- package/dist/env-file.js +13 -8
- package/dist/env-file.js.map +1 -1
- package/dist/export-import.d.ts +7 -0
- package/dist/export-import.js +44 -10
- package/dist/export-import.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -0
- package/dist/fleet-manager.d.ts +172 -12
- package/dist/fleet-manager.js +897 -139
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-yaml-patch.d.ts +3 -0
- package/dist/fleet-yaml-patch.js +103 -0
- package/dist/fleet-yaml-patch.js.map +1 -0
- package/dist/general-knowledge/skills/concepts/SKILL.md +393 -0
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +2 -1
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +2 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +1 -1
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +14 -4
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/install-stream.d.ts +53 -0
- package/dist/install-stream.js +134 -0
- package/dist/install-stream.js.map +1 -0
- package/dist/instance-config-impact.js +1 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +22 -2
- package/dist/instance-lifecycle.js +103 -19
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-topic-delete.d.ts +77 -0
- package/dist/instance-topic-delete.js +123 -0
- package/dist/instance-topic-delete.js.map +1 -0
- package/dist/instructions.d.ts +2 -2
- package/dist/instructions.js +2 -2
- package/dist/instructions.js.map +1 -1
- package/dist/interaction-observation.d.ts +1 -0
- package/dist/interaction-observation.js +1 -1
- package/dist/interaction-observation.js.map +1 -1
- package/dist/kiro-engine-status.d.ts +11 -0
- package/dist/kiro-engine-status.js +6 -0
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-resume-summary.d.ts +37 -0
- package/dist/kiro-resume-summary.js +85 -0
- package/dist/kiro-resume-summary.js.map +1 -0
- package/dist/locale.js +130 -6
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +30 -0
- package/dist/log-service.js +36 -3
- package/dist/log-service.js.map +1 -1
- package/dist/log-steps.d.ts +4 -3
- package/dist/log-steps.js +32 -7
- package/dist/log-steps.js.map +1 -1
- package/dist/logger.d.ts +12 -0
- package/dist/logger.js +43 -1
- package/dist/logger.js.map +1 -1
- package/dist/login-controller.js +9 -1
- package/dist/login-controller.js.map +1 -1
- package/dist/login-flows.d.ts +2 -0
- package/dist/login-flows.js +5 -2
- package/dist/login-flows.js.map +1 -1
- package/dist/login-manager.d.ts +6 -0
- package/dist/login-manager.js +10 -1
- package/dist/login-manager.js.map +1 -1
- package/dist/missed-offline.d.ts +25 -0
- package/dist/missed-offline.js +79 -0
- package/dist/missed-offline.js.map +1 -0
- package/dist/needs-you-hub.d.ts +6 -1
- package/dist/needs-you-hub.js +31 -8
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +22 -2
- package/dist/needs-you.js +17 -3
- package/dist/needs-you.js.map +1 -1
- package/dist/next-steps.d.ts +12 -2
- package/dist/next-steps.js +19 -3
- package/dist/next-steps.js.map +1 -1
- package/dist/office-share-page.d.ts +1 -1
- package/dist/office-share-page.js +6 -2
- package/dist/office-share-page.js.map +1 -1
- package/dist/office-share-service.d.ts +57 -0
- package/dist/office-share-service.js +76 -11
- package/dist/office-share-service.js.map +1 -1
- package/dist/office-share.d.ts +8 -0
- package/dist/office-share.js +34 -0
- package/dist/office-share.js.map +1 -1
- package/dist/outbound-handlers.js +59 -3
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +1 -0
- package/dist/outbound-schemas.js +10 -4
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/package-preimage.js +27 -2
- package/dist/package-preimage.js.map +1 -1
- package/dist/page-share.d.ts +122 -0
- package/dist/page-share.js +199 -0
- package/dist/page-share.js.map +1 -0
- package/dist/public-preview.d.ts +4 -0
- package/dist/public-preview.js +5 -4
- package/dist/public-preview.js.map +1 -1
- package/dist/public-web-gateway.js +5 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/queued-handoffs.d.ts +33 -0
- package/dist/queued-handoffs.js +75 -0
- package/dist/queued-handoffs.js.map +1 -0
- package/dist/quickstart-api.d.ts +5 -0
- package/dist/quickstart-api.js +1 -1
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +40 -0
- package/dist/quickstart.js +174 -28
- package/dist/quickstart.js.map +1 -1
- package/dist/remote-card-answer.js +2 -0
- package/dist/remote-card-answer.js.map +1 -1
- package/dist/remote-card-prompt.js +4 -2
- package/dist/remote-card-prompt.js.map +1 -1
- package/dist/reply-buttons-controller.js +10 -0
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/scheduler/db.d.ts +2 -1
- package/dist/scheduler/db.js +23 -9
- package/dist/scheduler/db.js.map +1 -1
- package/dist/selection-card.d.ts +20 -0
- package/dist/selection-card.js +202 -0
- package/dist/selection-card.js.map +1 -0
- package/dist/settings-api.d.ts +13 -0
- package/dist/settings-api.js +16 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +5 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +2 -0
- package/dist/settings-effect.js.map +1 -1
- package/dist/setup-host.js +2 -2
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +2 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/stall-reporter.d.ts +21 -0
- package/dist/stall-reporter.js +82 -0
- package/dist/stall-reporter.js.map +1 -0
- package/dist/tmux-control.d.ts +2 -2
- package/dist/tmux-control.js +4 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.d.ts +6 -3
- package/dist/tmux-exec-helper.js +115 -53
- package/dist/tmux-exec-helper.js.map +1 -1
- package/dist/tmux-manager.d.ts +6 -0
- package/dist/tmux-manager.js +17 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +5 -2
- package/dist/tool-permissions.js +6 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.d.ts +2 -0
- package/dist/tool-progress.js +19 -3
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-commands.js +4 -0
- package/dist/topic-commands.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +4 -0
- package/dist/tunnel/cloudflared-install.js +20 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +8 -1
- package/dist/tunnel/cloudflared.js +34 -6
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/lease.d.ts +3 -3
- package/dist/tunnel/lease.js +23 -19
- package/dist/tunnel/lease.js.map +1 -1
- package/dist/tunnel/manager.js +6 -7
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/ui/chat-store.js +28 -4
- package/dist/ui/chat-strings.js +40 -4
- package/dist/ui/chat-thread.js +52 -10
- package/dist/ui/fleet-canvas.js +4 -3
- package/dist/ui/fleet-office-model.js +55 -22
- package/dist/ui/fleet-office-overview.js +6 -38
- package/dist/ui/fleet-office-pack.js +4 -3
- package/dist/ui/fleet-office-skin.js +114 -21
- package/dist/ui/fleet-office-store.js +5 -0
- package/dist/ui/fleet-office-zones.js +2 -2
- package/dist/ui/fleet-office.js +41 -9
- package/dist/ui/fleet-usage.js +90 -27
- package/dist/ui/page-share-dialog.js +191 -0
- package/dist/ui/panel-chat.js +16 -0
- package/dist/ui/panel-log.js +7 -1
- package/dist/ui/panel-needs.js +17 -8
- package/dist/ui/panel-notices.js +98 -0
- package/dist/ui/panel-settings.js +9 -2
- package/dist/ui/preview-pages.js +41 -0
- package/dist/ui/preview-panel-actions.js +161 -0
- package/dist/ui/preview-panel.js +209 -28
- package/dist/ui/preview-versions.js +155 -0
- package/dist/ui/preview.js +88 -3
- package/dist/ui/settings-registry.js +1 -0
- package/dist/ui/settings-strings.js +6 -2
- package/dist/ui/shared/app-i18n.js +6 -6
- package/dist/ui/shared/app-needs.js +1 -1
- package/dist/ui/shared/app-route.js +4 -0
- package/dist/ui/shared/app-shell.js +9 -5
- package/dist/ui/shared/app-store.js +71 -1
- package/dist/ui/shared/app-stream.js +27 -1
- package/dist/ui/shared/app.css +94 -4
- package/dist/ui/shared/app.js +22 -1
- package/dist/ui/shared/office/guild.png +0 -0
- package/dist/ui/shared/office/school.png +0 -0
- package/dist/ui/shared/panel-view.js +339 -17
- package/dist/ui/shared/signin.js +12 -1
- package/dist/ui/shared/ui-icons.js +3 -0
- package/dist/ui/shared/usage-dialog.js +18 -1
- package/dist/ui/shared/view-history.css +17 -0
- package/dist/ui/shared/view-history.js +438 -0
- package/dist/ui/shared/view-strings.js +42 -0
- package/dist/ui/shared/web-authorize.js +3 -1
- package/dist/unattended-install.d.ts +6 -0
- package/dist/unattended-install.js +79 -0
- package/dist/unattended-install.js.map +1 -0
- package/dist/usage/capacity.d.ts +69 -0
- package/dist/usage/capacity.js +119 -0
- package/dist/usage/capacity.js.map +1 -0
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +3 -0
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/profile-timeline.d.ts +16 -0
- package/dist/usage/profile-timeline.js +58 -0
- package/dist/usage/profile-timeline.js.map +1 -0
- package/dist/usage/quota-history.d.ts +43 -0
- package/dist/usage/quota-history.js +168 -0
- package/dist/usage/quota-history.js.map +1 -0
- package/dist/usage/usage-api.d.ts +31 -0
- package/dist/usage/usage-api.js +80 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.d.ts +25 -1
- package/dist/usage-report.js +55 -4
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.d.ts +4 -1
- package/dist/usage-rollup.js +12 -3
- package/dist/usage-rollup.js.map +1 -1
- package/dist/view-api.d.ts +31 -0
- package/dist/view-api.js +186 -41
- package/dist/view-api.js.map +1 -1
- package/dist/view-history.d.ts +84 -0
- package/dist/view-history.js +116 -0
- package/dist/view-history.js.map +1 -0
- package/dist/web-api.d.ts +32 -0
- package/dist/web-api.js +195 -5
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.js +7 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-chat-history.d.ts +20 -0
- package/dist/web-chat-history.js +21 -0
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-guest-access.js +5 -1
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-login.d.ts +6 -3
- package/dist/web-login.js +26 -15
- package/dist/web-login.js.map +1 -1
- package/dist/web-notices.d.ts +51 -0
- package/dist/web-notices.js +118 -0
- package/dist/web-notices.js.map +1 -0
- package/dist/web-office-pack-tools.d.ts +1 -1
- package/dist/web-office-pack-tools.js +1 -1
- package/dist/web-office-pack-tools.js.map +1 -1
- package/dist/web-only-fleet.d.ts +22 -0
- package/dist/web-only-fleet.js +13 -0
- package/dist/web-only-fleet.js.map +1 -0
- package/dist/web-preview.d.ts +32 -3
- package/dist/web-preview.js +52 -19
- package/dist/web-preview.js.map +1 -1
- package/dist/web-session-authorization.d.ts +13 -2
- package/dist/web-session-authorization.js +10 -3
- package/dist/web-session-authorization.js.map +1 -1
- package/dist/web-session.d.ts +12 -0
- package/dist/web-session.js +22 -8
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +3 -1
- package/dist/web-settings-patch.js +4 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-shell-routes.d.ts +2 -0
- package/dist/web-shell-routes.js +3 -0
- package/dist/web-shell-routes.js.map +1 -1
- package/launcher/agend-install.cjs +16 -2
- package/launcher/private-home.cjs +1 -1
- package/package.json +1 -1
|
@@ -62,6 +62,10 @@ Close it with **Close public link** → **Close link (signs public browsers out)
|
|
|
62
62
|
A public link is limited on purpose: no live stream (the page polls), no custom CSS, and Settings → Access & security, Look,
|
|
63
63
|
schedule edits and preference writes are refused. HTML previews work over it through a second tunnel
|
|
64
64
|
of their own (`web.preview_on_public_link`, default on).
|
|
65
|
+
HTML previews cannot load from the network; Settings → Web dashboard → **HTML previews may load libraries from cdnjs /
|
|
66
|
+
jsDelivr** (`web.preview_cdn`, default off) allows scripts, styles and fonts from cdnjs `/ajax/libs/` and jsDelivr `/npm/`
|
|
67
|
+
only — those requests leave the machine. The preview panel steps between a page's versions (‹ v2/3 ›, **Changes**),
|
|
68
|
+
lists every page (**Pages (N)**), shows a page at phone or tablet width, and goes full screen.
|
|
65
69
|
|
|
66
70
|
**Sessions.**
|
|
67
71
|
- Local: 48 h from sign-in and 48 h unused (`web.session.local.absolute_hours` / `idle_hours`, 1–720). Background
|
|
@@ -75,7 +79,7 @@ of their own (`web.preview_on_public_link`, default on).
|
|
|
75
79
|
- `/web revoke` (in chat) signs every browser out, withdraws an unused code and closes the public link.
|
|
76
80
|
|
|
77
81
|
**`/view` without signing in.** `web.view_access`: `open` (default) or `session`. With `open`, anyone who can reach
|
|
78
|
-
the local address sees every instance's live terminal and the roster (status, context %, model, effort, backend,
|
|
82
|
+
the local address sees every instance's live terminal (for Claude Code with its earlier conversation, as below) and the roster (status, context %, model, effort, backend,
|
|
79
83
|
tags, name, description, avatars, cards) and the usage meters — read only; editing says "Sign in to edit". Over a
|
|
80
84
|
public link `/view` always needs sign-in.
|
|
81
85
|
|
|
@@ -97,7 +101,7 @@ They can chat there unless `web.guests.chat` is false, run only the commands the
|
|
|
97
101
|
agent's channel (on the web: `/ctx`, `/steer`, `/btw`, `/cancel`; anything else is refused), open the usage panel, and the
|
|
98
102
|
agent sees them as `via web (guest)`. A guest's app has no Fleet, Settings or Needs you. Each person is **Chat** (the
|
|
99
103
|
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
|
|
104
|
+
also gets a read-only **View** of those agents (no typing; 2 reads a second, 2 agents at once; for Claude Code with its earlier conversation) and **search** of the chat
|
|
101
105
|
messages it can already see (6 a minute, 20 results; no messages between agents, tasks or settings). To invite someone: turn it
|
|
102
106
|
on, grant them their agents in Settings → Access & security → Guests, and press **Send sign-in code** (or tell them to
|
|
103
107
|
send `/web`). The Guests section is not in Settings over the public link.
|
|
@@ -287,8 +291,9 @@ buttons in General); every change is logged and told in General. **Style** (per
|
|
|
287
291
|
**Studio** (one scene — Work, Lounge, Help desk, Nap corner — where each instance walks to the area for its state),
|
|
288
292
|
**Cozy** (#2631: the same in a warm pixel-art office drawn as one picture; its notice board says a skin pack can
|
|
289
293
|
restyle it; the default for a browser that has not picked a style and for a new office — a saved office keeps its
|
|
290
|
-
own)
|
|
291
|
-
|
|
294
|
+
own), **Guild** and **School** (#2947: two more pictures on the Cozy's arrangement — an adventurers' guild hall and a
|
|
295
|
+
classroom) or an uploaded pack; one the page cannot load is drawn as Desks with a note. On a stored office in Studio,
|
|
296
|
+
Cozy, Guild, School or a pack,
|
|
292
297
|
**Edit layout** (admin only) shows a 1280×720 coordinate grid and lets you drag seats, furniture, the door, the mail drop
|
|
293
298
|
(an envelope: where letters from other offices land; dashed on a pack without a `mailDrop`, #2736) and
|
|
294
299
|
waypoints (or Tab to one and use the arrow keys, Shift for 10), add or remove waypoints and join or unjoin
|
|
@@ -378,6 +383,11 @@ to that instance's Log).
|
|
|
378
383
|
|
|
379
384
|
**Chat | View | Log | Details** switch at the top of an instance.
|
|
380
385
|
- **View** — the live terminal (read only), the identity card, and **Edit profile** (or **Sign in to edit** when signed out).
|
|
386
|
+
Scrolling up (or **Earlier output**) shows what scrolled off: tmux's scrollback; for Claude Code, its earlier
|
|
387
|
+
conversation from its transcript, drawn in Claude's own terminal style above the live screen under **History above**
|
|
388
|
+
(long output folded, click to expand; older pages near the top; the latest ~1000 steps), tool results included.
|
|
389
|
+
Everyone who may open the View sees it — a signed-in admin, an anonymous reader under `view_access: open`, a Trusted
|
|
390
|
+
guest for its agents (the user's decision on #3069); the Log tab's switch plays no part.
|
|
381
391
|
- **Log** — [the Log tab](#the-log-tab).
|
|
382
392
|
- **Details** — Configuration (display name, description, directory, bound to, tags; "Read only — change it in
|
|
383
393
|
Settings." with **Edit in Settings**), Runtime (backend, model, effort, cost, context, 5 h and 7 d rate), Recent
|
|
@@ -42,4 +42,4 @@ Do not put user-facing results only in terminal text; the fleet report is the de
|
|
|
42
42
|
|
|
43
43
|
## Relayed human approval
|
|
44
44
|
|
|
45
|
-
For an irreversible action based on relayed consent, request an explicit `forwards` edge for the original human `verification_id`, then read its original content and origin with `delivery_status`. Each hop needs a forward; a peer's summary or a mentioned ID grants nothing. When you relay it, put the ID in `forwards` (even if your loaded copy of the tool's schema lacks the parameter: the server accepts it), not in the text. Require delivered and an owned proof_kind, and verify the actual platform/adapter/actor plus the exact resource. Hidden/expired/uncertain receipts are not consent and must not trigger a resend. A web-chat message (`[user:<name> via web, id:…]`) is that person: their sign-in code went to their own Discord or Telegram account. Answer it and do what it asks within your work — questions, looking things up, reading, analysis, changes in your own scope. Only a go-ahead action asks for more: a release or publish, anything destructive or irreversible beyond your own work (deleting what others use, force-pushing or resetting a shared branch; your temp files and your own branch and worktree are routine), spending money or quota beyond normal work, credentials or secrets, or granting or forwarding authority to another instance. For these an open browser is not proof of the account, so the account must stand behind it: a Discord or Telegram receipt, or a `via web (verified)` one — read it with `delivery_status`: `authority.kind: web-verified`, its person `authority.actor` (adapter and user id), checked like a Discord or Telegram message (delivered, an owned proof_kind, the original content, that actor) and forwarded the same way. A guest (`via web (guest)`) was let in only to chat: talk with them there, and take nothing they ask as the admin's. Plain `via web`, a guest, and authority since revoked (`authority.kind: none`) are not a go-ahead; nor is a reviewer's APPROVE. See the cross-instance-messaging skill.
|
|
45
|
+
For an irreversible action based on relayed consent, request an explicit `forwards` edge for the original human `verification_id`, then read its original content and origin with `delivery_status`. Each hop needs a forward; a peer's summary or a mentioned ID grants nothing. When you relay it, put the ID in `forwards` (even if your loaded copy of the tool's schema lacks the parameter: the server accepts it), not in the text. Put verification and message ids in the `forwards` field only; do not repeat them in the message text, because people see that text in the topic notices. Require delivered and an owned proof_kind, and verify the actual platform/adapter/actor plus the exact resource. Hidden/expired/uncertain receipts are not consent and must not trigger a resend. A web-chat message (`[user:<name> via web, id:…]`) is that person: their sign-in code went to their own Discord or Telegram account. Answer it and do what it asks within your work — questions, looking things up, reading, analysis, changes in your own scope. Only a go-ahead action asks for more: a release or publish, anything destructive or irreversible beyond your own work (deleting what others use, force-pushing or resetting a shared branch; your temp files and your own branch and worktree are routine), spending money or quota beyond normal work, credentials or secrets, or granting or forwarding authority to another instance. For these an open browser is not proof of the account, so the account must stand behind it: a Discord or Telegram receipt, or a `via web (verified)` one — read it with `delivery_status`: `authority.kind: web-verified`, its person `authority.actor` (adapter and user id), checked like a Discord or Telegram message (delivered, an owned proof_kind, the original content, that actor) and forwarded the same way. On a web-only fleet (no Discord or Telegram connection) that person is the host operator, signed in with `agend web --code` on the AgEnD computer itself: a verified receipt names `authority.actor` adapter `host`, user `operator`. A guest (`via web (guest)`) was let in only to chat: talk with them there, and take nothing they ask as the admin's. Plain `via web`, a guest, and authority since revoked (`authority.kind: none`) are not a go-ahead; nor is a reviewer's APPROVE. See the cross-instance-messaging skill.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export declare const INSTALL_STREAM_LINES = 15;
|
|
2
|
+
export declare const INSTALL_STREAM_BYTES = 1500;
|
|
3
|
+
export declare const INSTALL_STREAM_EDIT_MIN_MS = 5000;
|
|
4
|
+
export interface InstallStreamSink {
|
|
5
|
+
/** Post the message (its plain status line); its id is what the edits change. */
|
|
6
|
+
send(text: string): Promise<{
|
|
7
|
+
messageId: string;
|
|
8
|
+
} | undefined>;
|
|
9
|
+
/** Replace the message's text: a code block under the status line, in the stream's style (markdown or html). */
|
|
10
|
+
edit(messageId: string, text: string): Promise<void>;
|
|
11
|
+
warn?(message: string, err: unknown): void;
|
|
12
|
+
}
|
|
13
|
+
export interface InstallStreamClock {
|
|
14
|
+
now(): number;
|
|
15
|
+
setTimeout(fn: () => void, ms: number): unknown;
|
|
16
|
+
clearTimeout(handle: unknown): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The window's own text, without what tmux adds to it: a dead pane's "Pane is dead (status N, <date>)" line (drawn on
|
|
20
|
+
* the bottom row, below a screenful of blank rows), and runs of blank rows collapsed to one — else the last lines of a
|
|
21
|
+
* finished install would be blanks and that line.
|
|
22
|
+
*/
|
|
23
|
+
export declare function installerOutput(pane: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* How a frame is written: "markdown" (a fenced code block — Discord) or "html" (Telegram's own `<pre>`: its markdown
|
|
26
|
+
* conversion keeps a fence as literal backticks).
|
|
27
|
+
*/
|
|
28
|
+
export type InstallFrameStyle = "markdown" | "html";
|
|
29
|
+
/** The window's last lines as a code block under a status line; just the status line when there are none. */
|
|
30
|
+
export declare function renderInstallFrame(header: string, pane: string, style?: InstallFrameStyle): string;
|
|
31
|
+
export declare class InstallStream {
|
|
32
|
+
private readonly sink;
|
|
33
|
+
private readonly header;
|
|
34
|
+
private readonly clock;
|
|
35
|
+
private readonly editMinMs;
|
|
36
|
+
private readonly style;
|
|
37
|
+
private messageId;
|
|
38
|
+
private shown;
|
|
39
|
+
private wanted;
|
|
40
|
+
private pane;
|
|
41
|
+
private lastAt;
|
|
42
|
+
private timer;
|
|
43
|
+
private inFlight;
|
|
44
|
+
private closed;
|
|
45
|
+
constructor(sink: InstallStreamSink, header: string, clock?: InstallStreamClock, editMinMs?: number, style?: InstallFrameStyle);
|
|
46
|
+
/** A new capture of the window. Never awaits; nothing is posted until the window shows something. */
|
|
47
|
+
update(pane: string): void;
|
|
48
|
+
/** Stop editing and write the final frame (the last capture, unless a later one is given) over the message. */
|
|
49
|
+
finish(header: string, pane?: string): Promise<void>;
|
|
50
|
+
private schedule;
|
|
51
|
+
/** `header`: the frame's status line as plain text — what a new message is first posted as. */
|
|
52
|
+
private write;
|
|
53
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M-2281 (#2980): the installer's output, live, in the chat that asked `/login` to install a CLI. No page shows the
|
|
3
|
+
* `agend-login-<backend>` window (it is not an instance), so the chat is where its progress is seen.
|
|
4
|
+
*
|
|
5
|
+
* One message, edited in place: the last INSTALL_STREAM_LINES lines of the window, ANSI stripped and secrets masked
|
|
6
|
+
* (dialogScreenText — the whole capture is masked before its bottom is kept), under INSTALL_STREAM_BYTES so it fits
|
|
7
|
+
* a Discord (2000) or Telegram (4096) message. At most one edit per INSTALL_STREAM_EDIT_MIN_MS, one in flight, none
|
|
8
|
+
* for an unchanged frame. The frames come from the session's own poll capture — nothing here reads the pane.
|
|
9
|
+
*
|
|
10
|
+
* Fire-and-forget from the poll: update() only records the frame and arms a timer. finish() stops the edits and
|
|
11
|
+
* writes the final frame (success / failed / timed out / cancelled) over the same message.
|
|
12
|
+
*/
|
|
13
|
+
import { dialogScreenText } from "./dialog-screen-text.js";
|
|
14
|
+
export const INSTALL_STREAM_LINES = 15;
|
|
15
|
+
export const INSTALL_STREAM_BYTES = 1_500;
|
|
16
|
+
export const INSTALL_STREAM_EDIT_MIN_MS = 5_000;
|
|
17
|
+
const realClock = {
|
|
18
|
+
now: () => performance.now(),
|
|
19
|
+
setTimeout: (fn, ms) => { const t = setTimeout(fn, ms); t.unref?.(); return t; },
|
|
20
|
+
clearTimeout: handle => clearTimeout(handle),
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The window's own text, without what tmux adds to it: a dead pane's "Pane is dead (status N, <date>)" line (drawn on
|
|
24
|
+
* the bottom row, below a screenful of blank rows), and runs of blank rows collapsed to one — else the last lines of a
|
|
25
|
+
* finished install would be blanks and that line.
|
|
26
|
+
*/
|
|
27
|
+
export function installerOutput(pane) {
|
|
28
|
+
return pane.replace(/^Pane is dead\b.*$/gm, "").replace(/\n(?:[ \t]*\n){2,}/g, "\n\n");
|
|
29
|
+
}
|
|
30
|
+
const escapeHtml = (s) => s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
31
|
+
/** The window's last lines as a code block under a status line; just the status line when there are none. */
|
|
32
|
+
export function renderInstallFrame(header, pane, style = "markdown") {
|
|
33
|
+
const body = dialogScreenText(installerOutput(pane), { lines: INSTALL_STREAM_LINES, bytes: INSTALL_STREAM_BYTES });
|
|
34
|
+
if (!body)
|
|
35
|
+
return style === "html" ? escapeHtml(header) : header;
|
|
36
|
+
// HTML: everything escaped, the only tag is ours. Markdown: a fence inside the output would close the block early,
|
|
37
|
+
// so its backticks become look-alikes.
|
|
38
|
+
return style === "html"
|
|
39
|
+
? `${escapeHtml(header)}\n<pre>${escapeHtml(body)}</pre>`
|
|
40
|
+
: `${header}\n\`\`\`\n${body.replace(/`/g, "ˋ")}\n\`\`\``;
|
|
41
|
+
}
|
|
42
|
+
export class InstallStream {
|
|
43
|
+
sink;
|
|
44
|
+
header;
|
|
45
|
+
clock;
|
|
46
|
+
editMinMs;
|
|
47
|
+
style;
|
|
48
|
+
messageId;
|
|
49
|
+
shown = "";
|
|
50
|
+
wanted = "";
|
|
51
|
+
pane = "";
|
|
52
|
+
lastAt = Number.NEGATIVE_INFINITY;
|
|
53
|
+
timer = null;
|
|
54
|
+
inFlight = null;
|
|
55
|
+
closed = false;
|
|
56
|
+
constructor(sink, header, clock = realClock, editMinMs = INSTALL_STREAM_EDIT_MIN_MS, style = "markdown") {
|
|
57
|
+
this.sink = sink;
|
|
58
|
+
this.header = header;
|
|
59
|
+
this.clock = clock;
|
|
60
|
+
this.editMinMs = editMinMs;
|
|
61
|
+
this.style = style;
|
|
62
|
+
}
|
|
63
|
+
/** A new capture of the window. Never awaits; nothing is posted until the window shows something. */
|
|
64
|
+
update(pane) {
|
|
65
|
+
if (this.closed)
|
|
66
|
+
return;
|
|
67
|
+
this.pane = pane;
|
|
68
|
+
const frame = renderInstallFrame(this.header, pane, this.style);
|
|
69
|
+
if (frame === renderInstallFrame(this.header, "", this.style) && this.messageId === undefined)
|
|
70
|
+
return;
|
|
71
|
+
this.wanted = frame;
|
|
72
|
+
this.schedule();
|
|
73
|
+
}
|
|
74
|
+
/** Stop editing and write the final frame (the last capture, unless a later one is given) over the message. */
|
|
75
|
+
async finish(header, pane) {
|
|
76
|
+
this.closed = true;
|
|
77
|
+
if (this.timer !== null) {
|
|
78
|
+
this.clock.clearTimeout(this.timer);
|
|
79
|
+
this.timer = null;
|
|
80
|
+
}
|
|
81
|
+
await this.inFlight;
|
|
82
|
+
const frame = renderInstallFrame(header, pane ?? this.pane, this.style);
|
|
83
|
+
// Nothing was ever shown: the result message says it all.
|
|
84
|
+
if (this.messageId === undefined && frame === renderInstallFrame(header, "", this.style))
|
|
85
|
+
return;
|
|
86
|
+
// The final edit keeps the rate too: it waits out what is left of the interval rather than skip it.
|
|
87
|
+
const wait = this.lastAt + this.editMinMs - this.clock.now();
|
|
88
|
+
if (wait > 0)
|
|
89
|
+
await new Promise(resolve => this.clock.setTimeout(resolve, wait));
|
|
90
|
+
await this.write(frame, header);
|
|
91
|
+
}
|
|
92
|
+
schedule() {
|
|
93
|
+
if (this.timer !== null || this.inFlight || this.wanted === this.shown)
|
|
94
|
+
return;
|
|
95
|
+
const delay = Math.max(0, this.lastAt + this.editMinMs - this.clock.now());
|
|
96
|
+
this.timer = this.clock.setTimeout(() => {
|
|
97
|
+
this.timer = null;
|
|
98
|
+
if (this.closed)
|
|
99
|
+
return;
|
|
100
|
+
const frame = this.wanted;
|
|
101
|
+
this.inFlight = this.write(frame, this.header).finally(() => {
|
|
102
|
+
this.inFlight = null;
|
|
103
|
+
if (!this.closed)
|
|
104
|
+
this.schedule();
|
|
105
|
+
});
|
|
106
|
+
}, delay);
|
|
107
|
+
}
|
|
108
|
+
/** `header`: the frame's status line as plain text — what a new message is first posted as. */
|
|
109
|
+
async write(frame, header) {
|
|
110
|
+
if (frame === this.shown)
|
|
111
|
+
return;
|
|
112
|
+
this.lastAt = this.clock.now();
|
|
113
|
+
try {
|
|
114
|
+
if (this.messageId === undefined) {
|
|
115
|
+
// Posted as its plain status line, and every frame goes in by an edit: the message is then one kind from start
|
|
116
|
+
// to end (Telegram posts a text with a code block as a rich message, but edits text with HTML).
|
|
117
|
+
const sent = await this.sink.send(header);
|
|
118
|
+
if (!sent?.messageId)
|
|
119
|
+
return;
|
|
120
|
+
this.messageId = sent.messageId;
|
|
121
|
+
await this.sink.edit(this.messageId, frame);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
await this.sink.edit(this.messageId, frame);
|
|
125
|
+
}
|
|
126
|
+
this.shown = frame;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
// A refused edit (rate limit, a reconnect) is tried again with the next frame, after the interval.
|
|
130
|
+
this.sink.warn?.("install output edit failed", err);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=install-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-stream.js","sourceRoot":"","sources":["../src/install-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,6 +97,7 @@ const FLEET_FIELD_IMPACTS = {
|
|
|
97
97
|
"web.log_tab": "now",
|
|
98
98
|
"web.usage_report_on_public_link": "now",
|
|
99
99
|
"web.office_levels": "now",
|
|
100
|
+
"web.preview_cdn": "now",
|
|
100
101
|
"web.public_link.allow_public": "now",
|
|
101
102
|
"web.public_link.ttl_minutes": "now",
|
|
102
103
|
"web.public_link.protocol": "now",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-config-impact.js","sourceRoot":"","sources":["../src/instance-config-impact.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instance-config-impact.js","sourceRoot":"","sources":["../src/instance-config-impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SettingsExecution } from "./settings-transaction.js";
|
|
2
2
|
import type { InstanceConfig, FleetConfig } from "./types.js";
|
|
3
|
+
import type { TopicDeleteOutcome } from "./instance-topic-delete.js";
|
|
3
4
|
import { RoutingEngine } from "./routing-engine.js";
|
|
4
5
|
import type { Logger } from "./logger.js";
|
|
5
6
|
import type { IpcClient } from "./channel/ipc-bridge.js";
|
|
@@ -41,6 +42,11 @@ export interface BackendInstallationInfo {
|
|
|
41
42
|
export declare const BACKEND_INSTALLATION_INFO: Readonly<Record<string, BackendInstallationInfo>>;
|
|
42
43
|
/** Check one executable using the same PATH visible to the fleet process. */
|
|
43
44
|
export declare function checkBinaryInstalled(binary: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* M-2281 (#2980): the same check without holding the fleet loop — for paths a chat click runs (`/login`'s install
|
|
47
|
+
* routing), where a slow PATH (WSL's /mnt/c entries) would otherwise stall every adapter for up to the timeout.
|
|
48
|
+
*/
|
|
49
|
+
export declare function checkBinaryInstalledAsync(binary: string): Promise<boolean>;
|
|
44
50
|
/**
|
|
45
51
|
* Return why an instance daemon PID must not receive SIGTERM, or null when the
|
|
46
52
|
* stale-process cleanup may proceed. daemon.pid historically stores the shared
|
|
@@ -52,6 +58,7 @@ export declare function getUnsafeInstanceDaemonPidReason(pid: number, dataDir: s
|
|
|
52
58
|
* FleetManager implements this.
|
|
53
59
|
*/
|
|
54
60
|
export interface LifecycleContext {
|
|
61
|
+
readonly agentCredentials?: Pick<import("./agent-credentials.js").AgentCredentials, "issue" | "invalidate">;
|
|
55
62
|
readonly fleetConfig: FleetConfig | null;
|
|
56
63
|
readonly logger: Logger;
|
|
57
64
|
readonly dataDir: string;
|
|
@@ -86,8 +93,12 @@ export interface LifecycleContext {
|
|
|
86
93
|
}): Promise<void>;
|
|
87
94
|
connectIpcToInstance(name: string): Promise<void>;
|
|
88
95
|
createForumTopic(topicName: string, adapterId?: string): Promise<number | string>;
|
|
89
|
-
/**
|
|
90
|
-
|
|
96
|
+
/** #2910: no Discord or Telegram connection at all — a new agent gets no topic (it is reached from the dashboard). */
|
|
97
|
+
isWebOnlyFleet?(): boolean;
|
|
98
|
+
/** delete_instance: the removal, then (unless `deleteTopic` is false) the agent's own topic, through its own bot. */
|
|
99
|
+
removeInstanceAndTopic(name: string, authorization: ExplicitInstanceRemoval, opts: {
|
|
100
|
+
deleteTopic: boolean;
|
|
101
|
+
}): Promise<TopicDeleteOutcome>;
|
|
91
102
|
/**
|
|
92
103
|
* A bound delete for the world `adapterId` selects, captured by the caller
|
|
93
104
|
* BEFORE awaiting createForumTopic. Rollback must use exactly this — never
|
|
@@ -128,6 +139,8 @@ export interface LifecycleContext {
|
|
|
128
139
|
/** Notify a clean CLI exit and offer an admin-only restart action in General. */
|
|
129
140
|
notifyNormalExit(name: string): Promise<void>;
|
|
130
141
|
notifySessionOomStop?(name: string, unclear?: boolean): Promise<void>;
|
|
142
|
+
/** A pre-launch refusal is still a visible wait when no daemon was published. */
|
|
143
|
+
setKiroCompatibilityHold?(name: string, message: string | null): void;
|
|
131
144
|
/** Tell every General, as an agent, that kiro-cli can no longer run this instance as configured. */
|
|
132
145
|
queueKiroIncompatNotice?(name: string, reason: string): void;
|
|
133
146
|
/** True for a dynamic ClassicBot channel instance (not a fleet topic). */
|
|
@@ -364,6 +377,13 @@ export declare class InstanceLifecycle {
|
|
|
364
377
|
/** Max retries before giving up and pausing. */
|
|
365
378
|
private static readonly CAPACITY_BACKOFF_MAX;
|
|
366
379
|
constructor(ctx: LifecycleContext);
|
|
380
|
+
/** M-2269: the last dialog text logged per instance — the same screen seen again on later scans is not logged again. */
|
|
381
|
+
private readonly lastLoggedScreen;
|
|
382
|
+
/**
|
|
383
|
+
* M-2269: `{ screen }` for a dialog/prompt event's Log row (the daemon already stripped, masked and capped it), or
|
|
384
|
+
* nothing when there is none or it is the same text this instance's Log already has. Bookkeeping only.
|
|
385
|
+
*/
|
|
386
|
+
private screenForLog;
|
|
367
387
|
/** Seed only the Codex daemon replacing a scheduled capacity retry. */
|
|
368
388
|
private applyCapacityBackoffBaseline;
|
|
369
389
|
/**
|
|
@@ -5,12 +5,14 @@ import { existsSync, readFileSync, mkdirSync, realpathSync, writeFileSync, statS
|
|
|
5
5
|
import { ensureInstanceDir } from "./private-dir.js";
|
|
6
6
|
import { assertNoSessionOomStop } from "./session-oom-stop.js";
|
|
7
7
|
import { execFileSync } from "node:child_process";
|
|
8
|
+
import { execFile } from "./child-process.js";
|
|
8
9
|
import { join, basename, dirname, resolve, sep as pathSep } from "node:path";
|
|
9
10
|
import { access } from "node:fs/promises";
|
|
10
11
|
import { getAgendHome, ensureWorkspaceGit } from "./paths.js";
|
|
11
12
|
import { DEFAULT_INSTANCE_CONFIG, getEffectiveInstanceDefaults, getTmuxSession, newInstanceKiroUi } from "./config.js";
|
|
12
13
|
import { readStatuslineModel, uniqueInstanceName } from "./topic-commands.js";
|
|
13
|
-
import {
|
|
14
|
+
import { sanitizeInstanceName } from "./instance-names.js";
|
|
15
|
+
import { isModelCompatible, noteResolvedBinary } from "./backend/types.js";
|
|
14
16
|
import { safeHandler } from "./safe-async.js";
|
|
15
17
|
import { t } from "./locale.js";
|
|
16
18
|
import { interactionCategory } from "./interaction-observation.js";
|
|
@@ -18,7 +20,7 @@ import { EMBEDDED_CREDENTIAL_REMOTE_REPAIR_FAILED, EMBEDDED_CREDENTIAL_REMOTE_WA
|
|
|
18
20
|
import { clearPausedMarker, hasPausedMarker, readPausedAt, readPauseReason, writePausedMarker } from "./pause-marker.js";
|
|
19
21
|
import { reportProviderRateLimit } from "./usage/provider-alerts.js";
|
|
20
22
|
import { isFleetStartCommandLine } from "./fleet-lock.js";
|
|
21
|
-
import { GENERAL_PAUSE_ERROR, isGeneralInstance } from "./general-instance.js";
|
|
23
|
+
import { GENERAL_PAUSE_ERROR, isGeneralInstance, GENERAL_NAME } from "./general-instance.js";
|
|
22
24
|
import { BACKEND_AUTH_CHECKS, checkAuthStatus, LOGIN_FLOWS } from "./login-flows.js";
|
|
23
25
|
import { CHAT_PROFILE_LOGIN_BACKENDS, credentialProfileEnv, credentialProfileLoginCommand } from "./backend/credential-profile.js";
|
|
24
26
|
import { fetchClaudeUsage, fetchCodexUsage } from "./usage/providers.js";
|
|
@@ -64,6 +66,20 @@ export const BACKEND_INSTALLATION_INFO = {
|
|
|
64
66
|
export function checkBinaryInstalled(binary) {
|
|
65
67
|
return measureSyncWork("lifecycle.checkBinaryInstalled", () => checkBinaryInstalledSync(binary));
|
|
66
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* M-2281 (#2980): the same check without holding the fleet loop — for paths a chat click runs (`/login`'s install
|
|
71
|
+
* routing), where a slow PATH (WSL's /mnt/c entries) would otherwise stall every adapter for up to the timeout.
|
|
72
|
+
*/
|
|
73
|
+
export function checkBinaryInstalledAsync(binary) {
|
|
74
|
+
return new Promise(resolve => {
|
|
75
|
+
try {
|
|
76
|
+
execFile("which", [binary], { timeout: 2000 }, err => resolve(!err));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
resolve(false);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
67
83
|
function checkBinaryInstalledSync(binary) {
|
|
68
84
|
try {
|
|
69
85
|
execFileSync("which", [binary], { stdio: "pipe", timeout: 2000 });
|
|
@@ -321,6 +337,20 @@ export class InstanceLifecycle {
|
|
|
321
337
|
constructor(ctx) {
|
|
322
338
|
this.ctx = ctx;
|
|
323
339
|
}
|
|
340
|
+
/** M-2269: the last dialog text logged per instance — the same screen seen again on later scans is not logged again. */
|
|
341
|
+
lastLoggedScreen = new Map();
|
|
342
|
+
/**
|
|
343
|
+
* M-2269: `{ screen }` for a dialog/prompt event's Log row (the daemon already stripped, masked and capped it), or
|
|
344
|
+
* nothing when there is none or it is the same text this instance's Log already has. Bookkeeping only.
|
|
345
|
+
*/
|
|
346
|
+
screenForLog(name, screen) {
|
|
347
|
+
if (typeof screen !== "string" || !screen)
|
|
348
|
+
return {};
|
|
349
|
+
if (this.lastLoggedScreen.get(name) === screen)
|
|
350
|
+
return {};
|
|
351
|
+
this.lastLoggedScreen.set(name, screen);
|
|
352
|
+
return { screen };
|
|
353
|
+
}
|
|
324
354
|
/** Seed only the Codex daemon replacing a scheduled capacity retry. */
|
|
325
355
|
applyCapacityBackoffBaseline(name, backendName, daemon) {
|
|
326
356
|
if (backendName !== "codex")
|
|
@@ -651,6 +681,24 @@ export class InstanceLifecycle {
|
|
|
651
681
|
}
|
|
652
682
|
this.ctx.notifyInstanceTopic(name, t("delivery.cancelled_unsent", messages.length, name));
|
|
653
683
|
}, this.ctx.logger, `daemon.human_messages_cancelled[${name}]`));
|
|
684
|
+
// #3030: messages handed to the busy CLI's own queue that it never took (it went idle without them), or that a
|
|
685
|
+
// restart left unverifiable (its transcript could not be read, so they were not sent again). Each is marked ❌ and
|
|
686
|
+
// the person is told once — never a silent ✅.
|
|
687
|
+
daemon.on("human_handoffs_unsettled", safeHandler((data) => {
|
|
688
|
+
const messages = Array.isArray(data?.messages) ? data.messages : [];
|
|
689
|
+
if (!messages.length)
|
|
690
|
+
return;
|
|
691
|
+
const reason = data.reason === "unverifiable" ? "unverifiable" : "not-taken";
|
|
692
|
+
this.ctx.eventLog?.insert(name, "handoffs_unsettled", { reason, count: messages.length });
|
|
693
|
+
this.ctx.logger.warn({ name, reason, count: messages.length }, "Queued messages not taken by the CLI — telling the person");
|
|
694
|
+
for (const m of messages) {
|
|
695
|
+
if (this.ctx.finishDeliveryStatus)
|
|
696
|
+
this.ctx.finishDeliveryStatus(name, m.chatId, m.messageId, "failed", m.threadId);
|
|
697
|
+
else
|
|
698
|
+
this.ctx.reactMessageStatus(name, m.chatId, m.messageId, "failed", m.threadId);
|
|
699
|
+
}
|
|
700
|
+
this.ctx.notifyInstanceTopic(name, t(reason === "unverifiable" ? "delivery.handoff_unverified_after_restart" : "delivery.handoff_not_taken", messages.length, name));
|
|
701
|
+
}, this.ctx.logger, `daemon.human_handoffs_unsettled[${name}]`));
|
|
654
702
|
}
|
|
655
703
|
attachIncidentHandlers(name, daemon) {
|
|
656
704
|
daemon.on("capacity_nudge_cancelled", safeHandler((data) => {
|
|
@@ -936,7 +984,7 @@ export class InstanceLifecycle {
|
|
|
936
984
|
// position, so the human must LOOK and pick the option explicitly — no
|
|
937
985
|
// fixed key sequence; a known dialog whose auto-dismiss did not take gets
|
|
938
986
|
// the keys we would have pressed.
|
|
939
|
-
this.ctx.eventLog?.insert(name, "dialog_parked", { description: data.description, holdOnly: data.holdOnly });
|
|
987
|
+
this.ctx.eventLog?.insert(name, "dialog_parked", { description: data.description, holdOnly: data.holdOnly, ...this.screenForLog(name, data.screen) });
|
|
940
988
|
this.ctx.logger.warn({ name, description: data.description, holdOnly: data.holdOnly }, "Instance is parked on a CLI dialog — not auto-answering");
|
|
941
989
|
if (this.ctx.isPlannedRestart())
|
|
942
990
|
return;
|
|
@@ -982,7 +1030,7 @@ export class InstanceLifecycle {
|
|
|
982
1030
|
// #2822: a usage-limit hold began or ended — Needs you lists it while it lasts.
|
|
983
1031
|
daemon.on("usage_hold", () => this.ctx.onAttentionChanged?.(name));
|
|
984
1032
|
daemon.on("interactive_prompt", safeHandler(async (data) => {
|
|
985
|
-
this.ctx.eventLog?.insert(name, "interactive_prompt", { kind: data.kind });
|
|
1033
|
+
this.ctx.eventLog?.insert(name, "interactive_prompt", { kind: data.kind, ...this.screenForLog(name, data.screen) });
|
|
986
1034
|
this.ctx.logger.warn({ name, kind: data.kind, prompt: data.prompt }, "Instance is waiting for interactive terminal input");
|
|
987
1035
|
if (this.ctx.isPlannedRestart()) {
|
|
988
1036
|
this.ctx.logger.info({ name }, "Interactive prompt notification suppressed — planned restart in progress");
|
|
@@ -1337,6 +1385,7 @@ export class InstanceLifecycle {
|
|
|
1337
1385
|
}
|
|
1338
1386
|
/** Invalidate every start/wake already running for `name` (they will not publish). */
|
|
1339
1387
|
invalidate(name) {
|
|
1388
|
+
this.ctx.agentCredentials?.invalidate(name);
|
|
1340
1389
|
this.lifecycleEpochs.set(name, this.epochOf(name) + 1);
|
|
1341
1390
|
}
|
|
1342
1391
|
/** Whether `transition` is `name`'s transition and is the one running now. */
|
|
@@ -1430,10 +1479,18 @@ export class InstanceLifecycle {
|
|
|
1430
1479
|
this.ctx.notifyInstanceTopic(name, t("inst.backend_removed", name, backendName, REMOVED_BACKENDS[backendName].replacement));
|
|
1431
1480
|
return;
|
|
1432
1481
|
}
|
|
1433
|
-
// Verify backend binary is in PATH before spawning
|
|
1482
|
+
// Verify backend binary is in PATH before spawning. Off-loop resolve pins a
|
|
1483
|
+
// hint so createBackend's resolveBinary does not run synchronous `which`
|
|
1484
|
+
// (#1490 row 67). Missing still only logs; start continues.
|
|
1434
1485
|
const installation = BACKEND_INSTALLATION_INFO[backendName];
|
|
1435
|
-
if (installation
|
|
1436
|
-
|
|
1486
|
+
if (installation) {
|
|
1487
|
+
const { resolveBackendBinary } = await import("./backend-availability.js");
|
|
1488
|
+
const path = await resolveBackendBinary(backendName);
|
|
1489
|
+
noteResolvedBinary(installation.binary, path ?? installation.binary);
|
|
1490
|
+
check();
|
|
1491
|
+
if (!path) {
|
|
1492
|
+
this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
|
|
1493
|
+
}
|
|
1437
1494
|
}
|
|
1438
1495
|
// claude-code refuses --dangerously-skip-permissions as root — fail fast
|
|
1439
1496
|
// Unless IS_SANDBOX=1 is set (recognized sandbox environment)
|
|
@@ -1449,6 +1506,18 @@ export class InstanceLifecycle {
|
|
|
1449
1506
|
backend: backendName,
|
|
1450
1507
|
model: config.model ?? "default",
|
|
1451
1508
|
}, this.ctx.spawnGate, this.ctx.stormWindow, this.ctx.backendOutage);
|
|
1509
|
+
// Register before start: a pre-launch refusal has no published daemon or later incident handlers.
|
|
1510
|
+
daemon.on("kiro_compatibility_hold", (message) => {
|
|
1511
|
+
const owner = this.daemons.get(name);
|
|
1512
|
+
if (owner ? owner !== daemon : this.epochOf(name) !== epoch)
|
|
1513
|
+
return;
|
|
1514
|
+
this.ctx.setKiroCompatibilityHold?.(name, message);
|
|
1515
|
+
});
|
|
1516
|
+
daemon.setAgentCredentialIssuer?.(token => {
|
|
1517
|
+
if (this.epochOf(name) !== epoch)
|
|
1518
|
+
throw new SupersededStartError(name);
|
|
1519
|
+
this.ctx.agentCredentials?.issue(name, token);
|
|
1520
|
+
});
|
|
1452
1521
|
daemon.setDeliveryOutboxPort(this.ctx.deliveryOutbox ?? undefined);
|
|
1453
1522
|
daemon.setWorkLeaseCheck(() => this.hasWorkLease(name));
|
|
1454
1523
|
if (seedNow)
|
|
@@ -1542,6 +1611,7 @@ export class InstanceLifecycle {
|
|
|
1542
1611
|
this.ctx.setTopicIcon(name, "green");
|
|
1543
1612
|
this.ctx.touchActivity(name);
|
|
1544
1613
|
});
|
|
1614
|
+
this.ctx.setKiroCompatibilityHold?.(name, null);
|
|
1545
1615
|
this.attachIncidentHandlers(name, daemon);
|
|
1546
1616
|
// #2897: a new daemon starts with no dialog held; a notice the last one left (a crash, a respawn) is out of date.
|
|
1547
1617
|
this.ctx.resolveParkedNotice?.(name);
|
|
@@ -2151,9 +2221,13 @@ export class InstanceLifecycle {
|
|
|
2151
2221
|
// primary or a new world). Null means fail closed at rollback.
|
|
2152
2222
|
const topicDeleter = this.ctx.getForumTopicDeleter?.(adapterId) ?? null;
|
|
2153
2223
|
try {
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2224
|
+
// #2910: a web-only fleet has no topics to create — the agent is reached from the dashboard.
|
|
2225
|
+
const webOnly = this.ctx.isWebOnlyFleet?.() === true;
|
|
2226
|
+
if (!webOnly) {
|
|
2227
|
+
check();
|
|
2228
|
+
createdTopicId = await this.ctx.createForumTopic(topicName, adapterId);
|
|
2229
|
+
check();
|
|
2230
|
+
}
|
|
2157
2231
|
// Use explicit topic_name as name base when provided; fall back to directory basename
|
|
2158
2232
|
const explicitTopicName = args.topic_name;
|
|
2159
2233
|
const nameBase = explicitTopicName ?? (worktreePath ? topicName : (directory ? basename(workDir) : topicName));
|
|
@@ -2163,7 +2237,17 @@ export class InstanceLifecycle {
|
|
|
2163
2237
|
// (#1305 P1): full topic_id string equality, plus the adapter/world
|
|
2164
2238
|
// check when the existing entry records one (channel_id). A dir-only
|
|
2165
2239
|
// collision (no config entry) can never prove that.
|
|
2166
|
-
{
|
|
2240
|
+
if (webOnly) {
|
|
2241
|
+
// No topic to suffix with: the name as asked, else the first free "-2", "-3"…. "general" is never handed out
|
|
2242
|
+
// here (#2919 review): that name alone makes an instance the General (its create/start tools, never paused).
|
|
2243
|
+
const instances = this.ctx.fleetConfig?.instances ?? {};
|
|
2244
|
+
const taken = (candidate) => candidate === GENERAL_NAME || candidate in instances || existsSync(this.ctx.getInstanceDir(candidate));
|
|
2245
|
+
const clean = sanitizeInstanceName(nameBase);
|
|
2246
|
+
newInstanceName = clean;
|
|
2247
|
+
for (let n = 2; taken(newInstanceName); n++)
|
|
2248
|
+
newInstanceName = `${clean}-${n}`;
|
|
2249
|
+
}
|
|
2250
|
+
else {
|
|
2167
2251
|
const instances = this.ctx.fleetConfig?.instances ?? {};
|
|
2168
2252
|
const wanted = String(createdTopicId);
|
|
2169
2253
|
newInstanceName = uniqueInstanceName(nameBase, createdTopicId, (candidate) => candidate in instances
|
|
@@ -2191,7 +2275,7 @@ export class InstanceLifecycle {
|
|
|
2191
2275
|
...DEFAULT_INSTANCE_CONFIG,
|
|
2192
2276
|
...getEffectiveInstanceDefaults(this.ctx.fleetConfig.defaults ?? {}),
|
|
2193
2277
|
working_directory: workDir,
|
|
2194
|
-
topic_id: createdTopicId,
|
|
2278
|
+
...(createdTopicId != null ? { topic_id: createdTopicId } : {}),
|
|
2195
2279
|
...(description ? { description } : {}),
|
|
2196
2280
|
...(systemPrompt ? { systemPrompt } : {}),
|
|
2197
2281
|
...(args.model ? { model: args.model } : {}),
|
|
@@ -2222,7 +2306,8 @@ export class InstanceLifecycle {
|
|
|
2222
2306
|
const beforeCreate = structuredClone(this.ctx.fleetConfig);
|
|
2223
2307
|
const persist = () => {
|
|
2224
2308
|
this.ctx.fleetConfig.instances[newInstanceName] = instanceConfig;
|
|
2225
|
-
|
|
2309
|
+
if (createdTopicId != null)
|
|
2310
|
+
this.ctx.routing.register(createdTopicId, { kind: "instance", name: newInstanceName });
|
|
2226
2311
|
try {
|
|
2227
2312
|
this.ctx.saveFleetConfig();
|
|
2228
2313
|
}
|
|
@@ -2288,7 +2373,8 @@ export class InstanceLifecycle {
|
|
|
2288
2373
|
/** Handle delete_instance tool call from a daemon. */
|
|
2289
2374
|
async handleDelete(args, respond) {
|
|
2290
2375
|
const instanceName = args.name;
|
|
2291
|
-
|
|
2376
|
+
// The user's decision (beta.9): deleting an agent deletes its topic, unless `delete_topic: false` keeps it.
|
|
2377
|
+
const deleteTopic = args.delete_topic ?? true;
|
|
2292
2378
|
const instanceConfig = this.ctx.fleetConfig?.instances[instanceName];
|
|
2293
2379
|
if (!instanceConfig) {
|
|
2294
2380
|
respond(null, `Instance not found: ${instanceName}`);
|
|
@@ -2298,11 +2384,9 @@ export class InstanceLifecycle {
|
|
|
2298
2384
|
respond(null, "Cannot delete the General instance");
|
|
2299
2385
|
return;
|
|
2300
2386
|
}
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
}
|
|
2304
|
-
await this.ctx.removeInstance(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"));
|
|
2305
|
-
respond({ success: true, name: instanceName, topic_deleted: deleteTopic });
|
|
2387
|
+
// topic_deleted is the platform's answer, never the request; when the topic stays, topic_reason says why.
|
|
2388
|
+
const topic = await this.ctx.removeInstanceAndTopic(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"), { deleteTopic });
|
|
2389
|
+
respond({ success: true, name: instanceName, topic_deleted: topic.deleted, ...(topic.deleted ? {} : { topic_reason: topic.reason }) });
|
|
2306
2390
|
}
|
|
2307
2391
|
has(name) {
|
|
2308
2392
|
return this.daemons.has(name);
|