@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
|
@@ -8,9 +8,14 @@ import { atomicWriteFileSync } from "./atomic-write.js";
|
|
|
8
8
|
import { validateNativeTask } from "./windows-cli-worker.js";
|
|
9
9
|
import { inventoryProbed } from "./windows-cli.js";
|
|
10
10
|
import { isNativeProviderId } from "./windows-cli-providers.js";
|
|
11
|
+
import { assertCredentialProfileCli, assertCredentialProfileName, parseCredentialProfileReport } from "./runtime-credential-profiles.js";
|
|
12
|
+
import { parseAccountIdentity } from "./claude-auth-status.js";
|
|
13
|
+
import { RuntimeUpdateActivity } from "./runtime-update-activity.js";
|
|
14
|
+
import { parseRuntimeUpdateControl, RUNTIME_MANAGED_UPDATE_CAPABILITY, validRuntimeUpdateId } from "./runtime-update-protocol.js";
|
|
11
15
|
import { validatePaneMcpBody } from "./runtime-pane-mcp-protocol.js";
|
|
12
16
|
import { validateRuntimePaneRequest, validateRuntimePaneSnapshot, validateRuntimePaneShutdown } from "./runtime-pane-protocol.js";
|
|
13
|
-
import {
|
|
17
|
+
import { withNativePaneVerification } from "./runtime-pane-native.js";
|
|
18
|
+
import { RUNTIME_CLAIM_PATH, RUNTIME_CONNECT_PATH, RUNTIME_MAX_FRAME_BYTES, RUNTIME_PAIR_PATH, RUNTIME_ROTATE_PATH, runtimeFingerprintFromHash, parseRuntimeInfo, runtimeInfoCompatible, RUNTIME_REINSTALL_CLOSE_REASON } from "./runtime-protocol.js";
|
|
14
19
|
const PAIR_TTL = 10 * 60_000;
|
|
15
20
|
const MAX_STORE_BYTES = 64 * 1024 * 1024;
|
|
16
21
|
const UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;
|
|
@@ -18,6 +23,9 @@ const secret = () => randomBytes(32).toString("hex");
|
|
|
18
23
|
const hash = (value) => createHash("sha256").update(value).digest("hex");
|
|
19
24
|
const equal = (value, digest) => /^[a-f0-9]{64}$/i.test(digest) && timingSafeEqual(Buffer.from(hash(value), "hex"), Buffer.from(digest, "hex"));
|
|
20
25
|
const record = (v) => !!v && typeof v === "object" && !Array.isArray(v);
|
|
26
|
+
/** A deliberate validation failure whose static message is safe to show the runtime; every other error (I/O, internal) is not. */
|
|
27
|
+
class RuntimeProtocolError extends Error {
|
|
28
|
+
}
|
|
21
29
|
const text = (v, max) => typeof v === "string" && v.length > 0 && v.length <= max && !/[\0\r\n]/.test(v);
|
|
22
30
|
const terminal = (task) => !!task.finishedAt && ["completed", "failed", "cancelled"].includes(task.status);
|
|
23
31
|
const loopback = (address) => address === "127.0.0.1" || address === "::1" || address === "::ffff:127.0.0.1";
|
|
@@ -34,10 +42,19 @@ function stable(value, depth = 0) {
|
|
|
34
42
|
return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${stable(value[key], depth + 1)}`).join(",")}}`;
|
|
35
43
|
return JSON.stringify(value) ?? "null";
|
|
36
44
|
}
|
|
45
|
+
/** The CLI rows' `supports` flags AgEnD knows; any other key a Runtime adds is not kept. */
|
|
46
|
+
const SUPPORT_KEYS = ["execution", "resume", "model", "mcp"];
|
|
47
|
+
const MODEL_SOURCES = ["cli-cache", "official-catalog", "cli-list", "unavailable"];
|
|
48
|
+
/**
|
|
49
|
+
* A Runtime's inventory, copied field by field from an allowlist: a field AgEnD does not know is not kept (so it can never be stored or served back
|
|
50
|
+
* by /ui/runtimes), every text field has a length limit, and the account identity and the credential profile report are accepted in their
|
|
51
|
+
* closed, masked form only. A refusal names the field and the reason, never the rejected value: an unmasked e-mail must not reach a log, a close
|
|
52
|
+
* reason or an error message from here.
|
|
53
|
+
*/
|
|
37
54
|
function inventory(value) {
|
|
38
55
|
if (!record(value) || typeof value.home !== "string" || value.home.length > 1024 || !Array.isArray(value.clis) || value.clis.length > 16)
|
|
39
|
-
throw
|
|
40
|
-
const seen = new Set();
|
|
56
|
+
throw new RuntimeProtocolError("Invalid runtime inventory");
|
|
57
|
+
const seen = new Set(), clis = [];
|
|
41
58
|
for (const row of value.clis) {
|
|
42
59
|
if (!record(row) || !isNativeProviderId(row.id) || seen.has(row.id) || !record(row.supports)
|
|
43
60
|
|| typeof row.runnable !== "boolean" || typeof row.readOnlySupport !== "boolean"
|
|
@@ -45,18 +62,60 @@ function inventory(value) {
|
|
|
45
62
|
|| !(row.path === null || text(row.path, 2048)) || !(row.version === null || text(row.version, 256))
|
|
46
63
|
|| typeof row.permissionNote !== "string" || row.permissionNote.length > 2048
|
|
47
64
|
|| !Array.isArray(row.models) || row.models.length > 256)
|
|
48
|
-
throw
|
|
49
|
-
|
|
65
|
+
throw new RuntimeProtocolError("Invalid runtime CLI inventory");
|
|
66
|
+
const models = row.models.map(model => {
|
|
50
67
|
if (!record(model) || !text(model.id, 256) || model.name !== undefined && !text(model.name, 256)
|
|
51
68
|
|| model.description !== undefined && (typeof model.description !== "string" || model.description.length > 2048))
|
|
52
|
-
throw
|
|
69
|
+
throw new RuntimeProtocolError("Invalid runtime model inventory");
|
|
70
|
+
return { id: model.id, ...(model.name !== undefined ? { name: model.name } : {}), ...(model.description !== undefined ? { description: model.description } : {}) };
|
|
71
|
+
});
|
|
53
72
|
if (Object.values(row.supports).some(v => typeof v !== "boolean"))
|
|
54
|
-
throw
|
|
73
|
+
throw new RuntimeProtocolError("Invalid runtime capabilities");
|
|
74
|
+
if (row.reason !== undefined && (typeof row.reason !== "string" || row.reason.length > 1024))
|
|
75
|
+
throw new RuntimeProtocolError("Invalid runtime CLI inventory");
|
|
76
|
+
const supports = Object.fromEntries(SUPPORT_KEYS.filter(key => Object.hasOwn(row.supports, key)).map(key => [key, row.supports[key]]));
|
|
77
|
+
const entry = { id: row.id, path: row.path, version: row.version, authenticated: row.authenticated, runnable: row.runnable, supports: supports,
|
|
78
|
+
readOnlySupport: row.readOnlySupport, permissionNote: row.permissionNote, models,
|
|
79
|
+
...(row.reason !== undefined ? { reason: row.reason } : {}),
|
|
80
|
+
...(MODEL_SOURCES.includes(row.modelsSource) ? { modelsSource: row.modelsSource } : {}) };
|
|
55
81
|
seen.add(row.id);
|
|
82
|
+
clis.push(entry);
|
|
56
83
|
}
|
|
57
84
|
if (Buffer.byteLength(JSON.stringify(value)) > RUNTIME_MAX_FRAME_BYTES / 2)
|
|
58
|
-
throw
|
|
59
|
-
|
|
85
|
+
throw new RuntimeProtocolError("Runtime inventory is too large");
|
|
86
|
+
if (value.probedAt !== undefined && value.probedAt !== null && (typeof value.probedAt !== "number" || !Number.isFinite(value.probedAt)))
|
|
87
|
+
throw new RuntimeProtocolError("Invalid runtime inventory");
|
|
88
|
+
const probe = { clis, home: value.home, ...(value.probedAt !== undefined ? { probedAt: value.probedAt } : {}),
|
|
89
|
+
...(typeof value.hostname === "string" && value.hostname.trim() && value.hostname.length <= 255 && !/[\x00-\x1f\x7f]/.test(value.hostname) ? { hostname: value.hostname.trim() } : {}) };
|
|
90
|
+
const field = (error) => /^Invalid (?:credential profile report|account identity): [A-Za-z ,.]{1,48}$/.test(String(error?.message)) ? String(error.message).replace(/^Invalid (?:credential profile report|account identity): /, "") : "invalid";
|
|
91
|
+
if (value.credentialProfiles !== undefined) {
|
|
92
|
+
try {
|
|
93
|
+
probe.credentialProfiles = parseCredentialProfileReport(value.credentialProfiles);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new RuntimeProtocolError(`Invalid runtime credential profiles (${field(error)})`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const identities = new Map(value.clis.map(row => [row.id, row.identity]));
|
|
100
|
+
for (const row of probe.clis) {
|
|
101
|
+
const identity = identities.get(row.id);
|
|
102
|
+
if (identity === undefined)
|
|
103
|
+
continue;
|
|
104
|
+
if (row.id !== "claude-code" || row.authenticated !== true)
|
|
105
|
+
throw new RuntimeProtocolError("Invalid runtime CLI identity (only a signed-in Claude Code has one)");
|
|
106
|
+
try {
|
|
107
|
+
row.identity = parseAccountIdentity(identity);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
throw new RuntimeProtocolError(`Invalid runtime CLI identity (${field(error)})`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return probe;
|
|
114
|
+
}
|
|
115
|
+
function machineView(machine) {
|
|
116
|
+
return { ...structuredClone(machine), ...(machine.inventory ? { inventory: withNativePaneVerification(machine.inventory) } : {}), runtimeCompatibility: machine.runtimeInfo
|
|
117
|
+
? runtimeInfoCompatible(machine.runtimeInfo) ? "compatible" : "incompatible"
|
|
118
|
+
: machine.bootId ? "legacy" : "unknown" };
|
|
60
119
|
}
|
|
61
120
|
/**
|
|
62
121
|
* M-2239 P2-1 (#2936 review): the journal is compacted, never just capped. A settled command (failed, or accepted with a
|
|
@@ -82,6 +141,8 @@ export class RuntimeCoordinator {
|
|
|
82
141
|
pending = new Map();
|
|
83
142
|
paneToolPending = new Set();
|
|
84
143
|
panePending = new Map();
|
|
144
|
+
/** Physical handler ownership survives socket replacement and transport deadlines. */
|
|
145
|
+
machineActivity = new Map();
|
|
85
146
|
listeners = new Set();
|
|
86
147
|
limits = new Map();
|
|
87
148
|
heartbeat;
|
|
@@ -124,6 +185,9 @@ export class RuntimeCoordinator {
|
|
|
124
185
|
for (const command of this.state.commands)
|
|
125
186
|
if (command.state === "pending")
|
|
126
187
|
command.state = interrupted(command);
|
|
188
|
+
for (const row of this.state.machines)
|
|
189
|
+
if (row.machine.runtimeInfo !== undefined)
|
|
190
|
+
row.machine.runtimeInfo = parseRuntimeInfo(row.machine.runtimeInfo);
|
|
127
191
|
this.save();
|
|
128
192
|
this.heartbeat = setInterval(() => {
|
|
129
193
|
for (const connection of this.connections.values()) {
|
|
@@ -169,8 +233,8 @@ export class RuntimeCoordinator {
|
|
|
169
233
|
}
|
|
170
234
|
entry(id) { const row = this.state.machines.find(v => v.machine.id === id); if (!row)
|
|
171
235
|
throw Error("Runtime machine not found"); return row; }
|
|
172
|
-
listMachines() { return this.state.machines.map(row =>
|
|
173
|
-
machine(id) { const row = this.state.machines.find(v => v.machine.id === id); return row ?
|
|
236
|
+
listMachines() { return this.state.machines.map(row => machineView(row.machine)); }
|
|
237
|
+
machine(id) { const row = this.state.machines.find(v => v.machine.id === id); return row ? machineView(row.machine) : null; }
|
|
174
238
|
subscribe(listener) { this.listeners.add(listener); return () => this.listeners.delete(listener); }
|
|
175
239
|
createPairing() {
|
|
176
240
|
this.state.pairings = this.state.pairings.filter(row => row.expiresAt > this.now());
|
|
@@ -246,6 +310,7 @@ export class RuntimeCoordinator {
|
|
|
246
310
|
if (connection) {
|
|
247
311
|
this.connections.delete(id);
|
|
248
312
|
this.rejectPending(connection, "Runtime machine was revoked");
|
|
313
|
+
this.options.warn?.({ machineId: id, code: 1008, reason: "Machine revoked" }, "Runtime connection closed because the machine was revoked");
|
|
249
314
|
connection.ws.close(1008, "Machine revoked");
|
|
250
315
|
}
|
|
251
316
|
this.emit({ type: "machine", machineId: id });
|
|
@@ -394,20 +459,31 @@ export class RuntimeCoordinator {
|
|
|
394
459
|
const old = this.connections.get(row.machine.id);
|
|
395
460
|
if (old) {
|
|
396
461
|
this.rejectPending(old, "Runtime connection was replaced; execution must be reconciled");
|
|
462
|
+
this.options.warn?.({ machineId: row.machine.id, code: 1008, reason: "Connection replaced" }, "Runtime connection closed because the same machine credential connected again");
|
|
397
463
|
old.ws.close(1008, "Connection replaced");
|
|
398
464
|
}
|
|
399
465
|
row.machine.generation++;
|
|
400
466
|
row.machine.status = "offline";
|
|
401
467
|
this.save();
|
|
402
|
-
const
|
|
468
|
+
const activity = this.machineActivity.get(row.machine.id) ?? new RuntimeUpdateActivity();
|
|
469
|
+
this.machineActivity.set(row.machine.id, activity);
|
|
470
|
+
const connection = { ws, machineId: row.machine.id, generation: row.machine.generation, ready: false, alive: true, activity, helloTimer: setTimeout(() => ws.close(1008, "Runtime hello required"), 10_000) };
|
|
403
471
|
connection.helloTimer.unref();
|
|
404
472
|
this.connections.set(row.machine.id, connection);
|
|
405
473
|
ws.on("pong", () => { connection.alive = true; if (this.current(connection))
|
|
406
474
|
row.machine.lastSeenAt = this.now(); });
|
|
407
|
-
ws.on("message", (data, binary) => {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
475
|
+
ws.on("message", (data, binary) => {
|
|
476
|
+
if (binary) {
|
|
477
|
+
ws.close(1008, "Runtime requires JSON text frames");
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
void this.message(connection, data).catch(error => {
|
|
481
|
+
// The cause (a static validation message) goes to the log and, trimmed, to the runtime so its terminal can show it.
|
|
482
|
+
const reason = error instanceof RuntimeProtocolError ? `Invalid runtime message: ${error.message}`.replace(/[^ -~]/g, "?").slice(0, 120) : "Invalid runtime message";
|
|
483
|
+
this.options.warn?.({ machineId: connection.machineId, code: 1008, reason, detail: error instanceof Error ? error.message : String(error) }, "Runtime connection closed because of an invalid runtime message");
|
|
484
|
+
ws.close(1008, reason);
|
|
485
|
+
});
|
|
486
|
+
});
|
|
411
487
|
ws.on("error", () => { });
|
|
412
488
|
ws.on("close", () => {
|
|
413
489
|
clearTimeout(connection.helloTimer);
|
|
@@ -434,6 +510,8 @@ export class RuntimeCoordinator {
|
|
|
434
510
|
connection.ws.send(frame);
|
|
435
511
|
}
|
|
436
512
|
rejectPending(connection, reason) {
|
|
513
|
+
connection.update?.fence.release();
|
|
514
|
+
connection.update = undefined;
|
|
437
515
|
for (const [id, pending] of this.panePending)
|
|
438
516
|
if (pending.machineId === connection.machineId && pending.generation === connection.generation) {
|
|
439
517
|
this.panePending.delete(id);
|
|
@@ -458,7 +536,7 @@ export class RuntimeCoordinator {
|
|
|
458
536
|
}
|
|
459
537
|
validateTask(command, value) {
|
|
460
538
|
if (command.operation !== "run" || !record(command.payload) || !record(command.payload.task) || !record(value))
|
|
461
|
-
throw
|
|
539
|
+
throw new RuntimeProtocolError("Unexpected runtime task");
|
|
462
540
|
const input = command.payload.task;
|
|
463
541
|
if (value.id !== input.requestId || value.cli !== input.cli || value.cwd !== input.cwd || value.sandbox !== input.sandbox || (value.model ?? "") !== (input.model ?? "")
|
|
464
542
|
|| !["starting", "running", "cancelling", "completed", "failed", "cancelled"].includes(String(value.status))
|
|
@@ -469,38 +547,154 @@ export class RuntimeCoordinator {
|
|
|
469
547
|
|| value.threadId !== undefined && !text(value.threadId, 256)
|
|
470
548
|
|| value.threadId !== undefined && command.payload.resumeSessionId !== undefined && value.threadId !== command.payload.resumeSessionId
|
|
471
549
|
|| value.outcomeConfirmed !== undefined && typeof value.outcomeConfirmed !== "boolean")
|
|
472
|
-
throw
|
|
550
|
+
throw new RuntimeProtocolError("Invalid runtime task snapshot");
|
|
473
551
|
return { id: value.id, cli: value.cli, cwd: value.cwd, sandbox: value.sandbox, ...(value.model ? { model: value.model } : {}),
|
|
474
552
|
status: value.status, startedAt: value.startedAt, output: value.output,
|
|
475
553
|
...(value.finishedAt !== undefined ? { finishedAt: value.finishedAt } : {}), ...(value.error ? { error: value.error } : {}), ...(value.threadId ? { threadId: value.threadId } : {}), ...(value.outcomeConfirmed !== undefined ? { outcomeConfirmed: value.outcomeConfirmed } : {}) };
|
|
476
554
|
}
|
|
555
|
+
admitting(connection) {
|
|
556
|
+
return connection.ready && !connection.update && connection.activity.accepting && this.current(connection)
|
|
557
|
+
&& this.entry(connection.machineId).machine.status === "online" && connection.ws.readyState === WebSocket.OPEN;
|
|
558
|
+
}
|
|
559
|
+
updateIdle(connection) {
|
|
560
|
+
const machine = connection.machineId;
|
|
561
|
+
return connection.activity.pending === 0 && !this.hasActiveTask(machine) && connection.ws.bufferedAmount === 0
|
|
562
|
+
&& ![...this.pending.values(), ...this.panePending.values()].some(pending => pending.machineId === machine)
|
|
563
|
+
&& ![...this.paneToolPending].some(key => key.startsWith(`${machine}:`));
|
|
564
|
+
}
|
|
565
|
+
/** Trial metadata is staged until activation: no online event or probe can admit work early. */
|
|
566
|
+
promoteRuntime(connection) {
|
|
567
|
+
const row = this.entry(connection.machineId), hello = connection.hello;
|
|
568
|
+
row.machine.bootId = connection.bootId;
|
|
569
|
+
row.machine.status = "online";
|
|
570
|
+
row.machine.lastSeenAt = this.now();
|
|
571
|
+
if (hello.runtimeInfo)
|
|
572
|
+
row.machine.runtimeInfo = hello.runtimeInfo;
|
|
573
|
+
else
|
|
574
|
+
delete row.machine.runtimeInfo;
|
|
575
|
+
if (hello.paneProtocol === 1)
|
|
576
|
+
row.machine.paneProtocol = 1;
|
|
577
|
+
else
|
|
578
|
+
delete row.machine.paneProtocol;
|
|
579
|
+
if (hello.inventory !== undefined) {
|
|
580
|
+
row.machine.inventory = hello.inventory;
|
|
581
|
+
row.machine.inventoryUpdatedAt = this.now();
|
|
582
|
+
}
|
|
583
|
+
this.save();
|
|
584
|
+
}
|
|
585
|
+
updateControl(connection, value) {
|
|
586
|
+
if (!connection.ready || !connection.managedUpdate)
|
|
587
|
+
throw new RuntimeProtocolError("Runtime update was not negotiated");
|
|
588
|
+
const control = parseRuntimeUpdateControl(value, "client");
|
|
589
|
+
const reply = (phase) => this.send(connection, { v: 1, type: "update.control", id: control.id, bootId: connection.bootId, generation: connection.generation, phase });
|
|
590
|
+
if (control.bootId !== connection.bootId || control.generation !== connection.generation) {
|
|
591
|
+
reply("cancelled");
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
const owned = connection.update;
|
|
595
|
+
if (owned?.phase === "trial") {
|
|
596
|
+
if (control.phase !== "activate" || owned.id !== control.id) {
|
|
597
|
+
reply("busy");
|
|
598
|
+
return;
|
|
599
|
+
}
|
|
600
|
+
if (!owned.fence.current() || !this.updateIdle(connection)) {
|
|
601
|
+
reply("busy");
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
// The supervisor has persisted its activation intent. Lost acknowledgement is uncertain, never rollback permission.
|
|
605
|
+
owned.fence.release();
|
|
606
|
+
connection.update = undefined;
|
|
607
|
+
connection.activatedUpdateId = control.id;
|
|
608
|
+
this.promoteRuntime(connection);
|
|
609
|
+
reply("activated");
|
|
610
|
+
this.emit({ type: "machine", machineId: connection.machineId });
|
|
611
|
+
if (!inventoryProbed(this.entry(connection.machineId).machine.inventory))
|
|
612
|
+
void this.call(connection.machineId, "probe", { force: true }).catch(() => { });
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
if (control.phase === "activate" && connection.activatedUpdateId === control.id) {
|
|
616
|
+
reply("activated");
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
if (control.phase === "prepare") {
|
|
620
|
+
if (owned) {
|
|
621
|
+
reply(owned.id === control.id ? owned.phase === "committed" ? "commit" : "prepared" : "busy");
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
const fence = connection.activity.tryFence(control.id, () => this.current(connection) && connection.ready && connection.ws.readyState === WebSocket.OPEN, () => this.updateIdle(connection));
|
|
625
|
+
if (!fence) {
|
|
626
|
+
reply("busy");
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
connection.update = { id: control.id, phase: "prepared", fence };
|
|
630
|
+
reply("prepared");
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
if (!owned || owned.id !== control.id) {
|
|
634
|
+
reply("cancelled");
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
if (owned.phase === "committed") {
|
|
638
|
+
reply("commit");
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
if (control.phase === "ready" && owned.fence.current() && this.updateIdle(connection)) {
|
|
642
|
+
owned.phase = "committed";
|
|
643
|
+
reply("commit");
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
// A cancellation/busy reply is queued before admitting any later request on this ordered connection.
|
|
647
|
+
reply(control.phase === "ready" ? "busy" : "cancelled");
|
|
648
|
+
owned.fence.release();
|
|
649
|
+
connection.update = undefined;
|
|
650
|
+
}
|
|
477
651
|
async message(connection, raw) {
|
|
478
652
|
if (!this.current(connection))
|
|
479
653
|
return;
|
|
480
654
|
const value = JSON.parse(raw.toString());
|
|
481
655
|
if (!record(value) || value.v !== 1 || !text(value.type, 32))
|
|
482
|
-
throw
|
|
656
|
+
throw new RuntimeProtocolError("Invalid runtime frame");
|
|
483
657
|
const row = this.entry(connection.machineId);
|
|
484
658
|
connection.alive = true;
|
|
659
|
+
if (value.type === "update.control") {
|
|
660
|
+
this.updateControl(connection, value);
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
485
663
|
if (!connection.ready) {
|
|
486
664
|
if (value.type !== "hello" || !text(value.bootId, 128))
|
|
487
|
-
throw
|
|
488
|
-
|
|
665
|
+
throw new RuntimeProtocolError("Runtime hello required");
|
|
666
|
+
const runtimeInfo = parseRuntimeInfo(value.runtimeInfo);
|
|
667
|
+
if (runtimeInfo && !runtimeInfoCompatible(runtimeInfo)) {
|
|
668
|
+
// Version skew fails clearly: no welcome, no work, and the Runtime is told to run the install command again. Its report is
|
|
669
|
+
// kept (it stays offline) so Settings can show which version needs reinstalling; the pairing itself is untouched.
|
|
670
|
+
row.machine.runtimeInfo = runtimeInfo;
|
|
671
|
+
row.machine.lastSeenAt = this.now();
|
|
672
|
+
this.save();
|
|
673
|
+
this.emit({ type: "machine", machineId: connection.machineId });
|
|
674
|
+
this.options.warn?.({ machineId: connection.machineId, code: 1008, reason: "Runtime incompatible", detail: `version ${runtimeInfo.version ?? "unknown"}, protocols ${runtimeInfo.protocolVersions.join(",")}, capabilities ${runtimeInfo.capabilities.join(",")}` }, "Runtime connection refused: its version is not compatible with this AgEnD");
|
|
675
|
+
connection.ws.close(1008, RUNTIME_REINSTALL_CLOSE_REASON);
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
const managed = runtimeInfo?.capabilities.includes(RUNTIME_MANAGED_UPDATE_CAPABILITY) === true;
|
|
679
|
+
if (managed && !validRuntimeUpdateId(value.bootId) || value.updateTrialId !== undefined && (!managed || !validRuntimeUpdateId(value.updateTrialId)))
|
|
680
|
+
throw new RuntimeProtocolError("Invalid Runtime update handshake");
|
|
681
|
+
const reportedInventory = value.inventory === undefined ? undefined : inventory(value.inventory);
|
|
489
682
|
connection.bootId = value.bootId;
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
delete row.machine.paneProtocol;
|
|
498
|
-
if (value.inventory !== undefined) {
|
|
499
|
-
row.machine.inventory = inventory(value.inventory);
|
|
500
|
-
row.machine.inventoryUpdatedAt = this.now();
|
|
683
|
+
connection.managedUpdate = managed;
|
|
684
|
+
connection.hello = { runtimeInfo, ...(value.paneProtocol === 1 ? { paneProtocol: 1 } : {}), inventory: reportedInventory };
|
|
685
|
+
if (value.updateTrialId !== undefined) {
|
|
686
|
+
const fence = connection.activity.tryFence(value.updateTrialId, () => this.current(connection), () => this.updateIdle(connection));
|
|
687
|
+
if (!fence)
|
|
688
|
+
throw new RuntimeProtocolError("Runtime update trial is busy");
|
|
689
|
+
connection.update = { id: value.updateTrialId, phase: "trial", fence };
|
|
501
690
|
}
|
|
502
|
-
|
|
503
|
-
|
|
691
|
+
connection.ready = true;
|
|
692
|
+
clearTimeout(connection.helloTimer);
|
|
693
|
+
if (!connection.update)
|
|
694
|
+
this.promoteRuntime(connection);
|
|
695
|
+
this.send(connection, { v: 1, type: "welcome", machineId: connection.machineId, generation: connection.generation, ...(managed ? { updateProtocol: 1 } : {}) });
|
|
696
|
+
if (connection.update)
|
|
697
|
+
return; // A trial has authenticated, but cannot receive tasks or an automatic CLI probe.
|
|
504
698
|
this.emit({ type: "machine", machineId: connection.machineId });
|
|
505
699
|
// alpha.2 polish (dev-claude's no-chat e2e): a runner that brings no CLI inventory (just paired, nothing detected
|
|
506
700
|
// yet) is asked for its own report now — its detection runs on that PC, never on this fleet's loop — so the first
|
|
@@ -513,21 +707,25 @@ export class RuntimeCoordinator {
|
|
|
513
707
|
return;
|
|
514
708
|
}
|
|
515
709
|
row.machine.lastSeenAt = this.now();
|
|
710
|
+
if (connection.update?.phase === "trial")
|
|
711
|
+
throw new RuntimeProtocolError("Runtime update trial has not activated");
|
|
516
712
|
if (value.type === "pane.tool.request") {
|
|
517
713
|
if (row.machine.paneProtocol !== 1 || Object.keys(value).some(key => !["v", "type", "id", "body"].includes(key)) || !UUID.test(String(value.id)))
|
|
518
|
-
throw
|
|
714
|
+
throw new RuntimeProtocolError("Invalid pane MCP transport request");
|
|
519
715
|
const body = validatePaneMcpBody(value.body), id = value.id;
|
|
520
716
|
const key = `${connection.machineId}:${connection.generation}:${id}`;
|
|
521
717
|
if (this.paneToolPending.size >= 128 || this.paneToolPending.has(key))
|
|
522
|
-
throw
|
|
718
|
+
throw new RuntimeProtocolError("Pane MCP transport backlog or duplicate request");
|
|
523
719
|
let active = true;
|
|
524
720
|
const current = () => active && !this.closed && this.current(connection) && connection.ready && connection.ws.readyState === WebSocket.OPEN;
|
|
525
721
|
this.paneToolPending.add(key);
|
|
526
722
|
let timer;
|
|
527
723
|
try {
|
|
528
|
-
if (!current() || !this.options.handlePaneMcp)
|
|
529
|
-
throw
|
|
530
|
-
|
|
724
|
+
if (!current() || !this.options.handlePaneMcp || !connection.activity.accepting || connection.activity.pending >= 128)
|
|
725
|
+
throw new RuntimeProtocolError("Pane MCP scope unavailable");
|
|
726
|
+
// The activity token belongs to the underlying handler, not the deadline race that may finish first.
|
|
727
|
+
const physical = connection.activity.run(() => this.options.handlePaneMcp(connection.machineId, body, current));
|
|
728
|
+
const result = await Promise.race([physical, new Promise((_resolve, reject) => {
|
|
531
729
|
timer = setTimeout(() => { active = false; reject(Error("Pane MCP deadline")); }, 80_000);
|
|
532
730
|
timer.unref();
|
|
533
731
|
})]);
|
|
@@ -547,19 +745,19 @@ export class RuntimeCoordinator {
|
|
|
547
745
|
}
|
|
548
746
|
if (value.type === "pane.output") {
|
|
549
747
|
if (row.machine.paneProtocol !== 1)
|
|
550
|
-
throw
|
|
748
|
+
throw new RuntimeProtocolError("Pane protocol was not negotiated");
|
|
551
749
|
const snapshot = validateRuntimePaneSnapshot(value.snapshot);
|
|
552
750
|
this.emit({ type: "pane", machineId: connection.machineId, pane: snapshot });
|
|
553
751
|
return;
|
|
554
752
|
}
|
|
555
753
|
if (value.type === "pane.response") {
|
|
556
754
|
if (row.machine.paneProtocol !== 1 || !UUID.test(String(value.id)) || typeof value.ok !== "boolean")
|
|
557
|
-
throw
|
|
755
|
+
throw new RuntimeProtocolError("Invalid pane transport response");
|
|
558
756
|
const pending = this.panePending.get(value.id);
|
|
559
757
|
if (!pending)
|
|
560
758
|
return; // A late reply proves nothing and never replays a command.
|
|
561
759
|
if (pending.machineId !== connection.machineId || pending.generation !== connection.generation)
|
|
562
|
-
throw
|
|
760
|
+
throw new RuntimeProtocolError("Pane response belongs to another connection");
|
|
563
761
|
this.panePending.delete(value.id);
|
|
564
762
|
clearTimeout(pending.timer);
|
|
565
763
|
if (value.ok)
|
|
@@ -577,7 +775,7 @@ export class RuntimeCoordinator {
|
|
|
577
775
|
}
|
|
578
776
|
if (value.type === "task") {
|
|
579
777
|
if (!record(value.task) || !Number.isSafeInteger(value.seq) || value.seq < 1)
|
|
580
|
-
throw
|
|
778
|
+
throw new RuntimeProtocolError("Invalid runtime task event");
|
|
581
779
|
const taskValue = value.task;
|
|
582
780
|
const command = this.state.commands.find(command => command.id === taskValue.id && command.machineId === connection.machineId && command.operation === "run");
|
|
583
781
|
if (!command) {
|
|
@@ -585,13 +783,13 @@ export class RuntimeCoordinator {
|
|
|
585
783
|
// is acknowledged by its tombstone and changes nothing. An unknown id, or another machine's, still closes.
|
|
586
784
|
if (this.tombstoned(connection.machineId, taskValue.id))
|
|
587
785
|
return;
|
|
588
|
-
throw
|
|
786
|
+
throw new RuntimeProtocolError("Runtime task does not belong to this machine");
|
|
589
787
|
}
|
|
590
788
|
const task = this.validateTask(command, value.task);
|
|
591
789
|
if (value.seq <= command.seq)
|
|
592
790
|
return;
|
|
593
791
|
if (command.task && terminal(command.task) && !terminal(task))
|
|
594
|
-
throw
|
|
792
|
+
throw new RuntimeProtocolError("Runtime task cannot restart");
|
|
595
793
|
command.seq = value.seq;
|
|
596
794
|
command.task = task;
|
|
597
795
|
command.state = "accepted";
|
|
@@ -601,12 +799,12 @@ export class RuntimeCoordinator {
|
|
|
601
799
|
}
|
|
602
800
|
if (value.type === "response") {
|
|
603
801
|
if (!text(value.id, 128) || typeof value.ok !== "boolean")
|
|
604
|
-
throw
|
|
802
|
+
throw new RuntimeProtocolError("Invalid runtime response");
|
|
605
803
|
const pending = this.pending.get(value.id), command = this.state.commands.find(command => command.id === value.id);
|
|
606
804
|
if (!command || command.machineId !== connection.machineId) {
|
|
607
805
|
if (!command && this.tombstoned(connection.machineId, value.id))
|
|
608
806
|
return;
|
|
609
|
-
throw
|
|
807
|
+
throw new RuntimeProtocolError("Runtime response does not belong to this machine");
|
|
610
808
|
}
|
|
611
809
|
if (!pending || pending.generation !== connection.generation)
|
|
612
810
|
return;
|
|
@@ -651,30 +849,30 @@ export class RuntimeCoordinator {
|
|
|
651
849
|
}
|
|
652
850
|
if (value.type === "tool.call") {
|
|
653
851
|
if (!text(value.id, 128) || !text(value.runId, 128))
|
|
654
|
-
throw
|
|
852
|
+
throw new RuntimeProtocolError("Invalid runtime tool call");
|
|
655
853
|
const command = this.state.commands.find(command => command.id === value.runId && command.machineId === connection.machineId && command.operation === "run");
|
|
656
854
|
try {
|
|
657
|
-
if (!command || !record(command.payload) || !record(command.payload.mcp) || command.task && terminal(command.task) || !this.options.handleMcp)
|
|
658
|
-
throw
|
|
855
|
+
if (!connection.activity.accepting || connection.activity.pending >= 128 || !command || !record(command.payload) || !record(command.payload.mcp) || command.task && terminal(command.task) || !this.options.handleMcp)
|
|
856
|
+
throw new RuntimeProtocolError("Runtime tool call has no active turn");
|
|
659
857
|
const body = value.body;
|
|
660
858
|
if (!record(body) || Object.keys(body).some(key => !["op", "method", "params", "callId"].includes(key))
|
|
661
859
|
|| body.op !== "native-mcp" || !record(body.params) || Buffer.byteLength(JSON.stringify(body)) > 64 * 1024)
|
|
662
|
-
throw
|
|
860
|
+
throw new RuntimeProtocolError("Invalid runtime MCP request");
|
|
663
861
|
if (body.method === "tools/list") {
|
|
664
862
|
if (Object.keys(body.params).length || body.callId !== undefined)
|
|
665
|
-
throw
|
|
863
|
+
throw new RuntimeProtocolError("Invalid runtime MCP listing");
|
|
666
864
|
}
|
|
667
865
|
else if (body.method === "tools/call") {
|
|
668
866
|
if (!text(body.callId, 128) || !/^[A-Za-z0-9._:-]+$/.test(body.callId)
|
|
669
867
|
|| Object.keys(body.params).some(key => !["name", "arguments"].includes(key)) || typeof body.params.name !== "string"
|
|
670
868
|
|| !Array.isArray(command.payload.mcp.tools) || !command.payload.mcp.tools.includes(body.params.name)
|
|
671
869
|
|| body.params.arguments !== undefined && !record(body.params.arguments))
|
|
672
|
-
throw
|
|
870
|
+
throw new RuntimeProtocolError("Runtime MCP tool is outside this turn");
|
|
673
871
|
stable(body.params);
|
|
674
872
|
}
|
|
675
873
|
else
|
|
676
|
-
throw
|
|
677
|
-
const result = await this.options.handleMcp(connection.machineId, value.runId, body);
|
|
874
|
+
throw new RuntimeProtocolError("Invalid runtime MCP operation");
|
|
875
|
+
const result = await connection.activity.run(() => this.options.handleMcp(connection.machineId, value.runId, body));
|
|
678
876
|
if (!this.current(connection))
|
|
679
877
|
return;
|
|
680
878
|
this.send(connection, { v: 1, type: "tool.result", id: value.id, ok: true, result });
|
|
@@ -685,7 +883,7 @@ export class RuntimeCoordinator {
|
|
|
685
883
|
}
|
|
686
884
|
return;
|
|
687
885
|
}
|
|
688
|
-
throw
|
|
886
|
+
throw new RuntimeProtocolError("Unknown runtime message");
|
|
689
887
|
}
|
|
690
888
|
tombstoned(machineId, id) {
|
|
691
889
|
return typeof id === "string" && this.state.tombstones.some(row => row.id === id && row.machineId === machineId);
|
|
@@ -720,10 +918,31 @@ export class RuntimeCoordinator {
|
|
|
720
918
|
}
|
|
721
919
|
task(id) { const task = this.state.commands.find(command => command.id === id && command.operation === "run")?.task; return task ? structuredClone(task) : null; }
|
|
722
920
|
tasks() { return this.state.commands.flatMap(command => command.operation === "run" && command.task ? [{ machineId: command.machineId, task: structuredClone(command.task) }] : []); }
|
|
921
|
+
/** Include journaled sends whose acknowledgement is still missing, so reopening diagnostics cannot hide an uncertain run. */
|
|
922
|
+
diagnosticTasks(machineId) {
|
|
923
|
+
return this.state.commands.flatMap(command => {
|
|
924
|
+
if (command.operation !== "run" || command.machineId !== machineId)
|
|
925
|
+
return [];
|
|
926
|
+
if (command.task)
|
|
927
|
+
return [structuredClone(command.task)];
|
|
928
|
+
let input;
|
|
929
|
+
try {
|
|
930
|
+
input = validateNativeTask(command.payload.task);
|
|
931
|
+
}
|
|
932
|
+
catch {
|
|
933
|
+
return [];
|
|
934
|
+
}
|
|
935
|
+
const uncertain = command.state === "uncertain", rejected = command.state === "failed";
|
|
936
|
+
return [{ id: command.id, cli: input.cli, cwd: input.cwd, sandbox: input.sandbox, ...(input.model ? { model: input.model } : {}),
|
|
937
|
+
startedAt: command.createdAt, status: uncertain || rejected ? "failed" : "starting", output: "",
|
|
938
|
+
...(rejected ? { outcomeConfirmed: true, error: command.error || "Runtime request failed" } : {}),
|
|
939
|
+
...(uncertain ? { outcomeConfirmed: false, error: "Remote execution outcome is unconfirmed. Reconnect this runtime to reconcile before sending another task." } : {}) }];
|
|
940
|
+
}).sort((a, b) => b.startedAt - a.startedAt).slice(0, 20);
|
|
941
|
+
}
|
|
723
942
|
hasActiveTask(machineId) { return this.state.commands.some(command => command.machineId === machineId && command.operation === "run" && command.state !== "failed" && (!command.task || !terminal(command.task) || command.task.outcomeConfirmed === false)); }
|
|
724
943
|
paneTransportEpoch(machineId) {
|
|
725
944
|
const connection = this.connections.get(machineId);
|
|
726
|
-
return connection
|
|
945
|
+
return connection && this.admitting(connection) ? `${this.paneEpoch}:${machineId}:${connection.generation}` : null;
|
|
727
946
|
}
|
|
728
947
|
/** Pane input replay/sequence authority lives in its pane ledger; reads never fill the exec-task journal. */
|
|
729
948
|
async callPane(machineId, raw, maxAgents = 4) {
|
|
@@ -731,8 +950,8 @@ export class RuntimeCoordinator {
|
|
|
731
950
|
if (!Number.isInteger(maxAgents) || maxAgents < 1 || maxAgents > 16)
|
|
732
951
|
throw Error("Invalid machine pane limit");
|
|
733
952
|
const machine = this.entry(machineId).machine, connection = this.connections.get(machineId);
|
|
734
|
-
if (this.closed || machine.status !== "online" || machine.paneProtocol !== 1 || !connection
|
|
735
|
-
throw Error("Pane runtime is offline or unsupported");
|
|
953
|
+
if (this.closed || machine.status !== "online" || machine.paneProtocol !== 1 || !connection || !this.admitting(connection))
|
|
954
|
+
throw Error("Pane runtime is offline, updating or unsupported");
|
|
736
955
|
if (this.panePending.size >= 64)
|
|
737
956
|
throw Error("Pane transport capacity reached");
|
|
738
957
|
const id = randomUUID();
|
|
@@ -769,13 +988,17 @@ export class RuntimeCoordinator {
|
|
|
769
988
|
throw Error("Unsupported runtime operation");
|
|
770
989
|
const machine = this.entry(machineId).machine;
|
|
771
990
|
const connection = this.connections.get(machineId);
|
|
772
|
-
if (machine.status !== "online" || !connection
|
|
773
|
-
throw Error("Runtime machine is offline");
|
|
991
|
+
if (machine.status !== "online" || !connection || !this.admitting(connection))
|
|
992
|
+
throw Error("Runtime machine is offline or updating");
|
|
774
993
|
let id = randomUUID(), normalized = payload;
|
|
775
994
|
if (operation === "run") {
|
|
776
|
-
if (!record(payload) || Object.keys(payload).some(k => !["task", "resumeSessionId", "context", "mcp"].includes(k)))
|
|
995
|
+
if (!record(payload) || Object.keys(payload).some(k => !["task", "resumeSessionId", "context", "mcp", "credentialProfile"].includes(k)))
|
|
777
996
|
throw Error("Invalid runtime run payload");
|
|
778
997
|
const task = validateNativeTask(payload.task);
|
|
998
|
+
if (payload.credentialProfile !== undefined) {
|
|
999
|
+
assertCredentialProfileName(payload.credentialProfile);
|
|
1000
|
+
assertCredentialProfileCli(task.cli);
|
|
1001
|
+
}
|
|
779
1002
|
if (payload.resumeSessionId !== undefined && !text(payload.resumeSessionId, 256) || payload.context !== undefined && (typeof payload.context !== "string" || payload.context.length > 2000 || payload.context.includes("\0")))
|
|
780
1003
|
throw Error("Invalid runtime turn context");
|
|
781
1004
|
if (payload.mcp !== undefined && (!record(payload.mcp) || Object.keys(payload.mcp).some(k => k !== "tools") || !Array.isArray(payload.mcp.tools) || !payload.mcp.tools.length || payload.mcp.tools.length > 128 || payload.mcp.tools.some(v => typeof v !== "string" || !/^[a-z][a-z0-9_]{0,63}$/.test(v))))
|
|
@@ -847,6 +1070,8 @@ export class RuntimeCoordinator {
|
|
|
847
1070
|
return;
|
|
848
1071
|
this.closed = true;
|
|
849
1072
|
clearInterval(this.heartbeat);
|
|
1073
|
+
for (const activity of this.machineActivity.values())
|
|
1074
|
+
activity.close();
|
|
850
1075
|
for (const connection of this.connections.values()) {
|
|
851
1076
|
clearTimeout(connection.helloTimer);
|
|
852
1077
|
this.rejectPending(connection, "Runtime coordinator stopped; reconcile before retrying");
|