@songsid/agend 2.3.5-alpha.4 → 2.3.5-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +52 -0
- package/dist/accounts-view.d.ts +97 -0
- package/dist/accounts-view.js +116 -0
- package/dist/accounts-view.js.map +1 -0
- 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 +3 -1
- package/dist/agent-endpoint.js +13 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.js +1 -1
- package/dist/agent-file-read.js.map +1 -1
- package/dist/agent-runtime-change.d.ts +3 -1
- package/dist/agent-runtime-change.js +15 -3
- package/dist/agent-runtime-change.js.map +1 -1
- package/dist/agent-workspace.d.ts +93 -0
- package/dist/agent-workspace.js +353 -0
- package/dist/agent-workspace.js.map +1 -0
- package/dist/auth-api.d.ts +27 -0
- package/dist/auth-api.js +164 -3
- 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/backend/antigravity.js +3 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/codex-footer-hints.d.ts +3 -0
- package/dist/backend/codex-footer-hints.js +14 -0
- package/dist/backend/codex-footer-hints.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-quota-history.d.ts +7 -0
- package/dist/backend/codex-quota-history.js +57 -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 +7 -0
- package/dist/backend/codex.js +78 -15
- 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 -1
- package/dist/backend/grok.js +301 -54
- 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/native-pane.d.ts +3 -1
- package/dist/backend/native-pane.js +2 -2
- package/dist/backend/native-pane.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/build-provenance-cli.d.ts +3 -0
- package/dist/build-provenance-cli.js +11 -0
- package/dist/build-provenance-cli.js.map +1 -0
- package/dist/build-provenance.d.ts +20 -0
- package/dist/build-provenance.js +67 -0
- package/dist/build-provenance.js.map +1 -0
- package/dist/build-provenance.json +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/mcp-tools.js +3 -3
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +2 -0
- package/dist/claude-auth-status.d.ts +48 -0
- package/dist/claude-auth-status.js +149 -0
- package/dist/claude-auth-status.js.map +1 -0
- package/dist/cli.js +138 -37
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +21 -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 +70 -1
- package/dist/daemon.js +547 -25
- 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 +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 +1 -1
- package/dist/delivery-reconciliation.js +1 -1
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/doctor.js +20 -9
- package/dist/doctor.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 +359 -7
- package/dist/fleet-manager.js +1365 -90
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +2 -1
- package/dist/fleet-windows-runtime.js +25 -7
- package/dist/fleet-windows-runtime.js.map +1 -1
- package/dist/general-knowledge/skills/concepts/SKILL.md +425 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
- 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/session-management/SKILL.md +1 -1
- package/dist/general-knowledge/skills/tui-effort/SKILL.md +10 -10
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +31 -15
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/general-role.d.ts +1 -1
- package/dist/general-role.js +1 -0
- package/dist/general-role.js.map +1 -1
- package/dist/hub/admission.d.ts +28 -0
- package/dist/hub/admission.js +62 -0
- package/dist/hub/admission.js.map +1 -0
- package/dist/hub/attachments/limits.d.ts +20 -0
- package/dist/hub/attachments/limits.js +48 -0
- package/dist/hub/attachments/limits.js.map +1 -0
- package/dist/hub/attachments/store.d.ts +116 -0
- package/dist/hub/attachments/store.js +246 -0
- package/dist/hub/attachments/store.js.map +1 -0
- package/dist/hub/audit/index.d.ts +62 -0
- package/dist/hub/audit/index.js +344 -0
- package/dist/hub/audit/index.js.map +1 -0
- package/dist/hub/browser-certificate.d.ts +38 -0
- package/dist/hub/browser-certificate.js +247 -0
- package/dist/hub/browser-certificate.js.map +1 -0
- package/dist/hub/buttons-model.d.ts +9 -0
- package/dist/hub/buttons-model.js +42 -0
- package/dist/hub/buttons-model.js.map +1 -0
- package/dist/hub/buttons.d.ts +54 -0
- package/dist/hub/buttons.js +346 -0
- package/dist/hub/buttons.js.map +1 -0
- package/dist/hub/catalog.d.ts +74 -0
- package/dist/hub/catalog.js +195 -0
- package/dist/hub/catalog.js.map +1 -0
- package/dist/hub/client.d.ts +69 -0
- package/dist/hub/client.js +300 -0
- package/dist/hub/client.js.map +1 -0
- package/dist/hub/compose/member.d.ts +139 -0
- package/dist/hub/compose/member.js +450 -0
- package/dist/hub/compose/member.js.map +1 -0
- package/dist/hub/compose/server.d.ts +77 -0
- package/dist/hub/compose/server.js +349 -0
- package/dist/hub/compose/server.js.map +1 -0
- package/dist/hub/compose/views.d.ts +12 -0
- package/dist/hub/compose/views.js +4 -0
- package/dist/hub/compose/views.js.map +1 -0
- package/dist/hub/db.d.ts +56 -0
- package/dist/hub/db.js +188 -0
- package/dist/hub/db.js.map +1 -0
- package/dist/hub/directory/config.d.ts +39 -0
- package/dist/hub/directory/config.js +108 -0
- package/dist/hub/directory/config.js.map +1 -0
- package/dist/hub/directory/directory.d.ts +18 -0
- package/dist/hub/directory/directory.js +320 -0
- package/dist/hub/directory/directory.js.map +1 -0
- package/dist/hub/directory/index.d.ts +7 -0
- package/dist/hub/directory/index.js +4 -0
- package/dist/hub/directory/index.js.map +1 -0
- package/dist/hub/directory/profiles.d.ts +41 -0
- package/dist/hub/directory/profiles.js +90 -0
- package/dist/hub/directory/profiles.js.map +1 -0
- package/dist/hub/directory/types.d.ts +71 -0
- package/dist/hub/directory/types.js +14 -0
- package/dist/hub/directory/types.js.map +1 -0
- package/dist/hub/execution/cli-provider.d.ts +23 -0
- package/dist/hub/execution/cli-provider.js +341 -0
- package/dist/hub/execution/cli-provider.js.map +1 -0
- package/dist/hub/execution/index.d.ts +13 -0
- package/dist/hub/execution/index.js +8 -0
- package/dist/hub/execution/index.js.map +1 -0
- package/dist/hub/execution/model-broker.d.ts +24 -0
- package/dist/hub/execution/model-broker.js +208 -0
- package/dist/hub/execution/model-broker.js.map +1 -0
- package/dist/hub/execution/provider-setup.d.ts +11 -0
- package/dist/hub/execution/provider-setup.js +21 -0
- package/dist/hub/execution/provider-setup.js.map +1 -0
- package/dist/hub/execution/sandbox-runner.d.ts +1 -0
- package/dist/hub/execution/sandbox-runner.js +221 -0
- package/dist/hub/execution/sandbox-runner.js.map +1 -0
- package/dist/hub/execution/service.d.ts +136 -0
- package/dist/hub/execution/service.js +459 -0
- package/dist/hub/execution/service.js.map +1 -0
- package/dist/hub/execution/store.d.ts +61 -0
- package/dist/hub/execution/store.js +182 -0
- package/dist/hub/execution/store.js.map +1 -0
- package/dist/hub/execution/views.d.ts +20 -0
- package/dist/hub/execution/views.js +48 -0
- package/dist/hub/execution/views.js.map +1 -0
- package/dist/hub/http/compose.d.ts +20 -0
- package/dist/hub/http/compose.js +518 -0
- package/dist/hub/http/compose.js.map +1 -0
- package/dist/hub/http/core.d.ts +49 -0
- package/dist/hub/http/core.js +124 -0
- package/dist/hub/http/core.js.map +1 -0
- package/dist/hub/http/deps.d.ts +61 -0
- package/dist/hub/http/deps.js +2 -0
- package/dist/hub/http/deps.js.map +1 -0
- package/dist/hub/http/schema.d.ts +14 -0
- package/dist/hub/http/schema.js +80 -0
- package/dist/hub/http/schema.js.map +1 -0
- package/dist/hub/identity.d.ts +32 -0
- package/dist/hub/identity.js +80 -0
- package/dist/hub/identity.js.map +1 -0
- package/dist/hub/init/browser-certificate.d.ts +9 -0
- package/dist/hub/init/browser-certificate.js +78 -0
- package/dist/hub/init/browser-certificate.js.map +1 -0
- package/dist/hub/init/browser-tls.d.ts +18 -0
- package/dist/hub/init/browser-tls.js +62 -0
- package/dist/hub/init/browser-tls.js.map +1 -0
- package/dist/hub/init/cli.d.ts +3 -0
- package/dist/hub/init/cli.js +83 -0
- package/dist/hub/init/cli.js.map +1 -0
- package/dist/hub/init/directory-certificate.d.ts +24 -0
- package/dist/hub/init/directory-certificate.js +222 -0
- package/dist/hub/init/directory-certificate.js.map +1 -0
- package/dist/hub/init/existing-fleet.d.ts +6 -0
- package/dist/hub/init/existing-fleet.js +58 -0
- package/dist/hub/init/existing-fleet.js.map +1 -0
- package/dist/hub/init/handoff.d.ts +8 -0
- package/dist/hub/init/handoff.js +36 -0
- package/dist/hub/init/handoff.js.map +1 -0
- package/dist/hub/init/identity.d.ts +5 -0
- package/dist/hub/init/identity.js +24 -0
- package/dist/hub/init/identity.js.map +1 -0
- package/dist/hub/init/initializer.d.ts +24 -0
- package/dist/hub/init/initializer.js +385 -0
- package/dist/hub/init/initializer.js.map +1 -0
- package/dist/hub/init/inventory.d.ts +17 -0
- package/dist/hub/init/inventory.js +33 -0
- package/dist/hub/init/inventory.js.map +1 -0
- package/dist/hub/init/layout.d.ts +32 -0
- package/dist/hub/init/layout.js +53 -0
- package/dist/hub/init/layout.js.map +1 -0
- package/dist/hub/init/network.d.ts +18 -0
- package/dist/hub/init/network.js +104 -0
- package/dist/hub/init/network.js.map +1 -0
- package/dist/hub/init/plan-digest.d.ts +5 -0
- package/dist/hub/init/plan-digest.js +47 -0
- package/dist/hub/init/plan-digest.js.map +1 -0
- package/dist/hub/init/prompt.d.ts +26 -0
- package/dist/hub/init/prompt.js +110 -0
- package/dist/hub/init/prompt.js.map +1 -0
- package/dist/hub/init/secret-file.d.ts +1 -0
- package/dist/hub/init/secret-file.js +59 -0
- package/dist/hub/init/secret-file.js.map +1 -0
- package/dist/hub/init/text.d.ts +127 -0
- package/dist/hub/init/text.js +247 -0
- package/dist/hub/init/text.js.map +1 -0
- package/dist/hub/init/types.d.ts +114 -0
- package/dist/hub/init/types.js +9 -0
- package/dist/hub/init/types.js.map +1 -0
- package/dist/hub/init/wizard.d.ts +34 -0
- package/dist/hub/init/wizard.js +554 -0
- package/dist/hub/init/wizard.js.map +1 -0
- package/dist/hub/initialization.d.ts +23 -0
- package/dist/hub/initialization.js +28 -0
- package/dist/hub/initialization.js.map +1 -0
- package/dist/hub/member/agent-mode.d.ts +6 -0
- package/dist/hub/member/agent-mode.js +23 -0
- package/dist/hub/member/agent-mode.js.map +1 -0
- package/dist/hub/member/attachments.d.ts +29 -0
- package/dist/hub/member/attachments.js +107 -0
- package/dist/hub/member/attachments.js.map +1 -0
- package/dist/hub/member/exposure-api.d.ts +87 -0
- package/dist/hub/member/exposure-api.js +64 -0
- package/dist/hub/member/exposure-api.js.map +1 -0
- package/dist/hub/member/exposures.d.ts +123 -0
- package/dist/hub/member/exposures.js +282 -0
- package/dist/hub/member/exposures.js.map +1 -0
- package/dist/hub/member/pairing-api.d.ts +85 -0
- package/dist/hub/member/pairing-api.js +385 -0
- package/dist/hub/member/pairing-api.js.map +1 -0
- package/dist/hub/member/quota.d.ts +20 -0
- package/dist/hub/member/quota.js +98 -0
- package/dist/hub/member/quota.js.map +1 -0
- package/dist/hub/member-journal.d.ts +104 -0
- package/dist/hub/member-journal.js +336 -0
- package/dist/hub/member-journal.js.map +1 -0
- package/dist/hub/member-reconciliation.d.ts +14 -0
- package/dist/hub/member-reconciliation.js +97 -0
- package/dist/hub/member-reconciliation.js.map +1 -0
- package/dist/hub/mount.d.ts +39 -0
- package/dist/hub/mount.js +123 -0
- package/dist/hub/mount.js.map +1 -0
- package/dist/hub/pairing-client.d.ts +17 -0
- package/dist/hub/pairing-client.js +108 -0
- package/dist/hub/pairing-client.js.map +1 -0
- package/dist/hub/pairing.d.ts +65 -0
- package/dist/hub/pairing.js +211 -0
- package/dist/hub/pairing.js.map +1 -0
- package/dist/hub/policy.d.ts +63 -0
- package/dist/hub/policy.js +147 -0
- package/dist/hub/policy.js.map +1 -0
- package/dist/hub/preview.d.ts +32 -0
- package/dist/hub/preview.js +64 -0
- package/dist/hub/preview.js.map +1 -0
- package/dist/hub/private-files.d.ts +5 -0
- package/dist/hub/private-files.js +44 -0
- package/dist/hub/private-files.js.map +1 -0
- package/dist/hub/profile.d.ts +59 -0
- package/dist/hub/profile.js +73 -0
- package/dist/hub/profile.js.map +1 -0
- package/dist/hub/protocol.d.ts +779 -0
- package/dist/hub/protocol.js +93 -0
- package/dist/hub/protocol.js.map +1 -0
- package/dist/hub/quota.d.ts +24 -0
- package/dist/hub/quota.js +112 -0
- package/dist/hub/quota.js.map +1 -0
- package/dist/hub/representative.d.ts +141 -0
- package/dist/hub/representative.js +528 -0
- package/dist/hub/representative.js.map +1 -0
- package/dist/hub/retention.d.ts +17 -0
- package/dist/hub/retention.js +45 -0
- package/dist/hub/retention.js.map +1 -0
- package/dist/hub/rooms.d.ts +120 -0
- package/dist/hub/rooms.js +535 -0
- package/dist/hub/rooms.js.map +1 -0
- package/dist/hub/runtime.d.ts +106 -0
- package/dist/hub/runtime.js +298 -0
- package/dist/hub/runtime.js.map +1 -0
- package/dist/hub/server.d.ts +56 -0
- package/dist/hub/server.js +202 -0
- package/dist/hub/server.js.map +1 -0
- package/dist/hub/service-start.d.ts +17 -0
- package/dist/hub/service-start.js +109 -0
- package/dist/hub/service-start.js.map +1 -0
- package/dist/hub/sessions.d.ts +53 -0
- package/dist/hub/sessions.js +196 -0
- package/dist/hub/sessions.js.map +1 -0
- package/dist/hub/socket.d.ts +24 -0
- package/dist/hub/socket.js +79 -0
- package/dist/hub/socket.js.map +1 -0
- package/dist/hub/store.d.ts +77 -0
- package/dist/hub/store.js +88 -0
- package/dist/hub/store.js.map +1 -0
- package/dist/hub/tls.d.ts +31 -0
- package/dist/hub/tls.js +135 -0
- package/dist/hub/tls.js.map +1 -0
- package/dist/hub/types.d.ts +401 -0
- package/dist/hub/types.js +2 -0
- package/dist/hub/types.js.map +1 -0
- package/dist/hub/validation.d.ts +33 -0
- package/dist/hub/validation.js +136 -0
- package/dist/hub/validation.js.map +1 -0
- package/dist/hub/version-floor.d.ts +10 -0
- package/dist/hub/version-floor.js +45 -0
- package/dist/hub/version-floor.js.map +1 -0
- package/dist/hub-browser-certificate-policy.d.ts +31 -0
- package/dist/hub-browser-certificate-policy.js +25 -0
- package/dist/hub-browser-certificate-policy.js.map +1 -0
- package/dist/hub-membership-settings.d.ts +6 -0
- package/dist/hub-membership-settings.js +21 -0
- package/dist/hub-membership-settings.js.map +1 -0
- package/dist/hub-mode.d.ts +15 -0
- package/dist/hub-mode.js +17 -0
- package/dist/hub-mode.js.map +1 -0
- package/dist/hub-pairing-summary.d.ts +48 -0
- package/dist/hub-pairing-summary.js +36 -0
- package/dist/hub-pairing-summary.js.map +1 -0
- package/dist/hub-report-target.d.ts +32 -0
- package/dist/hub-report-target.js +33 -0
- package/dist/hub-report-target.js.map +1 -0
- package/dist/hub-retention-policy.d.ts +14 -0
- package/dist/hub-retention-policy.js +15 -0
- package/dist/hub-retention-policy.js.map +1 -0
- package/dist/instance-config-impact.js +3 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +17 -2
- package/dist/instance-lifecycle.js +58 -8
- 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 -1
- package/dist/instructions.js +1 -1
- 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/launchd-service-domain.d.ts +5 -0
- package/dist/launchd-service-domain.js +21 -0
- package/dist/launchd-service-domain.js.map +1 -0
- package/dist/locale.js +125 -3
- 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 +15 -7
- package/dist/login-flows.js +29 -3
- 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/ls-rows.js +3 -4
- package/dist/ls-rows.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/native-instance-api.d.ts +0 -1
- package/dist/native-instance-api.js +15 -3
- package/dist/native-instance-api.js.map +1 -1
- package/dist/native-instance-input.d.ts +3 -0
- package/dist/native-instance-input.js +6 -1
- package/dist/native-instance-input.js.map +1 -1
- package/dist/native-instance-registry.d.ts +6 -0
- package/dist/native-instance-registry.js +24 -0
- package/dist/native-instance-registry.js.map +1 -1
- package/dist/native-mcp.d.ts +3 -0
- package/dist/native-mcp.js +15 -2
- package/dist/native-mcp.js.map +1 -1
- package/dist/native-pane-lifecycle.d.ts +8 -0
- package/dist/native-pane-lifecycle.js +13 -4
- package/dist/native-pane-lifecycle.js.map +1 -1
- package/dist/native-pane-manager.js +17 -9
- package/dist/native-pane-manager.js.map +1 -1
- package/dist/needs-you-hub.d.ts +9 -1
- package/dist/needs-you-hub.js +46 -8
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +47 -2
- package/dist/needs-you.js +31 -3
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.js +2 -2
- package/dist/office-share-page.js.map +1 -1
- package/dist/office-share.d.ts +11 -0
- package/dist/office-share.js +14 -0
- package/dist/office-share.js.map +1 -1
- package/dist/office-talk.d.ts +26 -0
- package/dist/office-talk.js +50 -0
- package/dist/office-talk.js.map +1 -0
- package/dist/outbound-handlers.d.ts +14 -0
- package/dist/outbound-handlers.js +49 -6
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +33 -1
- package/dist/outbound-schemas.js +29 -16
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-quota-history.d.ts +9 -0
- package/dist/pane-quota-history.js +67 -0
- package/dist/pane-quota-history.js.map +1 -0
- package/dist/pause-marker.d.ts +1 -1
- package/dist/pause-marker.js +1 -1
- package/dist/pause-marker.js.map +1 -1
- 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 +7 -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.d.ts +13 -0
- package/dist/quickstart.js +81 -5
- package/dist/quickstart.js.map +1 -1
- 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/runtime-api.d.ts +2 -0
- package/dist/runtime-api.js +25 -7
- package/dist/runtime-api.js.map +1 -1
- package/dist/runtime-build-info.js +5 -3
- package/dist/runtime-build-info.js.map +1 -1
- package/dist/runtime-bundle.d.ts +3 -0
- package/dist/runtime-bundle.js +3 -1
- package/dist/runtime-bundle.js.map +1 -1
- package/dist/runtime-cli.d.ts +8 -1
- package/dist/runtime-cli.js +127 -8
- package/dist/runtime-cli.js.map +1 -1
- package/dist/runtime-client-store.d.ts +7 -0
- package/dist/runtime-client-store.js +30 -2
- package/dist/runtime-client-store.js.map +1 -1
- package/dist/runtime-client.d.ts +63 -1
- package/dist/runtime-client.js +295 -21
- package/dist/runtime-client.js.map +1 -1
- package/dist/runtime-coordinator.d.ts +7 -0
- package/dist/runtime-coordinator.js +213 -35
- package/dist/runtime-coordinator.js.map +1 -1
- package/dist/runtime-credential-profiles.d.ts +78 -0
- package/dist/runtime-credential-profiles.js +280 -0
- package/dist/runtime-credential-profiles.js.map +1 -0
- package/dist/runtime-install.d.ts +50 -0
- package/dist/runtime-install.js +186 -0
- package/dist/runtime-install.js.map +1 -0
- package/dist/runtime-pane-assets.d.ts +1 -1
- package/dist/runtime-pane-assets.js +1 -1
- package/dist/runtime-pane-assets.js.map +1 -1
- package/dist/runtime-pane-codex-index.d.ts +10 -1
- package/dist/runtime-pane-codex-index.js +131 -27
- package/dist/runtime-pane-codex-index.js.map +1 -1
- package/dist/runtime-pane-host.d.ts +19 -0
- package/dist/runtime-pane-host.js +50 -7
- package/dist/runtime-pane-host.js.map +1 -1
- package/dist/runtime-pane-link.d.ts +7 -0
- package/dist/runtime-pane-link.js +93 -2
- package/dist/runtime-pane-link.js.map +1 -1
- package/dist/runtime-pane-mcp-relay.d.ts +1 -0
- package/dist/runtime-pane-mcp-relay.js +10 -0
- package/dist/runtime-pane-mcp-relay.js.map +1 -1
- package/dist/runtime-pane-mcp.d.ts +4 -0
- package/dist/runtime-pane-mcp.js +6 -3
- package/dist/runtime-pane-mcp.js.map +1 -1
- package/dist/runtime-pane-native.d.ts +32 -2
- package/dist/runtime-pane-native.js +55 -6
- package/dist/runtime-pane-native.js.map +1 -1
- package/dist/runtime-pane-port.d.ts +5 -0
- package/dist/runtime-pane-port.js +17 -1
- package/dist/runtime-pane-port.js.map +1 -1
- package/dist/runtime-pane-process.d.ts +1 -1
- package/dist/runtime-pane-process.js +11 -2
- package/dist/runtime-pane-process.js.map +1 -1
- package/dist/runtime-pane-protocol.d.ts +11 -1
- package/dist/runtime-pane-protocol.js +27 -5
- package/dist/runtime-pane-protocol.js.map +1 -1
- package/dist/runtime-pane-quota-history.d.ts +6 -0
- package/dist/runtime-pane-quota-history.js +44 -0
- package/dist/runtime-pane-quota-history.js.map +1 -0
- package/dist/runtime-pane-service.d.ts +5 -0
- package/dist/runtime-pane-service.js +47 -12
- package/dist/runtime-pane-service.js.map +1 -1
- package/dist/runtime-pane-transcript.d.ts +5 -0
- package/dist/runtime-pane-transcript.js +66 -5
- package/dist/runtime-pane-transcript.js.map +1 -1
- package/dist/runtime-pane-worker.js +19 -6
- package/dist/runtime-pane-worker.js.map +1 -1
- package/dist/runtime-protocol.d.ts +17 -2
- package/dist/runtime-protocol.js +12 -0
- package/dist/runtime-protocol.js.map +1 -1
- package/dist/runtime-update-activity.d.ts +21 -0
- package/dist/runtime-update-activity.js +51 -0
- package/dist/runtime-update-activity.js.map +1 -0
- package/dist/runtime-update-artifact.d.ts +31 -0
- package/dist/runtime-update-artifact.js +252 -0
- package/dist/runtime-update-artifact.js.map +1 -0
- package/dist/runtime-update-install.d.ts +31 -0
- package/dist/runtime-update-install.js +205 -0
- package/dist/runtime-update-install.js.map +1 -0
- package/dist/runtime-update-journal.d.ts +44 -0
- package/dist/runtime-update-journal.js +121 -0
- package/dist/runtime-update-journal.js.map +1 -0
- package/dist/runtime-update-lock.d.ts +48 -0
- package/dist/runtime-update-lock.js +217 -0
- package/dist/runtime-update-lock.js.map +1 -0
- package/dist/runtime-update-owners.d.ts +29 -0
- package/dist/runtime-update-owners.js +240 -0
- package/dist/runtime-update-owners.js.map +1 -0
- package/dist/runtime-update-protocol.d.ts +15 -0
- package/dist/runtime-update-protocol.js +13 -0
- package/dist/runtime-update-protocol.js.map +1 -0
- package/dist/runtime-windows-bridge.d.ts +2 -1
- package/dist/runtime-windows-bridge.js +11 -1
- package/dist/runtime-windows-bridge.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-text.js +1 -1
- package/dist/scheduler/task-board-text.js.map +1 -1
- package/dist/scheduler/task-board.d.ts +13 -0
- package/dist/scheduler/task-board.js +28 -3
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/service-drain.d.ts +19 -0
- package/dist/service-drain.js +64 -0
- package/dist/service-drain.js.map +1 -0
- package/dist/service-installer.d.ts +7 -2
- package/dist/service-installer.js +13 -10
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +20 -0
- package/dist/settings-api.js +414 -4
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +6 -0
- package/dist/settings-baseline.js +3 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.js +29 -6
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.d.ts +13 -0
- package/dist/settings-effect.js +97 -0
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +13 -1
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +27 -0
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/setup-wizard.js +6 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/task-board-tool.d.ts +13 -1
- package/dist/task-board-tool.js +104 -4
- 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-binary.d.ts +59 -0
- package/dist/tmux-binary.js +200 -0
- package/dist/tmux-binary.js.map +1 -0
- package/dist/tmux-control.js +4 -4
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.js +32 -1
- package/dist/tmux-exec-helper.js.map +1 -1
- package/dist/tmux-manager.d.ts +1 -1
- package/dist/tmux-manager.js +45 -36
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.js +4 -3
- package/dist/tmux-read.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 +10 -5
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-monitor.d.ts +20 -0
- package/dist/transcript-monitor.js +47 -3
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-needles.d.ts +7 -0
- package/dist/transcript-needles.js +9 -1
- package/dist/transcript-needles.js.map +1 -1
- package/dist/transcript-records.d.ts +1 -1
- package/dist/transcript-records.js +2 -1
- package/dist/transcript-records.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/ui/account-identity.js +27 -0
- package/dist/ui/accounts-view.js +214 -0
- package/dist/ui/agent-runtime-settings.js +9 -8
- package/dist/ui/backend-signin.js +4 -1
- package/dist/ui/chat-ambient.js +1 -1
- package/dist/ui/chat-md-strings.js +3 -0
- package/dist/ui/chat-render.js +3 -670
- package/dist/ui/chat-store.js +1 -1
- package/dist/ui/chat-strings.js +3 -333
- package/dist/ui/chat-thread.js +3 -919
- package/dist/ui/chat-time.js +3 -80
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/credential-profile-select.js +54 -0
- package/dist/ui/fleet-office-dialogue.d.ts +30 -0
- package/dist/ui/fleet-office-dialogue.js +382 -0
- package/dist/ui/fleet-office-pack.d.ts +9 -0
- package/dist/ui/fleet-office-pack.js +76 -4
- package/dist/ui/fleet-office-skin.js +23 -5
- package/dist/ui/fleet-office-store.js +5 -0
- package/dist/ui/fleet-office.js +173 -6
- package/dist/ui/fleet-task-card.js +10 -6
- package/dist/ui/fleet-task-common.js +12 -2
- package/dist/ui/fleet-task-menu.js +188 -0
- package/dist/ui/fleet-task-stats.js +124 -0
- package/dist/ui/fleet-task-view.js +340 -0
- package/dist/ui/fleet-tasks.js +131 -43
- package/dist/ui/fleet-usage.js +90 -27
- package/dist/ui/html-attachment.js +3 -40
- package/dist/ui/hub-agent-copy.js +23 -0
- package/dist/ui/hub-button-actions.js +65 -0
- package/dist/ui/hub-chat-store.js +158 -0
- package/dist/ui/hub-chat-strings.js +77 -0
- package/dist/ui/hub-client.js +329 -0
- package/dist/ui/hub-owner-strings.js +51 -0
- package/dist/ui/hub-provider-guidance.js +31 -0
- package/dist/ui/hub-quota.js +85 -0
- package/dist/ui/hub-strings.js +162 -0
- package/dist/ui/hub-switcher.js +27 -0
- package/dist/ui/native-pane-recovery.js +1 -1
- package/dist/ui/office-share-page.js +4 -2
- package/dist/ui/panel-chat.js +34 -48
- package/dist/ui/panel-details.js +1 -1
- package/dist/ui/panel-fleet.js +78 -10
- package/dist/ui/panel-hub.js +619 -0
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-needs.js +24 -8
- package/dist/ui/panel-runtimes.js +114 -23
- package/dist/ui/panel-settings.js +69 -80
- package/dist/ui/panel-windows-cli.js +12 -2
- package/dist/ui/preview-pages.js +1 -1
- package/dist/ui/preview-panel.js +92 -6
- package/dist/ui/preview-versions.js +1 -1
- package/dist/ui/preview.js +3 -476
- package/dist/ui/runtime-commands.d.ts +4 -0
- package/dist/ui/runtime-commands.js +59 -0
- package/dist/ui/search-dialog.js +2 -0
- package/dist/ui/settings-access-strings.js +42 -0
- package/dist/ui/settings-build-version.js +35 -0
- package/dist/ui/settings-codex-copy.js +19 -0
- package/dist/ui/settings-devices.js +253 -0
- package/dist/ui/settings-dialogs.js +28 -7
- package/dist/ui/settings-hub-browser-certificate.js +74 -0
- package/dist/ui/settings-hub-membership.js +72 -0
- package/dist/ui/settings-hub-retention.js +52 -0
- package/dist/ui/settings-hub.js +196 -0
- package/dist/ui/settings-layout.js +8 -11
- package/dist/ui/settings-model.js +16 -2
- package/dist/ui/settings-outside.js +104 -38
- package/dist/ui/settings-registry.js +4 -1
- package/dist/ui/settings-shared-strings.js +143 -0
- package/dist/ui/settings-shared.js +345 -0
- package/dist/ui/settings-strings.js +10 -46
- package/dist/ui/settings-web-authority.js +5 -2
- package/dist/ui/shared/accounts.css +15 -0
- 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 +6 -1
- package/dist/ui/shared/app-session.js +6 -2
- package/dist/ui/shared/app-shell.js +64 -8
- package/dist/ui/shared/app.css +121 -30
- package/dist/ui/shared/app.js +12 -3
- package/dist/ui/shared/chat-composer.js +68 -0
- package/dist/ui/shared/chat-md-strings.js +9 -0
- package/dist/ui/shared/chat-render.js +682 -0
- package/dist/ui/shared/chat-strings.js +333 -0
- package/dist/ui/shared/chat-thread.js +969 -0
- package/dist/ui/shared/chat-time.js +80 -0
- package/dist/ui/shared/header-tools.js +3 -5
- package/dist/ui/shared/html-attachment.js +42 -0
- package/dist/ui/shared/hub-chat.css +85 -0
- package/dist/ui/shared/hub-owner.css +33 -0
- package/dist/ui/shared/hub-quota.css +8 -0
- package/dist/ui/shared/hub.css +71 -0
- package/dist/ui/shared/page-head.js +8 -0
- package/dist/ui/shared/panel-view.js +77 -4
- package/dist/ui/shared/preview.js +476 -0
- package/dist/ui/shared/runtime-install.css +26 -0
- package/dist/ui/shared/side-rail.js +15 -0
- package/dist/ui/shared/signin.js +172 -0
- package/dist/ui/shared/task-board.css +95 -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 +16 -0
- package/dist/ui/shared/workspace.css +20 -0
- package/dist/ui/signin.html +21 -0
- package/dist/ui/workspace-panel.js +189 -0
- package/dist/ui/workspace-strings.js +35 -0
- package/dist/unattended-install.d.ts +11 -2
- package/dist/unattended-install.js +41 -6
- 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.js +2 -1
- 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/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 +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 +105 -23
- 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 +48 -2
- package/dist/web-api.js +276 -8
- package/dist/web-api.js.map +1 -1
- package/dist/web-backend-login.d.ts +23 -1
- package/dist/web-backend-login.js +11 -17
- package/dist/web-backend-login.js.map +1 -1
- package/dist/web-device-login.d.ts +153 -0
- package/dist/web-device-login.js +278 -0
- package/dist/web-device-login.js.map +1 -0
- package/dist/web-office-skins.d.ts +9 -0
- package/dist/web-office-skins.js +16 -1
- package/dist/web-office-skins.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 +35 -0
- package/dist/web-session.js +7 -0
- 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 +6 -0
- package/dist/web-shell-routes.js +7 -0
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-terminal.d.ts +4 -30
- package/dist/web-terminal.js +9 -6
- package/dist/web-terminal.js.map +1 -1
- package/dist/windows-agents.d.ts +1 -0
- package/dist/windows-agents.js +1 -0
- package/dist/windows-agents.js.map +1 -1
- package/dist/windows-cli-api.d.ts +12 -1
- package/dist/windows-cli-api.js +27 -1
- package/dist/windows-cli-api.js.map +1 -1
- package/dist/windows-cli-providers.d.ts +0 -9
- package/dist/windows-cli-providers.js +4 -9
- package/dist/windows-cli-providers.js.map +1 -1
- package/dist/windows-cli-worker.d.ts +24 -0
- package/dist/windows-cli-worker.js +96 -5
- package/dist/windows-cli-worker.js.map +1 -1
- package/dist/windows-cli.d.ts +10 -0
- package/dist/windows-cli.js +10 -1
- package/dist/windows-cli.js.map +1 -1
- package/dist/yaml-shared-nodes.js +8 -3
- package/dist/yaml-shared-nodes.js.map +1 -1
- package/launcher/agend-install.cjs +8 -1
- package/launcher/launchd-session-type.cjs +14 -0
- package/launcher/postinstall.cjs +27 -2
- package/launcher/private-home.cjs +1 -1
- package/launcher/tmux-bundle.cjs +247 -0
- package/package.json +3 -2
- package/templates/launchd.plist.ejs +3 -1
- package/templates/runtime-install/install.ps1 +270 -0
package/dist/runtime-client.js
CHANGED
|
@@ -6,11 +6,14 @@ import { hostname } from "node:os";
|
|
|
6
6
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
7
7
|
import { join } from "node:path";
|
|
8
8
|
import { WindowsCliBridge, nativeWindowsTransport, WINDOWS_CLI_INVENTORY_FILE } from "./windows-cli.js";
|
|
9
|
-
import { validateNativeTask, validWindowsAgentId } from "./windows-cli-worker.js";
|
|
9
|
+
import { probeCredentialProfileStatus, validateNativeTask, validWindowsAgentId } from "./windows-cli-worker.js";
|
|
10
10
|
import { validNativeSessionId } from "./windows-cli-providers.js";
|
|
11
|
+
import { RUNTIME_CREDENTIAL_CAPABILITY, credentialLoginRequired, credentialProfileReport, isCredentialProfileCli, listCredentialProfileNames, rememberCredentialStatus, requireCredentialProfile, credentialCacheStamp, assertCredentialProfileName, assertCredentialProfileCli } from "./runtime-credential-profiles.js";
|
|
11
12
|
import { runtimeJobDigest, validateRuntimeServer } from "./runtime-client-store.js";
|
|
12
|
-
import { RUNTIME_ROTATE_PATH, runtimeClaimFingerprint } from "./runtime-protocol.js";
|
|
13
|
+
import { RUNTIME_ROTATE_PATH, RUNTIME_REINSTALL_CLOSE_PREFIX, runtimeClaimFingerprint } from "./runtime-protocol.js";
|
|
13
14
|
import { readRuntimeInfo } from "./runtime-build-info.js";
|
|
15
|
+
import { RuntimeUpdateActivity } from "./runtime-update-activity.js";
|
|
16
|
+
import { parseRuntimeUpdateControl, RUNTIME_MANAGED_UPDATE_CAPABILITY, validRuntimeUpdateId } from "./runtime-update-protocol.js";
|
|
14
17
|
import { validatePaneMcpBody } from "./runtime-pane-mcp-protocol.js";
|
|
15
18
|
import { validateRuntimePaneRequest, validateRuntimePaneShutdown } from "./runtime-pane-protocol.js";
|
|
16
19
|
export { RUNTIME_PANE_MODULES } from "./runtime-pane-assets.js";
|
|
@@ -19,6 +22,7 @@ const REPAIR = "run .\\agend-runtime.cmd disconnect in this folder (add the same
|
|
|
19
22
|
export function describeRuntimeStop(reason) {
|
|
20
23
|
switch (reason.kind) {
|
|
21
24
|
case "refused": return `${reason.detail === "HTTP 403" ? "The connection was refused with HTTP 403. If AgEnD's address goes through a proxy, check the proxy's settings too. " : ""}AgEnD did not accept this computer's saved connection, so the Runtime stopped. Open AgEnD Settings -> Runtime: if this computer is missing or revoked, or AgEnD's data was reset, it must be paired again; ${REPAIR} If the pairing was made against a different AgEnD address than this folder's, use the download that matches it.`;
|
|
25
|
+
case "reinstall": return "AgEnD refused this Runtime because its version is not compatible with this AgEnD (it was installed from a different AgEnD release). Your pairing is kept. Re-run the install command shown in AgEnD Settings -> Runtime -> Connect a computer (Windows PowerShell tab) on this computer; it installs the matching Runtime next to this one and never deletes the version that is running. Then start it again with agend-runtime run (add the same --profile if you used one). If you installed from the ZIP, download the ZIP from the same page and double-click connect-agend.bat.";
|
|
22
26
|
case "revoked": return `This computer was revoked in AgEnD Settings -> Runtime, so the Runtime stopped. To connect it again, ${REPAIR}`;
|
|
23
27
|
case "replaced": return "This computer connected to AgEnD again from somewhere else, so AgEnD closed this connection. A pairing allows one live connection. Close the other Runtime window (or the other computer that uses a copy of this profile), then double-click connect-agend.bat again. Each computer needs its own pairing code.";
|
|
24
28
|
case "incompatible": return "This Runtime could not understand a message from AgEnD, so it stopped. This usually means the Runtime and AgEnD are different versions, or the address points at something that is not this AgEnD. Download the Windows Runtime again from AgEnD Settings -> Runtime, extract it, and double-click connect-agend.bat.";
|
|
@@ -30,9 +34,14 @@ const MAX_TOOL = 64 * 1024;
|
|
|
30
34
|
function object(value) { return !!value && typeof value === "object" && !Array.isArray(value); }
|
|
31
35
|
function message(error) { return error instanceof Error ? error.message.slice(0, 1000) : "Runtime operation failed"; }
|
|
32
36
|
function checkedRun(value) {
|
|
33
|
-
if (!object(value) || Object.keys(value).some(key => !["task", "resumeSessionId", "context", "mcp"].includes(key)))
|
|
37
|
+
if (!object(value) || Object.keys(value).some(key => !["task", "resumeSessionId", "context", "mcp", "credentialProfile"].includes(key)))
|
|
34
38
|
throw new Error("Invalid runtime run payload");
|
|
35
39
|
const task = validateNativeTask(value.task);
|
|
40
|
+
// A name and nothing else: a path, a drive letter or a control byte is not a profile name and is refused here, not "cleaned".
|
|
41
|
+
if (value.credentialProfile !== undefined) {
|
|
42
|
+
assertCredentialProfileName(value.credentialProfile);
|
|
43
|
+
assertCredentialProfileCli(task.cli);
|
|
44
|
+
}
|
|
36
45
|
if (value.resumeSessionId !== undefined && !validNativeSessionId(task.cli, value.resumeSessionId))
|
|
37
46
|
throw new Error("Invalid native conversation ID");
|
|
38
47
|
if (value.context !== undefined && (typeof value.context !== "string" || value.context.length > 2000 || value.context.includes("\0")))
|
|
@@ -42,7 +51,7 @@ function checkedRun(value) {
|
|
|
42
51
|
|| value.mcp.tools.some(tool => typeof tool !== "string" || !/^[a-z][a-z0-9_]{0,63}$/.test(tool))))
|
|
43
52
|
throw new Error("Invalid scoped MCP request");
|
|
44
53
|
return { task, resumeSessionId: value.resumeSessionId, context: value.context,
|
|
45
|
-
mcp: value.mcp };
|
|
54
|
+
mcp: value.mcp, ...(value.credentialProfile !== undefined ? { credentialProfile: value.credentialProfile } : {}) };
|
|
46
55
|
}
|
|
47
56
|
function jsonBody(req) {
|
|
48
57
|
return new Promise((accept, reject) => {
|
|
@@ -78,6 +87,8 @@ export class RuntimeClient {
|
|
|
78
87
|
reconnectAttempt = 0;
|
|
79
88
|
graceTimer = null;
|
|
80
89
|
pollTimer = null;
|
|
90
|
+
credentialWatch = null;
|
|
91
|
+
credentialStamp = "";
|
|
81
92
|
credentials = null;
|
|
82
93
|
startupRotation = null;
|
|
83
94
|
paneHost = null;
|
|
@@ -94,21 +105,37 @@ export class RuntimeClient {
|
|
|
94
105
|
mcpPort = 0;
|
|
95
106
|
inventory = null;
|
|
96
107
|
stoppedListeners = new Set();
|
|
108
|
+
activity = new RuntimeUpdateActivity();
|
|
109
|
+
stopPromise;
|
|
110
|
+
generation = 0;
|
|
111
|
+
updateProtocol = false;
|
|
112
|
+
preparingUpdate = false;
|
|
113
|
+
trialFence;
|
|
114
|
+
updateWait;
|
|
97
115
|
/** Set only when AgEnD ended the connection and the person must act; a local stop (Ctrl+C) leaves it undefined. */
|
|
98
116
|
stopReason;
|
|
99
117
|
/** The socket this Runtime itself closed with 1008 because it could not read AgEnD's frame; that is not AgEnD refusing us. */
|
|
100
118
|
selfClosed = null;
|
|
101
119
|
constructor(options) {
|
|
102
120
|
this.options = options;
|
|
103
|
-
|
|
121
|
+
const info = readRuntimeInfo({ panes: process.platform === "win32" || !!options.createPaneHost || !!options.openPaneLink });
|
|
122
|
+
// Offered only when this client has a profile root to resolve names under; otherwise AgEnD must not ask for a profile.
|
|
123
|
+
if (options.managedUpdate?.trialId !== undefined && !validRuntimeUpdateId(options.managedUpdate.trialId))
|
|
124
|
+
throw Error("Invalid Runtime update trial");
|
|
125
|
+
this.runtimeInfo = { ...info, capabilities: [...info.capabilities.filter(name => options.credentialProfilesRoot || name !== RUNTIME_CREDENTIAL_CAPABILITY), ...(options.managedUpdate ? [RUNTIME_MANAGED_UPDATE_CAPABILITY] : [])] };
|
|
104
126
|
this.bridge = options.bridge ?? new WindowsCliBridge(nativeWindowsTransport, join(options.store.directory, WINDOWS_CLI_INVENTORY_FILE));
|
|
105
127
|
}
|
|
106
128
|
report(text) { this.options.report?.(text); }
|
|
107
|
-
online() { return this.welcomed && this.socket?.readyState === WebSocket.OPEN; }
|
|
108
|
-
waitUntilStopped() { return this.stopped && this.closed ? Promise.resolve() : new Promise(done => this.stoppedListeners.add(done)); }
|
|
129
|
+
online() { return !this.trialFence && this.welcomed && this.socket?.readyState === WebSocket.OPEN; }
|
|
130
|
+
waitUntilStopped() { return this.stopPromise ?? (this.stopped && this.closed ? Promise.resolve() : new Promise(done => this.stoppedListeners.add(done))); }
|
|
109
131
|
async start() {
|
|
110
132
|
if (!this.stopped)
|
|
111
133
|
return;
|
|
134
|
+
if (this.stopPromise) {
|
|
135
|
+
await this.stopPromise;
|
|
136
|
+
this.stopPromise = undefined;
|
|
137
|
+
this.activity = new RuntimeUpdateActivity();
|
|
138
|
+
}
|
|
112
139
|
let credentials = this.options.store.credentials();
|
|
113
140
|
if (!credentials)
|
|
114
141
|
throw new Error("Pair this runtime before connecting");
|
|
@@ -139,13 +166,19 @@ export class RuntimeClient {
|
|
|
139
166
|
this.options.store.adoptMachine(credentials.machineId);
|
|
140
167
|
this.options.store.recoverInterrupted();
|
|
141
168
|
this.credentials = credentials;
|
|
169
|
+
if (this.options.managedUpdate?.trialId) {
|
|
170
|
+
this.trialFence = this.activity.tryFence(this.options.managedUpdate.trialId, () => !this.stopped, () => true);
|
|
171
|
+
if (!this.trialFence)
|
|
172
|
+
throw Error("Runtime trial admission is unavailable");
|
|
173
|
+
}
|
|
142
174
|
// Connect immediately, then publish the last administrator detection from the private profile.
|
|
143
175
|
// A cached read starts no CLI. Only an explicit probe command with force:true performs detection.
|
|
144
176
|
this.connect();
|
|
145
177
|
// A foreground runtime must remain alive while an idle connection is down. Promises and unref'ed retry
|
|
146
178
|
// timers do not keep Node running after the last socket closes; stop() owns and clears this liveness ref.
|
|
147
179
|
this.pollTimer = setInterval(() => this.poll(), this.options.pollMs ?? 250);
|
|
148
|
-
|
|
180
|
+
if (!this.trialFence)
|
|
181
|
+
this.beginDiscovery();
|
|
149
182
|
}
|
|
150
183
|
catch (error) {
|
|
151
184
|
this.stopped = true;
|
|
@@ -164,6 +197,7 @@ export class RuntimeClient {
|
|
|
164
197
|
?? new WebSocket(url.href, { headers: { Authorization: `Bearer ${this.credentials.credential}` }, followRedirects: false,
|
|
165
198
|
maxPayload: MAX_FRAME, handshakeTimeout: 15_000, perMessageDeflate: false });
|
|
166
199
|
this.welcomed = false;
|
|
200
|
+
this.updateProtocol = false;
|
|
167
201
|
this.paneEpoch = randomUUID();
|
|
168
202
|
socket.on("open", () => {
|
|
169
203
|
if (this.stopped || this.socket !== socket) {
|
|
@@ -171,6 +205,7 @@ export class RuntimeClient {
|
|
|
171
205
|
return;
|
|
172
206
|
}
|
|
173
207
|
this.send({ v: 1, type: "hello", bootId: this.bootId, name: this.credentials.name, platform: process.platform, runtimeInfo: this.runtimeInfo,
|
|
208
|
+
...(this.trialFence ? { updateTrialId: this.trialFence.id } : {}),
|
|
174
209
|
...(process.platform === "win32" || this.options.createPaneHost || this.options.openPaneLink ? { paneProtocol: 1 } : {}),
|
|
175
210
|
...(this.inventory ? { inventory: this.inventory } : {}) });
|
|
176
211
|
});
|
|
@@ -200,6 +235,12 @@ export class RuntimeClient {
|
|
|
200
235
|
this.socket = null;
|
|
201
236
|
this.welcomed = false;
|
|
202
237
|
this.paneEpoch = randomUUID();
|
|
238
|
+
if (this.updateWait) {
|
|
239
|
+
const pending = this.updateWait;
|
|
240
|
+
this.updateWait = undefined;
|
|
241
|
+
clearTimeout(pending.timer);
|
|
242
|
+
pending.reject(Error("Runtime update connection changed"));
|
|
243
|
+
}
|
|
203
244
|
if (this.paneHost && "connectionChanged" in this.paneHost)
|
|
204
245
|
this.paneHost.connectionChanged();
|
|
205
246
|
this.rejectTools();
|
|
@@ -208,7 +249,7 @@ export class RuntimeClient {
|
|
|
208
249
|
if (code === 1008) {
|
|
209
250
|
const why = reason.toString().replace(/[^ -~]/g, "?").slice(0, 120);
|
|
210
251
|
this.report(this.selfClosed === socket ? "This Runtime could not read a message from AgEnD and closed the connection." : `AgEnD closed the connection (code 1008${why ? `: ${why}` : ""}).`);
|
|
211
|
-
this.stopReason = this.selfClosed === socket ? { kind: "incompatible" } : { kind: why === "Machine revoked" ? "revoked" : why === "Connection replaced" ? "replaced" : "rejected", ...(why ? { detail: why } : {}) };
|
|
252
|
+
this.stopReason = this.selfClosed === socket ? { kind: "incompatible" } : { kind: why === "Machine revoked" ? "revoked" : why === "Connection replaced" ? "replaced" : why.startsWith(RUNTIME_REINSTALL_CLOSE_PREFIX) ? "reinstall" : "rejected", ...(why ? { detail: why } : {}) };
|
|
212
253
|
void this.stop({ retirePanes: why === "Machine revoked" });
|
|
213
254
|
return;
|
|
214
255
|
}
|
|
@@ -251,14 +292,37 @@ export class RuntimeClient {
|
|
|
251
292
|
if (value.machineId !== this.credentials?.machineId || !Number.isSafeInteger(value.generation))
|
|
252
293
|
throw new Error("Runtime machine identity mismatch");
|
|
253
294
|
this.welcomed = true;
|
|
295
|
+
this.generation = value.generation;
|
|
296
|
+
this.updateProtocol = value.updateProtocol === 1;
|
|
254
297
|
this.reconnectAttempt = 0;
|
|
255
298
|
if (this.graceTimer) {
|
|
256
299
|
clearTimeout(this.graceTimer);
|
|
257
300
|
this.graceTimer = null;
|
|
258
301
|
}
|
|
259
302
|
this.report("Connected to AgEnD.");
|
|
260
|
-
|
|
261
|
-
this.
|
|
303
|
+
if (!this.trialFence)
|
|
304
|
+
for (const job of this.options.store.list())
|
|
305
|
+
this.publish(job);
|
|
306
|
+
this.options.managedUpdate?.authenticated?.({ bootId: this.bootId, generation: this.generation, ...(this.updateProtocol ? { updateProtocol: 1 } : {}), runtimeInfo: this.runtimeInfo });
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (value.type === "update.control") {
|
|
310
|
+
const control = parseRuntimeUpdateControl(value, "server"), pending = this.updateWait;
|
|
311
|
+
if (!pending || control.bootId !== this.bootId || control.generation !== this.generation || control.id !== pending.id || !pending.phases.includes(control.phase))
|
|
312
|
+
return;
|
|
313
|
+
if (control.phase === "activated") {
|
|
314
|
+
if (this.trialFence?.id !== control.id || !this.trialFence.current() || !this.locallyIdle())
|
|
315
|
+
throw Error("Runtime trial is no longer idle");
|
|
316
|
+
this.trialFence.release();
|
|
317
|
+
this.trialFence = undefined;
|
|
318
|
+
// Release synchronously: the server's next ordered frame may already contain ordinary work.
|
|
319
|
+
for (const job of this.options.store.list())
|
|
320
|
+
this.publish(job);
|
|
321
|
+
this.beginDiscovery();
|
|
322
|
+
}
|
|
323
|
+
this.updateWait = undefined;
|
|
324
|
+
clearTimeout(pending.timer);
|
|
325
|
+
pending.accept(control.phase);
|
|
262
326
|
return;
|
|
263
327
|
}
|
|
264
328
|
if (value.type === "revoked") {
|
|
@@ -309,9 +373,16 @@ export class RuntimeClient {
|
|
|
309
373
|
const request = validateRuntimePaneRequest(value.request);
|
|
310
374
|
this.machinePaneLimit = value.maxAgents;
|
|
311
375
|
const epoch = this.paneEpoch;
|
|
376
|
+
let leave;
|
|
312
377
|
try {
|
|
378
|
+
leave = this.activity.enter();
|
|
313
379
|
const host = await this.panes();
|
|
314
|
-
|
|
380
|
+
// A terminal for an agent with no profile of its own starts under this pairing's default profile, when there is one. The default is passed
|
|
381
|
+
// beside the launch, not inside it: the host decides with it only for a pane that is new, so a pane that is already running reattaches
|
|
382
|
+
// whatever the default has become since.
|
|
383
|
+
const fallback = request.action === "open" && request.launch.credentialProfile === undefined ? this.credentialProfileFor(request.launch.cli, undefined) : undefined;
|
|
384
|
+
const forHost = request.action === "open" && fallback !== undefined ? { ...request, defaultCredentialProfile: fallback } : request;
|
|
385
|
+
const result = await host.request(forHost, () => epoch === this.paneEpoch && this.online());
|
|
315
386
|
if (request.action === "shutdown") {
|
|
316
387
|
validateRuntimePaneShutdown(result, request.hostBootId);
|
|
317
388
|
// Explicit coordinator disable, not a disconnect: the next enabled request discovers a new host boot.
|
|
@@ -327,6 +398,9 @@ export class RuntimeClient {
|
|
|
327
398
|
catch (error) {
|
|
328
399
|
this.send({ v: 1, type: "pane.response", id: value.id, ok: false, error: message(error) });
|
|
329
400
|
}
|
|
401
|
+
finally {
|
|
402
|
+
leave?.();
|
|
403
|
+
}
|
|
330
404
|
return;
|
|
331
405
|
}
|
|
332
406
|
if (value.type !== "request" || typeof value.id !== "string" || !/^[A-Za-z0-9._:-]{1,128}$/.test(value.id)
|
|
@@ -360,6 +434,7 @@ export class RuntimeClient {
|
|
|
360
434
|
else
|
|
361
435
|
this.paneOpening = import("./runtime-pane-link.js").then(({ RuntimePaneLink }) => (this.options.openPaneLink ?? RuntimePaneLink.open.bind(RuntimePaneLink))({
|
|
362
436
|
directory: this.options.store.directory, server: this.credentials.server, machineId: this.credentials.machineId,
|
|
437
|
+
...(this.options.credentialProfilesRoot ? { credentialRoot: this.options.credentialProfilesRoot } : {}),
|
|
363
438
|
online: () => !this.stopped && this.online(), maxAgents: () => this.machinePaneLimit, epoch: () => this.paneEpoch, output, mcp: (body, current) => this.paneMcp(body, current),
|
|
364
439
|
})).then(host => this.paneHost = host);
|
|
365
440
|
const opening = this.paneOpening;
|
|
@@ -368,7 +443,8 @@ export class RuntimeClient {
|
|
|
368
443
|
}
|
|
369
444
|
return this.paneOpening;
|
|
370
445
|
}
|
|
371
|
-
paneMcp(raw, current) {
|
|
446
|
+
paneMcp(raw, current) { return this.activity.run(() => this.forwardPaneMcp(raw, current)); }
|
|
447
|
+
forwardPaneMcp(raw, current) {
|
|
372
448
|
const body = validatePaneMcpBody(raw), epoch = this.paneEpoch;
|
|
373
449
|
if (!current() || !this.online() || this.pendingPaneTools.size >= 32)
|
|
374
450
|
return Promise.reject(Error("Pane MCP transport is unavailable"));
|
|
@@ -417,15 +493,94 @@ export class RuntimeClient {
|
|
|
417
493
|
if (task)
|
|
418
494
|
this.update(task);
|
|
419
495
|
} }
|
|
420
|
-
|
|
421
|
-
|
|
496
|
+
/** Which profile a run uses: the one the agent named, else this pairing's default (Claude Code only), else none (the Runtime's own environment). */
|
|
497
|
+
credentialProfileFor(cli, named) {
|
|
498
|
+
if (named !== undefined)
|
|
499
|
+
return named;
|
|
500
|
+
return cli === "claude-code" && this.options.credentialProfilesRoot ? this.options.store.credentialDefault() : undefined;
|
|
501
|
+
}
|
|
502
|
+
stamp() { return credentialCacheStamp(this.options.credentialProfilesRoot, join(this.options.store.directory, "credential-default.json")); }
|
|
503
|
+
/**
|
|
504
|
+
* Re-report on its own after `agend-runtime login` / `profile default` (run in another window) changed the sign-in cache: the account shown
|
|
505
|
+
* in AgEnD follows a profile that was signed in to another account, without an administrator pressing "Detect again". Reads the cache only.
|
|
506
|
+
*/
|
|
507
|
+
watchCredentialCache() {
|
|
508
|
+
if (!this.options.credentialProfilesRoot)
|
|
509
|
+
return;
|
|
510
|
+
this.credentialStamp = this.stamp();
|
|
511
|
+
this.credentialWatch = setInterval(() => {
|
|
512
|
+
if (!this.activity.accepting)
|
|
513
|
+
return;
|
|
514
|
+
const now = this.stamp();
|
|
515
|
+
if (now === this.credentialStamp)
|
|
516
|
+
return;
|
|
517
|
+
this.credentialStamp = now;
|
|
518
|
+
void this.refreshInventory(false).catch(() => { });
|
|
519
|
+
}, this.options.credentialWatchMs ?? 5000);
|
|
520
|
+
this.credentialWatch.unref?.();
|
|
521
|
+
}
|
|
522
|
+
statusOf(cli, directory) {
|
|
523
|
+
if (this.options.credentialStatus)
|
|
524
|
+
return this.options.credentialStatus(cli, directory);
|
|
525
|
+
if (this.options.credentialLogin)
|
|
526
|
+
return this.options.credentialLogin(cli, directory).then(loggedIn => ({ loggedIn }));
|
|
527
|
+
return probeCredentialProfileStatus(cli, directory);
|
|
528
|
+
}
|
|
529
|
+
remember(root, cli, name, answer) {
|
|
530
|
+
rememberCredentialStatus(root, cli, name, answer);
|
|
531
|
+
this.credentialStamp = this.stamp(); // our own write is not "another window"
|
|
532
|
+
}
|
|
533
|
+
/** The folder of a profile that exists AND is signed in on this computer; anything else refuses, never the default account. */
|
|
534
|
+
async credentialHome(cli, name) {
|
|
535
|
+
const root = this.options.credentialProfilesRoot;
|
|
536
|
+
if (!root)
|
|
537
|
+
throw new Error("This Runtime has no credential profile folder, so it cannot select an account. Update or restart the Runtime.");
|
|
538
|
+
if (!isCredentialProfileCli(cli))
|
|
539
|
+
throw new Error("Credential profiles on a Windows Runtime support Claude Code only");
|
|
540
|
+
const directory = requireCredentialProfile(root, cli, name);
|
|
541
|
+
const answer = await this.statusOf(cli, directory);
|
|
542
|
+
this.remember(root, cli, name, answer);
|
|
543
|
+
if (answer.loggedIn !== true)
|
|
544
|
+
throw credentialLoginRequired(cli, name, answer.loggedIn);
|
|
545
|
+
return directory;
|
|
546
|
+
}
|
|
547
|
+
/** Names and signed-in yes/no only. `force` (an explicit "Detect again") asks each profile's CLI; otherwise the last known answer is reported. */
|
|
548
|
+
async credentialReport(force) {
|
|
549
|
+
const root = this.options.credentialProfilesRoot;
|
|
550
|
+
if (!root)
|
|
551
|
+
return undefined;
|
|
552
|
+
if (force)
|
|
553
|
+
for (const name of listCredentialProfileNames(root, "claude-code")) {
|
|
554
|
+
try {
|
|
555
|
+
this.remember(root, "claude-code", name, await this.statusOf("claude-code", requireCredentialProfile(root, "claude-code", name)));
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
this.remember(root, "claude-code", name, { loggedIn: null });
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
let name;
|
|
562
|
+
try {
|
|
563
|
+
name = this.options.store.credentialDefault();
|
|
564
|
+
}
|
|
565
|
+
catch { /* reported as no default; a run refuses with the real error */ }
|
|
566
|
+
return credentialProfileReport(root, name);
|
|
567
|
+
}
|
|
568
|
+
beginDiscovery() {
|
|
569
|
+
void this.refreshInventory().catch(() => this.report("CLI discovery failed; refresh it from AgEnD after checking the local installation."));
|
|
570
|
+
this.watchCredentialCache();
|
|
571
|
+
}
|
|
572
|
+
refreshInventory(force = false) { return this.activity.run(() => this.readInventory(force)); }
|
|
573
|
+
async readInventory(force) {
|
|
574
|
+
const probed = await this.bridge.probe({ force }), credentialProfiles = await this.credentialReport(force);
|
|
575
|
+
const inventory = credentialProfiles ? { ...probed, credentialProfiles } : probed;
|
|
422
576
|
this.inventory = inventory;
|
|
423
577
|
if (this.online())
|
|
424
578
|
this.send({ v: 1, type: "inventory", inventory });
|
|
425
579
|
return inventory;
|
|
426
580
|
}
|
|
427
581
|
/** Testable command surface. Mutation identity is committed before calling the native bridge. */
|
|
428
|
-
|
|
582
|
+
operation(operation, payload) { return this.activity.run(() => this.ownedOperation(operation, payload)); }
|
|
583
|
+
async ownedOperation(operation, payload) {
|
|
429
584
|
if (operation === "probe") {
|
|
430
585
|
if (Object.keys(payload).some(key => key !== "force") || (payload.force !== undefined && typeof payload.force !== "boolean"))
|
|
431
586
|
throw new Error("Invalid discovery request");
|
|
@@ -495,13 +650,16 @@ export class RuntimeClient {
|
|
|
495
650
|
return accepted.job.task;
|
|
496
651
|
this.publish(accepted.job);
|
|
497
652
|
try {
|
|
653
|
+
// Fail closed, and as a confirmed failed turn: an unknown, unsigned or unusable profile never falls back to another account.
|
|
654
|
+
const profile = this.credentialProfileFor(task.cli, run.credentialProfile);
|
|
655
|
+
const credentialHome = profile ? await this.credentialHome(task.cli, profile) : undefined;
|
|
498
656
|
const mcp = payload.mcp ? await this.openMcp(task.requestId, payload.mcp.tools) : undefined;
|
|
499
657
|
if (this.stopped || !this.online())
|
|
500
658
|
throw new Error("Runtime disconnected before native execution started");
|
|
501
659
|
this.active.add(task.requestId);
|
|
502
660
|
const initial = this.bridge.start(task, () => !this.stopped && this.online(), {
|
|
503
661
|
...(payload.resumeSessionId ? { resumeSessionId: payload.resumeSessionId } : {}),
|
|
504
|
-
...(payload.context ? { context: payload.context } : {}), ...(mcp ? { mcp } : {}),
|
|
662
|
+
...(payload.context ? { context: payload.context } : {}), ...(mcp ? { mcp } : {}), ...(credentialHome ? { credentialHome } : {}),
|
|
505
663
|
onSettled: settled => this.update(settled),
|
|
506
664
|
});
|
|
507
665
|
this.update(initial);
|
|
@@ -515,6 +673,90 @@ export class RuntimeClient {
|
|
|
515
673
|
return failed;
|
|
516
674
|
}
|
|
517
675
|
}
|
|
676
|
+
locallyIdle() {
|
|
677
|
+
return this.activity.pending === 0 && this.active.size === 0 && !this.options.store.blocked()
|
|
678
|
+
&& this.bridge.idleForUpdate?.() === true && this.pendingTools.size === 0 && this.pendingPaneTools.size === 0
|
|
679
|
+
&& !(this.paneOpening && !this.paneHost) && (this.socket?.bufferedAmount ?? 1) === 0;
|
|
680
|
+
}
|
|
681
|
+
updateRpc(phase, id, phases) {
|
|
682
|
+
if (!this.welcomed || !this.updateProtocol || this.socket?.readyState !== WebSocket.OPEN || this.updateWait)
|
|
683
|
+
return Promise.reject(Error("Runtime update negotiation is unavailable"));
|
|
684
|
+
return new Promise((accept, reject) => {
|
|
685
|
+
const pending = { id, phases, accept, reject, timer: setTimeout(() => {
|
|
686
|
+
if (this.updateWait === pending)
|
|
687
|
+
this.updateWait = undefined;
|
|
688
|
+
reject(Error("Runtime update acknowledgement is unconfirmed"));
|
|
689
|
+
}, 10_000) };
|
|
690
|
+
pending.timer.unref();
|
|
691
|
+
this.updateWait = pending;
|
|
692
|
+
try {
|
|
693
|
+
this.send({ v: 1, type: "update.control", id, bootId: this.bootId, generation: this.generation, phase });
|
|
694
|
+
}
|
|
695
|
+
catch (error) {
|
|
696
|
+
this.updateWait = undefined;
|
|
697
|
+
clearTimeout(pending.timer);
|
|
698
|
+
reject(error);
|
|
699
|
+
}
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
/** Called only by the local supervisor. A timeout or disconnect never authorizes process replacement. */
|
|
703
|
+
async prepareUpdate(id) {
|
|
704
|
+
if (!validRuntimeUpdateId(id) || !this.options.managedUpdate || this.trialFence || this.preparingUpdate || !this.online() || !this.updateProtocol)
|
|
705
|
+
return false;
|
|
706
|
+
const socket = this.socket, generation = this.generation;
|
|
707
|
+
const current = () => !this.stopped && this.socket === socket && socket.readyState === WebSocket.OPEN && this.generation === generation;
|
|
708
|
+
const fence = this.activity.tryFence(id, current, () => this.locallyIdle());
|
|
709
|
+
if (!fence)
|
|
710
|
+
return false;
|
|
711
|
+
this.preparingUpdate = true;
|
|
712
|
+
let committed = false;
|
|
713
|
+
try {
|
|
714
|
+
if (await this.updateRpc("prepare", id, ["prepared", "busy", "cancelled"]) !== "prepared")
|
|
715
|
+
return false;
|
|
716
|
+
if (this.options.drainPaneHostForUpdate)
|
|
717
|
+
await this.options.drainPaneHostForUpdate(() => fence.current());
|
|
718
|
+
else {
|
|
719
|
+
const { RuntimePaneLink } = await import("./runtime-pane-link.js");
|
|
720
|
+
const existing = this.paneHost instanceof RuntimePaneLink && this.paneHost.connected() ? this.paneHost : undefined;
|
|
721
|
+
if (!existing && (this.options.createPaneHost || this.options.openPaneLink))
|
|
722
|
+
throw Error("Injected pane host requires its own positive idle proof");
|
|
723
|
+
await RuntimePaneLink.drainExistingForUpdate({ directory: this.options.store.directory, server: this.credentials.server, machineId: this.credentials.machineId,
|
|
724
|
+
online: () => current(), maxAgents: () => this.machinePaneLimit, epoch: () => this.paneEpoch, mcp: (body, owned) => this.paneMcp(body, owned) }, () => fence.current(), existing);
|
|
725
|
+
}
|
|
726
|
+
if (!fence.current() || !this.locallyIdle())
|
|
727
|
+
return false;
|
|
728
|
+
if (await this.updateRpc("ready", id, ["commit", "busy", "cancelled"]) !== "commit")
|
|
729
|
+
return false;
|
|
730
|
+
fence.commit();
|
|
731
|
+
committed = true;
|
|
732
|
+
await this.stop();
|
|
733
|
+
return true;
|
|
734
|
+
}
|
|
735
|
+
catch (error) {
|
|
736
|
+
if (committed)
|
|
737
|
+
throw error;
|
|
738
|
+
return false;
|
|
739
|
+
}
|
|
740
|
+
finally {
|
|
741
|
+
this.preparingUpdate = false;
|
|
742
|
+
if (!committed) {
|
|
743
|
+
try {
|
|
744
|
+
if (!current() || await this.updateRpc("cancel", id, ["cancelled", "commit"]) !== "cancelled")
|
|
745
|
+
socket.terminate();
|
|
746
|
+
}
|
|
747
|
+
catch {
|
|
748
|
+
socket.terminate();
|
|
749
|
+
}
|
|
750
|
+
fence.release();
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
/** The parent persists activation intent before this call; an unconfirmed answer is never rollback permission. */
|
|
755
|
+
async activateTrial(id) {
|
|
756
|
+
if (this.trialFence?.id !== id || !this.locallyIdle())
|
|
757
|
+
return false;
|
|
758
|
+
return await this.updateRpc("activate", id, ["activated", "busy", "cancelled"]) === "activated";
|
|
759
|
+
}
|
|
518
760
|
async openMcp(runId, tools) {
|
|
519
761
|
if (!this.mcpOpening)
|
|
520
762
|
this.mcpOpening = new Promise((accept, reject) => {
|
|
@@ -532,6 +774,22 @@ export class RuntimeClient {
|
|
|
532
774
|
reply(403, { error: "Runtime MCP capability is unavailable" });
|
|
533
775
|
return;
|
|
534
776
|
}
|
|
777
|
+
let leave;
|
|
778
|
+
try {
|
|
779
|
+
leave = this.activity.enter();
|
|
780
|
+
}
|
|
781
|
+
catch {
|
|
782
|
+
req.resume();
|
|
783
|
+
reply(503, { error: "Runtime update is pending" });
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
const finished = new Promise(done => {
|
|
787
|
+
const settle = () => { res.off("finish", settle); res.off("close", settle); done(); };
|
|
788
|
+
res.once("finish", settle);
|
|
789
|
+
res.once("close", settle);
|
|
790
|
+
if (res.destroyed || res.writableFinished)
|
|
791
|
+
settle();
|
|
792
|
+
});
|
|
535
793
|
void jsonBody(req).then(async (body) => {
|
|
536
794
|
if (!object(body) || body.op !== "native-mcp" || !["tools/list", "tools/call"].includes(String(body.method))
|
|
537
795
|
|| !object(body.params) || Object.keys(body).some(key => !["op", "method", "params", "callId"].includes(key)))
|
|
@@ -547,7 +805,7 @@ export class RuntimeClient {
|
|
|
547
805
|
if (Buffer.byteLength(JSON.stringify(result) ?? "") > MAX_TOOL)
|
|
548
806
|
throw new Error("Runtime MCP result is too large");
|
|
549
807
|
reply(200, result);
|
|
550
|
-
}).catch(() => reply(403, { error: "Runtime MCP request was refused or its execution expired" }));
|
|
808
|
+
}).catch(() => reply(403, { error: "Runtime MCP request was refused or its execution expired" })).finally(async () => { await finished; leave(); });
|
|
551
809
|
});
|
|
552
810
|
server.on("error", reject);
|
|
553
811
|
server.listen(0, "127.0.0.1", () => { const address = server.address(); if (!address || typeof address === "string") {
|
|
@@ -588,20 +846,36 @@ export class RuntimeClient {
|
|
|
588
846
|
}
|
|
589
847
|
this.pendingTools.clear();
|
|
590
848
|
}
|
|
591
|
-
|
|
849
|
+
stop(options = {}) {
|
|
850
|
+
if (this.stopPromise)
|
|
851
|
+
return this.stopPromise;
|
|
592
852
|
if (this.stopped)
|
|
593
|
-
return;
|
|
853
|
+
return Promise.resolve();
|
|
594
854
|
this.stopped = true;
|
|
595
855
|
this.welcomed = false;
|
|
856
|
+
this.activity.close();
|
|
857
|
+
// Own cleanup before callbacks (bridge.close, pane cleanup) can re-enter stop().
|
|
858
|
+
return this.stopPromise = Promise.resolve().then(() => this.stopOwned(options));
|
|
859
|
+
}
|
|
860
|
+
async stopOwned(options) {
|
|
861
|
+
if (this.updateWait) {
|
|
862
|
+
const pending = this.updateWait;
|
|
863
|
+
this.updateWait = undefined;
|
|
864
|
+
clearTimeout(pending.timer);
|
|
865
|
+
pending.reject(Error("Runtime update stopped"));
|
|
866
|
+
}
|
|
596
867
|
if (this.reconnectTimer)
|
|
597
868
|
clearTimeout(this.reconnectTimer);
|
|
598
869
|
if (this.graceTimer)
|
|
599
870
|
clearTimeout(this.graceTimer);
|
|
600
871
|
if (this.pollTimer)
|
|
601
872
|
clearInterval(this.pollTimer);
|
|
873
|
+
if (this.credentialWatch)
|
|
874
|
+
clearInterval(this.credentialWatch);
|
|
602
875
|
this.reconnectTimer = null;
|
|
603
876
|
this.graceTimer = null;
|
|
604
877
|
this.pollTimer = null;
|
|
878
|
+
this.credentialWatch = null;
|
|
605
879
|
this.rejectTools();
|
|
606
880
|
this.mcpTokens.clear();
|
|
607
881
|
this.bridge.close();
|
|
@@ -637,7 +911,6 @@ export class RuntimeClient {
|
|
|
637
911
|
this.update({ ...old.task, status: "failed", finishedAt: Date.now(), outcomeConfirmed: false,
|
|
638
912
|
error: "Runtime stopped before native process shutdown was confirmed. Inspect processes before recovery." });
|
|
639
913
|
}
|
|
640
|
-
this.closed = true;
|
|
641
914
|
if (this.mcpServer) {
|
|
642
915
|
const server = this.mcpServer;
|
|
643
916
|
this.mcpServer = null;
|
|
@@ -646,6 +919,7 @@ export class RuntimeClient {
|
|
|
646
919
|
}
|
|
647
920
|
this.unlock?.();
|
|
648
921
|
this.unlock = null;
|
|
922
|
+
this.closed = true;
|
|
649
923
|
for (const done of this.stoppedListeners)
|
|
650
924
|
done();
|
|
651
925
|
this.stoppedListeners.clear();
|