@songsid/agend 2.3.5-alpha.3 → 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-api.d.ts +4 -0
- package/dist/agent-runtime-api.js +59 -0
- package/dist/agent-runtime-api.js.map +1 -0
- package/dist/agent-runtime-change.d.ts +76 -0
- package/dist/agent-runtime-change.js +114 -0
- package/dist/agent-runtime-change.js.map +1 -0
- 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 +168 -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 +7 -0
- package/dist/backend/codex-footer-hints.js +41 -0
- package/dist/backend/codex-footer-hints.js.map +1 -0
- 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 +85 -24
- 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 +362 -7
- package/dist/fleet-manager.js +1522 -91
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +8 -2
- package/dist/fleet-windows-runtime.js +93 -6
- 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 +3 -3
- 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/public-web-link.d.ts +6 -0
- package/dist/public-web-link.js +9 -0
- 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.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 +106 -13
- package/dist/runtime-api.js.map +1 -1
- package/dist/runtime-build-info.d.ts +9 -0
- package/dist/runtime-build-info.js +59 -0
- package/dist/runtime-build-info.js.map +1 -0
- package/dist/runtime-bundle.d.ts +6 -1
- package/dist/runtime-bundle.js +17 -9
- package/dist/runtime-bundle.js.map +1 -1
- package/dist/runtime-cli.d.ts +13 -1
- package/dist/runtime-cli.js +173 -19
- package/dist/runtime-cli.js.map +1 -1
- package/dist/runtime-client-store.d.ts +27 -1
- package/dist/runtime-client-store.js +86 -6
- package/dist/runtime-client-store.js.map +1 -1
- package/dist/runtime-client.d.ts +74 -0
- package/dist/runtime-client.js +336 -26
- package/dist/runtime-client.js.map +1 -1
- package/dist/runtime-connection.d.ts +22 -0
- package/dist/runtime-connection.js +93 -0
- package/dist/runtime-connection.js.map +1 -0
- package/dist/runtime-coordinator.d.ts +16 -0
- package/dist/runtime-coordinator.js +287 -62
- 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-boot.d.ts +7 -0
- package/dist/runtime-pane-boot.js +23 -0
- package/dist/runtime-pane-boot.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 +30 -2
- package/dist/runtime-protocol.js +30 -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 +98 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +3 -0
- package/dist/settings-http-confirmation.js +28 -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 +68 -0
- package/dist/ui/agent-runtime.js +20 -2
- package/dist/ui/backend-signin.js +39 -21
- 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-instance-settings.js +5 -8
- package/dist/ui/native-pane-recovery.js +1 -1
- package/dist/ui/office-share-page.js +4 -2
- package/dist/ui/panel-chat.js +36 -49
- package/dist/ui/panel-details.js +1 -1
- package/dist/ui/panel-fleet.js +82 -12
- 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 +239 -45
- package/dist/ui/panel-settings.js +266 -192
- package/dist/ui/panel-windows-cli.js +88 -42
- 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-agent-filters.js +94 -0
- package/dist/ui/settings-appearance.js +122 -23
- 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 +33 -12
- package/dist/ui/settings-guests.js +25 -11
- 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 +242 -0
- package/dist/ui/settings-model.js +24 -2
- package/dist/ui/settings-outside.js +104 -38
- package/dist/ui/settings-registry.js +9 -4
- package/dist/ui/settings-shared-strings.js +143 -0
- package/dist/ui/settings-shared.js +345 -0
- package/dist/ui/settings-shortcuts.js +65 -0
- package/dist/ui/settings-strings.js +89 -32
- package/dist/ui/settings-web-authority.js +17 -11
- 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 +81 -15
- package/dist/ui/shared/app.css +1114 -13
- 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/instance-nav.js +3 -2
- package/dist/ui/shared/machine-name.js +13 -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/settings-width.js +31 -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/tokens.css +1 -0
- package/dist/ui/shared/ui-dialog.js +2 -2
- package/dist/ui/shared/ui-menu.js +3 -3
- 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/windows-cli-catalog.js +41 -12
- 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 +49 -2
- package/dist/web-api.js +279 -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 +4 -1
- package/dist/windows-agents.js +14 -10
- package/dist/windows-agents.js.map +1 -1
- package/dist/windows-cli-api.d.ts +12 -1
- package/dist/windows-cli-api.js +29 -2
- 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 +25 -0
- package/dist/windows-cli-worker.js +98 -7
- package/dist/windows-cli-worker.js.map +1 -1
- package/dist/windows-cli.d.ts +11 -0
- package/dist/windows-cli.js +17 -3
- 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
|
@@ -1,26 +1,47 @@
|
|
|
1
1
|
/** Standalone, outbound-only native runtime. Imports no Fleet, database, bot or Linux native dependency. */
|
|
2
2
|
import WebSocket from "ws";
|
|
3
|
-
import { readPaneSystemBootId } from "./runtime-pane-boot.js";
|
|
3
|
+
import { readPaneSystemBootId, reusedRuntimeLockPid } from "./runtime-pane-boot.js";
|
|
4
4
|
import { createServer } from "node:http";
|
|
5
5
|
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";
|
|
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";
|
|
13
17
|
import { validatePaneMcpBody } from "./runtime-pane-mcp-protocol.js";
|
|
14
18
|
import { validateRuntimePaneRequest, validateRuntimePaneShutdown } from "./runtime-pane-protocol.js";
|
|
15
19
|
export { RUNTIME_PANE_MODULES } from "./runtime-pane-assets.js";
|
|
20
|
+
const REPAIR = "run .\\agend-runtime.cmd disconnect in this folder (add the same --profile if you used one), then double-click connect-agend.bat and enter a new pairing code.";
|
|
21
|
+
/** Plain-language cause and next step for a stop AgEnD caused. AgEnD answers an unknown and a revoked credential with the same bare 401, so "refused" covers both. */
|
|
22
|
+
export function describeRuntimeStop(reason) {
|
|
23
|
+
switch (reason.kind) {
|
|
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.";
|
|
26
|
+
case "revoked": return `This computer was revoked in AgEnD Settings -> Runtime, so the Runtime stopped. To connect it again, ${REPAIR}`;
|
|
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.";
|
|
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.";
|
|
29
|
+
case "rejected": return `AgEnD rejected a message from this Runtime${reason.detail ? ` (${reason.detail})` : ""}. Usual causes: leftover data from pairing this profile with a different AgEnD server, or a Runtime/AgEnD version mismatch. If this profile was used with another AgEnD server, ${REPAIR} If pairing reports an unfinished job from another pairing, follow that message: check that no CLI it started is still running, delete jobs.json in the profile folder, then pair again. Otherwise download the Windows Runtime again from AgEnD Settings -> Runtime, extract it, and double-click connect-agend.bat.`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
16
32
|
const MAX_FRAME = 256 * 1024;
|
|
17
33
|
const MAX_TOOL = 64 * 1024;
|
|
18
34
|
function object(value) { return !!value && typeof value === "object" && !Array.isArray(value); }
|
|
19
35
|
function message(error) { return error instanceof Error ? error.message.slice(0, 1000) : "Runtime operation failed"; }
|
|
20
36
|
function checkedRun(value) {
|
|
21
|
-
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)))
|
|
22
38
|
throw new Error("Invalid runtime run payload");
|
|
23
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
|
+
}
|
|
24
45
|
if (value.resumeSessionId !== undefined && !validNativeSessionId(task.cli, value.resumeSessionId))
|
|
25
46
|
throw new Error("Invalid native conversation ID");
|
|
26
47
|
if (value.context !== undefined && (typeof value.context !== "string" || value.context.length > 2000 || value.context.includes("\0")))
|
|
@@ -30,7 +51,7 @@ function checkedRun(value) {
|
|
|
30
51
|
|| value.mcp.tools.some(tool => typeof tool !== "string" || !/^[a-z][a-z0-9_]{0,63}$/.test(tool))))
|
|
31
52
|
throw new Error("Invalid scoped MCP request");
|
|
32
53
|
return { task, resumeSessionId: value.resumeSessionId, context: value.context,
|
|
33
|
-
mcp: value.mcp };
|
|
54
|
+
mcp: value.mcp, ...(value.credentialProfile !== undefined ? { credentialProfile: value.credentialProfile } : {}) };
|
|
34
55
|
}
|
|
35
56
|
function jsonBody(req) {
|
|
36
57
|
return new Promise((accept, reject) => {
|
|
@@ -55,6 +76,7 @@ function jsonBody(req) {
|
|
|
55
76
|
export class RuntimeClient {
|
|
56
77
|
options;
|
|
57
78
|
bootId = randomUUID();
|
|
79
|
+
runtimeInfo;
|
|
58
80
|
bridge;
|
|
59
81
|
socket = null;
|
|
60
82
|
welcomed = false;
|
|
@@ -65,6 +87,8 @@ export class RuntimeClient {
|
|
|
65
87
|
reconnectAttempt = 0;
|
|
66
88
|
graceTimer = null;
|
|
67
89
|
pollTimer = null;
|
|
90
|
+
credentialWatch = null;
|
|
91
|
+
credentialStamp = "";
|
|
68
92
|
credentials = null;
|
|
69
93
|
startupRotation = null;
|
|
70
94
|
paneHost = null;
|
|
@@ -81,27 +105,52 @@ export class RuntimeClient {
|
|
|
81
105
|
mcpPort = 0;
|
|
82
106
|
inventory = null;
|
|
83
107
|
stoppedListeners = new Set();
|
|
108
|
+
activity = new RuntimeUpdateActivity();
|
|
109
|
+
stopPromise;
|
|
110
|
+
generation = 0;
|
|
111
|
+
updateProtocol = false;
|
|
112
|
+
preparingUpdate = false;
|
|
113
|
+
trialFence;
|
|
114
|
+
updateWait;
|
|
115
|
+
/** Set only when AgEnD ended the connection and the person must act; a local stop (Ctrl+C) leaves it undefined. */
|
|
116
|
+
stopReason;
|
|
117
|
+
/** The socket this Runtime itself closed with 1008 because it could not read AgEnD's frame; that is not AgEnD refusing us. */
|
|
118
|
+
selfClosed = null;
|
|
84
119
|
constructor(options) {
|
|
85
120
|
this.options = options;
|
|
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] : [])] };
|
|
86
126
|
this.bridge = options.bridge ?? new WindowsCliBridge(nativeWindowsTransport, join(options.store.directory, WINDOWS_CLI_INVENTORY_FILE));
|
|
87
127
|
}
|
|
88
128
|
report(text) { this.options.report?.(text); }
|
|
89
|
-
online() { return this.welcomed && this.socket?.readyState === WebSocket.OPEN; }
|
|
90
|
-
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))); }
|
|
91
131
|
async start() {
|
|
92
132
|
if (!this.stopped)
|
|
93
133
|
return;
|
|
134
|
+
if (this.stopPromise) {
|
|
135
|
+
await this.stopPromise;
|
|
136
|
+
this.stopPromise = undefined;
|
|
137
|
+
this.activity = new RuntimeUpdateActivity();
|
|
138
|
+
}
|
|
94
139
|
let credentials = this.options.store.credentials();
|
|
95
140
|
if (!credentials)
|
|
96
141
|
throw new Error("Pair this runtime before connecting");
|
|
97
142
|
validateRuntimeServer(credentials.server);
|
|
98
143
|
this.stopped = false;
|
|
99
144
|
this.closed = false;
|
|
145
|
+
this.stopReason = undefined;
|
|
100
146
|
try {
|
|
101
147
|
const systemBootId = process.platform === "win32" ? await readPaneSystemBootId() : undefined;
|
|
102
148
|
if (this.stopped)
|
|
103
149
|
throw Error("Runtime start was cancelled");
|
|
104
|
-
|
|
150
|
+
const reused = process.platform === "win32" ? await reusedRuntimeLockPid(this.options.store.lockHolder()) : undefined;
|
|
151
|
+
if (this.stopped)
|
|
152
|
+
throw Error("Runtime start was cancelled");
|
|
153
|
+
this.unlock = this.options.store.lock(this.bootId, systemBootId, reused);
|
|
105
154
|
if (credentials.pendingCredential) {
|
|
106
155
|
const rotating = this.startupRotation = rotateRuntimeCredentials({ store: this.options.store });
|
|
107
156
|
try {
|
|
@@ -114,15 +163,22 @@ export class RuntimeClient {
|
|
|
114
163
|
}
|
|
115
164
|
if (this.stopped)
|
|
116
165
|
throw Error("Runtime start was cancelled");
|
|
166
|
+
this.options.store.adoptMachine(credentials.machineId);
|
|
117
167
|
this.options.store.recoverInterrupted();
|
|
118
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
|
+
}
|
|
119
174
|
// Connect immediately, then publish the last administrator detection from the private profile.
|
|
120
175
|
// A cached read starts no CLI. Only an explicit probe command with force:true performs detection.
|
|
121
176
|
this.connect();
|
|
122
177
|
// A foreground runtime must remain alive while an idle connection is down. Promises and unref'ed retry
|
|
123
178
|
// timers do not keep Node running after the last socket closes; stop() owns and clears this liveness ref.
|
|
124
179
|
this.pollTimer = setInterval(() => this.poll(), this.options.pollMs ?? 250);
|
|
125
|
-
|
|
180
|
+
if (!this.trialFence)
|
|
181
|
+
this.beginDiscovery();
|
|
126
182
|
}
|
|
127
183
|
catch (error) {
|
|
128
184
|
this.stopped = true;
|
|
@@ -141,29 +197,33 @@ export class RuntimeClient {
|
|
|
141
197
|
?? new WebSocket(url.href, { headers: { Authorization: `Bearer ${this.credentials.credential}` }, followRedirects: false,
|
|
142
198
|
maxPayload: MAX_FRAME, handshakeTimeout: 15_000, perMessageDeflate: false });
|
|
143
199
|
this.welcomed = false;
|
|
200
|
+
this.updateProtocol = false;
|
|
144
201
|
this.paneEpoch = randomUUID();
|
|
145
202
|
socket.on("open", () => {
|
|
146
203
|
if (this.stopped || this.socket !== socket) {
|
|
147
204
|
socket.close();
|
|
148
205
|
return;
|
|
149
206
|
}
|
|
150
|
-
this.send({ v: 1, type: "hello", bootId: this.bootId, name: this.credentials.name, platform: process.platform,
|
|
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 } : {}),
|
|
151
209
|
...(process.platform === "win32" || this.options.createPaneHost || this.options.openPaneLink ? { paneProtocol: 1 } : {}),
|
|
152
210
|
...(this.inventory ? { inventory: this.inventory } : {}) });
|
|
153
211
|
});
|
|
154
212
|
socket.on("message", (bytes, binary) => {
|
|
155
213
|
const size = Array.isArray(bytes) ? bytes.reduce((sum, part) => sum + part.byteLength, 0) : bytes.byteLength;
|
|
156
214
|
if (binary || size > MAX_FRAME || this.socket !== socket) {
|
|
215
|
+
this.selfClosed = socket;
|
|
157
216
|
socket.close(1008, "Invalid runtime frame");
|
|
158
217
|
return;
|
|
159
218
|
}
|
|
160
|
-
void this.receive(bytes.toString()).catch(() => socket.close(1008, "Invalid runtime protocol"));
|
|
219
|
+
void this.receive(bytes.toString()).catch(() => { this.selfClosed = socket; socket.close(1008, "Invalid runtime protocol"); });
|
|
161
220
|
});
|
|
162
221
|
socket.on("error", () => { });
|
|
163
222
|
socket.on("unexpected-response", (_req, response) => {
|
|
164
223
|
response.resume();
|
|
165
224
|
if (response.statusCode === 401 || response.statusCode === 403) {
|
|
166
225
|
this.report("Runtime credential was refused. Re-pair after the machine is authorized.");
|
|
226
|
+
this.stopReason = { kind: "refused", ...(response.statusCode === 403 ? { detail: "HTTP 403" } : {}) };
|
|
167
227
|
void this.stop();
|
|
168
228
|
}
|
|
169
229
|
else
|
|
@@ -175,14 +235,22 @@ export class RuntimeClient {
|
|
|
175
235
|
this.socket = null;
|
|
176
236
|
this.welcomed = false;
|
|
177
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
|
+
}
|
|
178
244
|
if (this.paneHost && "connectionChanged" in this.paneHost)
|
|
179
245
|
this.paneHost.connectionChanged();
|
|
180
246
|
this.rejectTools();
|
|
181
247
|
if (this.stopped)
|
|
182
248
|
return;
|
|
183
249
|
if (code === 1008) {
|
|
184
|
-
|
|
185
|
-
|
|
250
|
+
const why = reason.toString().replace(/[^ -~]/g, "?").slice(0, 120);
|
|
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}` : ""}).`);
|
|
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 } : {}) };
|
|
253
|
+
void this.stop({ retirePanes: why === "Machine revoked" });
|
|
186
254
|
return;
|
|
187
255
|
}
|
|
188
256
|
this.report("Disconnected. Existing execution is not replayed; reconnecting…");
|
|
@@ -224,18 +292,42 @@ export class RuntimeClient {
|
|
|
224
292
|
if (value.machineId !== this.credentials?.machineId || !Number.isSafeInteger(value.generation))
|
|
225
293
|
throw new Error("Runtime machine identity mismatch");
|
|
226
294
|
this.welcomed = true;
|
|
295
|
+
this.generation = value.generation;
|
|
296
|
+
this.updateProtocol = value.updateProtocol === 1;
|
|
227
297
|
this.reconnectAttempt = 0;
|
|
228
298
|
if (this.graceTimer) {
|
|
229
299
|
clearTimeout(this.graceTimer);
|
|
230
300
|
this.graceTimer = null;
|
|
231
301
|
}
|
|
232
302
|
this.report("Connected to AgEnD.");
|
|
233
|
-
|
|
234
|
-
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);
|
|
235
326
|
return;
|
|
236
327
|
}
|
|
237
328
|
if (value.type === "revoked") {
|
|
238
329
|
this.report("This machine was revoked by AgEnD.");
|
|
330
|
+
this.stopReason = { kind: "revoked" };
|
|
239
331
|
await this.stop({ retirePanes: true });
|
|
240
332
|
return;
|
|
241
333
|
}
|
|
@@ -281,9 +373,16 @@ export class RuntimeClient {
|
|
|
281
373
|
const request = validateRuntimePaneRequest(value.request);
|
|
282
374
|
this.machinePaneLimit = value.maxAgents;
|
|
283
375
|
const epoch = this.paneEpoch;
|
|
376
|
+
let leave;
|
|
284
377
|
try {
|
|
378
|
+
leave = this.activity.enter();
|
|
285
379
|
const host = await this.panes();
|
|
286
|
-
|
|
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());
|
|
287
386
|
if (request.action === "shutdown") {
|
|
288
387
|
validateRuntimePaneShutdown(result, request.hostBootId);
|
|
289
388
|
// Explicit coordinator disable, not a disconnect: the next enabled request discovers a new host boot.
|
|
@@ -299,6 +398,9 @@ export class RuntimeClient {
|
|
|
299
398
|
catch (error) {
|
|
300
399
|
this.send({ v: 1, type: "pane.response", id: value.id, ok: false, error: message(error) });
|
|
301
400
|
}
|
|
401
|
+
finally {
|
|
402
|
+
leave?.();
|
|
403
|
+
}
|
|
302
404
|
return;
|
|
303
405
|
}
|
|
304
406
|
if (value.type !== "request" || typeof value.id !== "string" || !/^[A-Za-z0-9._:-]{1,128}$/.test(value.id)
|
|
@@ -332,6 +434,7 @@ export class RuntimeClient {
|
|
|
332
434
|
else
|
|
333
435
|
this.paneOpening = import("./runtime-pane-link.js").then(({ RuntimePaneLink }) => (this.options.openPaneLink ?? RuntimePaneLink.open.bind(RuntimePaneLink))({
|
|
334
436
|
directory: this.options.store.directory, server: this.credentials.server, machineId: this.credentials.machineId,
|
|
437
|
+
...(this.options.credentialProfilesRoot ? { credentialRoot: this.options.credentialProfilesRoot } : {}),
|
|
335
438
|
online: () => !this.stopped && this.online(), maxAgents: () => this.machinePaneLimit, epoch: () => this.paneEpoch, output, mcp: (body, current) => this.paneMcp(body, current),
|
|
336
439
|
})).then(host => this.paneHost = host);
|
|
337
440
|
const opening = this.paneOpening;
|
|
@@ -340,7 +443,8 @@ export class RuntimeClient {
|
|
|
340
443
|
}
|
|
341
444
|
return this.paneOpening;
|
|
342
445
|
}
|
|
343
|
-
paneMcp(raw, current) {
|
|
446
|
+
paneMcp(raw, current) { return this.activity.run(() => this.forwardPaneMcp(raw, current)); }
|
|
447
|
+
forwardPaneMcp(raw, current) {
|
|
344
448
|
const body = validatePaneMcpBody(raw), epoch = this.paneEpoch;
|
|
345
449
|
if (!current() || !this.online() || this.pendingPaneTools.size >= 32)
|
|
346
450
|
return Promise.reject(Error("Pane MCP transport is unavailable"));
|
|
@@ -389,15 +493,94 @@ export class RuntimeClient {
|
|
|
389
493
|
if (task)
|
|
390
494
|
this.update(task);
|
|
391
495
|
} }
|
|
392
|
-
|
|
393
|
-
|
|
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;
|
|
394
576
|
this.inventory = inventory;
|
|
395
577
|
if (this.online())
|
|
396
578
|
this.send({ v: 1, type: "inventory", inventory });
|
|
397
579
|
return inventory;
|
|
398
580
|
}
|
|
399
581
|
/** Testable command surface. Mutation identity is committed before calling the native bridge. */
|
|
400
|
-
|
|
582
|
+
operation(operation, payload) { return this.activity.run(() => this.ownedOperation(operation, payload)); }
|
|
583
|
+
async ownedOperation(operation, payload) {
|
|
401
584
|
if (operation === "probe") {
|
|
402
585
|
if (Object.keys(payload).some(key => key !== "force") || (payload.force !== undefined && typeof payload.force !== "boolean"))
|
|
403
586
|
throw new Error("Invalid discovery request");
|
|
@@ -467,13 +650,16 @@ export class RuntimeClient {
|
|
|
467
650
|
return accepted.job.task;
|
|
468
651
|
this.publish(accepted.job);
|
|
469
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;
|
|
470
656
|
const mcp = payload.mcp ? await this.openMcp(task.requestId, payload.mcp.tools) : undefined;
|
|
471
657
|
if (this.stopped || !this.online())
|
|
472
658
|
throw new Error("Runtime disconnected before native execution started");
|
|
473
659
|
this.active.add(task.requestId);
|
|
474
660
|
const initial = this.bridge.start(task, () => !this.stopped && this.online(), {
|
|
475
661
|
...(payload.resumeSessionId ? { resumeSessionId: payload.resumeSessionId } : {}),
|
|
476
|
-
...(payload.context ? { context: payload.context } : {}), ...(mcp ? { mcp } : {}),
|
|
662
|
+
...(payload.context ? { context: payload.context } : {}), ...(mcp ? { mcp } : {}), ...(credentialHome ? { credentialHome } : {}),
|
|
477
663
|
onSettled: settled => this.update(settled),
|
|
478
664
|
});
|
|
479
665
|
this.update(initial);
|
|
@@ -487,6 +673,90 @@ export class RuntimeClient {
|
|
|
487
673
|
return failed;
|
|
488
674
|
}
|
|
489
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
|
+
}
|
|
490
760
|
async openMcp(runId, tools) {
|
|
491
761
|
if (!this.mcpOpening)
|
|
492
762
|
this.mcpOpening = new Promise((accept, reject) => {
|
|
@@ -504,6 +774,22 @@ export class RuntimeClient {
|
|
|
504
774
|
reply(403, { error: "Runtime MCP capability is unavailable" });
|
|
505
775
|
return;
|
|
506
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
|
+
});
|
|
507
793
|
void jsonBody(req).then(async (body) => {
|
|
508
794
|
if (!object(body) || body.op !== "native-mcp" || !["tools/list", "tools/call"].includes(String(body.method))
|
|
509
795
|
|| !object(body.params) || Object.keys(body).some(key => !["op", "method", "params", "callId"].includes(key)))
|
|
@@ -519,7 +805,7 @@ export class RuntimeClient {
|
|
|
519
805
|
if (Buffer.byteLength(JSON.stringify(result) ?? "") > MAX_TOOL)
|
|
520
806
|
throw new Error("Runtime MCP result is too large");
|
|
521
807
|
reply(200, result);
|
|
522
|
-
}).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(); });
|
|
523
809
|
});
|
|
524
810
|
server.on("error", reject);
|
|
525
811
|
server.listen(0, "127.0.0.1", () => { const address = server.address(); if (!address || typeof address === "string") {
|
|
@@ -560,20 +846,36 @@ export class RuntimeClient {
|
|
|
560
846
|
}
|
|
561
847
|
this.pendingTools.clear();
|
|
562
848
|
}
|
|
563
|
-
|
|
849
|
+
stop(options = {}) {
|
|
850
|
+
if (this.stopPromise)
|
|
851
|
+
return this.stopPromise;
|
|
564
852
|
if (this.stopped)
|
|
565
|
-
return;
|
|
853
|
+
return Promise.resolve();
|
|
566
854
|
this.stopped = true;
|
|
567
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
|
+
}
|
|
568
867
|
if (this.reconnectTimer)
|
|
569
868
|
clearTimeout(this.reconnectTimer);
|
|
570
869
|
if (this.graceTimer)
|
|
571
870
|
clearTimeout(this.graceTimer);
|
|
572
871
|
if (this.pollTimer)
|
|
573
872
|
clearInterval(this.pollTimer);
|
|
873
|
+
if (this.credentialWatch)
|
|
874
|
+
clearInterval(this.credentialWatch);
|
|
574
875
|
this.reconnectTimer = null;
|
|
575
876
|
this.graceTimer = null;
|
|
576
877
|
this.pollTimer = null;
|
|
878
|
+
this.credentialWatch = null;
|
|
577
879
|
this.rejectTools();
|
|
578
880
|
this.mcpTokens.clear();
|
|
579
881
|
this.bridge.close();
|
|
@@ -609,7 +911,6 @@ export class RuntimeClient {
|
|
|
609
911
|
this.update({ ...old.task, status: "failed", finishedAt: Date.now(), outcomeConfirmed: false,
|
|
610
912
|
error: "Runtime stopped before native process shutdown was confirmed. Inspect processes before recovery." });
|
|
611
913
|
}
|
|
612
|
-
this.closed = true;
|
|
613
914
|
if (this.mcpServer) {
|
|
614
915
|
const server = this.mcpServer;
|
|
615
916
|
this.mcpServer = null;
|
|
@@ -618,6 +919,7 @@ export class RuntimeClient {
|
|
|
618
919
|
}
|
|
619
920
|
this.unlock?.();
|
|
620
921
|
this.unlock = null;
|
|
922
|
+
this.closed = true;
|
|
621
923
|
for (const done of this.stoppedListeners)
|
|
622
924
|
done();
|
|
623
925
|
this.stoppedListeners.clear();
|
|
@@ -672,6 +974,7 @@ export async function pairRuntime(input) {
|
|
|
672
974
|
const server = validateRuntimeServer(input.server);
|
|
673
975
|
if (!input.code.trim() || input.code.length > 256 || /[\x00-\x1f]/.test(input.code) || !input.name.trim() || input.name.length > 100)
|
|
674
976
|
throw new Error("Enter a valid pairing code and machine name");
|
|
977
|
+
input.store.assertCanPair();
|
|
675
978
|
const paired = await post(server, "/runtime/v1/pair", { code: input.code.trim(), name: input.name.trim(), platform: process.platform, hostname: hostname() }, input.signal);
|
|
676
979
|
if (paired.status !== 201 || paired.data.status !== "pending" || typeof paired.data.machineId !== "string" || typeof paired.data.claimSecret !== "string")
|
|
677
980
|
throw new Error(`Runtime pairing was refused (HTTP ${paired.status})`);
|
|
@@ -683,7 +986,14 @@ export async function pairRuntime(input) {
|
|
|
683
986
|
if (claimed.status === 200 && claimed.data.status === "approved" && claimed.data.machineId === paired.data.machineId
|
|
684
987
|
&& typeof claimed.data.credential === "string" && /^[A-Za-z0-9._-]{16,256}$/.test(claimed.data.credential)) {
|
|
685
988
|
const credentials = { server: server.origin, machineId: paired.data.machineId, credential: claimed.data.credential, name: input.name.trim() };
|
|
989
|
+
// Save first: the one-time credential cannot be issued again. A ledger that changed since the check above is reported after it is safe.
|
|
686
990
|
input.store.saveCredentials(credentials);
|
|
991
|
+
try {
|
|
992
|
+
input.store.adoptMachine(credentials.machineId, true);
|
|
993
|
+
}
|
|
994
|
+
catch (error) {
|
|
995
|
+
throw new Error(`The computer was paired and its credential is saved. ${error instanceof Error ? error.message : "Its job ledger could not be updated."}`);
|
|
996
|
+
}
|
|
687
997
|
input.report?.("Runtime paired. Its machine credential was saved in the private local profile.");
|
|
688
998
|
return credentials;
|
|
689
999
|
}
|
|
@@ -695,6 +1005,6 @@ export async function pairRuntime(input) {
|
|
|
695
1005
|
input.signal?.addEventListener("abort", abort, { once: true });
|
|
696
1006
|
});
|
|
697
1007
|
}
|
|
698
|
-
throw new Error("Runtime pairing was cancelled
|
|
1008
|
+
throw new Error(input.signal?.aborted ? "Runtime pairing was cancelled" : "Runtime pairing expired before the computer was approved. Open AgEnD Settings -> Runtime, then double-click connect-agend.bat again and enter a new pairing code.");
|
|
699
1009
|
}
|
|
700
1010
|
//# sourceMappingURL=runtime-client.js.map
|