@cuna_labs/cli 0.1.0
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/LICENSE +201 -0
- package/NOTICE +9 -0
- package/README.md +169 -0
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/dist/api/capability-evidence.d.ts +19 -0
- package/dist/api/capability-evidence.d.ts.map +1 -0
- package/dist/api/capability-evidence.js +38 -0
- package/dist/api/capability-evidence.js.map +1 -0
- package/dist/api/client.d.ts +167 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +937 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/contracts.d.ts +345 -0
- package/dist/api/contracts.d.ts.map +1 -0
- package/dist/api/contracts.js +976 -0
- package/dist/api/contracts.js.map +1 -0
- package/dist/api/execution-workspaces.d.ts +17 -0
- package/dist/api/execution-workspaces.d.ts.map +1 -0
- package/dist/api/execution-workspaces.js +46 -0
- package/dist/api/execution-workspaces.js.map +1 -0
- package/dist/api/http.d.ts +76 -0
- package/dist/api/http.d.ts.map +1 -0
- package/dist/api/http.js +838 -0
- package/dist/api/http.js.map +1 -0
- package/dist/api/managed-executions.d.ts +37 -0
- package/dist/api/managed-executions.d.ts.map +1 -0
- package/dist/api/managed-executions.js +80 -0
- package/dist/api/managed-executions.js.map +1 -0
- package/dist/api/observer-v2-schema.d.ts +206 -0
- package/dist/api/observer-v2-schema.d.ts.map +1 -0
- package/dist/api/observer-v2-schema.js +264 -0
- package/dist/api/observer-v2-schema.js.map +1 -0
- package/dist/api/observer-v2.d.ts +33 -0
- package/dist/api/observer-v2.d.ts.map +1 -0
- package/dist/api/observer-v2.js +60 -0
- package/dist/api/observer-v2.js.map +1 -0
- package/dist/api/owner-observe-grants-v2-schema.d.ts +678 -0
- package/dist/api/owner-observe-grants-v2-schema.d.ts.map +1 -0
- package/dist/api/owner-observe-grants-v2-schema.js +887 -0
- package/dist/api/owner-observe-grants-v2-schema.js.map +1 -0
- package/dist/api/owner-observe-grants-v2.d.ts +268 -0
- package/dist/api/owner-observe-grants-v2.d.ts.map +1 -0
- package/dist/api/owner-observe-grants-v2.js +604 -0
- package/dist/api/owner-observe-grants-v2.js.map +1 -0
- package/dist/api/provider-v2-schema.d.ts +293 -0
- package/dist/api/provider-v2-schema.d.ts.map +1 -0
- package/dist/api/provider-v2-schema.js +381 -0
- package/dist/api/provider-v2-schema.js.map +1 -0
- package/dist/api/provider-v2.d.ts +55 -0
- package/dist/api/provider-v2.d.ts.map +1 -0
- package/dist/api/provider-v2.js +54 -0
- package/dist/api/provider-v2.js.map +1 -0
- package/dist/api/remote-workspace.d.ts +29 -0
- package/dist/api/remote-workspace.d.ts.map +1 -0
- package/dist/api/remote-workspace.js +62 -0
- package/dist/api/remote-workspace.js.map +1 -0
- package/dist/api/supervisor-live-update.d.ts +248 -0
- package/dist/api/supervisor-live-update.d.ts.map +1 -0
- package/dist/api/supervisor-live-update.js +434 -0
- package/dist/api/supervisor-live-update.js.map +1 -0
- package/dist/api/terminal-reason.d.ts +5 -0
- package/dist/api/terminal-reason.d.ts.map +1 -0
- package/dist/api/terminal-reason.js +12 -0
- package/dist/api/terminal-reason.js.map +1 -0
- package/dist/auth/browser-handoff.d.ts +59 -0
- package/dist/auth/browser-handoff.d.ts.map +1 -0
- package/dist/auth/browser-handoff.js +33 -0
- package/dist/auth/browser-handoff.js.map +1 -0
- package/dist/auth/browser.d.ts +11 -0
- package/dist/auth/browser.d.ts.map +1 -0
- package/dist/auth/browser.js +47 -0
- package/dist/auth/browser.js.map +1 -0
- package/dist/auth/human-client.d.ts +39 -0
- package/dist/auth/human-client.d.ts.map +1 -0
- package/dist/auth/human-client.js +66 -0
- package/dist/auth/human-client.js.map +1 -0
- package/dist/auth/human-contracts.d.ts +52 -0
- package/dist/auth/human-contracts.d.ts.map +1 -0
- package/dist/auth/human-contracts.js +229 -0
- package/dist/auth/human-contracts.js.map +1 -0
- package/dist/auth/human-session.d.ts +48 -0
- package/dist/auth/human-session.d.ts.map +1 -0
- package/dist/auth/human-session.js +902 -0
- package/dist/auth/human-session.js.map +1 -0
- package/dist/auth/onboarding-state.d.ts +31 -0
- package/dist/auth/onboarding-state.d.ts.map +1 -0
- package/dist/auth/onboarding-state.js +52 -0
- package/dist/auth/onboarding-state.js.map +1 -0
- package/dist/auth/pkce.d.ts +15 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +19 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/bin/cuna.d.ts +3 -0
- package/dist/bin/cuna.d.ts.map +1 -0
- package/dist/bin/cuna.js +4 -0
- package/dist/bin/cuna.js.map +1 -0
- package/dist/build-identity.d.ts +20 -0
- package/dist/build-identity.d.ts.map +1 -0
- package/dist/build-identity.js +77 -0
- package/dist/build-identity.js.map +1 -0
- package/dist/cli/command-help.d.ts +9 -0
- package/dist/cli/command-help.d.ts.map +1 -0
- package/dist/cli/command-help.js +324 -0
- package/dist/cli/command-help.js.map +1 -0
- package/dist/cli/help.d.ts +40 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +256 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/output.d.ts +28 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +95 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parser.d.ts +65 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +294 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/process-entrypoint.d.ts +18 -0
- package/dist/cli/process-entrypoint.d.ts.map +1 -0
- package/dist/cli/process-entrypoint.js +26 -0
- package/dist/cli/process-entrypoint.js.map +1 -0
- package/dist/cli/run.d.ts +114 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +1969 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/commands/commands.d.ts +74 -0
- package/dist/commands/commands.d.ts.map +1 -0
- package/dist/commands/commands.js +2814 -0
- package/dist/commands/commands.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +323 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/infra-contract-witness.d.ts +29 -0
- package/dist/config/infra-contract-witness.d.ts.map +1 -0
- package/dist/config/infra-contract-witness.js +30 -0
- package/dist/config/infra-contract-witness.js.map +1 -0
- package/dist/core/browser-url.d.ts +2 -0
- package/dist/core/browser-url.d.ts.map +1 -0
- package/dist/core/browser-url.js +20 -0
- package/dist/core/browser-url.js.map +1 -0
- package/dist/core/deployed-wire-compatibility.d.ts +15 -0
- package/dist/core/deployed-wire-compatibility.d.ts.map +1 -0
- package/dist/core/deployed-wire-compatibility.js +15 -0
- package/dist/core/deployed-wire-compatibility.js.map +1 -0
- package/dist/core/errors.d.ts +59 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +82 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/exit-codes.d.ts +68 -0
- package/dist/core/exit-codes.d.ts.map +1 -0
- package/dist/core/exit-codes.js +84 -0
- package/dist/core/exit-codes.js.map +1 -0
- package/dist/core/instant.d.ts +60 -0
- package/dist/core/instant.d.ts.map +1 -0
- package/dist/core/instant.js +90 -0
- package/dist/core/instant.js.map +1 -0
- package/dist/core/namespace.d.ts +171 -0
- package/dist/core/namespace.d.ts.map +1 -0
- package/dist/core/namespace.js +227 -0
- package/dist/core/namespace.js.map +1 -0
- package/dist/core/observation-budget.d.ts +185 -0
- package/dist/core/observation-budget.d.ts.map +1 -0
- package/dist/core/observation-budget.js +209 -0
- package/dist/core/observation-budget.js.map +1 -0
- package/dist/core/product-web.d.ts +81 -0
- package/dist/core/product-web.d.ts.map +1 -0
- package/dist/core/product-web.js +87 -0
- package/dist/core/product-web.js.map +1 -0
- package/dist/core/validation.d.ts +90 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +199 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/credentials/contracts.d.ts +82 -0
- package/dist/credentials/contracts.d.ts.map +1 -0
- package/dist/credentials/contracts.js +2 -0
- package/dist/credentials/contracts.js.map +1 -0
- package/dist/credentials/errors.d.ts +19 -0
- package/dist/credentials/errors.d.ts.map +1 -0
- package/dist/credentials/errors.js +16 -0
- package/dist/credentials/errors.js.map +1 -0
- package/dist/credentials/index.d.ts +6 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +6 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/local-session.d.ts +101 -0
- package/dist/credentials/local-session.d.ts.map +1 -0
- package/dist/credentials/local-session.js +839 -0
- package/dist/credentials/local-session.js.map +1 -0
- package/dist/credentials/secret-material.d.ts +17 -0
- package/dist/credentials/secret-material.d.ts.map +1 -0
- package/dist/credentials/secret-material.js +49 -0
- package/dist/credentials/secret-material.js.map +1 -0
- package/dist/credentials/vault.d.ts +41 -0
- package/dist/credentials/vault.d.ts.map +1 -0
- package/dist/credentials/vault.js +719 -0
- package/dist/credentials/vault.js.map +1 -0
- package/dist/daemon/endpoint.d.ts +29 -0
- package/dist/daemon/endpoint.d.ts.map +1 -0
- package/dist/daemon/endpoint.js +66 -0
- package/dist/daemon/endpoint.js.map +1 -0
- package/dist/daemon/journal.d.ts +62 -0
- package/dist/daemon/journal.d.ts.map +1 -0
- package/dist/daemon/journal.js +299 -0
- package/dist/daemon/journal.js.map +1 -0
- package/dist/daemon/lease.d.ts +25 -0
- package/dist/daemon/lease.d.ts.map +1 -0
- package/dist/daemon/lease.js +94 -0
- package/dist/daemon/lease.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +14 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +29 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/protocol.d.ts +65 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +194 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/supervisor.d.ts +29 -0
- package/dist/daemon/supervisor.d.ts.map +1 -0
- package/dist/daemon/supervisor.js +87 -0
- package/dist/daemon/supervisor.js.map +1 -0
- package/dist/daemon/views.d.ts +31 -0
- package/dist/daemon/views.d.ts.map +1 -0
- package/dist/daemon/views.js +86 -0
- package/dist/daemon/views.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/journey/api-effects.d.ts +59 -0
- package/dist/journey/api-effects.d.ts.map +1 -0
- package/dist/journey/api-effects.js +386 -0
- package/dist/journey/api-effects.js.map +1 -0
- package/dist/journey/derived-identity.d.ts +91 -0
- package/dist/journey/derived-identity.d.ts.map +1 -0
- package/dist/journey/derived-identity.js +123 -0
- package/dist/journey/derived-identity.js.map +1 -0
- package/dist/journey/index.d.ts +6 -0
- package/dist/journey/index.d.ts.map +1 -0
- package/dist/journey/index.js +6 -0
- package/dist/journey/index.js.map +1 -0
- package/dist/journey/intent.d.ts +36 -0
- package/dist/journey/intent.d.ts.map +1 -0
- package/dist/journey/intent.js +191 -0
- package/dist/journey/intent.js.map +1 -0
- package/dist/journey/orchestrator.d.ts +140 -0
- package/dist/journey/orchestrator.d.ts.map +1 -0
- package/dist/journey/orchestrator.js +415 -0
- package/dist/journey/orchestrator.js.map +1 -0
- package/dist/journey/provider-launch-intent.d.ts +12 -0
- package/dist/journey/provider-launch-intent.d.ts.map +1 -0
- package/dist/journey/provider-launch-intent.js +40 -0
- package/dist/journey/provider-launch-intent.js.map +1 -0
- package/dist/journey/remote-workspace.d.ts +34 -0
- package/dist/journey/remote-workspace.d.ts.map +1 -0
- package/dist/journey/remote-workspace.js +91 -0
- package/dist/journey/remote-workspace.js.map +1 -0
- package/dist/journey/root-entry.d.ts +56 -0
- package/dist/journey/root-entry.d.ts.map +1 -0
- package/dist/journey/root-entry.js +19 -0
- package/dist/journey/root-entry.js.map +1 -0
- package/dist/journey/selection.d.ts +165 -0
- package/dist/journey/selection.d.ts.map +1 -0
- package/dist/journey/selection.js +565 -0
- package/dist/journey/selection.js.map +1 -0
- package/dist/journey/session-failure.d.ts +4 -0
- package/dist/journey/session-failure.d.ts.map +1 -0
- package/dist/journey/session-failure.js +28 -0
- package/dist/journey/session-failure.js.map +1 -0
- package/dist/journey/workspace-effects.d.ts +30 -0
- package/dist/journey/workspace-effects.d.ts.map +1 -0
- package/dist/journey/workspace-effects.js +348 -0
- package/dist/journey/workspace-effects.js.map +1 -0
- package/dist/local-actions/broker.d.ts +32 -0
- package/dist/local-actions/broker.d.ts.map +1 -0
- package/dist/local-actions/broker.js +400 -0
- package/dist/local-actions/broker.js.map +1 -0
- package/dist/local-actions/browser-action.d.ts +78 -0
- package/dist/local-actions/browser-action.d.ts.map +1 -0
- package/dist/local-actions/browser-action.js +307 -0
- package/dist/local-actions/browser-action.js.map +1 -0
- package/dist/local-actions/callback-relay.d.ts +45 -0
- package/dist/local-actions/callback-relay.d.ts.map +1 -0
- package/dist/local-actions/callback-relay.js +265 -0
- package/dist/local-actions/callback-relay.js.map +1 -0
- package/dist/local-actions/clipboard.d.ts +3 -0
- package/dist/local-actions/clipboard.d.ts.map +1 -0
- package/dist/local-actions/clipboard.js +18 -0
- package/dist/local-actions/clipboard.js.map +1 -0
- package/dist/local-actions/contracts.d.ts +63 -0
- package/dist/local-actions/contracts.d.ts.map +1 -0
- package/dist/local-actions/contracts.js +18 -0
- package/dist/local-actions/contracts.js.map +1 -0
- package/dist/local-actions/desktop-presentation.d.ts +141 -0
- package/dist/local-actions/desktop-presentation.d.ts.map +1 -0
- package/dist/local-actions/desktop-presentation.js +253 -0
- package/dist/local-actions/desktop-presentation.js.map +1 -0
- package/dist/local-actions/device-selection.d.ts +43 -0
- package/dist/local-actions/device-selection.d.ts.map +1 -0
- package/dist/local-actions/device-selection.js +154 -0
- package/dist/local-actions/device-selection.js.map +1 -0
- package/dist/local-actions/executor.d.ts +49 -0
- package/dist/local-actions/executor.d.ts.map +1 -0
- package/dist/local-actions/executor.js +329 -0
- package/dist/local-actions/executor.js.map +1 -0
- package/dist/local-actions/file-transfers.d.ts +141 -0
- package/dist/local-actions/file-transfers.d.ts.map +1 -0
- package/dist/local-actions/file-transfers.js +446 -0
- package/dist/local-actions/file-transfers.js.map +1 -0
- package/dist/local-actions/foreground-notifications.d.ts +45 -0
- package/dist/local-actions/foreground-notifications.d.ts.map +1 -0
- package/dist/local-actions/foreground-notifications.js +163 -0
- package/dist/local-actions/foreground-notifications.js.map +1 -0
- package/dist/local-actions/git-signing.d.ts +39 -0
- package/dist/local-actions/git-signing.d.ts.map +1 -0
- package/dist/local-actions/git-signing.js +135 -0
- package/dist/local-actions/git-signing.js.map +1 -0
- package/dist/local-actions/index.d.ts +19 -0
- package/dist/local-actions/index.d.ts.map +1 -0
- package/dist/local-actions/index.js +19 -0
- package/dist/local-actions/index.js.map +1 -0
- package/dist/local-actions/local-service-actions.d.ts +87 -0
- package/dist/local-actions/local-service-actions.d.ts.map +1 -0
- package/dist/local-actions/local-service-actions.js +347 -0
- package/dist/local-actions/local-service-actions.js.map +1 -0
- package/dist/local-actions/loopback.d.ts +5 -0
- package/dist/local-actions/loopback.d.ts.map +1 -0
- package/dist/local-actions/loopback.js +15 -0
- package/dist/local-actions/loopback.js.map +1 -0
- package/dist/local-actions/policy-store.d.ts +7 -0
- package/dist/local-actions/policy-store.d.ts.map +1 -0
- package/dist/local-actions/policy-store.js +70 -0
- package/dist/local-actions/policy-store.js.map +1 -0
- package/dist/local-actions/policy.d.ts +21 -0
- package/dist/local-actions/policy.d.ts.map +1 -0
- package/dist/local-actions/policy.js +43 -0
- package/dist/local-actions/policy.js.map +1 -0
- package/dist/local-actions/private-port-forward.d.ts +36 -0
- package/dist/local-actions/private-port-forward.d.ts.map +1 -0
- package/dist/local-actions/private-port-forward.js +154 -0
- package/dist/local-actions/private-port-forward.js.map +1 -0
- package/dist/local-actions/provider-mcp-config.d.ts +101 -0
- package/dist/local-actions/provider-mcp-config.d.ts.map +1 -0
- package/dist/local-actions/provider-mcp-config.js +166 -0
- package/dist/local-actions/provider-mcp-config.js.map +1 -0
- package/dist/local-actions/providers.d.ts +12 -0
- package/dist/local-actions/providers.d.ts.map +1 -0
- package/dist/local-actions/providers.js +42 -0
- package/dist/local-actions/providers.js.map +1 -0
- package/dist/local-actions/schemas.d.ts +4 -0
- package/dist/local-actions/schemas.d.ts.map +1 -0
- package/dist/local-actions/schemas.js +314 -0
- package/dist/local-actions/schemas.js.map +1 -0
- package/dist/local-actions/sensitive-consent.d.ts +32 -0
- package/dist/local-actions/sensitive-consent.d.ts.map +1 -0
- package/dist/local-actions/sensitive-consent.js +47 -0
- package/dist/local-actions/sensitive-consent.js.map +1 -0
- package/dist/machines/command-launch.d.ts +17 -0
- package/dist/machines/command-launch.d.ts.map +1 -0
- package/dist/machines/command-launch.js +52 -0
- package/dist/machines/command-launch.js.map +1 -0
- package/dist/machines/execution-receipt.d.ts +18 -0
- package/dist/machines/execution-receipt.d.ts.map +1 -0
- package/dist/machines/execution-receipt.js +87 -0
- package/dist/machines/execution-receipt.js.map +1 -0
- package/dist/machines/executions-screen.d.ts +6 -0
- package/dist/machines/executions-screen.d.ts.map +1 -0
- package/dist/machines/executions-screen.js +410 -0
- package/dist/machines/executions-screen.js.map +1 -0
- package/dist/machines/explorer.d.ts +75 -0
- package/dist/machines/explorer.d.ts.map +1 -0
- package/dist/machines/explorer.js +1726 -0
- package/dist/machines/explorer.js.map +1 -0
- package/dist/machines/live-supervisor-update.d.ts +325 -0
- package/dist/machines/live-supervisor-update.d.ts.map +1 -0
- package/dist/machines/live-supervisor-update.js +513 -0
- package/dist/machines/live-supervisor-update.js.map +1 -0
- package/dist/machines/machine-first.d.ts +123 -0
- package/dist/machines/machine-first.d.ts.map +1 -0
- package/dist/machines/machine-first.js +119 -0
- package/dist/machines/machine-first.js.map +1 -0
- package/dist/machines/opencode-supervisor.d.ts +51 -0
- package/dist/machines/opencode-supervisor.d.ts.map +1 -0
- package/dist/machines/opencode-supervisor.js +124 -0
- package/dist/machines/opencode-supervisor.js.map +1 -0
- package/dist/machines/pagination.d.ts +4 -0
- package/dist/machines/pagination.d.ts.map +1 -0
- package/dist/machines/pagination.js +7 -0
- package/dist/machines/pagination.js.map +1 -0
- package/dist/machines/provider-availability.d.ts +42 -0
- package/dist/machines/provider-availability.d.ts.map +1 -0
- package/dist/machines/provider-availability.js +82 -0
- package/dist/machines/provider-availability.js.map +1 -0
- package/dist/machines/provider-screen.d.ts +12 -0
- package/dist/machines/provider-screen.d.ts.map +1 -0
- package/dist/machines/provider-screen.js +129 -0
- package/dist/machines/provider-screen.js.map +1 -0
- package/dist/machines/session-actionability.d.ts +86 -0
- package/dist/machines/session-actionability.d.ts.map +1 -0
- package/dist/machines/session-actionability.js +125 -0
- package/dist/machines/session-actionability.js.map +1 -0
- package/dist/machines/session-visibility.d.ts +139 -0
- package/dist/machines/session-visibility.d.ts.map +1 -0
- package/dist/machines/session-visibility.js +109 -0
- package/dist/machines/session-visibility.js.map +1 -0
- package/dist/platform/adapter.d.ts +62 -0
- package/dist/platform/adapter.d.ts.map +1 -0
- package/dist/platform/adapter.js +240 -0
- package/dist/platform/adapter.js.map +1 -0
- package/dist/platform/support.d.ts +12 -0
- package/dist/platform/support.d.ts.map +1 -0
- package/dist/platform/support.js +25 -0
- package/dist/platform/support.js.map +1 -0
- package/dist/pty/contracts.d.ts +45 -0
- package/dist/pty/contracts.d.ts.map +1 -0
- package/dist/pty/contracts.js +2 -0
- package/dist/pty/contracts.js.map +1 -0
- package/dist/pty/evidence-gate.d.ts +14 -0
- package/dist/pty/evidence-gate.d.ts.map +1 -0
- package/dist/pty/evidence-gate.js +35 -0
- package/dist/pty/evidence-gate.js.map +1 -0
- package/dist/pty/index.d.ts +5 -0
- package/dist/pty/index.d.ts.map +1 -0
- package/dist/pty/index.js +5 -0
- package/dist/pty/index.js.map +1 -0
- package/dist/pty/node-host-terminal.d.ts +14 -0
- package/dist/pty/node-host-terminal.d.ts.map +1 -0
- package/dist/pty/node-host-terminal.js +173 -0
- package/dist/pty/node-host-terminal.js.map +1 -0
- package/dist/pty/node-process.d.ts +26 -0
- package/dist/pty/node-process.d.ts.map +1 -0
- package/dist/pty/node-process.js +102 -0
- package/dist/pty/node-process.js.map +1 -0
- package/dist/runtime/api-terminal-control-plane.d.ts +7 -0
- package/dist/runtime/api-terminal-control-plane.d.ts.map +1 -0
- package/dist/runtime/api-terminal-control-plane.js +95 -0
- package/dist/runtime/api-terminal-control-plane.js.map +1 -0
- package/dist/runtime/backoff.d.ts +17 -0
- package/dist/runtime/backoff.d.ts.map +1 -0
- package/dist/runtime/backoff.js +61 -0
- package/dist/runtime/backoff.js.map +1 -0
- package/dist/runtime/boundary.d.ts +171 -0
- package/dist/runtime/boundary.d.ts.map +1 -0
- package/dist/runtime/boundary.js +1858 -0
- package/dist/runtime/boundary.js.map +1 -0
- package/dist/runtime/capability-gate.d.ts +25 -0
- package/dist/runtime/capability-gate.d.ts.map +1 -0
- package/dist/runtime/capability-gate.js +77 -0
- package/dist/runtime/capability-gate.js.map +1 -0
- package/dist/runtime/contracts.d.ts +25 -0
- package/dist/runtime/contracts.d.ts.map +1 -0
- package/dist/runtime/contracts.js +66 -0
- package/dist/runtime/contracts.js.map +1 -0
- package/dist/runtime/errors.d.ts +20 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +22 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +9 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/node-foreground-session.d.ts +50 -0
- package/dist/runtime/node-foreground-session.d.ts.map +1 -0
- package/dist/runtime/node-foreground-session.js +431 -0
- package/dist/runtime/node-foreground-session.js.map +1 -0
- package/dist/runtime/node-websocket-connector.d.ts +6 -0
- package/dist/runtime/node-websocket-connector.d.ts.map +1 -0
- package/dist/runtime/node-websocket-connector.js +344 -0
- package/dist/runtime/node-websocket-connector.js.map +1 -0
- package/dist/runtime/observer-screen.d.ts +6 -0
- package/dist/runtime/observer-screen.d.ts.map +1 -0
- package/dist/runtime/observer-screen.js +144 -0
- package/dist/runtime/observer-screen.js.map +1 -0
- package/dist/runtime/owner-grant-operations.d.ts +136 -0
- package/dist/runtime/owner-grant-operations.d.ts.map +1 -0
- package/dist/runtime/owner-grant-operations.js +216 -0
- package/dist/runtime/owner-grant-operations.js.map +1 -0
- package/dist/runtime/owner-grants-screen.d.ts +40 -0
- package/dist/runtime/owner-grants-screen.d.ts.map +1 -0
- package/dist/runtime/owner-grants-screen.js +987 -0
- package/dist/runtime/owner-grants-screen.js.map +1 -0
- package/dist/runtime/terminal-transport.d.ts +85 -0
- package/dist/runtime/terminal-transport.d.ts.map +1 -0
- package/dist/runtime/terminal-transport.js +152 -0
- package/dist/runtime/terminal-transport.js.map +1 -0
- package/dist/sync/continuous-sync-supervisor.d.ts +107 -0
- package/dist/sync/continuous-sync-supervisor.d.ts.map +1 -0
- package/dist/sync/continuous-sync-supervisor.js +1117 -0
- package/dist/sync/continuous-sync-supervisor.js.map +1 -0
- package/dist/sync/index.d.ts +9 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +9 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/journal.d.ts +57 -0
- package/dist/sync/journal.d.ts.map +1 -0
- package/dist/sync/journal.js +685 -0
- package/dist/sync/journal.js.map +1 -0
- package/dist/sync/revisions.d.ts +118 -0
- package/dist/sync/revisions.d.ts.map +1 -0
- package/dist/sync/revisions.js +364 -0
- package/dist/sync/revisions.js.map +1 -0
- package/dist/sync/supervisor.d.ts +107 -0
- package/dist/sync/supervisor.d.ts.map +1 -0
- package/dist/sync/supervisor.js +246 -0
- package/dist/sync/supervisor.js.map +1 -0
- package/dist/sync/workspace-sync-client.d.ts +18 -0
- package/dist/sync/workspace-sync-client.d.ts.map +1 -0
- package/dist/sync/workspace-sync-client.js +150 -0
- package/dist/sync/workspace-sync-client.js.map +1 -0
- package/dist/sync/workspace-sync-coordinator.d.ts +76 -0
- package/dist/sync/workspace-sync-coordinator.d.ts.map +1 -0
- package/dist/sync/workspace-sync-coordinator.js +621 -0
- package/dist/sync/workspace-sync-coordinator.js.map +1 -0
- package/dist/sync/workspace-sync-product-service.d.ts +79 -0
- package/dist/sync/workspace-sync-product-service.d.ts.map +1 -0
- package/dist/sync/workspace-sync-product-service.js +398 -0
- package/dist/sync/workspace-sync-product-service.js.map +1 -0
- package/dist/sync/workspace-sync-protocol.d.ts +145 -0
- package/dist/sync/workspace-sync-protocol.d.ts.map +1 -0
- package/dist/sync/workspace-sync-protocol.js +347 -0
- package/dist/sync/workspace-sync-protocol.js.map +1 -0
- package/dist/terminal/appbar.d.ts +40 -0
- package/dist/terminal/appbar.d.ts.map +1 -0
- package/dist/terminal/appbar.js +55 -0
- package/dist/terminal/appbar.js.map +1 -0
- package/dist/terminal/cell-width.d.ts +3 -0
- package/dist/terminal/cell-width.d.ts.map +1 -0
- package/dist/terminal/cell-width.js +53 -0
- package/dist/terminal/cell-width.js.map +1 -0
- package/dist/terminal/codec.d.ts +107 -0
- package/dist/terminal/codec.d.ts.map +1 -0
- package/dist/terminal/codec.js +538 -0
- package/dist/terminal/codec.js.map +1 -0
- package/dist/terminal/foreground.d.ts +135 -0
- package/dist/terminal/foreground.d.ts.map +1 -0
- package/dist/terminal/foreground.js +2097 -0
- package/dist/terminal/foreground.js.map +1 -0
- package/dist/terminal/generated/terminal-wire-v1.d.ts +26 -0
- package/dist/terminal/generated/terminal-wire-v1.d.ts.map +1 -0
- package/dist/terminal/generated/terminal-wire-v1.js +27 -0
- package/dist/terminal/generated/terminal-wire-v1.js.map +1 -0
- package/dist/terminal/mode.d.ts +33 -0
- package/dist/terminal/mode.d.ts.map +1 -0
- package/dist/terminal/mode.js +99 -0
- package/dist/terminal/mode.js.map +1 -0
- package/dist/terminal/passthrough.d.ts +47 -0
- package/dist/terminal/passthrough.d.ts.map +1 -0
- package/dist/terminal/passthrough.js +666 -0
- package/dist/terminal/passthrough.js.map +1 -0
- package/dist/terminal/resume.d.ts +58 -0
- package/dist/terminal/resume.d.ts.map +1 -0
- package/dist/terminal/resume.js +185 -0
- package/dist/terminal/resume.js.map +1 -0
- package/dist/terminal/viewport.d.ts +93 -0
- package/dist/terminal/viewport.d.ts.map +1 -0
- package/dist/terminal/viewport.js +266 -0
- package/dist/terminal/viewport.js.map +1 -0
- package/dist/terminal/workbench.d.ts +32 -0
- package/dist/terminal/workbench.d.ts.map +1 -0
- package/dist/terminal/workbench.js +316 -0
- package/dist/terminal/workbench.js.map +1 -0
- package/dist/terminal/xterm-vte.d.ts +49 -0
- package/dist/terminal/xterm-vte.d.ts.map +1 -0
- package/dist/terminal/xterm-vte.js +602 -0
- package/dist/terminal/xterm-vte.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/workspace/binding-path.d.ts +17 -0
- package/dist/workspace/binding-path.d.ts.map +1 -0
- package/dist/workspace/binding-path.js +91 -0
- package/dist/workspace/binding-path.js.map +1 -0
- package/dist/workspace/binding-store.d.ts +107 -0
- package/dist/workspace/binding-store.d.ts.map +1 -0
- package/dist/workspace/binding-store.js +783 -0
- package/dist/workspace/binding-store.js.map +1 -0
- package/dist/workspace/binding.d.ts +35 -0
- package/dist/workspace/binding.d.ts.map +1 -0
- package/dist/workspace/binding.js +70 -0
- package/dist/workspace/binding.js.map +1 -0
- package/dist/workspace/errors.d.ts +4 -0
- package/dist/workspace/errors.d.ts.map +1 -0
- package/dist/workspace/errors.js +19 -0
- package/dist/workspace/errors.js.map +1 -0
- package/dist/workspace/exclusion.d.ts +21 -0
- package/dist/workspace/exclusion.d.ts.map +1 -0
- package/dist/workspace/exclusion.js +243 -0
- package/dist/workspace/exclusion.js.map +1 -0
- package/dist/workspace/index.d.ts +8 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +8 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/lifecycle.d.ts +56 -0
- package/dist/workspace/lifecycle.d.ts.map +1 -0
- package/dist/workspace/lifecycle.js +94 -0
- package/dist/workspace/lifecycle.js.map +1 -0
- package/dist/workspace/manifest.d.ts +47 -0
- package/dist/workspace/manifest.d.ts.map +1 -0
- package/dist/workspace/manifest.js +243 -0
- package/dist/workspace/manifest.js.map +1 -0
- package/dist/workspace/paths.d.ts +14 -0
- package/dist/workspace/paths.d.ts.map +1 -0
- package/dist/workspace/paths.js +67 -0
- package/dist/workspace/paths.js.map +1 -0
- package/dist/workspace/schema.d.ts +15 -0
- package/dist/workspace/schema.d.ts.map +1 -0
- package/dist/workspace/schema.js +33 -0
- package/dist/workspace/schema.js.map +1 -0
- package/dist/workspace/selection-screen.d.ts +4 -0
- package/dist/workspace/selection-screen.d.ts.map +1 -0
- package/dist/workspace/selection-screen.js +216 -0
- package/dist/workspace/selection-screen.js.map +1 -0
- package/dist/workspace/selection-service.d.ts +16 -0
- package/dist/workspace/selection-service.d.ts.map +1 -0
- package/dist/workspace/selection-service.js +65 -0
- package/dist/workspace/selection-service.js.map +1 -0
- package/node_modules/@xterm/headless/README.md +31 -0
- package/node_modules/@xterm/headless/lib-headless/xterm-headless.js +2 -0
- package/node_modules/@xterm/headless/lib-headless/xterm-headless.js.map +1 -0
- package/node_modules/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
- package/node_modules/@xterm/headless/lib-headless/xterm-headless.mjs.map +7 -0
- package/node_modules/@xterm/headless/package.json +29 -0
- package/node_modules/@xterm/headless/typings/xterm-headless.d.ts +1385 -0
- package/package.json +75 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { withProviderLaunchIntent } from "./provider-launch-intent.js";
|
|
2
|
+
import { createPublishedProviderSessionV2, requireMatchingPreset } from "./remote-workspace.js";
|
|
3
|
+
import { sessionFailure } from "./session-failure.js";
|
|
4
|
+
import { decideCapability, requireCapability } from "../api/client.js";
|
|
5
|
+
import { EXIT_CODES, CunaError } from "../core/errors.js";
|
|
6
|
+
import { isOpenCodeRuntimeUnverifiedCapabilityRejection, isOpenCodeSupervisorUpgradeReason, isOpenCodeSupervisorUpgradeCapabilityRejection, openCodeRuntimeUnverified, openCodeSupervisorUpgradeRequired, } from "../machines/opencode-supervisor.js";
|
|
7
|
+
import { machineProviderAvailability } from "../machines/provider-availability.js";
|
|
8
|
+
const MACHINE_POLL_LIMIT = 60;
|
|
9
|
+
const CHILD_POLL_LIMIT = 90;
|
|
10
|
+
function fail(code, message, exitCode = EXIT_CODES.remote, details) {
|
|
11
|
+
return new CunaError({ code, message, exitCode, ...(details === undefined ? {} : { details }) });
|
|
12
|
+
}
|
|
13
|
+
function recency(machine, now) {
|
|
14
|
+
const timestamp = machine.updatedAt ?? machine.createdAt;
|
|
15
|
+
if (timestamp === undefined)
|
|
16
|
+
return "unknown";
|
|
17
|
+
const observed = Date.parse(timestamp);
|
|
18
|
+
if (!Number.isFinite(observed) || observed > now + 5_000)
|
|
19
|
+
return "unknown";
|
|
20
|
+
return now - observed <= 30 * 24 * 60 * 60 * 1_000 ? "recent" : "not_recent";
|
|
21
|
+
}
|
|
22
|
+
function machineState(value) {
|
|
23
|
+
const states = new Set(["creating", "running", "paused", "suspended", "stopped", "deleted", "error"]);
|
|
24
|
+
return states.has(value) ? value : "unknown";
|
|
25
|
+
}
|
|
26
|
+
function relativeCwd(cwd) {
|
|
27
|
+
return cwd.replace(/^\/workspace\/?/u, "") || ".";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Map the durable writer seat onto the selection's attachment fact.
|
|
31
|
+
*
|
|
32
|
+
* available ∧ writer = null → detached (nobody types; reuse)
|
|
33
|
+
* available ∧ writer = this client → detached (our own seat; the
|
|
34
|
+
* reconnect path reissues with the
|
|
35
|
+
* resume handle)
|
|
36
|
+
* available ∧ writer = other client → attached (name the holder)
|
|
37
|
+
* owner_unrecoverable | none → unknown (no attestable PTY)
|
|
38
|
+
*
|
|
39
|
+
* Without our own client instance id every held seat is another client's:
|
|
40
|
+
* claiming a seat as ours on no evidence would race a terminal that has a
|
|
41
|
+
* writer.
|
|
42
|
+
*/
|
|
43
|
+
export function attachmentFromSeat(seat, ownClientInstanceId) {
|
|
44
|
+
if (seat.state !== "available")
|
|
45
|
+
return { attachment: "unknown" };
|
|
46
|
+
if (seat.writerClientInstanceId === null)
|
|
47
|
+
return { attachment: "detached" };
|
|
48
|
+
// The row names the last writer forever; only its connection says whether
|
|
49
|
+
// that client is there now. A writer that has detached leaves the terminal
|
|
50
|
+
// reusable, which is the whole point of a durable session.
|
|
51
|
+
if (!seat.writerAttached)
|
|
52
|
+
return { attachment: "detached" };
|
|
53
|
+
if (ownClientInstanceId !== undefined && seat.writerClientInstanceId === ownClientInstanceId) {
|
|
54
|
+
return { attachment: "detached" };
|
|
55
|
+
}
|
|
56
|
+
return { attachment: "attached", attachmentHolder: seat.writerClientInstanceId };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* An edge that does not serve the seat route answers 404. Both spellings the
|
|
60
|
+
* transport gives a 404 map to "the fact is not published here": a plain
|
|
61
|
+
* 404 is `operation_not_served`, a Problem-shaped `resource_not_found` is
|
|
62
|
+
* `not_found`. Every other error is a real failure and propagates.
|
|
63
|
+
*/
|
|
64
|
+
function isSeatUnserved(error) {
|
|
65
|
+
return error instanceof CunaError &&
|
|
66
|
+
(error.code === "cuna.remote.operation_not_served" || error.code === "cuna.remote.not_found");
|
|
67
|
+
}
|
|
68
|
+
function sessionObservation(session, seat) {
|
|
69
|
+
return Object.freeze({
|
|
70
|
+
id: session.id,
|
|
71
|
+
machineId: session.machineId,
|
|
72
|
+
name: session.name,
|
|
73
|
+
agent: session.agent,
|
|
74
|
+
workspaceIdentity: session.workspaceBindingId ?? "unknown",
|
|
75
|
+
workspaceGeneration: session.workspaceGeneration ?? 0,
|
|
76
|
+
cwd: relativeCwd(session.cwd),
|
|
77
|
+
authMode: session.authMode,
|
|
78
|
+
processState: session.processState,
|
|
79
|
+
...seat,
|
|
80
|
+
freshness: "fresh",
|
|
81
|
+
createdAt: session.createdAt,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async function defaultSleep(milliseconds, signal) {
|
|
85
|
+
if (signal.aborted)
|
|
86
|
+
throw signal.reason;
|
|
87
|
+
await new Promise((resolve, reject) => {
|
|
88
|
+
const timer = setTimeout(resolve, milliseconds);
|
|
89
|
+
signal.addEventListener("abort", () => { clearTimeout(timer); reject(signal.reason); }, { once: true });
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export function createApiAgentJourneyEffects(input) {
|
|
93
|
+
const now = input.now ?? Date.now;
|
|
94
|
+
const sleep = input.sleep ?? defaultSleep;
|
|
95
|
+
const effects = {
|
|
96
|
+
inspectWorkspace: input.inspectWorkspace,
|
|
97
|
+
async observeMachines({ signal }) {
|
|
98
|
+
const page = await input.client.listMachines(signal);
|
|
99
|
+
if (page.nextCursor !== undefined) {
|
|
100
|
+
throw fail("cuna.journey.machine_page_incomplete", "Machine selection requires a complete bounded collection.", EXIT_CODES.policy);
|
|
101
|
+
}
|
|
102
|
+
return Promise.all(page.items.map(async (machine) => {
|
|
103
|
+
let support = "unknown";
|
|
104
|
+
let supportReason;
|
|
105
|
+
const provider = machineProviderAvailability(machine);
|
|
106
|
+
if (!provider.actionable || provider.agent !== input.requestedAgent) {
|
|
107
|
+
return Object.freeze({
|
|
108
|
+
id: machine.id,
|
|
109
|
+
name: machine.name,
|
|
110
|
+
agent: provider.agent ?? "unknown",
|
|
111
|
+
requestedAgentSupport: "unsupported",
|
|
112
|
+
state: machineState(machine.state),
|
|
113
|
+
ownership: "owned",
|
|
114
|
+
freshness: "fresh",
|
|
115
|
+
recency: recency(machine, now()),
|
|
116
|
+
resources: Object.freeze({
|
|
117
|
+
...(machine.vcpus === undefined ? {} : { vcpus: machine.vcpus }),
|
|
118
|
+
...(machine.memoryMiB === undefined ? {} : { memoryMiB: machine.memoryMiB }),
|
|
119
|
+
}),
|
|
120
|
+
costStatus: "unknown",
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const snapshot = await input.client.discoverCapabilities("machine", machine.id, signal);
|
|
125
|
+
if (snapshot.subjectScope !== "machine" || snapshot.subjectId !== machine.id) {
|
|
126
|
+
return Object.freeze({
|
|
127
|
+
id: machine.id,
|
|
128
|
+
name: machine.name,
|
|
129
|
+
agent: "unknown",
|
|
130
|
+
requestedAgentSupport: "unknown",
|
|
131
|
+
state: machineState(machine.state),
|
|
132
|
+
ownership: "owned",
|
|
133
|
+
freshness: "fresh",
|
|
134
|
+
recency: recency(machine, now()),
|
|
135
|
+
resources: Object.freeze({}),
|
|
136
|
+
costStatus: "unknown",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
const decision = decideCapability(snapshot, "agent_sessions.create", now());
|
|
140
|
+
support = decision.status === "supported"
|
|
141
|
+
? "supported"
|
|
142
|
+
: decision.status === "unsupported"
|
|
143
|
+
? "unsupported"
|
|
144
|
+
: "unknown";
|
|
145
|
+
supportReason = decision.status === "supported" ? undefined : decision.reason;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
support = "unknown";
|
|
149
|
+
}
|
|
150
|
+
const requestedAgentBlocker = input.requestedAgent === "opencode" &&
|
|
151
|
+
support === "unsupported" &&
|
|
152
|
+
isOpenCodeSupervisorUpgradeReason(supportReason)
|
|
153
|
+
? "opencode-supervisor-update-required"
|
|
154
|
+
: undefined;
|
|
155
|
+
return Object.freeze({
|
|
156
|
+
id: machine.id,
|
|
157
|
+
name: machine.name,
|
|
158
|
+
agent: provider.agent ?? "unknown",
|
|
159
|
+
requestedAgentSupport: support,
|
|
160
|
+
...(requestedAgentBlocker === undefined ? {} : { requestedAgentBlocker }),
|
|
161
|
+
state: machineState(machine.state),
|
|
162
|
+
ownership: "owned",
|
|
163
|
+
freshness: "fresh",
|
|
164
|
+
recency: recency(machine, now()),
|
|
165
|
+
resources: Object.freeze({
|
|
166
|
+
...(machine.vcpus === undefined ? {} : { vcpus: machine.vcpus }),
|
|
167
|
+
...(machine.memoryMiB === undefined ? {} : { memoryMiB: machine.memoryMiB }),
|
|
168
|
+
}),
|
|
169
|
+
costStatus: "unknown",
|
|
170
|
+
});
|
|
171
|
+
}));
|
|
172
|
+
},
|
|
173
|
+
async createMachine({ requestedAgent, idempotencyKey, requestId, onDispatch, signal }) {
|
|
174
|
+
await requireCapability({ client: input.client, scope: "account", capabilityId: "machines.create", now, signal });
|
|
175
|
+
if (!await input.authorizeMachineCreate({ requestedAgent, signal })) {
|
|
176
|
+
throw fail("cuna.journey.machine_create_not_authorized", "Machine creation was not authorized.", EXIT_CODES.policy);
|
|
177
|
+
}
|
|
178
|
+
// Everything above this line fails before anything is sent: the
|
|
179
|
+
// capability check and the person's own confirmation.
|
|
180
|
+
onDispatch();
|
|
181
|
+
const machine = await input.client.createMachine({
|
|
182
|
+
name: `cuna-${requestedAgent}-${requestId.slice(0, 8)}`,
|
|
183
|
+
agent: requestedAgent,
|
|
184
|
+
background: true,
|
|
185
|
+
}, idempotencyKey, requestId, signal);
|
|
186
|
+
return Object.freeze({ id: machine.id, state: machineState(machine.state) });
|
|
187
|
+
},
|
|
188
|
+
async reconcileMachineCreate({ requestId, signal }) {
|
|
189
|
+
for (let attempt = 0; attempt < MACHINE_POLL_LIMIT; attempt += 1) {
|
|
190
|
+
let request = await input.client.getMachineCreateRequest(requestId, signal);
|
|
191
|
+
if (request.state === "unknown" || request.action === "reconcile") {
|
|
192
|
+
request = await input.client.reconcileMachineCreateRequest(requestId, signal);
|
|
193
|
+
}
|
|
194
|
+
if (request.state === "settled" || request.state === "provider_succeeded") {
|
|
195
|
+
const machine = await input.client.getMachine(request.machineId, signal);
|
|
196
|
+
return Object.freeze({ id: machine.id, state: machineState(machine.state) });
|
|
197
|
+
}
|
|
198
|
+
if (request.state === "terminal_failed" || request.action === "none") {
|
|
199
|
+
throw fail("cuna.journey.machine_create_failed", "Machine creation reached an authoritative failure.");
|
|
200
|
+
}
|
|
201
|
+
await sleep(Math.min(2_000, 100 * 2 ** Math.min(attempt, 4)), signal);
|
|
202
|
+
}
|
|
203
|
+
return "unreconcilable";
|
|
204
|
+
},
|
|
205
|
+
async ensureMachineReady({ machineId, observedState, signal }) {
|
|
206
|
+
let state = observedState;
|
|
207
|
+
if (state === "paused" || state === "suspended") {
|
|
208
|
+
state = machineState((await input.client.transitionMachine(machineId, "resume", signal)).state);
|
|
209
|
+
}
|
|
210
|
+
else if (state === "stopped") {
|
|
211
|
+
state = machineState((await input.client.transitionMachine(machineId, "start", signal)).state);
|
|
212
|
+
}
|
|
213
|
+
else if (state === "deleted" || state === "error" || state === "unknown") {
|
|
214
|
+
throw fail("cuna.journey.machine_not_reusable", "The selected machine is not safely reusable.", EXIT_CODES.policy);
|
|
215
|
+
}
|
|
216
|
+
for (let attempt = 0; attempt < MACHINE_POLL_LIMIT; attempt += 1) {
|
|
217
|
+
if (state === "running")
|
|
218
|
+
return Object.freeze({ id: machineId, state });
|
|
219
|
+
const observed = await input.client.getMachine(machineId, signal);
|
|
220
|
+
state = machineState(observed.state);
|
|
221
|
+
if (state === "deleted" || state === "error" || state === "unknown") {
|
|
222
|
+
throw fail("cuna.journey.machine_not_ready", "The machine did not reach running state.");
|
|
223
|
+
}
|
|
224
|
+
await sleep(Math.min(2_000, 100 * 2 ** Math.min(attempt, 4)), signal);
|
|
225
|
+
}
|
|
226
|
+
throw fail("cuna.journey.machine_ready_timeout", "Machine readiness remained unproven.", EXIT_CODES.network);
|
|
227
|
+
},
|
|
228
|
+
synchronizeWorkspace: input.synchronizeWorkspace,
|
|
229
|
+
async observeAgentSessions({ machineId, signal }) {
|
|
230
|
+
const page = await input.client.listAgentSessions(machineId, { limit: 100 }, signal);
|
|
231
|
+
if (page.nextCursor !== undefined) {
|
|
232
|
+
throw fail("cuna.journey.agent_session_page_incomplete", "AgentSession selection requires a complete bounded collection.", EXIT_CODES.policy);
|
|
233
|
+
}
|
|
234
|
+
return Object.freeze(await Promise.all(page.items.map(async (session) => {
|
|
235
|
+
// Only a session that could be reused is asked for its seat. A
|
|
236
|
+
// terminal or starting one is refused on its process state before the
|
|
237
|
+
// seat would matter, and reading it would only spend a request.
|
|
238
|
+
if (session.processState !== "ready" && session.processState !== "running") {
|
|
239
|
+
return sessionObservation(session, { attachment: "unknown" });
|
|
240
|
+
}
|
|
241
|
+
let seat;
|
|
242
|
+
try {
|
|
243
|
+
await requireCapability({ client: input.client, scope: "agent_session", resourceId: session.id, capabilityId: "terminal_seats.read", allowedInteractions: ["read_only"], now, signal });
|
|
244
|
+
seat = await input.client.getAgentSessionTerminalSeat(session.id, signal);
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
if (isSeatUnserved(error))
|
|
248
|
+
return sessionObservation(session, { attachment: "unknown" });
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
return sessionObservation(session, attachmentFromSeat(seat, input.clientInstanceId));
|
|
252
|
+
})));
|
|
253
|
+
},
|
|
254
|
+
async createAgentSession({ machineId, agent, authMode, credentialBindingId, workspace, signal }) {
|
|
255
|
+
try {
|
|
256
|
+
await requireCapability({
|
|
257
|
+
client: input.client,
|
|
258
|
+
scope: "machine",
|
|
259
|
+
resourceId: machineId,
|
|
260
|
+
capabilityId: "agent_sessions.create",
|
|
261
|
+
now,
|
|
262
|
+
signal,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
if (agent === "opencode" && isOpenCodeSupervisorUpgradeCapabilityRejection(error)) {
|
|
267
|
+
throw openCodeSupervisorUpgradeRequired({
|
|
268
|
+
...(error.details === undefined ? {} : { details: error.details }),
|
|
269
|
+
machineId,
|
|
270
|
+
cause: error,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
if (agent === "opencode" && isOpenCodeRuntimeUnverifiedCapabilityRejection(error)) {
|
|
274
|
+
throw openCodeRuntimeUnverified({
|
|
275
|
+
...(error.details === undefined ? {} : { details: error.details }),
|
|
276
|
+
machineId,
|
|
277
|
+
cause: error,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
throw error;
|
|
281
|
+
}
|
|
282
|
+
if (agent === 'opencode' || agent === 'codex' || agent === 'claude-code') {
|
|
283
|
+
if (authMode !== 'interactive_login' || credentialBindingId !== undefined || !workspace.executionWorkspaceId || workspace.generation < 1 || !input.selectProviderPreset)
|
|
284
|
+
throw fail('cuna.provider.v2_unavailable', 'The agent requires a selected V2 profile and a published execution Workspace.');
|
|
285
|
+
const preset = await input.selectProviderPreset(signal);
|
|
286
|
+
requireMatchingPreset(agent, preset);
|
|
287
|
+
if (!input.providerLaunchState)
|
|
288
|
+
throw fail('cuna.provider.v2_unavailable', 'Durable provider launch state is unavailable.');
|
|
289
|
+
const executionWorkspaceId = workspace.executionWorkspaceId;
|
|
290
|
+
const session = await withProviderLaunchIntent({ ...input.providerLaunchState, machineId, executionWorkspaceId, confirmNew: async () => await input.confirmNewProviderLaunch?.(signal) ?? false, intent: { executionWorkspaceId, generation: workspace.generation, cwd: workspace.remoteCwd, profileId: preset.profile_id, profileRevision: preset.profile_revision, agent, authMode }, create: operationId => createPublishedProviderSessionV2({ client: input.client, machineId, agent, preset, operationId, executionWorkspaceId, generation: workspace.generation, cwd: workspace.remoteCwd, signal }) });
|
|
291
|
+
return Object.freeze({ id: session.id, machineId: session.machineId });
|
|
292
|
+
}
|
|
293
|
+
throw fail('cuna.provider.v2_unavailable', 'This agent has no supported canonical V2 launch profile.');
|
|
294
|
+
},
|
|
295
|
+
async ensureAgentSessionReady({ agentSessionId, signal }) {
|
|
296
|
+
for (let attempt = 0; attempt < CHILD_POLL_LIMIT; attempt += 1) {
|
|
297
|
+
if (signal?.aborted)
|
|
298
|
+
throw signal.reason;
|
|
299
|
+
const session = await input.client.getAgentSession(agentSessionId, signal);
|
|
300
|
+
if (session.requestState === "failed") {
|
|
301
|
+
if (session.workspaceFailureCode !== undefined) {
|
|
302
|
+
const messages = {
|
|
303
|
+
"workspace.remote_edits": "Remote edits prevent synchronization. Preserve and reconcile those edits before retrying.",
|
|
304
|
+
"workspace.in_use": "This workspace is still in use or waiting for a previous session to finish. Inspect its sessions before retrying.",
|
|
305
|
+
"workspace.replacement_requires_fence": "This Workspace cannot replace its files while writer exclusion is unverified. Its existing files were preserved.",
|
|
306
|
+
"workspace.materialization_manifest_limit": "This Workspace exceeds the runtime file manifest limit. Reduce the synchronized file set before retrying.",
|
|
307
|
+
};
|
|
308
|
+
throw fail("cuna.journey.workspace_materialization_failed", messages[session.workspaceFailureCode] ?? "The runtime could not prepare this Workspace. Its failure code identifies the refused operation.", EXIT_CODES.remote, { reason: session.workspaceFailureCode });
|
|
309
|
+
}
|
|
310
|
+
throw sessionFailure(session, "The AgentSession request failed before attach.");
|
|
311
|
+
}
|
|
312
|
+
if (signal?.aborted)
|
|
313
|
+
throw signal.reason;
|
|
314
|
+
if (session.id !== agentSessionId) {
|
|
315
|
+
throw fail("cuna.journey.session_identity_mismatch", "The readiness observation describes a different AgentSession.");
|
|
316
|
+
}
|
|
317
|
+
if (session.processState === "ready" || session.processState === "running") {
|
|
318
|
+
// A durable process acknowledgement can precede the registry's exact
|
|
319
|
+
// PTY attachment. Wait for that authority without dispatching again.
|
|
320
|
+
try {
|
|
321
|
+
await requireCapability({ client: input.client, scope: "agent_session", resourceId: agentSessionId,
|
|
322
|
+
capabilityId: "terminal_connections.create", allowedInteractions: ["native"], now, signal });
|
|
323
|
+
if (signal?.aborted)
|
|
324
|
+
throw signal.reason;
|
|
325
|
+
return Object.freeze({ id: session.id, machineId: session.machineId });
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
if (signal?.aborted)
|
|
329
|
+
throw signal.reason;
|
|
330
|
+
if (!(error instanceof CunaError
|
|
331
|
+
&& ["cuna.capability.unknown", "cuna.capability.temporarily_unavailable"].includes(error.code)
|
|
332
|
+
&& error.details?.capability_id === "terminal_connections.create"
|
|
333
|
+
&& ["supervisor_registry_unavailable", "agent_session_not_ready", "runtime_lease_expired"].includes(String(error.details?.reason))))
|
|
334
|
+
throw error;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (["exited", "failed", "terminated"].includes(session.processState)) {
|
|
338
|
+
throw sessionFailure(session, "The AgentSession reached a terminal state before attach.");
|
|
339
|
+
}
|
|
340
|
+
await sleep(Math.min(2_000, 100 * 2 ** Math.min(attempt, 4)), signal);
|
|
341
|
+
}
|
|
342
|
+
throw new CunaError({
|
|
343
|
+
code: "cuna.journey.agent_session_ready_timeout",
|
|
344
|
+
message: "Cuna stopped waiting for AgentSession readiness. The remote request may still be pending.",
|
|
345
|
+
exitCode: EXIT_CODES.network,
|
|
346
|
+
hint: `Inspect the existing request before starting another session: cuna agent-sessions get ${agentSessionId}`,
|
|
347
|
+
details: { agent_session_id: agentSessionId },
|
|
348
|
+
});
|
|
349
|
+
},
|
|
350
|
+
attach: input.attach,
|
|
351
|
+
async reconcileCancellation({ ledger, signal }) {
|
|
352
|
+
if (input.reconcileCancellation !== undefined) {
|
|
353
|
+
await input.reconcileCancellation({ ledger, signal });
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
if (ledger.createdAgentSessionId !== undefined) {
|
|
357
|
+
await input.client.getAgentSession(ledger.createdAgentSessionId, signal).catch(() => undefined);
|
|
358
|
+
}
|
|
359
|
+
// An absent request identity proves no create was dispatched, so there is
|
|
360
|
+
// nothing to reconcile. It used to be present unconditionally, which made
|
|
361
|
+
// every cancelled journey that merely SELECTED a machine query a request
|
|
362
|
+
// identity the producer had never been told about.
|
|
363
|
+
if (ledger.createdMachineId === undefined && ledger.machineCreateRequestId !== undefined) {
|
|
364
|
+
const requestId = ledger.machineCreateRequestId;
|
|
365
|
+
try {
|
|
366
|
+
let request = await input.client.getMachineCreateRequest(requestId, signal);
|
|
367
|
+
if (request.state === "unknown" || request.action === "reconcile") {
|
|
368
|
+
request = await input.client.reconcileMachineCreateRequest(requestId, signal);
|
|
369
|
+
}
|
|
370
|
+
if (request.state === "settled" || request.state === "provider_succeeded") {
|
|
371
|
+
await input.client.getMachine(request.machineId, signal);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
// A missing request proves no cleanup target; a transport failure
|
|
376
|
+
// remains unproven and is reported by the cancellation result.
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (ledger.createdMachineId !== undefined) {
|
|
380
|
+
await input.client.getMachine(ledger.createdMachineId, signal).catch(() => undefined);
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
};
|
|
384
|
+
return Object.freeze(effects);
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=api-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-effects.js","sourceRoot":"","sources":["../../src/journey/api-effects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { AgentKind } from "../api/contracts.js";
|
|
2
|
+
import type { MachineJourneySelection } from "./intent.js";
|
|
3
|
+
/**
|
|
4
|
+
* A deterministic RFC 4122 version-5-shaped identifier for `domain` and `value`.
|
|
5
|
+
*
|
|
6
|
+
* Two call sites now need the same primitive — the workspace binding's
|
|
7
|
+
* `projectId`/`localInstanceId` and the machine-create request identity — so it
|
|
8
|
+
* is defined once. Two private copies of one derivation is the shape that lets
|
|
9
|
+
* one copy be "improved" and silently start minting different identifiers for
|
|
10
|
+
* records already written to a user's disk.
|
|
11
|
+
*/
|
|
12
|
+
export declare function stableUuid(domain: string, value: string): string;
|
|
13
|
+
/** Everything that decides WHICH machine a journey create is asking for. */
|
|
14
|
+
export interface MachineCreateIdentityInput {
|
|
15
|
+
/** The authenticated principal the create is billed and scoped to. */
|
|
16
|
+
readonly userId: string;
|
|
17
|
+
/** The workspace the machine is created inside. */
|
|
18
|
+
readonly workspaceId: string;
|
|
19
|
+
/** The project root, canonicalized by the same authority the binding uses. */
|
|
20
|
+
readonly canonicalLocalRoot: string;
|
|
21
|
+
/** The agent the machine is created to run. */
|
|
22
|
+
readonly agent: AgentKind;
|
|
23
|
+
/** The machine the invocation asked for. */
|
|
24
|
+
readonly machine: MachineJourneySelection;
|
|
25
|
+
}
|
|
26
|
+
export interface MachineCreateIdentity {
|
|
27
|
+
/** The producer-side create-request identity, and the reconciliation key. */
|
|
28
|
+
readonly requestId: string;
|
|
29
|
+
/** The transport idempotency key carried by the same create. */
|
|
30
|
+
readonly idempotencyKey: string;
|
|
31
|
+
/** The intent digest both identities project from. Diagnostics only. */
|
|
32
|
+
readonly intentDigest: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Derive the durable identity of one machine-create request from the intent
|
|
36
|
+
* that asked for it.
|
|
37
|
+
*
|
|
38
|
+
* WHY THIS IS NOT `randomUUID()`. The identity below is the key
|
|
39
|
+
* `reconcileMachineCreate` looks the create up by. Minted from randomness it is
|
|
40
|
+
* lost with the process that minted it: a CLI interrupted between the provider
|
|
41
|
+
* accepting the create and the CLI recording it comes back with a different id,
|
|
42
|
+
* cannot find its own attempt, and creates a SECOND machine while the first
|
|
43
|
+
* bills forever with nothing able to name it. Derived from the intent, the
|
|
44
|
+
* re-run of an interrupted command re-derives the same id and reconciles.
|
|
45
|
+
* `journey/workspace-effects.ts` already derives the workspace binding's
|
|
46
|
+
* identities this way and for this reason; this is that discipline, not a
|
|
47
|
+
* second mechanism.
|
|
48
|
+
*
|
|
49
|
+
* EVERY INPUT IS NECESSARY:
|
|
50
|
+
*
|
|
51
|
+
* `userId` — two principals on one host, in one directory, running one
|
|
52
|
+
* command must not derive one create identity. The id is a client-chosen
|
|
53
|
+
* key into a producer-side table; scoping it to the principal makes a
|
|
54
|
+
* cross-principal collision impossible under any producer keying, including
|
|
55
|
+
* keyings this repository cannot read.
|
|
56
|
+
*
|
|
57
|
+
* `workspaceId` — one principal may hold more than one workspace and a
|
|
58
|
+
* machine belongs to exactly one. A create in workspace B must never
|
|
59
|
+
* reconcile onto a machine created in workspace A.
|
|
60
|
+
*
|
|
61
|
+
* `canonicalLocalRoot` — two projects are two machines. This is the same
|
|
62
|
+
* canonical root `workspace-effects.ts` keys the binding on, taken from the
|
|
63
|
+
* same authority rather than recomputed here, so the create identity and
|
|
64
|
+
* the binding identity can never disagree about which project this is. A
|
|
65
|
+
* lexical path would disagree the moment the user retried through a
|
|
66
|
+
* symlink, a different case, or a relative spelling.
|
|
67
|
+
*
|
|
68
|
+
* `agent` — `cuna claude` and `cuna codex` send different create bodies and
|
|
69
|
+
* different machine names. Sharing an identity would reconcile the second
|
|
70
|
+
* command onto a machine running the other agent.
|
|
71
|
+
*
|
|
72
|
+
* `machine` — `--new` is a deliberately different request from the default
|
|
73
|
+
* reconciling one, and the full selection is serialized rather than only
|
|
74
|
+
* its kind so that a later change letting `--machine NAME` reach creation
|
|
75
|
+
* cannot silently alias two names onto one identity.
|
|
76
|
+
*
|
|
77
|
+
* DELIBERATELY EXCLUDED: `syncMode`, `newSession`, `authMode` and
|
|
78
|
+
* `credentialBindingId` describe the AgentSession and the file transfer, not
|
|
79
|
+
* the machine. Admitting them would split one machine into several for
|
|
80
|
+
* invocations that are asking for the same machine.
|
|
81
|
+
*
|
|
82
|
+
* THE COST, stated because it is real. A derived identity is durable in both
|
|
83
|
+
* directions: once a create has settled, that identity keeps resolving to its
|
|
84
|
+
* outcome. If the machine is later deleted AND the local binding removed, the
|
|
85
|
+
* same invocation re-derives a spent identity and cannot create a replacement;
|
|
86
|
+
* `--new` derives a different one and is the way out. That is the price of
|
|
87
|
+
* being able to find an orphan at all, and it is bounded, whereas an orphan
|
|
88
|
+
* that nothing can name is not.
|
|
89
|
+
*/
|
|
90
|
+
export declare function deriveMachineCreateIdentity(input: MachineCreateIdentityInput): MachineCreateIdentity;
|
|
91
|
+
//# sourceMappingURL=derived-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derived-identity.d.ts","sourceRoot":"","sources":["../../src/journey/derived-identity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhE;AAED,4EAA4E;AAC5E,MAAM,WAAW,0BAA0B;IACzC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AA8BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,0BAA0B,GAAG,qBAAqB,CAmBpG"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { EXIT_CODES, CunaError } from "../core/errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* A deterministic RFC 4122 version-5-shaped identifier for `domain` and `value`.
|
|
5
|
+
*
|
|
6
|
+
* Two call sites now need the same primitive — the workspace binding's
|
|
7
|
+
* `projectId`/`localInstanceId` and the machine-create request identity — so it
|
|
8
|
+
* is defined once. Two private copies of one derivation is the shape that lets
|
|
9
|
+
* one copy be "improved" and silently start minting different identifiers for
|
|
10
|
+
* records already written to a user's disk.
|
|
11
|
+
*/
|
|
12
|
+
export function stableUuid(domain, value) {
|
|
13
|
+
const bytes = createHash("sha256").update(`${domain}\0${value}`, "utf8").digest().subarray(0, 16);
|
|
14
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x50;
|
|
15
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
16
|
+
const hex = bytes.toString("hex");
|
|
17
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
18
|
+
}
|
|
19
|
+
function invalidComponent(component) {
|
|
20
|
+
return new CunaError({
|
|
21
|
+
code: "cuna.journey.machine_create_identity_unavailable",
|
|
22
|
+
message: "Cuna cannot derive a durable identity for this machine-create request.",
|
|
23
|
+
exitCode: EXIT_CODES.policy,
|
|
24
|
+
hint: "Report this with `cuna version --json`; the journey refuses to create a machine it could not later find.",
|
|
25
|
+
details: { component },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function component(value, name) {
|
|
29
|
+
// NUL is the field separator below. A value carrying one would let two
|
|
30
|
+
// different inputs serialize to the same string, which is the one way a
|
|
31
|
+
// derived identity can collide across genuinely different creates.
|
|
32
|
+
if (typeof value !== "string" || value.length === 0 || value.includes("\0")) {
|
|
33
|
+
throw invalidComponent(name);
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
/** The selection, serialized so that no two distinct selections share a string. */
|
|
38
|
+
function selectionComponent(machine) {
|
|
39
|
+
if (machine === null || typeof machine !== "object")
|
|
40
|
+
throw invalidComponent("machine_selection");
|
|
41
|
+
if (machine.kind === "exact-name")
|
|
42
|
+
return `exact-name${component(machine.name, "machine_selection")}`;
|
|
43
|
+
if (machine.kind === "new" || machine.kind === "automatic")
|
|
44
|
+
return machine.kind;
|
|
45
|
+
throw invalidComponent("machine_selection");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Derive the durable identity of one machine-create request from the intent
|
|
49
|
+
* that asked for it.
|
|
50
|
+
*
|
|
51
|
+
* WHY THIS IS NOT `randomUUID()`. The identity below is the key
|
|
52
|
+
* `reconcileMachineCreate` looks the create up by. Minted from randomness it is
|
|
53
|
+
* lost with the process that minted it: a CLI interrupted between the provider
|
|
54
|
+
* accepting the create and the CLI recording it comes back with a different id,
|
|
55
|
+
* cannot find its own attempt, and creates a SECOND machine while the first
|
|
56
|
+
* bills forever with nothing able to name it. Derived from the intent, the
|
|
57
|
+
* re-run of an interrupted command re-derives the same id and reconciles.
|
|
58
|
+
* `journey/workspace-effects.ts` already derives the workspace binding's
|
|
59
|
+
* identities this way and for this reason; this is that discipline, not a
|
|
60
|
+
* second mechanism.
|
|
61
|
+
*
|
|
62
|
+
* EVERY INPUT IS NECESSARY:
|
|
63
|
+
*
|
|
64
|
+
* `userId` — two principals on one host, in one directory, running one
|
|
65
|
+
* command must not derive one create identity. The id is a client-chosen
|
|
66
|
+
* key into a producer-side table; scoping it to the principal makes a
|
|
67
|
+
* cross-principal collision impossible under any producer keying, including
|
|
68
|
+
* keyings this repository cannot read.
|
|
69
|
+
*
|
|
70
|
+
* `workspaceId` — one principal may hold more than one workspace and a
|
|
71
|
+
* machine belongs to exactly one. A create in workspace B must never
|
|
72
|
+
* reconcile onto a machine created in workspace A.
|
|
73
|
+
*
|
|
74
|
+
* `canonicalLocalRoot` — two projects are two machines. This is the same
|
|
75
|
+
* canonical root `workspace-effects.ts` keys the binding on, taken from the
|
|
76
|
+
* same authority rather than recomputed here, so the create identity and
|
|
77
|
+
* the binding identity can never disagree about which project this is. A
|
|
78
|
+
* lexical path would disagree the moment the user retried through a
|
|
79
|
+
* symlink, a different case, or a relative spelling.
|
|
80
|
+
*
|
|
81
|
+
* `agent` — `cuna claude` and `cuna codex` send different create bodies and
|
|
82
|
+
* different machine names. Sharing an identity would reconcile the second
|
|
83
|
+
* command onto a machine running the other agent.
|
|
84
|
+
*
|
|
85
|
+
* `machine` — `--new` is a deliberately different request from the default
|
|
86
|
+
* reconciling one, and the full selection is serialized rather than only
|
|
87
|
+
* its kind so that a later change letting `--machine NAME` reach creation
|
|
88
|
+
* cannot silently alias two names onto one identity.
|
|
89
|
+
*
|
|
90
|
+
* DELIBERATELY EXCLUDED: `syncMode`, `newSession`, `authMode` and
|
|
91
|
+
* `credentialBindingId` describe the AgentSession and the file transfer, not
|
|
92
|
+
* the machine. Admitting them would split one machine into several for
|
|
93
|
+
* invocations that are asking for the same machine.
|
|
94
|
+
*
|
|
95
|
+
* THE COST, stated because it is real. A derived identity is durable in both
|
|
96
|
+
* directions: once a create has settled, that identity keeps resolving to its
|
|
97
|
+
* outcome. If the machine is later deleted AND the local binding removed, the
|
|
98
|
+
* same invocation re-derives a spent identity and cannot create a replacement;
|
|
99
|
+
* `--new` derives a different one and is the way out. That is the price of
|
|
100
|
+
* being able to find an orphan at all, and it is bounded, whereas an orphan
|
|
101
|
+
* that nothing can name is not.
|
|
102
|
+
*/
|
|
103
|
+
export function deriveMachineCreateIdentity(input) {
|
|
104
|
+
const serialized = [
|
|
105
|
+
component(input.userId, "user_id"),
|
|
106
|
+
component(input.workspaceId, "workspace_id"),
|
|
107
|
+
component(input.canonicalLocalRoot, "canonical_local_root"),
|
|
108
|
+
component(input.agent, "agent"),
|
|
109
|
+
selectionComponent(input.machine),
|
|
110
|
+
].join("\0");
|
|
111
|
+
const intentDigest = createHash("sha256").update(serialized, "utf8").digest("hex");
|
|
112
|
+
return Object.freeze({
|
|
113
|
+
requestId: stableUuid("cuna.machine-create-request.v1", intentDigest),
|
|
114
|
+
// The producer accepts both a create-request identity and a transport
|
|
115
|
+
// idempotency key. Deriving only the first would leave a cross-process
|
|
116
|
+
// replay carrying a fresh key, which is a duplicate create under any
|
|
117
|
+
// producer that deduplicates on the key alone. Both are derived, so the
|
|
118
|
+
// replay is identical in every dimension the request carries.
|
|
119
|
+
idempotencyKey: `cuna-machine-create-${intentDigest}`,
|
|
120
|
+
intentDigest,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=derived-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derived-identity.js","sourceRoot":"","sources":["../../src/journey/derived-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG1D;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,KAAa;IACtD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,KAAK,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC;AAyBD,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,IAAI,SAAS,CAAC;QACnB,IAAI,EAAE,kDAAkD;QACxD,OAAO,EAAE,wEAAwE;QACjF,QAAQ,EAAE,UAAU,CAAC,MAAM;QAC3B,IAAI,EAAE,0GAA0G;QAChH,OAAO,EAAE,EAAE,SAAS,EAAE;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,IAAY;IAC5C,uEAAuE;IACvE,wEAAwE;IACxE,mEAAmE;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,SAAS,kBAAkB,CAAC,OAAgC;IAC1D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,cAAc,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;IACvG,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IAChF,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAiC;IAC3E,MAAM,UAAU,GAAG;QACjB,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;QAClC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC;QAC5C,SAAS,CAAC,KAAK,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;QAC3D,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;QAC/B,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,UAAU,CAAC,gCAAgC,EAAE,YAAY,CAAC;QACrE,sEAAsE;QACtE,uEAAuE;QACvE,qEAAqE;QACrE,wEAAwE;QACxE,8DAA8D;QAC9D,cAAc,EAAE,uBAAuB,YAAY,EAAE;QACrD,YAAY;KACb,CAAC,CAAC;AACL,CAAC"}
|