@songsid/agend 2.3.5-alpha.4 → 2.3.5-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -2
- package/README.zh-TW.md +0 -2
- package/THIRD_PARTY_NOTICES.md +12 -28
- package/dist/agent-cli-instructions.md +1 -1
- 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 +4 -6
- package/dist/agent-endpoint.js +15 -12
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/auth-api.d.ts +0 -21
- package/dist/auth-api.js +8 -93
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +30 -4
- package/dist/authority/session-authorizations.js +69 -17
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +2 -12
- package/dist/authority/web-authority.js +4 -25
- 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 +12 -15
- package/dist/backend/claude-code.js +133 -152
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +14 -0
- package/dist/backend/codex-metadata.js +45 -0
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex-package.d.ts +2 -5
- package/dist/backend/codex-package.js +5 -1
- package/dist/backend/codex-package.js.map +1 -1
- package/dist/backend/codex-quota-history.d.ts +7 -0
- package/dist/backend/codex-quota-history.js +72 -0
- package/dist/backend/codex-quota-history.js.map +1 -0
- package/dist/backend/codex-session-lookup.d.ts +6 -0
- package/dist/backend/codex-session-lookup.js +1 -1
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex-speed.d.ts +14 -0
- package/dist/backend/codex-speed.js +35 -0
- package/dist/backend/codex-speed.js.map +1 -0
- package/dist/backend/codex.d.ts +116 -136
- package/dist/backend/codex.js +912 -942
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok-weekly-reset.d.ts +24 -0
- package/dist/backend/grok-weekly-reset.js +95 -0
- package/dist/backend/grok-weekly-reset.js.map +1 -0
- package/dist/backend/grok.d.ts +30 -3
- package/dist/backend/grok.js +301 -76
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -0
- package/dist/backend/kiro.js +50 -2
- 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 +15 -8
- package/dist/backend/types.js +3 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/bundled-tmux-guard.d.ts +21 -0
- package/dist/bundled-tmux-guard.js +96 -0
- package/dist/bundled-tmux-guard.js.map +1 -0
- package/dist/cache-ledger.d.ts +95 -0
- package/dist/cache-ledger.js +276 -4
- 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 +11 -3
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +51 -0
- package/dist/channel/adapters/telegram.js +235 -17
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/ipc-bridge.d.ts +0 -2
- 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/classic-channel-manager.d.ts +2 -0
- package/dist/classic-channel-manager.js +5 -1
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +14 -10
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +30 -71
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +3 -17
- package/dist/config.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 +70 -68
- package/dist/daemon.js +774 -846
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +8 -0
- package/dist/dashboard-permissions.js +16 -0
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +26 -16
- package/dist/delivery-consumed-watch.js +31 -26
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.d.ts +0 -5
- package/dist/delivery-outbox.js +4 -32
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +42 -2
- package/dist/delivery-reconciliation.js +164 -2
- package/dist/delivery-reconciliation.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 +4 -2
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +0 -2
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +108 -245
- package/dist/fleet-manager.js +656 -2028
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-instance.d.ts +0 -7
- package/dist/general-instance.js +3 -20
- package/dist/general-instance.js.map +1 -1
- package/dist/general-knowledge/skills/concepts/SKILL.md +393 -0
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
- 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/web-dashboard/SKILL.md +9 -3
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/instance-config-impact.js +6 -7
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +19 -23
- package/dist/instance-lifecycle.js +216 -383
- 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 +1 -3
- package/dist/instructions.js +1 -7
- package/dist/instructions.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/locale.js +63 -86
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +28 -0
- package/dist/log-service.js +29 -0
- 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 +16 -2
- package/dist/logger.js +346 -66
- package/dist/logger.js.map +1 -1
- package/dist/login-flows.d.ts +7 -0
- package/dist/login-flows.js +5 -2
- package/dist/login-flows.js.map +1 -1
- package/dist/login-manager.js +25 -4
- 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/muse-usage-relay.d.ts +2 -0
- package/dist/muse-usage-relay.js +5 -3
- package/dist/muse-usage-relay.js.map +1 -1
- package/dist/needs-you-hub.d.ts +6 -3
- package/dist/needs-you-hub.js +31 -9
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +20 -18
- package/dist/needs-you.js +18 -14
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.js +1 -1
- package/dist/office-share-page.js.map +1 -1
- package/dist/outbound-handlers.d.ts +2 -16
- package/dist/outbound-handlers.js +10 -72
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +0 -38
- package/dist/outbound-schemas.js +5 -14
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-quota-history.d.ts +7 -0
- package/dist/pane-quota-history.js +47 -0
- package/dist/pane-quota-history.js.map +1 -0
- package/dist/platform-general.d.ts +46 -0
- package/dist/platform-general.js +91 -0
- package/dist/platform-general.js.map +1 -0
- package/dist/public-web-gateway.js +0 -9
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +0 -11
- package/dist/public-web-link.js +0 -13
- package/dist/public-web-link.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.js +5 -9
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +8 -1
- package/dist/quickstart.js +42 -4
- package/dist/quickstart.js.map +1 -1
- package/dist/quota-notice-config.d.ts +22 -0
- package/dist/quota-notice-config.js +41 -0
- package/dist/quota-notice-config.js.map +1 -0
- package/dist/quota-notice.d.ts +7 -0
- package/dist/quota-notice.js +40 -0
- package/dist/quota-notice.js.map +1 -1
- package/dist/reply-buttons-controller.js +10 -6
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-polls.d.ts +2 -2
- package/dist/reply-polls.js +3 -3
- package/dist/reply-polls.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/scheduler/task-board.d.ts +9 -0
- package/dist/scheduler/task-board.js +19 -0
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/settings-api.d.ts +13 -5
- package/dist/settings-api.js +26 -96
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +0 -1
- package/dist/settings-baseline.js +1 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.js +23 -28
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +1 -16
- package/dist/settings-confirmation.js +9 -47
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.d.ts +0 -4
- package/dist/settings-effect.js +1 -58
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +0 -4
- package/dist/settings-http-confirmation.js +3 -31
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +28 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/settings-request-capability.d.ts +0 -2
- package/dist/settings-request-capability.js +0 -4
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-transaction.d.ts +0 -4
- package/dist/settings-transaction.js +0 -9
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-form.js +3 -6
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-i18n.js +0 -3
- package/dist/setup-i18n.js.map +1 -1
- package/dist/task-board-tool.d.ts +11 -0
- package/dist/task-board-tool.js +44 -0
- package/dist/task-board-tool.js.map +1 -1
- package/dist/task-board-waker.d.ts +6 -0
- package/dist/task-board-waker.js +4 -0
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tmux-control.d.ts +1 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +1 -2
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +5 -2
- package/dist/tool-permissions.js +7 -7
- 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 -3
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +1 -1
- package/dist/transcript-delta-reader.js +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-monitor.d.ts +20 -3
- package/dist/transcript-monitor.js +92 -24
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +0 -5
- package/dist/transcript-sources.js +79 -8
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +3 -23
- package/dist/ui/app.html +8 -1
- package/dist/ui/backend-signin.js +21 -36
- package/dist/ui/chat-md-strings.js +9 -0
- package/dist/ui/chat-store.js +2 -13
- package/dist/ui/chat-strings.js +2 -50
- package/dist/ui/chat-thread.js +53 -3
- package/dist/ui/fleet-task-card.js +3 -3
- package/dist/ui/fleet-task-common.js +10 -0
- package/dist/ui/fleet-tasks.js +7 -5
- package/dist/ui/fleet-usage.js +90 -27
- package/dist/ui/panel-chat.js +37 -66
- package/dist/ui/panel-details.js +1 -2
- package/dist/ui/panel-fleet.js +88 -107
- package/dist/ui/panel-needs.js +21 -163
- package/dist/ui/panel-notices.js +4 -3
- package/dist/ui/panel-settings.js +149 -239
- package/dist/ui/preview-panel.js +84 -6
- package/dist/ui/search-dialog.js +3 -2
- package/dist/ui/settings-appearance.js +23 -122
- package/dist/ui/settings-catalog.js +10 -37
- package/dist/ui/settings-codex-copy.js +19 -0
- package/dist/ui/settings-confirm.js +1 -3
- package/dist/ui/settings-dialogs.js +20 -27
- package/dist/ui/settings-guests.js +14 -27
- package/dist/ui/settings-model.js +17 -12
- package/dist/ui/settings-quota-notice.js +100 -0
- package/dist/ui/settings-registry.js +4 -11
- package/dist/ui/settings-strings.js +4 -113
- package/dist/ui/settings-web-authority.js +13 -15
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-needs.js +1 -1
- package/dist/ui/shared/app-route.js +2 -6
- package/dist/ui/shared/app-shell.js +18 -23
- package/dist/ui/shared/app-store.js +2 -3
- package/dist/ui/shared/app-stream.js +1 -3
- package/dist/ui/shared/app.css +40 -1312
- package/dist/ui/shared/app.js +2 -5
- package/dist/ui/shared/header-tools.js +4 -6
- package/dist/ui/shared/instance-nav.js +7 -34
- package/dist/ui/shared/instance-switch.js +3 -4
- package/dist/ui/shared/loading.css +37 -0
- package/dist/ui/shared/panel-view.js +77 -4
- package/dist/ui/shared/signin.js +6 -39
- package/dist/ui/shared/tokens.css +0 -1
- package/dist/ui/shared/ui-dialog.js +2 -2
- package/dist/ui/shared/ui-menu.js +10 -30
- package/dist/ui/shared/ui-states.js +14 -3
- package/dist/ui/shared/usage-dialog.js +18 -1
- package/dist/ui/shared/vendor/vendor.json +2 -19
- 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 +16 -8
- package/dist/ui/signin.html +5 -2
- package/dist/unattended-install.d.ts +11 -2
- package/dist/unattended-install.js +39 -5
- package/dist/unattended-install.js.map +1 -1
- 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/providers.d.ts +5 -0
- package/dist/usage/providers.js +5 -0
- package/dist/usage/providers.js.map +1 -1
- 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/quota-notices.d.ts +38 -0
- package/dist/usage/quota-notices.js +160 -0
- package/dist/usage/quota-notices.js.map +1 -0
- package/dist/usage/usage-api.d.ts +32 -0
- package/dist/usage/usage-api.js +96 -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 +6 -1
- package/dist/usage-rollup.js +16 -4
- package/dist/usage-rollup.js.map +1 -1
- package/dist/view-api.d.ts +16 -0
- package/dist/view-api.js +100 -16
- 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 +6 -38
- package/dist/web-api.js +20 -255
- package/dist/web-api.js.map +1 -1
- package/dist/web-chat-history.d.ts +2 -19
- package/dist/web-chat-history.js +3 -72
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-only-fleet.d.ts +0 -20
- package/dist/web-only-fleet.js +0 -21
- package/dist/web-only-fleet.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 +0 -7
- package/dist/web-session.js +0 -2
- package/dist/web-session.js.map +1 -1
- package/dist/web-shell-routes.d.ts +1 -4
- package/dist/web-shell-routes.js +2 -7
- package/dist/web-shell-routes.js.map +1 -1
- package/launcher/private-home.cjs +1 -1
- package/package.json +3 -9
- package/dist/agent-runtime-api.d.ts +0 -4
- package/dist/agent-runtime-api.js +0 -59
- package/dist/agent-runtime-api.js.map +0 -1
- package/dist/agent-runtime-change.d.ts +0 -74
- package/dist/agent-runtime-change.js +0 -102
- package/dist/agent-runtime-change.js.map +0 -1
- package/dist/backend/grok-model-cache.d.ts +0 -7
- package/dist/backend/grok-model-cache.js +0 -65
- package/dist/backend/grok-model-cache.js.map +0 -1
- package/dist/backend/native-pane.d.ts +0 -9
- package/dist/backend/native-pane.js +0 -59
- package/dist/backend/native-pane.js.map +0 -1
- package/dist/fleet-windows-runtime.d.ts +0 -97
- package/dist/fleet-windows-runtime.js +0 -449
- package/dist/fleet-windows-runtime.js.map +0 -1
- package/dist/general-binding.d.ts +0 -85
- package/dist/general-binding.js +0 -298
- package/dist/general-binding.js.map +0 -1
- package/dist/general-host-owner.d.ts +0 -8
- package/dist/general-host-owner.js +0 -26
- package/dist/general-host-owner.js.map +0 -1
- package/dist/general-role.d.ts +0 -5
- package/dist/general-role.js +0 -26
- package/dist/general-role.js.map +0 -1
- package/dist/local-pane-endpoint.d.ts +0 -46
- package/dist/local-pane-endpoint.js +0 -189
- package/dist/local-pane-endpoint.js.map +0 -1
- package/dist/local-pane-launcher.d.ts +0 -2
- package/dist/local-pane-launcher.js +0 -38
- package/dist/local-pane-launcher.js.map +0 -1
- package/dist/local-pane-stage.ps1 +0 -101
- package/dist/model-catalog-defaults.d.ts +0 -14
- package/dist/model-catalog-defaults.js +0 -20
- package/dist/model-catalog-defaults.js.map +0 -1
- package/dist/native-agent-admission.d.ts +0 -7
- package/dist/native-agent-admission.js +0 -26
- package/dist/native-agent-admission.js.map +0 -1
- package/dist/native-daemon-client.d.ts +0 -13
- package/dist/native-daemon-client.js +0 -28
- package/dist/native-daemon-client.js.map +0 -1
- package/dist/native-instance-api.d.ts +0 -14
- package/dist/native-instance-api.js +0 -205
- package/dist/native-instance-api.js.map +0 -1
- package/dist/native-instance-input.d.ts +0 -84
- package/dist/native-instance-input.js +0 -54
- package/dist/native-instance-input.js.map +0 -1
- package/dist/native-instance-registry.d.ts +0 -32
- package/dist/native-instance-registry.js +0 -105
- package/dist/native-instance-registry.js.map +0 -1
- package/dist/native-mcp.d.ts +0 -40
- package/dist/native-mcp.js +0 -278
- package/dist/native-mcp.js.map +0 -1
- package/dist/native-model-catalog.d.ts +0 -5
- package/dist/native-model-catalog.js +0 -76
- package/dist/native-model-catalog.js.map +0 -1
- package/dist/native-pane-crash-budget.d.ts +0 -20
- package/dist/native-pane-crash-budget.js +0 -60
- package/dist/native-pane-crash-budget.js.map +0 -1
- package/dist/native-pane-create.d.ts +0 -26
- package/dist/native-pane-create.js +0 -53
- package/dist/native-pane-create.js.map +0 -1
- package/dist/native-pane-lifecycle.d.ts +0 -65
- package/dist/native-pane-lifecycle.js +0 -230
- package/dist/native-pane-lifecycle.js.map +0 -1
- package/dist/native-pane-manager.d.ts +0 -59
- package/dist/native-pane-manager.js +0 -584
- package/dist/native-pane-manager.js.map +0 -1
- package/dist/native-pane-output-log.d.ts +0 -15
- package/dist/native-pane-output-log.js +0 -108
- package/dist/native-pane-output-log.js.map +0 -1
- package/dist/native-pane-reconciliation.d.ts +0 -4
- package/dist/native-pane-reconciliation.js +0 -40
- package/dist/native-pane-reconciliation.js.map +0 -1
- package/dist/native-pane-recovery.d.ts +0 -12
- package/dist/native-pane-recovery.js +0 -10
- package/dist/native-pane-recovery.js.map +0 -1
- package/dist/native-pane-tools.d.ts +0 -2
- package/dist/native-pane-tools.js +0 -14
- package/dist/native-pane-tools.js.map +0 -1
- package/dist/pane-port.d.ts +0 -118
- package/dist/pane-port.js +0 -2
- package/dist/pane-port.js.map +0 -1
- package/dist/runtime-api.d.ts +0 -8
- package/dist/runtime-api.js +0 -171
- package/dist/runtime-api.js.map +0 -1
- package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +0 -21
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -19
- package/dist/runtime-assets/@xterm/addon-serialize/package.json +0 -29
- package/dist/runtime-assets/@xterm/headless/LICENSE +0 -21
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +0 -2
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +0 -46
- package/dist/runtime-assets/@xterm/headless/package.json +0 -29
- package/dist/runtime-assets/node-pty/CONPTY-LICENSE +0 -21
- package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +0 -503
- package/dist/runtime-assets/node-pty/LICENSE +0 -69
- package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +0 -16
- package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +0 -47
- package/dist/runtime-assets/node-pty/lib/index.js +0 -52
- package/dist/runtime-assets/node-pty/lib/interfaces.js +0 -7
- package/dist/runtime-assets/node-pty/lib/shared/conout.js +0 -11
- package/dist/runtime-assets/node-pty/lib/terminal.js +0 -190
- package/dist/runtime-assets/node-pty/lib/types.js +0 -7
- package/dist/runtime-assets/node-pty/lib/unixTerminal.js +0 -346
- package/dist/runtime-assets/node-pty/lib/utils.js +0 -39
- package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +0 -125
- package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +0 -320
- package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +0 -199
- package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +0 -22
- package/dist/runtime-assets/node-pty/package.json +0 -64
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/dist/runtime-build-info.d.ts +0 -9
- package/dist/runtime-build-info.js +0 -57
- package/dist/runtime-build-info.js.map +0 -1
- package/dist/runtime-bundle.d.ts +0 -19
- package/dist/runtime-bundle.js +0 -156
- package/dist/runtime-bundle.js.map +0 -1
- package/dist/runtime-cli.d.ts +0 -7
- package/dist/runtime-cli.js +0 -152
- package/dist/runtime-cli.js.map +0 -1
- package/dist/runtime-client-store.d.ts +0 -68
- package/dist/runtime-client-store.js +0 -344
- package/dist/runtime-client-store.js.map +0 -1
- package/dist/runtime-client.d.ts +0 -112
- package/dist/runtime-client.js +0 -736
- package/dist/runtime-client.js.map +0 -1
- package/dist/runtime-connection.d.ts +0 -22
- package/dist/runtime-connection.js +0 -93
- package/dist/runtime-connection.js.map +0 -1
- package/dist/runtime-coordinator.d.ts +0 -91
- package/dist/runtime-coordinator.js +0 -911
- package/dist/runtime-coordinator.js.map +0 -1
- package/dist/runtime-general-protocol.d.ts +0 -22
- package/dist/runtime-general-protocol.js +0 -57
- package/dist/runtime-general-protocol.js.map +0 -1
- package/dist/runtime-general-workspace.d.ts +0 -17
- package/dist/runtime-general-workspace.js +0 -213
- package/dist/runtime-general-workspace.js.map +0 -1
- package/dist/runtime-pane-assets.d.ts +0 -17
- package/dist/runtime-pane-assets.js +0 -23
- package/dist/runtime-pane-assets.js.map +0 -1
- package/dist/runtime-pane-boot.d.ts +0 -9
- package/dist/runtime-pane-boot.js +0 -47
- package/dist/runtime-pane-boot.js.map +0 -1
- package/dist/runtime-pane-codex-index.d.ts +0 -1
- package/dist/runtime-pane-codex-index.js +0 -47
- package/dist/runtime-pane-codex-index.js.map +0 -1
- package/dist/runtime-pane-config.d.ts +0 -16
- package/dist/runtime-pane-config.js +0 -54
- package/dist/runtime-pane-config.js.map +0 -1
- package/dist/runtime-pane-host.d.ts +0 -44
- package/dist/runtime-pane-host.js +0 -424
- package/dist/runtime-pane-host.js.map +0 -1
- package/dist/runtime-pane-job-owner.d.ts +0 -1
- package/dist/runtime-pane-job-owner.js +0 -29
- package/dist/runtime-pane-job-owner.js.map +0 -1
- package/dist/runtime-pane-job.ps1 +0 -116
- package/dist/runtime-pane-link.d.ts +0 -40
- package/dist/runtime-pane-link.js +0 -246
- package/dist/runtime-pane-link.js.map +0 -1
- package/dist/runtime-pane-mcp-protocol.d.ts +0 -32
- package/dist/runtime-pane-mcp-protocol.js +0 -39
- package/dist/runtime-pane-mcp-protocol.js.map +0 -1
- package/dist/runtime-pane-mcp-relay.d.ts +0 -17
- package/dist/runtime-pane-mcp-relay.js +0 -70
- package/dist/runtime-pane-mcp-relay.js.map +0 -1
- package/dist/runtime-pane-mcp.d.ts +0 -51
- package/dist/runtime-pane-mcp.js +0 -150
- package/dist/runtime-pane-mcp.js.map +0 -1
- package/dist/runtime-pane-native.d.ts +0 -45
- package/dist/runtime-pane-native.js +0 -65
- package/dist/runtime-pane-native.js.map +0 -1
- package/dist/runtime-pane-output.d.ts +0 -19
- package/dist/runtime-pane-output.js +0 -53
- package/dist/runtime-pane-output.js.map +0 -1
- package/dist/runtime-pane-port.d.ts +0 -139
- package/dist/runtime-pane-port.js +0 -558
- package/dist/runtime-pane-port.js.map +0 -1
- package/dist/runtime-pane-private.d.ts +0 -14
- package/dist/runtime-pane-private.js +0 -51
- package/dist/runtime-pane-private.js.map +0 -1
- package/dist/runtime-pane-private.ps1 +0 -14
- package/dist/runtime-pane-process.d.ts +0 -4
- package/dist/runtime-pane-process.js +0 -108
- package/dist/runtime-pane-process.js.map +0 -1
- package/dist/runtime-pane-protocol.d.ts +0 -172
- package/dist/runtime-pane-protocol.js +0 -195
- package/dist/runtime-pane-protocol.js.map +0 -1
- package/dist/runtime-pane-screen.d.ts +0 -19
- package/dist/runtime-pane-screen.js +0 -76
- package/dist/runtime-pane-screen.js.map +0 -1
- package/dist/runtime-pane-service.d.ts +0 -11
- package/dist/runtime-pane-service.js +0 -221
- package/dist/runtime-pane-service.js.map +0 -1
- package/dist/runtime-pane-stdio-protocol.d.ts +0 -54
- package/dist/runtime-pane-stdio-protocol.js +0 -94
- package/dist/runtime-pane-stdio-protocol.js.map +0 -1
- package/dist/runtime-pane-stdio.d.ts +0 -3
- package/dist/runtime-pane-stdio.js +0 -123
- package/dist/runtime-pane-stdio.js.map +0 -1
- package/dist/runtime-pane-store.d.ts +0 -33
- package/dist/runtime-pane-store.js +0 -164
- package/dist/runtime-pane-store.js.map +0 -1
- package/dist/runtime-pane-transcript-protocol.d.ts +0 -43
- package/dist/runtime-pane-transcript-protocol.js +0 -58
- package/dist/runtime-pane-transcript-protocol.js.map +0 -1
- package/dist/runtime-pane-transcript.d.ts +0 -45
- package/dist/runtime-pane-transcript.js +0 -605
- package/dist/runtime-pane-transcript.js.map +0 -1
- package/dist/runtime-pane-worker.d.ts +0 -1
- package/dist/runtime-pane-worker.js +0 -154
- package/dist/runtime-pane-worker.js.map +0 -1
- package/dist/runtime-protocol.d.ts +0 -162
- package/dist/runtime-protocol.js +0 -37
- package/dist/runtime-protocol.js.map +0 -1
- package/dist/runtime-switches.d.ts +0 -79
- package/dist/runtime-switches.js +0 -90
- package/dist/runtime-switches.js.map +0 -1
- package/dist/runtime-transcript-delta-reader.d.ts +0 -23
- package/dist/runtime-transcript-delta-reader.js +0 -74
- package/dist/runtime-transcript-delta-reader.js.map +0 -1
- package/dist/runtime-transcript-source.d.ts +0 -36
- package/dist/runtime-transcript-source.js +0 -189
- package/dist/runtime-transcript-source.js.map +0 -1
- package/dist/runtime-windows-bridge.d.ts +0 -41
- package/dist/runtime-windows-bridge.js +0 -157
- package/dist/runtime-windows-bridge.js.map +0 -1
- package/dist/settings-route-lifetime.d.ts +0 -14
- package/dist/settings-route-lifetime.js +0 -48
- package/dist/settings-route-lifetime.js.map +0 -1
- package/dist/tmux-pane-host.d.ts +0 -26
- package/dist/tmux-pane-host.js +0 -25
- package/dist/tmux-pane-host.js.map +0 -1
- package/dist/transcript-needles.d.ts +0 -35
- package/dist/transcript-needles.js +0 -158
- package/dist/transcript-needles.js.map +0 -1
- package/dist/transcript-records.d.ts +0 -21
- package/dist/transcript-records.js +0 -140
- package/dist/transcript-records.js.map +0 -1
- package/dist/ui/agent-proposals.js +0 -90
- package/dist/ui/agent-runtime-settings.js +0 -67
- package/dist/ui/agent-runtime.js +0 -124
- package/dist/ui/cli-picker.js +0 -42
- package/dist/ui/general-location.js +0 -71
- package/dist/ui/native-instance-settings.js +0 -44
- package/dist/ui/native-pane-recovery.js +0 -45
- package/dist/ui/panel-runtimes.js +0 -334
- package/dist/ui/panel-windows-agent.js +0 -86
- package/dist/ui/panel-windows-cli.js +0 -179
- package/dist/ui/provider-marks.js +0 -83
- package/dist/ui/runtime-catalog.js +0 -55
- package/dist/ui/settings-agent-filters.js +0 -94
- package/dist/ui/settings-layout.js +0 -245
- package/dist/ui/settings-outside.js +0 -176
- package/dist/ui/settings-shortcuts.js +0 -65
- package/dist/ui/shared/machine-name.js +0 -13
- package/dist/ui/shared/qrcode.module.js +0 -2237
- package/dist/ui/shared/settings-width.js +0 -31
- package/dist/ui/shared/vendor/qrcode-generator.LICENSE +0 -27
- package/dist/ui/windows-agents-nav.js +0 -2
- package/dist/ui/windows-cli-catalog.js +0 -108
- package/dist/web-remote-access.d.ts +0 -152
- package/dist/web-remote-access.js +0 -368
- package/dist/web-remote-access.js.map +0 -1
- package/dist/windows-agents.d.ts +0 -126
- package/dist/windows-agents.js +0 -490
- package/dist/windows-agents.js.map +0 -1
- package/dist/windows-cli-api.d.ts +0 -23
- package/dist/windows-cli-api.js +0 -159
- package/dist/windows-cli-api.js.map +0 -1
- package/dist/windows-cli-providers.d.ts +0 -115
- package/dist/windows-cli-providers.js +0 -429
- package/dist/windows-cli-providers.js.map +0 -1
- package/dist/windows-cli-worker.d.ts +0 -59
- package/dist/windows-cli-worker.js +0 -479
- package/dist/windows-cli-worker.js.map +0 -1
- package/dist/windows-cli.d.ts +0 -116
- package/dist/windows-cli.js +0 -407
- package/dist/windows-cli.js.map +0 -1
- package/dist/windows-native-mcp.d.ts +0 -19
- package/dist/windows-native-mcp.js +0 -143
- package/dist/windows-native-mcp.js.map +0 -1
- package/dist/windows-pane-mcp.d.ts +0 -26
- package/dist/windows-pane-mcp.js +0 -187
- package/dist/windows-pane-mcp.js.map +0 -1
- package/templates/runtime-assets/conpty-LICENSE +0 -21
- package/templates/runtime-assets/conpty-NOTICE.md +0 -503
- package/templates/runtime-assets/local-pane-stage.ps1 +0 -101
- package/templates/runtime-assets/runtime-pane-job.ps1 +0 -116
- package/templates/runtime-assets/runtime-pane-private.ps1 +0 -14
- package/templates/runtime-assets/xterm-LICENSE +0 -21
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { NativePaneRecoveryError } from "./native-pane-recovery.js";
|
|
2
|
-
import { addsSecondGeneral } from "./web-only-fleet.js";
|
|
3
|
-
import { NativePaneCrashBudget } from "./native-pane-crash-budget.js";
|
|
4
|
-
import { localWindowsCliEnabled, remoteRuntimeEnabled } from "./runtime-switches.js";
|
|
5
1
|
import { settingsUndo, undoSettingsPaths } from "./settings-transaction.js";
|
|
6
2
|
import { measureSyncWork } from "./sync-work-attribution.js";
|
|
7
3
|
import { REMOVED_BACKENDS, isRemovedBackend, removedBackendMessage } from "./backend/removed.js";
|
|
@@ -29,7 +25,6 @@ import { BACKEND_AUTH_CHECKS, checkAuthStatus, LOGIN_FLOWS } from "./login-flows
|
|
|
29
25
|
import { CHAT_PROFILE_LOGIN_BACKENDS, credentialProfileEnv, credentialProfileLoginCommand } from "./backend/credential-profile.js";
|
|
30
26
|
import { fetchClaudeUsage, fetchCodexUsage } from "./usage/providers.js";
|
|
31
27
|
import { assertExplicitInstanceRemoval, authorizeExplicitInstanceRemoval } from "./instance-removal.js";
|
|
32
|
-
import { WINDOWS_CREATE_REFUSED, isNativePaneInstance } from "./native-instance-registry.js";
|
|
33
28
|
import { capturePendingTargetReconciliation, finishTargetReconciliation, reconcileTargetBeforeStart, RECONCILIATION_WRITE_DRAIN_TIMEOUT_MS, retireCapturedTargetWindows, } from "./delivery-reconciliation.js";
|
|
34
29
|
import { noPlaceMarkers, placeRef } from "./topic-link.js";
|
|
35
30
|
export { isFleetStartCommandLine } from "./fleet-lock.js";
|
|
@@ -290,7 +285,6 @@ export class InstanceLifecycle {
|
|
|
290
285
|
activeTransition = new Map();
|
|
291
286
|
/** Bumped synchronously by stop/restart: a start begun under an older epoch must not publish. */
|
|
292
287
|
lifecycleEpochs = new Map();
|
|
293
|
-
nativeExitOwners = new Map();
|
|
294
288
|
/** Single wake flight per instance: concurrent wakes share it. */
|
|
295
289
|
wakeFlights = new Map();
|
|
296
290
|
/** Starts that begin their idle window now instead of at the persisted last inbound. */
|
|
@@ -687,109 +681,26 @@ export class InstanceLifecycle {
|
|
|
687
681
|
}
|
|
688
682
|
this.ctx.notifyInstanceTopic(name, t("delivery.cancelled_unsent", messages.length, name));
|
|
689
683
|
}, this.ctx.logger, `daemon.human_messages_cancelled[${name}]`));
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
new NativePaneCrashBudget(join(this.ctx.getInstanceDir(name), "native-crash-state.json")).reset(pin);
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
async nativePaneExited(name, daemon, data) {
|
|
709
|
-
const config = this.ctx.fleetConfig?.instances[name], epoch = this.epochOf(name), pin = data.snapshot.sessionId, profilePin = this.ctx.nativePanePinnedSession?.(name) ?? undefined;
|
|
710
|
-
if (!isNativePaneInstance(config) || data.name !== name || this.daemons.get(name) !== daemon || !daemon.nativePaneExitCurrent(data.snapshot, data.owner)
|
|
711
|
-
|| pin !== undefined && profilePin !== undefined && profilePin !== pin || this.nativeExitOwners.has(name) || this.ctx.isPlannedRestart())
|
|
712
|
-
return;
|
|
713
|
-
const token = Symbol(name), run = { token, daemon, timer: undefined };
|
|
714
|
-
this.nativeExitOwners.set(name, run);
|
|
715
|
-
const current = () => this.nativeExitOwners.get(name) === run && this.daemons.get(name) === daemon && this.epochOf(name) === epoch
|
|
716
|
-
&& this.ctx.fleetConfig?.instances[name] === config && ((this.ctx.nativePanePinnedSession?.(name) ?? undefined) === profilePin || profilePin === undefined && pin !== undefined && this.ctx.nativePanePinnedSession?.(name) === pin) && !this.isPaused(name) && !this.ctx.isPlannedRestart()
|
|
717
|
-
&& (config.machine_id ? remoteRuntimeEnabled() : localWindowsCliEnabled());
|
|
718
|
-
daemon.fenceDeliveryWritesForStop();
|
|
719
|
-
try {
|
|
720
|
-
const decision = pin && profilePin ? new NativePaneCrashBudget(join(this.ctx.getInstanceDir(name), "native-crash-state.json")).observe(pin, data.snapshot.exitCode, config.restart_policy) : null;
|
|
721
|
-
await this.runTransition(name, async () => {
|
|
722
|
-
if (!current())
|
|
723
|
-
return;
|
|
724
|
-
if (!await daemon.waitForDeliveryWritesToDrain(RECONCILIATION_WRITE_DRAIN_TIMEOUT_MS) || !current())
|
|
725
|
-
throw Error("Native input writes have not drained");
|
|
726
|
-
if (this.ctx.deliveryOutbox) {
|
|
727
|
-
this.ctx.deliveryOutbox.markTargetReconciliationPending(name, daemon.bootId);
|
|
728
|
-
if (!await daemon.reconcileNativeDeliveries(this.ctx.deliveryOutbox, current) || !current())
|
|
729
|
-
throw Error("Native delivery reconciliation is unconfirmed");
|
|
730
|
-
}
|
|
731
|
-
// Close finalizes the exact positive exit; no PID lookup or signal exists on this path.
|
|
732
|
-
await daemon.stop({ nativePane: "close" });
|
|
733
|
-
if (!current())
|
|
734
|
-
return;
|
|
735
|
-
this.ctx.eventLog?.insert(name, "native_pane_exited", { exitCode: data.snapshot.exitCode ?? null, sessionId: pin, decision: decision?.kind ?? "no-conversation", count: decision?.count ?? 0 });
|
|
736
|
-
if (!decision) {
|
|
737
|
-
this.ctx.holdNativePaneRecovery?.(name, new NativePaneRecoveryError({ kind: "session-unconfirmed", launchId: data.snapshot.launchId, sessionId: this.ctx.nativePanePinnedSession?.(name) ?? undefined, ...(config.backend === "codex" ? { provider: "codex" } : {}) }));
|
|
738
|
-
this.ctx.setTopicIcon(name, "red");
|
|
739
|
-
return;
|
|
740
|
-
}
|
|
741
|
-
if (decision.kind !== "retry") {
|
|
742
|
-
if (decision.kind === "normal")
|
|
743
|
-
await this.ctx.notifyNormalExit(name);
|
|
744
|
-
else
|
|
745
|
-
this.notifyIncident(name, decision.kind === "loop" ? "crash_loop" : "supervision_ended", t("inst.respawn_paused", name));
|
|
746
|
-
this.ctx.setTopicIcon(name, "red");
|
|
747
|
-
return;
|
|
748
|
-
}
|
|
749
|
-
const timer = setTimeout(() => {
|
|
750
|
-
run.timer = undefined;
|
|
751
|
-
void this.runTransition(name, async () => {
|
|
752
|
-
if (!current())
|
|
753
|
-
return;
|
|
754
|
-
await this.stopInTransition(name, token);
|
|
755
|
-
// Our own stop advances once. An operator's concurrent stop/config change prevents publication.
|
|
756
|
-
if (this.nativeExitOwners.get(name) !== run || this.epochOf(name) !== epoch + 1 || this.daemons.has(name)
|
|
757
|
-
|| this.ctx.fleetConfig?.instances[name] !== config || this.ctx.nativePanePinnedSession?.(name) !== pin || this.isPaused(name) || this.ctx.isPlannedRestart()
|
|
758
|
-
|| !(config.machine_id ? remoteRuntimeEnabled() : localWindowsCliEnabled()))
|
|
759
|
-
return;
|
|
760
|
-
await this.startInTransition(name, config, true, { kind: "fleet-topic", backend: config.backend ?? "codex", model: config.model || "default" });
|
|
761
|
-
if (this.nativeExitOwners.get(name) !== run || this.epochOf(name) !== epoch + 1 || this.ctx.isPlannedRestart())
|
|
762
|
-
return;
|
|
763
|
-
await this.ctx.connectIpcToInstance(name);
|
|
764
|
-
}).catch(error => { if (this.nativeExitOwners.get(name) === run && !this.ctx.isPlannedRestart()) {
|
|
765
|
-
if (this.ctx.holdNativePaneRecovery?.(name, error))
|
|
766
|
-
return;
|
|
767
|
-
this.ctx.logger.error({ name, err: error }, "Native conversation resume failed; its pin was retained");
|
|
768
|
-
this.notifyIncident(name, "supervision_ended", t("inst.respawn_paused", name));
|
|
769
|
-
} })
|
|
770
|
-
.finally(() => { this.cancelNativeRecovery(name, token); this.ctx.onNativePaneRecoverySettled?.(name); });
|
|
771
|
-
}, decision.delay);
|
|
772
|
-
timer.unref?.();
|
|
773
|
-
run.timer = timer;
|
|
774
|
-
});
|
|
775
|
-
if (!run.timer)
|
|
776
|
-
this.cancelNativeRecovery(name, token);
|
|
777
|
-
}
|
|
778
|
-
catch (error) {
|
|
779
|
-
if (this.nativeExitOwners.get(name) === run && !this.ctx.isPlannedRestart()) {
|
|
780
|
-
this.ctx.logger.error({ name, err: error }, "Native crash recovery held without a fresh fallback");
|
|
781
|
-
this.notifyIncident(name, "supervision_ended", t("inst.respawn_paused", 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);
|
|
782
699
|
}
|
|
783
|
-
this.
|
|
784
|
-
}
|
|
785
|
-
finally {
|
|
786
|
-
if (!run.timer)
|
|
787
|
-
this.ctx.onNativePaneRecoverySettled?.(name);
|
|
788
|
-
}
|
|
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}]`));
|
|
789
702
|
}
|
|
790
703
|
attachIncidentHandlers(name, daemon) {
|
|
791
|
-
if (daemon.usesNativePane?.())
|
|
792
|
-
daemon.on("native_pane_exited", safeHandler((data) => this.nativePaneExited(name, daemon, data), this.ctx.logger, `daemon.native_pane_exited[${name}]`));
|
|
793
704
|
daemon.on("capacity_nudge_cancelled", safeHandler((data) => {
|
|
794
705
|
const reason = data.reason === "the user cancelled" ? t("inst.codex_retry_cancel_reason_user")
|
|
795
706
|
: data.reason === "the instance was stopped, paused or respawned" || data.reason === "the instance is not running" ? t("inst.codex_retry_cancel_reason_stopped")
|
|
@@ -1088,22 +999,19 @@ export class InstanceLifecycle {
|
|
|
1088
999
|
// labels, summaries and every exhaustive match for one picker's text.)
|
|
1089
1000
|
// #1691: a prompt no table knows — what it asks (one sanitised, bounded line from the daemon, never the pane), and
|
|
1090
1001
|
// that AgEnD will not press anything.
|
|
1091
|
-
// S-35: a Windows agent's instance name is windows-<uuid>; people know it by its display name.
|
|
1092
|
-
const label = this.ctx.fleetConfig?.instances[name]?.display_name?.trim() || name;
|
|
1093
|
-
const place = placeRef({ kind: "instance", name }, label);
|
|
1094
1002
|
if (data.unrecognised) {
|
|
1095
1003
|
// #1990: the question is a pane line — it may not name a place of its own.
|
|
1096
1004
|
const asked = data.question ? t("inst.unrecognised_prompt_question", noPlaceMarkers(data.question)) : "";
|
|
1097
|
-
this.notifyParked(name, "dialog_parked", t("inst.unrecognised_prompt",
|
|
1005
|
+
this.notifyParked(name, "dialog_parked", t("inst.unrecognised_prompt", name, asked), t("fleet.unrecognised_prompt", instancePlace(name), asked));
|
|
1098
1006
|
return;
|
|
1099
1007
|
}
|
|
1100
1008
|
const category = data.kind && data.kind !== "dialog" ? interactionCategory(data.kind, data.backend) : null;
|
|
1101
|
-
const text = category ? t("inst.interaction_parked",
|
|
1009
|
+
const text = category ? t("inst.interaction_parked", name, category) : data.holdOnly
|
|
1102
1010
|
// #2872: the Claude session-resume advice only for that prompt (it read as nonsense under a grok or kiro dialog).
|
|
1103
|
-
? t("inst.dialog_parked_hold",
|
|
1104
|
-
: t("inst.dialog_parked_stuck",
|
|
1011
|
+
? t("inst.dialog_parked_hold", name, data.description) + (data.advice === "claude-resume" ? " " + t("inst.dialog_parked_hold_claude_resume") : "")
|
|
1012
|
+
: t("inst.dialog_parked_stuck", name, data.description) + (data.advice === "claude-resume" ? " " + t("inst.dialog_parked_stuck_claude_resume") : "");
|
|
1105
1013
|
// #1990: in General, the instance's name links to its topic.
|
|
1106
|
-
this.notifyParked(name, "dialog_parked", text, category ? t("fleet.interaction_parked",
|
|
1014
|
+
this.notifyParked(name, "dialog_parked", text, category ? t("fleet.interaction_parked", instancePlace(name), category) : t("fleet.dialog_parked", instancePlace(name), data.description));
|
|
1107
1015
|
}, this.ctx.logger, `daemon.dialog_parked[${name}]`));
|
|
1108
1016
|
// #2897: the held dialog is gone (closed, answered, auto-answered) — its notices go with it.
|
|
1109
1017
|
daemon.on("dialog_unparked", safeHandler(() => this.ctx.resolveParkedNotice?.(name), this.ctx.logger, `daemon.dialog_unparked[${name}]`));
|
|
@@ -1140,21 +1048,6 @@ export class InstanceLifecycle {
|
|
|
1140
1048
|
daemon.on("pty_error", safeHandler(async (data) => {
|
|
1141
1049
|
this.ctx.eventLog?.insert(name, "pty_error", { type: data.type, action: data.action });
|
|
1142
1050
|
this.ctx.logger.warn({ name, errorType: data.type, action: data.action }, `PTY error: ${data.message}`);
|
|
1143
|
-
if (daemon.usesNativePane?.()) {
|
|
1144
|
-
// Native credentials and quotas belong to its runner. Never probe a Linux login or group its peers with it.
|
|
1145
|
-
if (this.daemons.get(name) !== daemon)
|
|
1146
|
-
return;
|
|
1147
|
-
this.notifyIncident(name, data.type, data.notice ?? data.message);
|
|
1148
|
-
if (data.action === "pause") {
|
|
1149
|
-
if (data.type === "auth_error") {
|
|
1150
|
-
daemon.confirmAuthFailure?.();
|
|
1151
|
-
daemon.requestPauseWhenIdle({ reconfirmAuth: true, reason: "auth" });
|
|
1152
|
-
}
|
|
1153
|
-
else
|
|
1154
|
-
daemon.requestPauseWhenIdle({ reason: "error" });
|
|
1155
|
-
}
|
|
1156
|
-
return;
|
|
1157
|
-
}
|
|
1158
1051
|
// Antigravity's account-level cap is visible ONLY here: the quota summary
|
|
1159
1052
|
// API keeps reporting its buckets as barely used while the CLI is blocked
|
|
1160
1053
|
// (verified live — 0% used and "Individual quota reached" in the same
|
|
@@ -1202,6 +1095,10 @@ export class InstanceLifecycle {
|
|
|
1202
1095
|
const verdict = await this.verifyClaudeQuota();
|
|
1203
1096
|
if (verdict === "available") {
|
|
1204
1097
|
this.ctx.logger.debug({ name, backend: "claude-code" }, "quota pattern ignored — live usage has capacity (stale pane history)");
|
|
1098
|
+
// Not told: the daemon's one-notice-per-pause mark must not hold back the next repeat (the usage API can lag
|
|
1099
|
+
// the CLI right as the limit hits; the next "reached again" is verified again).
|
|
1100
|
+
if (data.verifyQuota)
|
|
1101
|
+
daemon.clearUsagePauseNotice?.();
|
|
1205
1102
|
return;
|
|
1206
1103
|
}
|
|
1207
1104
|
if (verdict === "unknown") {
|
|
@@ -1260,7 +1157,7 @@ export class InstanceLifecycle {
|
|
|
1260
1157
|
if (notificationTarget)
|
|
1261
1158
|
this.notifyAuthErrorOnce(name, data.message, notificationTarget);
|
|
1262
1159
|
}
|
|
1263
|
-
else if (notificationTarget && data.action !== "backoff_restart" && data.action !== "nudge_continue") {
|
|
1160
|
+
else if (notificationTarget && !data.quotaAdvisory && data.action !== "backoff_restart" && data.action !== "nudge_continue") {
|
|
1264
1161
|
// backoff_restart / nudge_continue notifications are handled in the action branch below
|
|
1265
1162
|
// with per-attempt context (attempt N/max, delay).
|
|
1266
1163
|
// #2872: a notice the user asked to be one line (grok's weekly limit) is posted as it is: no "(action: …)", and no
|
|
@@ -1491,10 +1388,8 @@ export class InstanceLifecycle {
|
|
|
1491
1388
|
return this.lifecycleEpochs.get(name) ?? 0;
|
|
1492
1389
|
}
|
|
1493
1390
|
/** Invalidate every start/wake already running for `name` (they will not publish). */
|
|
1494
|
-
invalidate(name
|
|
1495
|
-
|
|
1496
|
-
if (native && native.token !== nativeOwner)
|
|
1497
|
-
this.cancelNativeRecovery(name);
|
|
1391
|
+
invalidate(name) {
|
|
1392
|
+
this.ctx.agentCredentials?.invalidate(name);
|
|
1498
1393
|
this.lifecycleEpochs.set(name, this.epochOf(name) + 1);
|
|
1499
1394
|
}
|
|
1500
1395
|
/** Whether `transition` is `name`'s transition and is the one running now. */
|
|
@@ -1562,194 +1457,183 @@ export class InstanceLifecycle {
|
|
|
1562
1457
|
const check = () => { execution?.assert(); if (this.epochOf(name) !== epoch)
|
|
1563
1458
|
throw new SupersededStartError(name); };
|
|
1564
1459
|
check();
|
|
1565
|
-
this.ctx.assertGeneralBindingStart?.(name, config);
|
|
1566
1460
|
assertNoSessionOomStop(this.ctx.getInstanceDir(name));
|
|
1567
1461
|
const seedNow = this.activitySeedNow.delete(name);
|
|
1568
1462
|
if (this.daemons.has(name)) {
|
|
1569
1463
|
this.ctx.logger.info({ name }, "Instance already running, skipping");
|
|
1570
1464
|
return;
|
|
1571
1465
|
}
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1466
|
+
if (!existsSync(config.working_directory)) {
|
|
1467
|
+
this.ctx.logger.info({ name, working_directory: config.working_directory }, "Working directory does not exist — creating it");
|
|
1468
|
+
mkdirSync(config.working_directory, { recursive: true });
|
|
1469
|
+
}
|
|
1470
|
+
const instanceDir = this.ctx.getInstanceDir(name);
|
|
1471
|
+
ensureInstanceDir(instanceDir);
|
|
1472
|
+
// Daemon.start consumes the recovery marker after reading it. A start
|
|
1473
|
+
// that fails before reaching the daemon must leave that intent intact.
|
|
1474
|
+
const { Daemon } = await import("./daemon.js");
|
|
1475
|
+
const { createBackend } = await import("./backend/factory.js");
|
|
1476
|
+
check();
|
|
1477
|
+
const backendName = config.backend ?? this.ctx.fleetConfig?.defaults?.backend ?? "claude-code";
|
|
1478
|
+
// A removed backend (#1280): this instance refuses to start, says why and what to use instead, and the rest of
|
|
1479
|
+
// the fleet is unaffected. Never a fallback to another backend.
|
|
1480
|
+
if (isRemovedBackend(backendName)) {
|
|
1481
|
+
const message = removedBackendMessage(backendName, name);
|
|
1482
|
+
this.ctx.logger.error({ name, backend: backendName }, `Not starting: ${message}`);
|
|
1483
|
+
this.ctx.notifyInstanceTopic(name, t("inst.backend_removed", name, backendName, REMOVED_BACKENDS[backendName].replacement));
|
|
1484
|
+
return;
|
|
1485
|
+
}
|
|
1486
|
+
// Verify backend binary is in PATH before spawning. Off-loop resolve pins a
|
|
1487
|
+
// hint so createBackend's resolveBinary does not run synchronous `which`
|
|
1488
|
+
// (#1490 row 67). Missing still only logs; start continues.
|
|
1489
|
+
const installation = BACKEND_INSTALLATION_INFO[backendName];
|
|
1490
|
+
if (installation) {
|
|
1491
|
+
const { resolveBackendBinary } = await import("./backend-availability.js");
|
|
1492
|
+
const path = await resolveBackendBinary(backendName);
|
|
1493
|
+
noteResolvedBinary(installation.binary, path ?? installation.binary);
|
|
1590
1494
|
check();
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
// the fleet is unaffected. Never a fallback to another backend.
|
|
1594
|
-
if (isRemovedBackend(backendName)) {
|
|
1595
|
-
const message = removedBackendMessage(backendName, name);
|
|
1596
|
-
this.ctx.logger.error({ name, backend: backendName }, `Not starting: ${message}`);
|
|
1597
|
-
this.ctx.notifyInstanceTopic(name, t("inst.backend_removed", name, backendName, REMOVED_BACKENDS[backendName].replacement));
|
|
1598
|
-
return;
|
|
1495
|
+
if (!path) {
|
|
1496
|
+
this.ctx.logger.error({ binary: installation.binary, backend: backendName, instance: name }, `Backend binary "${installation.binary}" not found in PATH`);
|
|
1599
1497
|
}
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
this.ctx.notifyInstanceTopic(name, t("inst.root_skip_perms"));
|
|
1498
|
+
}
|
|
1499
|
+
// claude-code refuses --dangerously-skip-permissions as root — fail fast
|
|
1500
|
+
// Unless IS_SANDBOX=1 is set (recognized sandbox environment)
|
|
1501
|
+
if (process.getuid?.() === 0 && backendName === "claude-code" && !process.env.IS_SANDBOX) {
|
|
1502
|
+
const msg = `⚠️ claude-code cannot run with --dangerously-skip-permissions as root. Set IS_SANDBOX=1 or use a non-root user.`;
|
|
1503
|
+
this.ctx.logger.error({ name, backend: backendName }, msg);
|
|
1504
|
+
this.ctx.notifyInstanceTopic(name, t("inst.root_skip_perms"));
|
|
1505
|
+
return;
|
|
1506
|
+
}
|
|
1507
|
+
const backend = createBackend(backendName, instanceDir);
|
|
1508
|
+
const daemon = new Daemon(name, config, instanceDir, topicMode, backend, this.ctx.controlClient ?? undefined, this.ctx.logger, runtimeIdentity ?? {
|
|
1509
|
+
kind: "fleet-topic",
|
|
1510
|
+
backend: backendName,
|
|
1511
|
+
model: config.model ?? "default",
|
|
1512
|
+
}, this.ctx.spawnGate, this.ctx.stormWindow, this.ctx.backendOutage);
|
|
1513
|
+
// Register before start: a pre-launch refusal has no published daemon or later incident handlers.
|
|
1514
|
+
daemon.on("kiro_compatibility_hold", (message) => {
|
|
1515
|
+
const owner = this.daemons.get(name);
|
|
1516
|
+
if (owner ? owner !== daemon : this.epochOf(name) !== epoch)
|
|
1620
1517
|
return;
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
backend: backendName,
|
|
1626
|
-
model: config.model ?? "default",
|
|
1627
|
-
}, this.ctx.spawnGate, this.ctx.stormWindow, this.ctx.backendOutage);
|
|
1628
|
-
if (native) {
|
|
1629
|
-
daemon.setNativePaneLifecycle(native);
|
|
1630
|
-
native.bindDaemon?.(daemon);
|
|
1631
|
-
}
|
|
1632
|
-
daemon.setDeliveryOutboxPort(this.ctx.deliveryOutbox ?? undefined);
|
|
1633
|
-
daemon.setWorkLeaseCheck(() => this.hasWorkLease(name));
|
|
1634
|
-
if (seedNow)
|
|
1635
|
-
daemon.seedActivityNow();
|
|
1636
|
-
// Read at each spawn so a fleet.yaml reload is honoured (#984).
|
|
1637
|
-
daemon.setPeerWorkingDirectories(backendName === "kiro-cli"
|
|
1638
|
-
? this.ctx.kiroPeerWorkingDirectories ? () => this.ctx.kiroPeerWorkingDirectories(name) : undefined
|
|
1639
|
-
: () => peerWorkingDirectories(this.ctx.fleetConfig, name, backendName));
|
|
1640
|
-
daemon.setStatusEmojiAvoidList(() => this.ctx.statusEmojiAvoidList?.(name));
|
|
1641
|
-
// Before start: the first spawn builds the command and emits its launch
|
|
1642
|
-
// warning synchronously inside Daemon.start, long before
|
|
1643
|
-
// attachIncidentHandlers runs (#984).
|
|
1644
|
-
this.attachLaunchWarningHandler(name, daemon);
|
|
1645
|
-
this.attachContextLostHandler(name, daemon);
|
|
1646
|
-
daemon.on("durable_delivery_deferred", (data) => {
|
|
1647
|
-
// A daemon without its outbox port cannot update the row directly. The
|
|
1648
|
-
// lifecycle owns the same-process store and records a bounded pre-write
|
|
1649
|
-
// retry instead of leaving the lane in delivering forever.
|
|
1650
|
-
this.ctx.deliveryOutbox?.retryBeforeBegin(data.deliveryId, data.targetBootId, data.attemptNo, data.reason, 5_000);
|
|
1651
|
-
});
|
|
1652
|
-
daemon.on("mcp_tool_response_written", (data) => {
|
|
1653
|
-
if (!data.operationId || data.daemonBootId !== daemon.bootId)
|
|
1654
|
-
return;
|
|
1655
|
-
try {
|
|
1656
|
-
this.ctx.deliveryOutbox?.markResponseDelivered(name, data.operationId);
|
|
1657
|
-
}
|
|
1658
|
-
catch (err) {
|
|
1659
|
-
this.ctx.logger.error({ name, operationId: data.operationId, err }, "Could not persist MCP response-delivered marker");
|
|
1660
|
-
}
|
|
1661
|
-
});
|
|
1662
|
-
this.applyCapacityBackoffBaseline(name, backendName, daemon);
|
|
1663
|
-
// Catch errors from daemon internals (e.g. IPC server) to prevent crashing the fleet process
|
|
1664
|
-
daemon.on("error", (err) => {
|
|
1665
|
-
this.ctx.logger.error({ err, name }, "Daemon emitted error — instance isolated");
|
|
1666
|
-
});
|
|
1667
|
-
if (this.ctx.deliveryOutbox) {
|
|
1668
|
-
// Fence older-generation submissions and reconcile them before Daemon.start
|
|
1669
|
-
// reaches Strategy A's unconditional old-window kill.
|
|
1670
|
-
const recovered = this.ctx.deliveryOutbox.recoverTargetGeneration(name, daemon.bootId);
|
|
1671
|
-
if (recovered.queued || recovered.reconciliationPending) {
|
|
1672
|
-
this.ctx.logger.warn({ name, ...recovered }, "Preparing durable outbox rows before target generation start");
|
|
1673
|
-
}
|
|
1674
|
-
const reconciled = native
|
|
1675
|
-
? { uncertain: 0, safeToStart: await this.ctx.reconcileNativePaneBeforeStart?.(name, daemon) === true }
|
|
1676
|
-
: await reconcileTargetBeforeStart(this.ctx.deliveryOutbox, name, instanceDir, this.ctx.logger);
|
|
1677
|
-
if (reconciled.uncertain > 0) {
|
|
1678
|
-
this.ctx.logger.warn({ name, ...reconciled }, "Some durable submissions need operator reconciliation");
|
|
1679
|
-
}
|
|
1680
|
-
if (!reconciled.safeToStart) {
|
|
1681
|
-
const message = t("delivery.restart_blocked", name);
|
|
1682
|
-
this.ctx.logger.error({ name, ...reconciled }, message);
|
|
1683
|
-
this.ctx.notifyFleetError?.(message);
|
|
1684
|
-
await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose daemon after reconciliation could not verify old CLI exit"));
|
|
1685
|
-
throw new Error(message);
|
|
1686
|
-
}
|
|
1687
|
-
}
|
|
1688
|
-
if (this.epochOf(name) !== epoch || execution && !execution.current()) {
|
|
1689
|
-
// A stop/restart arrived while this start was reconciling: do not spawn.
|
|
1690
|
-
await daemon.abortStartup().catch(() => { });
|
|
1518
|
+
this.ctx.setKiroCompatibilityHold?.(name, message);
|
|
1519
|
+
});
|
|
1520
|
+
daemon.setAgentCredentialIssuer?.(token => {
|
|
1521
|
+
if (this.epochOf(name) !== epoch)
|
|
1691
1522
|
throw new SupersededStartError(name);
|
|
1523
|
+
this.ctx.agentCredentials?.issue(name, token);
|
|
1524
|
+
});
|
|
1525
|
+
daemon.setDeliveryOutboxPort(this.ctx.deliveryOutbox ?? undefined);
|
|
1526
|
+
daemon.setWorkLeaseCheck(() => this.hasWorkLease(name));
|
|
1527
|
+
if (seedNow)
|
|
1528
|
+
daemon.seedActivityNow();
|
|
1529
|
+
// Read at each spawn so a fleet.yaml reload is honoured (#984).
|
|
1530
|
+
daemon.setPeerWorkingDirectories(backendName === "kiro-cli"
|
|
1531
|
+
? this.ctx.kiroPeerWorkingDirectories ? () => this.ctx.kiroPeerWorkingDirectories(name) : undefined
|
|
1532
|
+
: () => peerWorkingDirectories(this.ctx.fleetConfig, name, backendName));
|
|
1533
|
+
daemon.setStatusEmojiAvoidList(() => this.ctx.statusEmojiAvoidList?.(name));
|
|
1534
|
+
// Before start: the first spawn builds the command and emits its launch
|
|
1535
|
+
// warning synchronously inside Daemon.start, long before
|
|
1536
|
+
// attachIncidentHandlers runs (#984).
|
|
1537
|
+
this.attachLaunchWarningHandler(name, daemon);
|
|
1538
|
+
this.attachContextLostHandler(name, daemon);
|
|
1539
|
+
daemon.on("durable_delivery_deferred", (data) => {
|
|
1540
|
+
// A daemon without its outbox port cannot update the row directly. The
|
|
1541
|
+
// lifecycle owns the same-process store and records a bounded pre-write
|
|
1542
|
+
// retry instead of leaving the lane in delivering forever.
|
|
1543
|
+
this.ctx.deliveryOutbox?.retryBeforeBegin(data.deliveryId, data.targetBootId, data.attemptNo, data.reason, 5_000);
|
|
1544
|
+
});
|
|
1545
|
+
daemon.on("mcp_tool_response_written", (data) => {
|
|
1546
|
+
if (!data.operationId || data.daemonBootId !== daemon.bootId)
|
|
1547
|
+
return;
|
|
1548
|
+
try {
|
|
1549
|
+
this.ctx.deliveryOutbox?.markResponseDelivered(name, data.operationId);
|
|
1692
1550
|
}
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
// hold it and deliver it once both are true.
|
|
1696
|
-
daemon.holdStartupIncidents?.();
|
|
1697
|
-
await InstanceLifecycle.startOrDispose(daemon, name, this.ctx.logger, execution || native ? check : undefined);
|
|
1698
|
-
// Publication fence (Phase 2a): the spawn cannot be cancelled, so a stop or
|
|
1699
|
-
// restart requested meanwhile has been waiting behind this transition. A
|
|
1700
|
-
// superseded start must not register, signal ready, or keep its window.
|
|
1701
|
-
if (this.epochOf(name) !== epoch || execution && !execution.current()) {
|
|
1702
|
-
await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose a superseded start"));
|
|
1703
|
-
throw new SupersededStartError(name);
|
|
1551
|
+
catch (err) {
|
|
1552
|
+
this.ctx.logger.error({ name, operationId: data.operationId, err }, "Could not persist MCP response-delivered marker");
|
|
1704
1553
|
}
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
this.ctx.
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
this.ctx.logger.
|
|
1725
|
-
this.ctx.
|
|
1726
|
-
this.ctx.
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1554
|
+
});
|
|
1555
|
+
this.applyCapacityBackoffBaseline(name, backendName, daemon);
|
|
1556
|
+
// Catch errors from daemon internals (e.g. IPC server) to prevent crashing the fleet process
|
|
1557
|
+
daemon.on("error", (err) => {
|
|
1558
|
+
this.ctx.logger.error({ err, name }, "Daemon emitted error — instance isolated");
|
|
1559
|
+
});
|
|
1560
|
+
if (this.ctx.deliveryOutbox) {
|
|
1561
|
+
// Fence older-generation submissions and reconcile them before Daemon.start
|
|
1562
|
+
// reaches Strategy A's unconditional old-window kill.
|
|
1563
|
+
const recovered = this.ctx.deliveryOutbox.recoverTargetGeneration(name, daemon.bootId);
|
|
1564
|
+
if (recovered.queued || recovered.reconciliationPending) {
|
|
1565
|
+
this.ctx.logger.warn({ name, ...recovered }, "Preparing durable outbox rows before target generation start");
|
|
1566
|
+
}
|
|
1567
|
+
const reconciled = await reconcileTargetBeforeStart(this.ctx.deliveryOutbox, name, instanceDir, this.ctx.logger);
|
|
1568
|
+
if (reconciled.uncertain > 0) {
|
|
1569
|
+
this.ctx.logger.warn({ name, ...reconciled }, "Some durable submissions need operator reconciliation");
|
|
1570
|
+
}
|
|
1571
|
+
if (!reconciled.safeToStart) {
|
|
1572
|
+
const message = t("delivery.restart_blocked", name);
|
|
1573
|
+
this.ctx.logger.error({ name, ...reconciled }, message);
|
|
1574
|
+
this.ctx.notifyFleetError?.(message);
|
|
1575
|
+
await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose daemon after reconciliation could not verify old CLI exit"));
|
|
1576
|
+
throw new Error(message);
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
if (this.epochOf(name) !== epoch || execution && !execution.current()) {
|
|
1580
|
+
// A stop/restart arrived while this start was reconciling: do not spawn.
|
|
1581
|
+
await daemon.abortStartup().catch(() => { });
|
|
1582
|
+
throw new SupersededStartError(name);
|
|
1583
|
+
}
|
|
1584
|
+
// The startup scan can raise an incident (sign-in screen, fatal modal)
|
|
1585
|
+
// before the handlers below exist and before this daemon is registered;
|
|
1586
|
+
// hold it and deliver it once both are true.
|
|
1587
|
+
daemon.holdStartupIncidents?.();
|
|
1588
|
+
await InstanceLifecycle.startOrDispose(daemon, name, this.ctx.logger, execution ? check : undefined);
|
|
1589
|
+
// Publication fence (Phase 2a): the spawn cannot be cancelled, so a stop or
|
|
1590
|
+
// restart requested meanwhile has been waiting behind this transition. A
|
|
1591
|
+
// superseded start must not register, signal ready, or keep its window.
|
|
1592
|
+
if (this.epochOf(name) !== epoch || execution && !execution.current()) {
|
|
1593
|
+
await daemon.abortStartup().catch(err => this.ctx.logger.warn({ err, name }, "Failed to dispose a superseded start"));
|
|
1594
|
+
throw new SupersededStartError(name);
|
|
1595
|
+
}
|
|
1596
|
+
this.capacityBackoffBaselines.delete(name);
|
|
1597
|
+
this.daemons.set(name, daemon);
|
|
1598
|
+
published?.(daemon); // Exact publication, synchronously after the ownership fence.
|
|
1599
|
+
if (seedNow)
|
|
1600
|
+
this.noteWokeForWork(name);
|
|
1601
|
+
this.ctx.onDaemonReady?.(name, daemon.bootId);
|
|
1602
|
+
daemon.on("auto_pause_requested", safeHandler(async (data) => {
|
|
1603
|
+
await this.pause(name, data?.reason ?? "idle");
|
|
1604
|
+
}, this.ctx.logger, `autoPause[${name}]`));
|
|
1605
|
+
daemon.on("auto_paused", (data) => {
|
|
1606
|
+
this.ctx.eventLog?.insert(name, "instance_paused", { reason: "idle", paused_at: data.pausedAt });
|
|
1607
|
+
this.ctx.logger.info({ name, pausedAt: data.pausedAt }, "Instance auto-paused after idle timeout");
|
|
1608
|
+
this.ctx.setTopicIcon(name, "remove");
|
|
1609
|
+
this.ctx.onAttentionChanged?.(name);
|
|
1610
|
+
});
|
|
1611
|
+
daemon.on("auto_woke", () => {
|
|
1612
|
+
this.ctx.onAttentionChanged?.(name);
|
|
1613
|
+
this.ctx.eventLog?.insert(name, "instance_resumed", { reason: "message" });
|
|
1614
|
+
this.ctx.logger.info({ name }, "Instance auto-woke for delivery");
|
|
1741
1615
|
this.ctx.setTopicIcon(name, "green");
|
|
1742
1616
|
this.ctx.touchActivity(name);
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1617
|
+
});
|
|
1618
|
+
this.ctx.setKiroCompatibilityHold?.(name, null);
|
|
1619
|
+
this.attachIncidentHandlers(name, daemon);
|
|
1620
|
+
// #2897: a new daemon starts with no dialog held; a notice the last one left (a crash, a respawn) is out of date.
|
|
1621
|
+
this.ctx.resolveParkedNotice?.(name);
|
|
1622
|
+
daemon.on("pty_recovered", safeHandler((data) => {
|
|
1623
|
+
const mins = Math.floor(data.downtime_s / 60);
|
|
1624
|
+
const secs = data.downtime_s % 60;
|
|
1625
|
+
const duration = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;
|
|
1626
|
+
this.ctx.eventLog?.insert(name, "pty_recovered", { downtime_s: data.downtime_s });
|
|
1627
|
+
this.ctx.logger.info({ name, downtime_s: data.downtime_s }, "PTY error recovered");
|
|
1628
|
+
this.ctx.notifyInstanceTopic(name, t("inst.recovered", name, duration));
|
|
1629
|
+
this.ctx.webhookEmit("pty_recovered", name, { downtime_s: data.downtime_s });
|
|
1630
|
+
}, this.ctx.logger, `daemon.pty_recovered[${name}]`));
|
|
1631
|
+
this.attachDeliveryStatusHandlers(name, daemon);
|
|
1632
|
+
this.ctx.setTopicIcon(name, "green");
|
|
1633
|
+
this.ctx.touchActivity(name);
|
|
1634
|
+
// Last: handlers attached and daemon registered, so a held startup incident
|
|
1635
|
+
// (pause, notify) finds both.
|
|
1636
|
+
daemon.releaseStartupIncidents?.();
|
|
1753
1637
|
}
|
|
1754
1638
|
isPaused(name) {
|
|
1755
1639
|
return this.daemons.get(name)?.isPaused ?? hasPausedMarker(this.ctx.getInstanceDir(name));
|
|
@@ -1758,30 +1642,11 @@ export class InstanceLifecycle {
|
|
|
1758
1642
|
return this.daemons.get(name)?.lastPausedAt ?? readPausedAt(this.ctx.getInstanceDir(name));
|
|
1759
1643
|
}
|
|
1760
1644
|
async pause(name, reason = "operator", admission) {
|
|
1761
|
-
this.cancelNativeRecovery(name);
|
|
1762
1645
|
// Final backstop shared by slash, MCP, Settings, warm-cap, and any future
|
|
1763
1646
|
// caller. General is the coordinator and must remain resident to route work.
|
|
1764
1647
|
if (isGeneralInstance(this.ctx.fleetConfig, name)) {
|
|
1765
1648
|
throw new Error(GENERAL_PAUSE_ERROR);
|
|
1766
1649
|
}
|
|
1767
|
-
const nativeDaemon = this.daemons.get(name);
|
|
1768
|
-
if (nativeDaemon?.usesNativePane?.()) {
|
|
1769
|
-
if (admission && !admission.current())
|
|
1770
|
-
return;
|
|
1771
|
-
await this.runTransition(name, async () => {
|
|
1772
|
-
if (this.daemons.get(name) !== nativeDaemon || admission && !admission.current())
|
|
1773
|
-
return;
|
|
1774
|
-
if (!nativeDaemon.nativePaneHasExited() && (!await nativeDaemon.nativePauseReady(admission) || this.daemons.get(name) !== nativeDaemon || !nativeDaemon.nativePauseStillReady()))
|
|
1775
|
-
return;
|
|
1776
|
-
if (this.daemons.get(name) !== nativeDaemon || admission && !admission.current())
|
|
1777
|
-
return;
|
|
1778
|
-
await this.stopInTransition(name);
|
|
1779
|
-
this.ctx.setNativePanePaused?.(name, true);
|
|
1780
|
-
writePausedMarker(this.ctx.getInstanceDir(name), Date.now(), reason);
|
|
1781
|
-
this.ctx.onAttentionChanged?.(name);
|
|
1782
|
-
});
|
|
1783
|
-
return;
|
|
1784
|
-
}
|
|
1785
1650
|
// B1: cancel any pending capacity backoff — a user-initiated pause should
|
|
1786
1651
|
// not be undone by a queued restart 30–120s later.
|
|
1787
1652
|
const pendingBackoff = this.capacityBackoffTimers.get(name);
|
|
@@ -1865,21 +1730,16 @@ export class InstanceLifecycle {
|
|
|
1865
1730
|
clearPausedMarker(instanceDir);
|
|
1866
1731
|
this.markActivitySeedNow(name);
|
|
1867
1732
|
try {
|
|
1868
|
-
if (isNativePaneInstance(this.ctx.fleetConfig?.instances[name]))
|
|
1869
|
-
this.ctx.setNativePanePaused?.(name, false);
|
|
1870
1733
|
await this.ctx.startPersistedPausedInstance(name, transition);
|
|
1871
1734
|
}
|
|
1872
1735
|
catch (err) {
|
|
1873
1736
|
this.clearActivitySeedNow(name);
|
|
1874
1737
|
writePausedMarker(instanceDir, pausedAt, reason);
|
|
1875
|
-
if (isNativePaneInstance(this.ctx.fleetConfig?.instances[name]))
|
|
1876
|
-
this.ctx.setNativePanePaused?.(name, true);
|
|
1877
1738
|
throw err;
|
|
1878
1739
|
}
|
|
1879
1740
|
}
|
|
1880
1741
|
this.noteWokeForWork(name);
|
|
1881
|
-
|
|
1882
|
-
this.ctx.startStatuslineWatcher(name);
|
|
1742
|
+
this.ctx.startStatuslineWatcher(name);
|
|
1883
1743
|
}
|
|
1884
1744
|
/**
|
|
1885
1745
|
* Ownership boundary for a daemon that is not yet registered: if start()
|
|
@@ -1913,8 +1773,8 @@ export class InstanceLifecycle {
|
|
|
1913
1773
|
this.invalidate(name);
|
|
1914
1774
|
return this.runTransition(name, () => this.stopInTransition(name), transition);
|
|
1915
1775
|
}
|
|
1916
|
-
async stopInTransition(name
|
|
1917
|
-
this.invalidate(name
|
|
1776
|
+
async stopInTransition(name) {
|
|
1777
|
+
this.invalidate(name);
|
|
1918
1778
|
this.wokeAt.delete(name);
|
|
1919
1779
|
this.ctx.setTopicIcon(name, "remove");
|
|
1920
1780
|
// #2897: a stopped instance holds no dialog — its "needs a human" notices are out of date.
|
|
@@ -1939,20 +1799,11 @@ export class InstanceLifecycle {
|
|
|
1939
1799
|
if (!drained)
|
|
1940
1800
|
this.ctx.logger.warn({ name }, "Pane write did not drain before durable reconciliation capture; relying on the Enter write-ahead fence");
|
|
1941
1801
|
this.ctx.deliveryOutbox.markTargetReconciliationPending(name, daemon.bootId);
|
|
1942
|
-
|
|
1943
|
-
const reconciled = await daemon.reconcileNativeDeliveries(this.ctx.deliveryOutbox, () => this.daemons.get(name) === daemon);
|
|
1944
|
-
if (!reconciled)
|
|
1945
|
-
this.ctx.logger.warn({ name }, "Native stop could not settle every old delivery; retained attempts will not be replayed");
|
|
1946
|
-
}
|
|
1947
|
-
if (!daemon.usesNativePane?.())
|
|
1948
|
-
captured = await capturePendingTargetReconciliation(this.ctx.deliveryOutbox, name, this.ctx.getInstanceDir(name), getTmuxSession(), this.ctx.logger);
|
|
1802
|
+
captured = await capturePendingTargetReconciliation(this.ctx.deliveryOutbox, name, this.ctx.getInstanceDir(name), getTmuxSession(), this.ctx.logger);
|
|
1949
1803
|
}
|
|
1950
1804
|
let stopped = false;
|
|
1951
1805
|
try {
|
|
1952
|
-
|
|
1953
|
-
await daemon.stop({ nativePane: "close" });
|
|
1954
|
-
else
|
|
1955
|
-
await daemon.stop();
|
|
1806
|
+
await daemon.stop();
|
|
1956
1807
|
stopped = true;
|
|
1957
1808
|
}
|
|
1958
1809
|
finally {
|
|
@@ -1982,11 +1833,6 @@ export class InstanceLifecycle {
|
|
|
1982
1833
|
if (this.daemons.get(name) === daemon)
|
|
1983
1834
|
this.daemons.delete(name);
|
|
1984
1835
|
}
|
|
1985
|
-
else if (isNativePaneInstance(this.ctx.fleetConfig?.instances[name])) {
|
|
1986
|
-
if (!this.ctx.closeRetainedNativePane)
|
|
1987
|
-
throw Error("Retained native pane owner is unavailable; no local PID was signalled");
|
|
1988
|
-
await this.ctx.closeRetainedNativePane(name);
|
|
1989
|
-
}
|
|
1990
1836
|
else {
|
|
1991
1837
|
const instanceDir = this.ctx.getInstanceDir(name);
|
|
1992
1838
|
const pidPath = join(instanceDir, "daemon.pid");
|
|
@@ -2169,31 +2015,21 @@ export class InstanceLifecycle {
|
|
|
2169
2015
|
clearPausedMarker(this.ctx.getInstanceDir(name));
|
|
2170
2016
|
this.ctx.logger.info({ name }, "Instance removed");
|
|
2171
2017
|
}
|
|
2018
|
+
/**
|
|
2019
|
+
* Whether a new instance made in `adapterId`'s world records it as channel_id: in a fleet with more than one
|
|
2020
|
+
* connection, or when that world is not the first one (where a missing channel_id would route). A single-connection
|
|
2021
|
+
* fleet's fleet.yaml stays as it was.
|
|
2022
|
+
*/
|
|
2023
|
+
bindsAdapter(adapterId) {
|
|
2024
|
+
const fleet = this.ctx.fleetConfig;
|
|
2025
|
+
const channels = fleet?.channels ?? (fleet?.channel ? [fleet.channel] : []);
|
|
2026
|
+
const first = channels[0] ? (channels[0].id ?? channels[0].type) : undefined;
|
|
2027
|
+
return channels.length > 1 || adapterId !== first;
|
|
2028
|
+
}
|
|
2172
2029
|
/** Handle create_instance tool call from a daemon. */
|
|
2173
2030
|
async handleCreate(args, respond, adapterId, execution) {
|
|
2174
2031
|
const check = () => execution?.assert();
|
|
2175
2032
|
check();
|
|
2176
|
-
if (args.runtime !== undefined && args.runtime !== "wsl" && args.runtime !== "windows") {
|
|
2177
|
-
respond(null, "Unknown instance runtime");
|
|
2178
|
-
return;
|
|
2179
|
-
}
|
|
2180
|
-
// M-2239 P1-1: a Windows agent is created only from the admin web dashboard (native-instance-api.ts), never through
|
|
2181
|
-
// create_instance, deploy_template or any other path that reaches here — an agent holding create_instance could
|
|
2182
|
-
// otherwise start one on the Windows host, in any drive path, with write access.
|
|
2183
|
-
if (args.runtime === "windows") {
|
|
2184
|
-
respond(null, WINDOWS_CREATE_REFUSED);
|
|
2185
|
-
return;
|
|
2186
|
-
}
|
|
2187
|
-
// #3021 review: on a fleet with no chat connection a new agent never becomes a second General (it would inherit
|
|
2188
|
-
// defaults.general_topic: true while the fleet has one).
|
|
2189
|
-
if (this.ctx.fleetConfig && addsSecondGeneral(this.ctx.fleetConfig)) {
|
|
2190
|
-
respond(null, "one_general: this fleet already has its General, and a new agent would inherit defaults.general_topic: true — set it to false in the defaults first");
|
|
2191
|
-
return;
|
|
2192
|
-
}
|
|
2193
|
-
if (args.sandbox !== undefined) {
|
|
2194
|
-
respond(null, "sandbox is supported only by the Windows runtime");
|
|
2195
|
-
return;
|
|
2196
|
-
}
|
|
2197
2033
|
const rawDirectory = args.directory;
|
|
2198
2034
|
const directory = rawDirectory ? rawDirectory.replace(/^~/, process.env.HOME || "~") : undefined;
|
|
2199
2035
|
const topicName = args.topic_name || (directory ? basename(directory) : undefined);
|
|
@@ -2455,6 +2291,9 @@ export class InstanceLifecycle {
|
|
|
2455
2291
|
...getEffectiveInstanceDefaults(this.ctx.fleetConfig.defaults ?? {}),
|
|
2456
2292
|
working_directory: workDir,
|
|
2457
2293
|
...(createdTopicId != null ? { topic_id: createdTopicId } : {}),
|
|
2294
|
+
// The topic was made in the caller's world (a Discord General in a fleet that lists Telegram first, or the
|
|
2295
|
+
// inverse): the instance is bound to that adapter, so routing and replies use it — not the fleet's first one.
|
|
2296
|
+
...(createdTopicId != null && adapterId && this.bindsAdapter(adapterId) ? { channel_id: adapterId } : {}),
|
|
2458
2297
|
...(description ? { description } : {}),
|
|
2459
2298
|
...(systemPrompt ? { systemPrompt } : {}),
|
|
2460
2299
|
...(args.model ? { model: args.model } : {}),
|
|
@@ -2484,11 +2323,6 @@ export class InstanceLifecycle {
|
|
|
2484
2323
|
createdConfig = instanceConfig;
|
|
2485
2324
|
const beforeCreate = structuredClone(this.ctx.fleetConfig);
|
|
2486
2325
|
const persist = () => {
|
|
2487
|
-
// #3021 review r2: asked again at the commit, after every await — two creates that both saw no General at entry
|
|
2488
|
-
// (defaults.general_topic: true) must not both become one.
|
|
2489
|
-
if (addsSecondGeneral(this.ctx.fleetConfig, { general_topic: instanceConfig.general_topic })) {
|
|
2490
|
-
throw new Error("one_general: this fleet already has its General, and a new agent would inherit defaults.general_topic: true — set it to false in the defaults first");
|
|
2491
|
-
}
|
|
2492
2326
|
this.ctx.fleetConfig.instances[newInstanceName] = instanceConfig;
|
|
2493
2327
|
if (createdTopicId != null)
|
|
2494
2328
|
this.ctx.routing.register(createdTopicId, { kind: "instance", name: newInstanceName });
|
|
@@ -2557,7 +2391,8 @@ export class InstanceLifecycle {
|
|
|
2557
2391
|
/** Handle delete_instance tool call from a daemon. */
|
|
2558
2392
|
async handleDelete(args, respond) {
|
|
2559
2393
|
const instanceName = args.name;
|
|
2560
|
-
|
|
2394
|
+
// The user's decision (beta.9): deleting an agent deletes its topic, unless `delete_topic: false` keeps it.
|
|
2395
|
+
const deleteTopic = args.delete_topic ?? true;
|
|
2561
2396
|
const instanceConfig = this.ctx.fleetConfig?.instances[instanceName];
|
|
2562
2397
|
if (!instanceConfig) {
|
|
2563
2398
|
respond(null, `Instance not found: ${instanceName}`);
|
|
@@ -2567,11 +2402,9 @@ export class InstanceLifecycle {
|
|
|
2567
2402
|
respond(null, "Cannot delete the General instance");
|
|
2568
2403
|
return;
|
|
2569
2404
|
}
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
}
|
|
2573
|
-
await this.ctx.removeInstance(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"));
|
|
2574
|
-
respond({ success: true, name: instanceName, topic_deleted: deleteTopic });
|
|
2405
|
+
// topic_deleted is the platform's answer, never the request; when the topic stays, topic_reason says why.
|
|
2406
|
+
const topic = await this.ctx.removeInstanceAndTopic(instanceName, authorizeExplicitInstanceRemoval("delete-instance-tool"), { deleteTopic });
|
|
2407
|
+
respond({ success: true, name: instanceName, topic_deleted: topic.deleted, ...(topic.deleted ? {} : { topic_reason: topic.reason }) });
|
|
2575
2408
|
}
|
|
2576
2409
|
has(name) {
|
|
2577
2410
|
return this.daemons.has(name);
|