@timurproko/a1 0.1.0 → 0.1.1-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/bin/a1-ui.js +24 -0
- package/bin/{addone.js → a1.js} +2 -2
- package/dist/src/cli/dispatch.d.ts +4 -5
- package/dist/src/cli/dispatch.js +11 -11
- package/dist/src/cli/index.d.ts +0 -1
- package/dist/src/cli/index.js +0 -1
- package/dist/src/cli/version-stats.d.ts +0 -1
- package/dist/src/cli/version-stats.js +27 -23
- package/dist/src/cli/version.d.ts +1 -2
- package/dist/src/cli/version.js +4 -4
- package/dist/src/composition/index.d.ts +22 -0
- package/dist/src/composition/index.js +166 -0
- package/dist/src/composition/transparent-runtime.d.ts +6 -0
- package/dist/src/composition/transparent-runtime.js +19 -0
- package/dist/src/features/launch/development-launch.d.ts +0 -1
- package/dist/src/features/launch/development-launch.js +12 -11
- package/dist/src/features/launch/index.d.ts +0 -1
- package/dist/src/features/launch/index.js +0 -1
- package/dist/src/features/launch/initialize-profile.d.ts +1 -2
- package/dist/src/features/launch/initialize-profile.js +1 -2
- package/dist/src/features/launch/intent.d.ts +0 -1
- package/dist/src/features/launch/intent.js +0 -1
- package/dist/src/features/launch/prepare-launch.d.ts +2 -3
- package/dist/src/features/launch/prepare-launch.js +3 -4
- package/dist/src/features/launch/profile-paths.d.ts +2 -3
- package/dist/src/features/launch/profile-paths.js +9 -8
- package/dist/src/features/launch/profiles.d.ts +2 -3
- package/dist/src/features/launch/profiles.js +5 -6
- package/dist/src/features/launch/runtime-selection.d.ts +1 -2
- package/dist/src/features/launch/runtime-selection.js +1 -2
- package/dist/src/features/owned-ui/customization.d.ts +5 -3
- package/dist/src/features/owned-ui/customization.js +2 -4
- package/dist/src/features/owned-ui/diagnostics.d.ts +0 -1
- package/dist/src/features/owned-ui/diagnostics.js +0 -1
- package/dist/src/features/owned-ui/index.d.ts +0 -2
- package/dist/src/features/owned-ui/index.js +0 -2
- package/dist/src/features/owned-ui/run.d.ts +3 -7
- package/dist/src/features/owned-ui/run.js +7 -15
- package/dist/src/features/workspace/capabilities.d.ts +0 -1
- package/dist/src/features/workspace/capabilities.js +0 -1
- package/dist/src/features/workspace/index.d.ts +0 -1
- package/dist/src/features/workspace/index.js +0 -1
- package/dist/src/features/workspace/presentation.d.ts +1 -2
- package/dist/src/features/workspace/presentation.js +5 -4
- package/dist/src/features/workspace/reconciliation.d.ts +0 -1
- package/dist/src/features/workspace/reconciliation.js +0 -1
- package/dist/src/features/workspace/reducer.d.ts +0 -1
- package/dist/src/features/workspace/reducer.js +0 -1
- package/dist/src/features/workspace/router.d.ts +0 -1
- package/dist/src/features/workspace/router.js +0 -1
- package/dist/src/features/workspace/store.d.ts +0 -1
- package/dist/src/features/workspace/store.js +0 -1
- package/dist/src/foundation/agent-engine-contracts/capability-ports.d.ts +95 -0
- package/dist/src/foundation/agent-engine-contracts/capability-ports.js +35 -0
- package/dist/src/foundation/agent-engine-contracts/domain-validation.d.ts +12 -0
- package/dist/src/foundation/agent-engine-contracts/domain-validation.js +89 -0
- package/dist/src/foundation/agent-engine-contracts/domain.d.ts +90 -0
- package/dist/src/foundation/agent-engine-contracts/domain.js +1 -0
- package/dist/src/foundation/agent-engine-contracts/index.d.ts +7 -0
- package/dist/src/foundation/agent-engine-contracts/index.js +7 -0
- package/dist/src/foundation/agent-engine-contracts/model.d.ts +78 -0
- package/dist/src/foundation/agent-engine-contracts/model.js +1 -0
- package/dist/src/foundation/agent-engine-contracts/ports.d.ts +18 -0
- package/dist/src/foundation/agent-engine-contracts/ports.js +1 -0
- package/dist/src/foundation/agent-engine-contracts/serialization.d.ts +7 -0
- package/dist/src/foundation/agent-engine-contracts/serialization.js +58 -0
- package/dist/src/foundation/agent-engine-contracts/validation.d.ts +5 -0
- package/dist/src/foundation/agent-engine-contracts/validation.js +128 -0
- package/dist/src/foundation/lifecycle/index.d.ts +0 -1
- package/dist/src/foundation/lifecycle/index.js +0 -1
- package/dist/src/foundation/lifecycle/model.d.ts +1 -2
- package/dist/src/foundation/lifecycle/model.js +3 -3
- package/dist/src/foundation/lifecycle/paths.d.ts +2 -3
- package/dist/src/foundation/lifecycle/paths.js +32 -16
- package/dist/src/foundation/native-host-protocol/codec.d.ts +0 -1
- package/dist/src/foundation/native-host-protocol/codec.js +0 -1
- package/dist/src/foundation/native-host-protocol/evidence.d.ts +2 -3
- package/dist/src/foundation/native-host-protocol/evidence.js +4 -4
- package/dist/src/foundation/native-host-protocol/index.d.ts +0 -1
- package/dist/src/foundation/native-host-protocol/index.js +0 -1
- package/dist/src/foundation/native-host-protocol/messages.d.ts +1 -2
- package/dist/src/foundation/native-host-protocol/messages.js +2 -2
- package/dist/src/foundation/native-host-protocol/proof-gate.d.ts +0 -1
- package/dist/src/foundation/native-host-protocol/proof-gate.js +0 -1
- package/dist/src/foundation/owned-ui-contracts/extension-ui.d.ts +0 -1
- package/dist/src/foundation/owned-ui-contracts/extension-ui.js +0 -1
- package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -1
- package/dist/src/foundation/owned-ui-contracts/index.js +0 -1
- package/dist/src/foundation/owned-ui-contracts/model.d.ts +0 -1
- package/dist/src/foundation/owned-ui-contracts/model.js +0 -1
- package/dist/src/foundation/owned-ui-contracts/validation.d.ts +0 -1
- package/dist/src/foundation/owned-ui-contracts/validation.js +0 -1
- package/dist/src/foundation/pi-component-adapter/components.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/components.js +0 -1
- package/dist/src/foundation/pi-component-adapter/conformance.d.ts +1 -1
- package/dist/src/foundation/pi-component-adapter/conformance.js +10 -4
- package/dist/src/foundation/pi-component-adapter/index.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/index.js +0 -1
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.d.ts +165 -0
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.js +166 -0
- package/dist/src/foundation/pi-component-adapter/shell-components.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-components.js +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +10 -13
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.js +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.js +5 -62
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.js +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.js +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.js +0 -1
- package/dist/src/foundation/pi-component-adapter/theme.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/theme.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +3 -27
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +18 -0
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +55 -0
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.d.ts +10 -0
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.js +120 -0
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.d.ts +1 -2
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.js +1 -2
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/external-editor.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/external-editor.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/model-search.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/model-search.js +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.js +1 -2
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.d.ts +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.js +18 -15
- package/dist/src/foundation/pi-engine-adapter/adapter.d.ts +2 -202
- package/dist/src/foundation/pi-engine-adapter/adapter.js +76 -174
- package/dist/src/foundation/pi-engine-adapter/conformance.d.ts +24 -1
- package/dist/src/foundation/pi-engine-adapter/conformance.js +60 -15
- package/dist/src/foundation/pi-engine-adapter/index.d.ts +6 -1
- package/dist/src/foundation/pi-engine-adapter/index.js +6 -1
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.d.ts +30 -0
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.js +61 -0
- package/dist/src/foundation/pi-engine-adapter/public-main-entry.d.ts +5 -0
- package/dist/src/foundation/pi-engine-adapter/public-main-entry.js +18 -0
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.d.ts +31 -0
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.js +80 -0
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.d.ts +18 -0
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.js +32 -0
- package/dist/src/foundation/pi-engine-adapter/session-integration.d.ts +43 -0
- package/dist/src/foundation/pi-engine-adapter/session-integration.js +97 -0
- package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +17 -0
- package/dist/src/foundation/pi-engine-adapter/settings-integration.js +85 -0
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.d.ts +20 -0
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.js +48 -0
- package/dist/src/foundation/pi-engine-adapter/workflows.d.ts +0 -1
- package/dist/src/foundation/pi-engine-adapter/workflows.js +0 -1
- package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +1 -0
- package/dist/src/foundation/pi-owned-ui-integration/index.js +1 -0
- package/dist/src/{features/owned-ui/pi-session-shell.d.ts → foundation/pi-owned-ui-integration/session-shell.d.ts} +17 -14
- package/dist/src/{features/owned-ui/pi-session-shell.js → foundation/pi-owned-ui-integration/session-shell.js} +59 -60
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.d.ts +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.js +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.d.ts +8 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.js +22 -9
- package/dist/src/foundation/pi-tui-runtime-adapter/contracts.d.ts +0 -2
- package/dist/src/foundation/pi-tui-runtime-adapter/contracts.js +1 -2
- package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +1 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/index.js +1 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.d.ts +4 -0
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.js +48 -0
- package/dist/src/foundation/presentation-contracts/index.d.ts +96 -0
- package/dist/src/foundation/presentation-contracts/index.js +38 -0
- package/dist/src/foundation/protocol/client.d.ts +0 -1
- package/dist/src/foundation/protocol/client.js +0 -1
- package/dist/src/foundation/protocol/index.d.ts +0 -1
- package/dist/src/foundation/protocol/index.js +0 -1
- package/dist/src/foundation/protocol/messages.d.ts +1 -2
- package/dist/src/foundation/protocol/messages.js +2 -2
- package/dist/src/foundation/release/bootstrap.d.ts +0 -1
- package/dist/src/foundation/release/bootstrap.js +55 -22
- package/dist/src/foundation/release/cohort-selection.d.ts +0 -1
- package/dist/src/foundation/release/cohort-selection.js +0 -1
- package/dist/src/foundation/release/cohort-state.d.ts +3 -2
- package/dist/src/foundation/release/cohort-state.js +5 -4
- package/dist/src/foundation/release/concurrency.d.ts +1 -0
- package/dist/src/foundation/release/concurrency.js +17 -0
- package/dist/src/foundation/release/development-preview-release.d.ts +2 -2
- package/dist/src/foundation/release/development-preview-release.js +3 -2
- package/dist/src/foundation/release/index.d.ts +0 -1
- package/dist/src/foundation/release/index.js +0 -1
- package/dist/src/foundation/release/process-cleanup.d.ts +0 -1
- package/dist/src/foundation/release/process-cleanup.js +0 -1
- package/dist/src/foundation/release/release-gc.d.ts +0 -1
- package/dist/src/foundation/release/release-gc.js +0 -1
- package/dist/src/foundation/release/release-store.d.ts +24 -6
- package/dist/src/foundation/release/release-store.js +56 -21
- package/dist/src/foundation/release/release.d.ts +5 -6
- package/dist/src/foundation/release/release.js +21 -19
- package/dist/src/foundation/release/stable-release.d.ts +2 -2
- package/dist/src/foundation/release/stable-release.js +6 -5
- package/dist/src/foundation/release/update-transaction.d.ts +2 -2
- package/dist/src/foundation/release/update-transaction.js +8 -7
- package/dist/src/foundation/release/update.d.ts +2 -3
- package/dist/src/foundation/release/update.js +31 -29
- package/dist/src/foundation/storage/control-store.d.ts +0 -1
- package/dist/src/foundation/storage/control-store.js +28 -7
- package/dist/src/foundation/storage/index.d.ts +0 -1
- package/dist/src/foundation/storage/index.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/backpressure.d.ts +0 -1
- package/dist/src/foundation/structured-agent-runtime/backpressure.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/commands.d.ts +0 -1
- package/dist/src/foundation/structured-agent-runtime/commands.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/handshake.d.ts +2 -3
- package/dist/src/foundation/structured-agent-runtime/handshake.js +13 -13
- package/dist/src/foundation/structured-agent-runtime/index.d.ts +0 -1
- package/dist/src/foundation/structured-agent-runtime/index.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/reconnection.d.ts +0 -1
- package/dist/src/foundation/structured-agent-runtime/reconnection.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/state.d.ts +0 -1
- package/dist/src/foundation/structured-agent-runtime/state.js +0 -1
- package/dist/src/foundation/supervision/index.d.ts +1 -2
- package/dist/src/foundation/supervision/index.js +1 -2
- package/dist/src/foundation/supervision/main.d.ts +0 -1
- package/dist/src/foundation/supervision/main.js +11 -10
- package/dist/src/foundation/supervision/paths.d.ts +1 -2
- package/dist/src/foundation/supervision/paths.js +1 -2
- package/dist/src/foundation/supervision/server.d.ts +3 -4
- package/dist/src/foundation/supervision/server.js +7 -6
- package/dist/src/foundation/transparent-terminal/command-resolution.d.ts +0 -1
- package/dist/src/foundation/transparent-terminal/command-resolution.js +0 -1
- package/dist/src/foundation/transparent-terminal/foreground-broker.d.ts +0 -1
- package/dist/src/foundation/transparent-terminal/foreground-broker.js +0 -1
- package/dist/src/foundation/transparent-terminal/index.d.ts +1 -1
- package/dist/src/foundation/transparent-terminal/index.js +1 -1
- package/dist/src/foundation/transparent-terminal/main.d.ts +3 -4
- package/dist/src/foundation/transparent-terminal/main.js +8 -21
- package/dist/src/foundation/transparent-terminal/native-launcher.d.ts +0 -1
- package/dist/src/foundation/transparent-terminal/native-launcher.js +0 -1
- package/dist/src/foundation/workspace-contracts/index.d.ts +0 -1
- package/dist/src/foundation/workspace-contracts/index.js +0 -1
- package/dist/src/foundation/workspace-contracts/model.d.ts +0 -1
- package/dist/src/foundation/workspace-contracts/model.js +0 -1
- package/dist/src/foundation/workspace-contracts/validation.d.ts +0 -1
- package/dist/src/foundation/workspace-contracts/validation.js +0 -1
- package/dist/src/product-identity.d.ts +37 -0
- package/dist/src/product-identity.js +149 -0
- package/dist/src/product-identity.json +96 -0
- package/docs/architecture/boundaries.md +2 -2
- package/docs/architecture/project-structure.md +2 -2
- package/docs/architecture/resource-and-data-policy.md +1 -1
- package/docs/architecture/terminal-host-proof-gate.md +2 -2
- package/docs/architecture/terminal-host-provenance.md +3 -3
- package/docs/architecture/terminal-host-spike-evidence.md +1 -1
- package/docs/architecture/toolchain.md +33 -7
- package/docs/features/launch-profiles.md +6 -6
- package/docs/manual-pi-boundary-candidate.md +33 -0
- package/docs/manual-transparent-checkpoint.md +11 -11
- package/package.json +10 -3
- package/bin/addone-ui.js +0 -20
- package/dist/src/cli/dispatch.d.ts.map +0 -1
- package/dist/src/cli/dispatch.js.map +0 -1
- package/dist/src/cli/index.d.ts.map +0 -1
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cli/version-stats.d.ts.map +0 -1
- package/dist/src/cli/version-stats.js.map +0 -1
- package/dist/src/cli/version.d.ts.map +0 -1
- package/dist/src/cli/version.js.map +0 -1
- package/dist/src/features/launch/development-launch.d.ts.map +0 -1
- package/dist/src/features/launch/development-launch.js.map +0 -1
- package/dist/src/features/launch/index.d.ts.map +0 -1
- package/dist/src/features/launch/index.js.map +0 -1
- package/dist/src/features/launch/initialize-profile.d.ts.map +0 -1
- package/dist/src/features/launch/initialize-profile.js.map +0 -1
- package/dist/src/features/launch/intent.d.ts.map +0 -1
- package/dist/src/features/launch/intent.js.map +0 -1
- package/dist/src/features/launch/prepare-launch.d.ts.map +0 -1
- package/dist/src/features/launch/prepare-launch.js.map +0 -1
- package/dist/src/features/launch/profile-paths.d.ts.map +0 -1
- package/dist/src/features/launch/profile-paths.js.map +0 -1
- package/dist/src/features/launch/profiles.d.ts.map +0 -1
- package/dist/src/features/launch/profiles.js.map +0 -1
- package/dist/src/features/launch/runtime-selection.d.ts.map +0 -1
- package/dist/src/features/launch/runtime-selection.js.map +0 -1
- package/dist/src/features/owned-ui/customization.d.ts.map +0 -1
- package/dist/src/features/owned-ui/customization.js.map +0 -1
- package/dist/src/features/owned-ui/diagnostics.d.ts.map +0 -1
- package/dist/src/features/owned-ui/diagnostics.js.map +0 -1
- package/dist/src/features/owned-ui/index.d.ts.map +0 -1
- package/dist/src/features/owned-ui/index.js.map +0 -1
- package/dist/src/features/owned-ui/pi-session-shell.d.ts.map +0 -1
- package/dist/src/features/owned-ui/pi-session-shell.js.map +0 -1
- package/dist/src/features/owned-ui/run.d.ts.map +0 -1
- package/dist/src/features/owned-ui/run.js.map +0 -1
- package/dist/src/features/workspace/capabilities.d.ts.map +0 -1
- package/dist/src/features/workspace/capabilities.js.map +0 -1
- package/dist/src/features/workspace/index.d.ts.map +0 -1
- package/dist/src/features/workspace/index.js.map +0 -1
- package/dist/src/features/workspace/presentation.d.ts.map +0 -1
- package/dist/src/features/workspace/presentation.js.map +0 -1
- package/dist/src/features/workspace/reconciliation.d.ts.map +0 -1
- package/dist/src/features/workspace/reconciliation.js.map +0 -1
- package/dist/src/features/workspace/reducer.d.ts.map +0 -1
- package/dist/src/features/workspace/reducer.js.map +0 -1
- package/dist/src/features/workspace/router.d.ts.map +0 -1
- package/dist/src/features/workspace/router.js.map +0 -1
- package/dist/src/features/workspace/store.d.ts.map +0 -1
- package/dist/src/features/workspace/store.js.map +0 -1
- package/dist/src/foundation/lifecycle/index.d.ts.map +0 -1
- package/dist/src/foundation/lifecycle/index.js.map +0 -1
- package/dist/src/foundation/lifecycle/model.d.ts.map +0 -1
- package/dist/src/foundation/lifecycle/model.js.map +0 -1
- package/dist/src/foundation/lifecycle/paths.d.ts.map +0 -1
- package/dist/src/foundation/lifecycle/paths.js.map +0 -1
- package/dist/src/foundation/native-host-protocol/codec.d.ts.map +0 -1
- package/dist/src/foundation/native-host-protocol/codec.js.map +0 -1
- package/dist/src/foundation/native-host-protocol/evidence.d.ts.map +0 -1
- package/dist/src/foundation/native-host-protocol/evidence.js.map +0 -1
- package/dist/src/foundation/native-host-protocol/index.d.ts.map +0 -1
- package/dist/src/foundation/native-host-protocol/index.js.map +0 -1
- package/dist/src/foundation/native-host-protocol/messages.d.ts.map +0 -1
- package/dist/src/foundation/native-host-protocol/messages.js.map +0 -1
- package/dist/src/foundation/native-host-protocol/proof-gate.d.ts.map +0 -1
- package/dist/src/foundation/native-host-protocol/proof-gate.js.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/extension-ui.d.ts.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/extension-ui.js.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/index.d.ts.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/index.js.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/model.d.ts.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/model.js.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/validation.d.ts.map +0 -1
- package/dist/src/foundation/owned-ui-contracts/validation.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/components.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/components.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/conformance.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/conformance.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/index.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/index.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-components.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-components.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/theme.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/theme.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/external-editor.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/external-editor.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/model-search.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/model-search.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.js.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.d.ts.map +0 -1
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.js.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/adapter.d.ts.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/adapter.js.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/conformance.d.ts.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/conformance.js.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/index.d.ts.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/index.js.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/workflows.d.ts.map +0 -1
- package/dist/src/foundation/pi-engine-adapter/workflows.js.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.d.ts.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.js.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.d.ts.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.js.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/contracts.d.ts.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/contracts.js.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts.map +0 -1
- package/dist/src/foundation/pi-tui-runtime-adapter/index.js.map +0 -1
- package/dist/src/foundation/protocol/client.d.ts.map +0 -1
- package/dist/src/foundation/protocol/client.js.map +0 -1
- package/dist/src/foundation/protocol/index.d.ts.map +0 -1
- package/dist/src/foundation/protocol/index.js.map +0 -1
- package/dist/src/foundation/protocol/messages.d.ts.map +0 -1
- package/dist/src/foundation/protocol/messages.js.map +0 -1
- package/dist/src/foundation/release/bootstrap.d.ts.map +0 -1
- package/dist/src/foundation/release/bootstrap.js.map +0 -1
- package/dist/src/foundation/release/cohort-selection.d.ts.map +0 -1
- package/dist/src/foundation/release/cohort-selection.js.map +0 -1
- package/dist/src/foundation/release/cohort-state.d.ts.map +0 -1
- package/dist/src/foundation/release/cohort-state.js.map +0 -1
- package/dist/src/foundation/release/development-preview-release.d.ts.map +0 -1
- package/dist/src/foundation/release/development-preview-release.js.map +0 -1
- package/dist/src/foundation/release/index.d.ts.map +0 -1
- package/dist/src/foundation/release/index.js.map +0 -1
- package/dist/src/foundation/release/process-cleanup.d.ts.map +0 -1
- package/dist/src/foundation/release/process-cleanup.js.map +0 -1
- package/dist/src/foundation/release/release-gc.d.ts.map +0 -1
- package/dist/src/foundation/release/release-gc.js.map +0 -1
- package/dist/src/foundation/release/release-store.d.ts.map +0 -1
- package/dist/src/foundation/release/release-store.js.map +0 -1
- package/dist/src/foundation/release/release.d.ts.map +0 -1
- package/dist/src/foundation/release/release.js.map +0 -1
- package/dist/src/foundation/release/stable-release.d.ts.map +0 -1
- package/dist/src/foundation/release/stable-release.js.map +0 -1
- package/dist/src/foundation/release/update-transaction.d.ts.map +0 -1
- package/dist/src/foundation/release/update-transaction.js.map +0 -1
- package/dist/src/foundation/release/update.d.ts.map +0 -1
- package/dist/src/foundation/release/update.js.map +0 -1
- package/dist/src/foundation/storage/control-store.d.ts.map +0 -1
- package/dist/src/foundation/storage/control-store.js.map +0 -1
- package/dist/src/foundation/storage/index.d.ts.map +0 -1
- package/dist/src/foundation/storage/index.js.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/backpressure.d.ts.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/backpressure.js.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/commands.d.ts.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/commands.js.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/handshake.d.ts.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/handshake.js.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/index.d.ts.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/index.js.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/reconnection.d.ts.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/reconnection.js.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/state.d.ts.map +0 -1
- package/dist/src/foundation/structured-agent-runtime/state.js.map +0 -1
- package/dist/src/foundation/supervision/index.d.ts.map +0 -1
- package/dist/src/foundation/supervision/index.js.map +0 -1
- package/dist/src/foundation/supervision/main.d.ts.map +0 -1
- package/dist/src/foundation/supervision/main.js.map +0 -1
- package/dist/src/foundation/supervision/paths.d.ts.map +0 -1
- package/dist/src/foundation/supervision/paths.js.map +0 -1
- package/dist/src/foundation/supervision/server.d.ts.map +0 -1
- package/dist/src/foundation/supervision/server.js.map +0 -1
- package/dist/src/foundation/transparent-terminal/command-resolution.d.ts.map +0 -1
- package/dist/src/foundation/transparent-terminal/command-resolution.js.map +0 -1
- package/dist/src/foundation/transparent-terminal/foreground-broker.d.ts.map +0 -1
- package/dist/src/foundation/transparent-terminal/foreground-broker.js.map +0 -1
- package/dist/src/foundation/transparent-terminal/index.d.ts.map +0 -1
- package/dist/src/foundation/transparent-terminal/index.js.map +0 -1
- package/dist/src/foundation/transparent-terminal/main.d.ts.map +0 -1
- package/dist/src/foundation/transparent-terminal/main.js.map +0 -1
- package/dist/src/foundation/transparent-terminal/native-launcher.d.ts.map +0 -1
- package/dist/src/foundation/transparent-terminal/native-launcher.js.map +0 -1
- package/dist/src/foundation/workspace-contracts/index.d.ts.map +0 -1
- package/dist/src/foundation/workspace-contracts/index.js.map +0 -1
- package/dist/src/foundation/workspace-contracts/model.d.ts.map +0 -1
- package/dist/src/foundation/workspace-contracts/model.js.map +0 -1
- package/dist/src/foundation/workspace-contracts/validation.d.ts.map +0 -1
- package/dist/src/foundation/workspace-contracts/validation.js.map +0 -1
- /package/bin/{addone-supervisor.js → a1-supervisor.js} +0 -0
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
export interface PiTuiRuntimeConformanceOptions {
|
|
2
|
+
readonly packageVersion: string;
|
|
3
|
+
}
|
|
2
4
|
export interface PiTuiRuntimeConformanceReport {
|
|
3
5
|
readonly packageName: "@earendil-works/pi-tui";
|
|
4
|
-
readonly packageVersion:
|
|
6
|
+
readonly packageVersion: string;
|
|
5
7
|
readonly mode: "regular" | "fullscreen";
|
|
8
|
+
readonly constructedModes: readonly ("regular" | "fullscreen")[];
|
|
6
9
|
readonly lifecycleRestored: boolean;
|
|
7
10
|
readonly inputRouted: boolean;
|
|
8
11
|
readonly overlayRouted: boolean;
|
|
12
|
+
readonly focusRouted: boolean;
|
|
13
|
+
readonly widthBounded: boolean;
|
|
9
14
|
readonly differentialRendering: boolean;
|
|
10
15
|
readonly resizeRedraw: boolean;
|
|
11
16
|
readonly terminalNativeSelection: boolean;
|
|
12
17
|
}
|
|
13
|
-
export declare function runPiTuiRuntimeConformance(): Promise<PiTuiRuntimeConformanceReport>;
|
|
14
|
-
//# sourceMappingURL=conformance.d.ts.map
|
|
18
|
+
export declare function runPiTuiRuntimeConformance(options: PiTuiRuntimeConformanceOptions): Promise<PiTuiRuntimeConformanceReport>;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { PI_TUI_PACKAGE_VERSION } from "./contracts.js";
|
|
2
1
|
import { PiTuiRuntimeAdapter, PiTuiRuntimeError } from "./adapter.js";
|
|
3
|
-
export async function runPiTuiRuntimeConformance() {
|
|
2
|
+
export async function runPiTuiRuntimeConformance(options) {
|
|
3
|
+
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(options.packageVersion)) {
|
|
4
|
+
throw new TypeError("Pi TUI conformance requires an exact package version from compatibility authority");
|
|
5
|
+
}
|
|
4
6
|
const terminal = new ConformanceTerminal();
|
|
5
7
|
const root = new ConformanceComponent(["stable row", "before"]);
|
|
6
8
|
const overlay = new ConformanceComponent(["overlay"]);
|
|
@@ -24,20 +26,26 @@ export async function runPiTuiRuntimeConformance() {
|
|
|
24
26
|
terminal.resize(60, 10);
|
|
25
27
|
runtime.renderNow();
|
|
26
28
|
const resizeRedraw = runtime.fullRedraws > redrawsBeforeResize && runtime.viewport().columns === 60;
|
|
29
|
+
const fullscreenConstructed = runtime.switchMode("fullscreen");
|
|
30
|
+
runtime.renderNow(true);
|
|
31
|
+
const regularRestored = runtime.switchMode("regular");
|
|
32
|
+
runtime.renderNow(true);
|
|
27
33
|
await runtime.stop({ drainMaxMs: 1, drainIdleMs: 1 });
|
|
28
34
|
const emitted = terminal.writes.join("");
|
|
29
35
|
return {
|
|
30
36
|
packageName: "@earendil-works/pi-tui",
|
|
31
|
-
packageVersion:
|
|
37
|
+
packageVersion: options.packageVersion,
|
|
32
38
|
mode: runtime.mode,
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
constructedModes: fullscreenConstructed && regularRestored ? ["regular", "fullscreen"] : ["regular"],
|
|
40
|
+
lifecycleRestored: terminal.startCount >= 1
|
|
41
|
+
&& terminal.startCount === terminal.stopCount
|
|
35
42
|
&& terminal.drainCount === 1
|
|
36
|
-
&&
|
|
37
|
-
&& !emitted.includes("\x1b[?1049l")
|
|
43
|
+
&& (emitted.match(/\x1b\[\?1049h/g)?.length ?? 0) === (emitted.match(/\x1b\[\?1049l/g)?.length ?? 0)
|
|
38
44
|
&& root.disposed,
|
|
39
45
|
inputRouted: root.inputs.includes("root-input"),
|
|
40
46
|
overlayRouted,
|
|
47
|
+
focusRouted: root.focusChanges.includes(true) && overlay.focusChanges.includes(true),
|
|
48
|
+
widthBounded: root.widths.every(width => width <= terminal.columns) && overlay.widths.every(width => width <= 12),
|
|
41
49
|
differentialRendering: differentialFrame.includes("after") && !differentialFrame.includes("stable row"),
|
|
42
50
|
resizeRedraw,
|
|
43
51
|
terminalNativeSelection: !emitted.includes("\x1b[?1000h") && !emitted.includes("\x1b[?1006h"),
|
|
@@ -54,13 +62,19 @@ export async function runPiTuiRuntimeConformance() {
|
|
|
54
62
|
class ConformanceComponent {
|
|
55
63
|
lines;
|
|
56
64
|
inputs = [];
|
|
65
|
+
focusChanges = [];
|
|
66
|
+
widths = [];
|
|
57
67
|
disposed = false;
|
|
58
68
|
constructor(lines) {
|
|
59
69
|
this.lines = lines;
|
|
60
70
|
}
|
|
61
|
-
render() {
|
|
71
|
+
render(width) {
|
|
72
|
+
this.widths.push(width);
|
|
62
73
|
return this.lines;
|
|
63
74
|
}
|
|
75
|
+
setFocused(focused) {
|
|
76
|
+
this.focusChanges.push(focused);
|
|
77
|
+
}
|
|
64
78
|
handleInput(data) {
|
|
65
79
|
this.inputs.push(data);
|
|
66
80
|
}
|
|
@@ -129,4 +143,3 @@ class ConformanceTerminal {
|
|
|
129
143
|
this.write(`progress:${active}`);
|
|
130
144
|
}
|
|
131
145
|
}
|
|
132
|
-
//# sourceMappingURL=conformance.js.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare const PI_TUI_PACKAGE_VERSION: "0.84.2";
|
|
2
1
|
export type PiTuiRuntimeState = "idle" | "running" | "stopping" | "stopped" | "failed";
|
|
3
2
|
export interface PiTuiViewport {
|
|
4
3
|
readonly columns: number;
|
|
@@ -119,4 +118,3 @@ export interface PiTuiStopOptions {
|
|
|
119
118
|
readonly drainMaxMs?: number;
|
|
120
119
|
readonly drainIdleMs?: number;
|
|
121
120
|
}
|
|
122
|
-
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
//# sourceMappingURL=contracts.js.map
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PresentationComponentPort, PresentationRuntimePort, PresentationTerminalPort } from "../presentation-contracts/index.js";
|
|
2
|
+
import type { PiTuiTerminalPort } from "./contracts.js";
|
|
3
|
+
export declare function createPiPresentationRuntime(root: PresentationComponentPort, terminal: PresentationTerminalPort): PresentationRuntimePort;
|
|
4
|
+
export declare function createPiTerminalBridge(terminal: PresentationTerminalPort): PiTuiTerminalPort;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { PiTuiRuntimeAdapter } from "./adapter.js";
|
|
2
|
+
export function createPiPresentationRuntime(root, terminal) {
|
|
3
|
+
return new PresentationRuntimeAdapter(root, terminal);
|
|
4
|
+
}
|
|
5
|
+
class PresentationRuntimeAdapter {
|
|
6
|
+
terminal;
|
|
7
|
+
#runtime;
|
|
8
|
+
constructor(root, terminal) {
|
|
9
|
+
this.terminal = terminal;
|
|
10
|
+
this.#runtime = new PiTuiRuntimeAdapter({ root, terminal: createPiTerminalBridge(terminal), mouse: false });
|
|
11
|
+
}
|
|
12
|
+
get state() { return this.#runtime.state; }
|
|
13
|
+
start() { this.#runtime.start(); }
|
|
14
|
+
render(force) { this.#runtime.renderNow(force); }
|
|
15
|
+
showOverlay(component, options) {
|
|
16
|
+
const handle = this.#runtime.showOverlay(component, {
|
|
17
|
+
anchor: options.anchor === "top" ? "top-center" : options.anchor === "bottom" ? "bottom-center" : "center",
|
|
18
|
+
...(options.width === undefined ? {} : { width: options.width }),
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
get visible() { return !handle.isHidden(); },
|
|
22
|
+
hide: () => handle.hide(),
|
|
23
|
+
show: () => handle.setHidden(false),
|
|
24
|
+
focus: () => handle.focus(),
|
|
25
|
+
dispose: () => handle.hide(),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async stop() { await this.#runtime.stop(); }
|
|
29
|
+
}
|
|
30
|
+
export function createPiTerminalBridge(terminal) {
|
|
31
|
+
return {
|
|
32
|
+
get columns() { return terminal.columns; },
|
|
33
|
+
get rows() { return terminal.rows; },
|
|
34
|
+
get kittyProtocolActive() { return terminal.enhancedKeyboard; },
|
|
35
|
+
start: (input, resize) => terminal.start(input, resize),
|
|
36
|
+
stop: () => terminal.stop(),
|
|
37
|
+
drainInput: (max, idle) => terminal.drainInput(max, idle),
|
|
38
|
+
write: data => terminal.write(data),
|
|
39
|
+
moveBy: lines => terminal.moveBy(lines),
|
|
40
|
+
hideCursor: () => terminal.hideCursor(),
|
|
41
|
+
showCursor: () => terminal.showCursor(),
|
|
42
|
+
clearLine: () => terminal.clearLine(),
|
|
43
|
+
clearFromCursor: () => terminal.clearFromCursor(),
|
|
44
|
+
clearScreen: () => terminal.clearScreen(),
|
|
45
|
+
setTitle: title => terminal.setTitle(title),
|
|
46
|
+
setProgress: active => terminal.setProgress(active),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export type PresentationRuntimeState = "idle" | "running" | "stopping" | "stopped" | "failed";
|
|
2
|
+
export interface PresentationComponentPort {
|
|
3
|
+
render(width: number): readonly string[];
|
|
4
|
+
invalidate(): void;
|
|
5
|
+
handleInput?(data: string): void;
|
|
6
|
+
setFocused?(focused: boolean): void;
|
|
7
|
+
dispose?(): void;
|
|
8
|
+
}
|
|
9
|
+
export interface PresentationEditorPort extends PresentationComponentPort {
|
|
10
|
+
getText(): string;
|
|
11
|
+
setText(text: string): void;
|
|
12
|
+
submit(): Promise<void> | void;
|
|
13
|
+
}
|
|
14
|
+
export interface PresentationSelectorItem {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly label: string;
|
|
17
|
+
readonly detail?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface PresentationSelectorPort extends PresentationComponentPort {
|
|
20
|
+
setItems(items: readonly PresentationSelectorItem[]): void;
|
|
21
|
+
readonly selectedId: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface PresentationDialogPort extends PresentationComponentPort {
|
|
24
|
+
readonly dialogId: string;
|
|
25
|
+
close(outcome: "accepted" | "cancelled"): void;
|
|
26
|
+
}
|
|
27
|
+
export interface PresentationExtensionUiPort {
|
|
28
|
+
mount(slot: PresentationContributionSlot, component: PresentationComponentPort): () => void;
|
|
29
|
+
}
|
|
30
|
+
export type PresentationContributionSlot = "transcript" | "tool" | "editor" | "status" | "dialog" | "overlay";
|
|
31
|
+
export type PresentationFocusTarget = "transcript" | "editor" | "dialog" | "overlay" | "status";
|
|
32
|
+
export interface PresentationFocusPort {
|
|
33
|
+
readonly focused: PresentationFocusTarget;
|
|
34
|
+
focus(target: PresentationFocusTarget): void;
|
|
35
|
+
}
|
|
36
|
+
export interface PresentationTerminalPort {
|
|
37
|
+
readonly columns: number;
|
|
38
|
+
readonly rows: number;
|
|
39
|
+
readonly enhancedKeyboard: boolean;
|
|
40
|
+
start(onInput: (data: string) => void, onResize: () => void): void;
|
|
41
|
+
stop(): void;
|
|
42
|
+
drainInput(maxMs?: number, idleMs?: number): Promise<void>;
|
|
43
|
+
write(data: string): void;
|
|
44
|
+
moveBy(lines: number): void;
|
|
45
|
+
clearLine(): void;
|
|
46
|
+
clearFromCursor(): void;
|
|
47
|
+
clearScreen(): void;
|
|
48
|
+
setTitle(title: string): void;
|
|
49
|
+
setProgress(active: boolean): void;
|
|
50
|
+
showCursor(): void;
|
|
51
|
+
hideCursor(): void;
|
|
52
|
+
}
|
|
53
|
+
export type PresentationLayoutNode = {
|
|
54
|
+
readonly type: "component";
|
|
55
|
+
readonly component: PresentationComponentPort;
|
|
56
|
+
} | {
|
|
57
|
+
readonly type: "stack";
|
|
58
|
+
readonly direction: "vertical" | "horizontal";
|
|
59
|
+
readonly children: readonly PresentationLayoutNode[];
|
|
60
|
+
readonly gap?: number;
|
|
61
|
+
} | {
|
|
62
|
+
readonly type: "scroll";
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly child: PresentationLayoutNode;
|
|
65
|
+
readonly follow: "none" | "end";
|
|
66
|
+
};
|
|
67
|
+
export interface PresentationOverlayOptions {
|
|
68
|
+
readonly anchor: "center" | "top" | "bottom";
|
|
69
|
+
readonly width?: number | `${number}%`;
|
|
70
|
+
readonly modal: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface PresentationOverlayHandle {
|
|
73
|
+
readonly visible: boolean;
|
|
74
|
+
hide(): void;
|
|
75
|
+
show(): void;
|
|
76
|
+
focus(): void;
|
|
77
|
+
dispose(): void;
|
|
78
|
+
}
|
|
79
|
+
export interface OwnedUiApplicationPort {
|
|
80
|
+
readonly disposed: boolean;
|
|
81
|
+
start(): void;
|
|
82
|
+
flush(): Promise<void>;
|
|
83
|
+
waitUntilStopped(): Promise<void>;
|
|
84
|
+
dispose(): Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
export interface PresentationRuntimePort {
|
|
87
|
+
readonly state: PresentationRuntimeState;
|
|
88
|
+
readonly terminal: PresentationTerminalPort;
|
|
89
|
+
start(): void;
|
|
90
|
+
render(force?: boolean): void;
|
|
91
|
+
showOverlay(component: PresentationComponentPort, options: PresentationOverlayOptions): PresentationOverlayHandle;
|
|
92
|
+
stop(): Promise<void>;
|
|
93
|
+
}
|
|
94
|
+
export declare function assertPresentationComponent(component: PresentationComponentPort): void;
|
|
95
|
+
export declare function assertPresentationRuntime(runtime: PresentationRuntimePort): void;
|
|
96
|
+
export declare function probePresentationLifecycle(runtime: PresentationRuntimePort): Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function assertPresentationComponent(component) {
|
|
2
|
+
requiredFunctions(component, ["render", "invalidate"], "presentation component");
|
|
3
|
+
const lines = component.render(80);
|
|
4
|
+
if (!Array.isArray(lines) || lines.some(line => typeof line !== "string" || line.includes("\n") || line.includes("\r"))) {
|
|
5
|
+
throw new TypeError("presentation component render must return newline-free string rows");
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function assertPresentationRuntime(runtime) {
|
|
9
|
+
requiredFunctions(runtime, ["start", "render", "showOverlay", "stop"], "presentation runtime");
|
|
10
|
+
if (!new Set(["idle", "running", "stopping", "stopped", "failed"]).has(runtime.state))
|
|
11
|
+
throw new TypeError("presentation runtime state is invalid");
|
|
12
|
+
const terminal = runtime.terminal;
|
|
13
|
+
requiredFunctions(terminal, ["start", "stop", "drainInput", "write", "moveBy", "clearLine", "clearFromCursor", "clearScreen", "setTitle", "setProgress", "showCursor", "hideCursor"], "presentation terminal");
|
|
14
|
+
if (!Number.isSafeInteger(terminal.columns) || terminal.columns < 1 || !Number.isSafeInteger(terminal.rows) || terminal.rows < 1)
|
|
15
|
+
throw new TypeError("presentation terminal geometry is invalid");
|
|
16
|
+
}
|
|
17
|
+
export async function probePresentationLifecycle(runtime) {
|
|
18
|
+
assertPresentationRuntime(runtime);
|
|
19
|
+
if (runtime.state !== "idle")
|
|
20
|
+
throw new TypeError("presentation runtime must begin idle");
|
|
21
|
+
runtime.start();
|
|
22
|
+
if (runtime.state !== "running")
|
|
23
|
+
throw new TypeError("presentation runtime did not enter running state");
|
|
24
|
+
runtime.render(true);
|
|
25
|
+
await runtime.stop();
|
|
26
|
+
if (runtime.state !== "stopped")
|
|
27
|
+
throw new TypeError("presentation runtime did not enter stopped state");
|
|
28
|
+
await runtime.stop();
|
|
29
|
+
if (runtime.state !== "stopped")
|
|
30
|
+
throw new TypeError("presentation runtime stop is not idempotent");
|
|
31
|
+
}
|
|
32
|
+
function requiredFunctions(value, names, label) {
|
|
33
|
+
if (!value)
|
|
34
|
+
throw new TypeError(`${label} is required`);
|
|
35
|
+
for (const name of names)
|
|
36
|
+
if (typeof value[name] !== "function")
|
|
37
|
+
throw new TypeError(`${label} requires ${name}`);
|
|
38
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CommandResult, SupervisorCommand, SupervisorSnapshot } from "../lifecycle/index.js";
|
|
2
|
-
export declare const CONTROL_ENVELOPE:
|
|
2
|
+
export declare const CONTROL_ENVELOPE: string;
|
|
3
3
|
export declare const CONTROL_ENVELOPE_REVISION: 1;
|
|
4
4
|
export declare const REQUIRED_CONTROL_FEATURES: readonly ["handshake.features.v1", "snapshot.revision.v1", "commands.request-identity.v1", "generation.lifecycle.v1", "terminal.foreground-lease.v1"];
|
|
5
5
|
export declare const OPTIONAL_CONTROL_FEATURES: readonly ["messages.unknown-additive-ignore.v1", "snapshot.resynchronize.v1"];
|
|
@@ -87,4 +87,3 @@ export declare function isControlHello(value: unknown): value is {
|
|
|
87
87
|
export declare function isCommandMessage(value: unknown): value is Extract<ClientMessage, {
|
|
88
88
|
type: "command";
|
|
89
89
|
}>;
|
|
90
|
-
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
|
|
2
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
3
|
+
export const CONTROL_ENVELOPE = PRODUCT_IDENTITY.protocol.controlEnvelope;
|
|
3
4
|
export const CONTROL_ENVELOPE_REVISION = 1;
|
|
4
5
|
export const REQUIRED_CONTROL_FEATURES = [
|
|
5
6
|
"handshake.features.v1",
|
|
@@ -96,4 +97,3 @@ function isRecord(value) {
|
|
|
96
97
|
function isStringArray(value) {
|
|
97
98
|
return Array.isArray(value) && value.every(item => typeof item === "string" && item.length > 0);
|
|
98
99
|
}
|
|
99
|
-
//# sourceMappingURL=messages.js.map
|
|
@@ -27,4 +27,3 @@ export declare function releaseVerifiedIdleOwner(metadata: SupervisorEndpointMet
|
|
|
27
27
|
}): Promise<boolean>;
|
|
28
28
|
export declare function waitForProcessExit(pid: number, timeoutMs: number): Promise<void>;
|
|
29
29
|
export declare function removeEndpointArtifacts(metadataPath: string, endpoint: string): Promise<void>;
|
|
30
|
-
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -5,41 +5,67 @@ import { platform } from "node:os";
|
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
6
|
import { selectCohortLaunch } from "./cohort-selection.js";
|
|
7
7
|
import { CohortStateStore } from "./cohort-state.js";
|
|
8
|
-
import { assertLaunchProfileId,
|
|
8
|
+
import { assertLaunchProfileId, resolveProductPaths } from "../lifecycle/index.js";
|
|
9
9
|
import { encodeFrame, LineFrameDecoder } from "../protocol/index.js";
|
|
10
10
|
import { cleanupProvenIdleOwner, processIsAlive } from "./process-cleanup.js";
|
|
11
|
-
import { materializeRelease, readMaterializedRelease, resolveReleaseEntryPoint, verifyMaterializedRelease } from "./release-store.js";
|
|
11
|
+
import { materializeRelease, readCertifiedReleaseManifest, readMaterializedRelease, resolveReleaseEntryPoint, verifyMaterializedRelease } from "./release-store.js";
|
|
12
|
+
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
12
13
|
export async function runBootstrap(options) {
|
|
13
14
|
const environment = { ...(options.environment ?? process.env) };
|
|
14
|
-
const launchProfileId = options.launchIntent?.profile.id ?? "
|
|
15
|
+
const launchProfileId = options.launchIntent?.profile.id ?? "a1";
|
|
15
16
|
assertLaunchProfileId(launchProfileId);
|
|
16
|
-
environment.
|
|
17
|
+
environment[PRODUCT_IDENTITY.environment.launchProfile] = launchProfileId;
|
|
17
18
|
const output = options.output ?? process.stderr;
|
|
18
|
-
const paths =
|
|
19
|
+
const paths = resolveProductPaths(environment);
|
|
19
20
|
await mkdir(paths.runtimeDir, { recursive: true, mode: 0o700 });
|
|
20
|
-
const candidate = await materializeRelease(options.packageRoot, paths.dataDir);
|
|
21
21
|
const stateStore = new CohortStateStore(paths.dataDir);
|
|
22
|
-
await stateStore.recordCandidate(candidate);
|
|
23
22
|
let state = await stateStore.read();
|
|
23
|
+
let endpoint = await readEndpointMetadata(paths.endpointMetadataPath);
|
|
24
|
+
let probe = endpoint ? await probeOwnership(endpoint) : "dead";
|
|
25
|
+
const installedVersion = await readInstalledVersion(options.packageRoot);
|
|
26
|
+
const activeId = state.references.active;
|
|
27
|
+
const active = activeId === null ? undefined : state.releases[activeId];
|
|
28
|
+
if (active?.approval === "approved" && active.packageVersion === installedVersion) {
|
|
29
|
+
const endpointMatches = endpoint?.releaseId === active.releaseId
|
|
30
|
+
&& endpoint.releaseRoot === active.releaseRoot
|
|
31
|
+
&& endpoint.contentDigest === active.contentDigest;
|
|
32
|
+
if (endpointMatches && probe === "live-verified") {
|
|
33
|
+
const retained = await readCertifiedReleaseManifest(active, resolve(paths.dataDir, "releases"));
|
|
34
|
+
return await launchUi(retained, environment);
|
|
35
|
+
}
|
|
36
|
+
if (endpoint === null || probe === "dead") {
|
|
37
|
+
if (endpoint)
|
|
38
|
+
await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
|
|
39
|
+
const retained = await readMaterializedRelease(active.releaseRoot);
|
|
40
|
+
await startSupervisor(retained, environment);
|
|
41
|
+
await waitForVerifiedEndpoint(paths.endpointMetadataPath, retained, 8_000);
|
|
42
|
+
return await launchUi(retained, environment);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const candidate = await materializeRelease(options.packageRoot, paths.dataDir, {
|
|
46
|
+
onProgress: progress => output.write(`${PRODUCT_TEXT.diagnostic(`preparing ${progress.fileCount} installed release files; first launch may take a moment.`)}\n`),
|
|
47
|
+
});
|
|
48
|
+
await stateStore.recordCandidate(candidate);
|
|
49
|
+
state = await stateStore.read();
|
|
24
50
|
if (!state.references.active) {
|
|
25
51
|
const diagnosticsPath = await certifyMaterializedRelease(candidate, paths.dataDir);
|
|
26
52
|
await stateStore.approve(candidate.releaseId, diagnosticsPath);
|
|
27
53
|
await stateStore.activate(candidate.releaseId);
|
|
28
54
|
state = await stateStore.read();
|
|
29
55
|
}
|
|
30
|
-
|
|
31
|
-
|
|
56
|
+
endpoint = await readEndpointMetadata(paths.endpointMetadataPath);
|
|
57
|
+
probe = endpoint ? await probeOwnership(endpoint) : "dead";
|
|
32
58
|
let decision = selectCohortLaunch(candidate, state, endpoint, probe);
|
|
33
59
|
if (decision.action === "blocked") {
|
|
34
60
|
await stateStore.blockPending(decision.reason, endpoint?.ownership.liveGenerationIds ?? []);
|
|
35
|
-
output.write(`
|
|
61
|
+
output.write(`${PRODUCT_TEXT.diagnostic(`startup is blocked to preserve uncertain live ownership: ${decision.reason}`)}\n`);
|
|
36
62
|
return 1;
|
|
37
63
|
}
|
|
38
64
|
if (decision.action === "clean-stale-owner" && endpoint) {
|
|
39
65
|
const diagnostics = await cleanupProvenIdleOwner(endpoint);
|
|
40
66
|
await writeFile(resolve(paths.dataDir, `cleanup-${Date.now()}.json`), JSON.stringify(diagnostics, null, 2));
|
|
41
67
|
if (!diagnostics.terminated)
|
|
42
|
-
throw new Error(`could not safely clean stale
|
|
68
|
+
throw new Error(`could not safely clean stale ${PRODUCT_TEXT.displayName} supervisor ${endpoint.pid}`);
|
|
43
69
|
await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
|
|
44
70
|
decision = selectCohortLaunch(candidate, await stateStore.read(), null, "dead");
|
|
45
71
|
}
|
|
@@ -62,12 +88,12 @@ export async function runBootstrap(options) {
|
|
|
62
88
|
const released = await requestIdleOwnershipRelease(endpoint, candidate.releaseId, 2_000);
|
|
63
89
|
if (!released) {
|
|
64
90
|
await stateStore.blockPending("idle supervisor did not verify ownership release", endpoint.ownership.liveGenerationIds);
|
|
65
|
-
output.write("
|
|
91
|
+
output.write(`${PRODUCT_TEXT.diagnostic("could not verify idle cohort ownership release; the retained release remains selected.")}\n`);
|
|
66
92
|
return 1;
|
|
67
93
|
}
|
|
68
94
|
if (!await releaseVerifiedIdleOwner(endpoint, paths.dataDir)) {
|
|
69
95
|
await stateStore.blockPending("idle supervisor acknowledged release but did not terminate", endpoint.ownership.liveGenerationIds);
|
|
70
|
-
output.write("
|
|
96
|
+
output.write(`${PRODUCT_TEXT.diagnostic("could not complete bounded idle cohort shutdown; the candidate remains pending.")}\n`);
|
|
71
97
|
return 1;
|
|
72
98
|
}
|
|
73
99
|
await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
|
|
@@ -92,10 +118,18 @@ export async function runBootstrap(options) {
|
|
|
92
118
|
await waitForVerifiedEndpoint(paths.endpointMetadataPath, selected, 8_000);
|
|
93
119
|
return await launchUi(selected, environment);
|
|
94
120
|
}
|
|
121
|
+
async function readInstalledVersion(packageRoot) {
|
|
122
|
+
const manifest = JSON.parse(await readFile(resolve(packageRoot, "package.json"), "utf8"));
|
|
123
|
+
if (typeof manifest.version !== "string" || manifest.version.length === 0) {
|
|
124
|
+
throw new Error(PRODUCT_TEXT.diagnostic("package metadata has no version"));
|
|
125
|
+
}
|
|
126
|
+
return manifest.version;
|
|
127
|
+
}
|
|
95
128
|
export async function certifyMaterializedRelease(release, dataDir) {
|
|
96
129
|
await verifyMaterializedRelease(release.releaseRoot, release, resolve(dataDir, "releases"));
|
|
97
130
|
const path = resolve(dataDir, `certification-${release.releaseId}.json`);
|
|
98
131
|
await writeFile(path, JSON.stringify({
|
|
132
|
+
schema: PRODUCT_IDENTITY.evidence.releaseCertificationSchema,
|
|
99
133
|
releaseId: release.releaseId,
|
|
100
134
|
contentDigest: release.contentDigest,
|
|
101
135
|
verifiedAt: new Date().toISOString(),
|
|
@@ -104,7 +138,7 @@ export async function certifyMaterializedRelease(release, dataDir) {
|
|
|
104
138
|
return path;
|
|
105
139
|
}
|
|
106
140
|
export async function startSupervisor(release, environment) {
|
|
107
|
-
const entry = await resolveReleaseEntryPoint(release, "bin/
|
|
141
|
+
const entry = await resolveReleaseEntryPoint(release, "bin/a1-supervisor.js");
|
|
108
142
|
const child = spawn(process.execPath, [entry], {
|
|
109
143
|
detached: true,
|
|
110
144
|
env: releaseEnvironment(environment, release),
|
|
@@ -118,7 +152,7 @@ export async function startSupervisor(release, environment) {
|
|
|
118
152
|
child.unref();
|
|
119
153
|
}
|
|
120
154
|
async function launchUi(release, environment) {
|
|
121
|
-
const entry = await resolveReleaseEntryPoint(release, "bin/
|
|
155
|
+
const entry = await resolveReleaseEntryPoint(release, "bin/a1-ui.js");
|
|
122
156
|
return await new Promise((resolvePromise, rejectPromise) => {
|
|
123
157
|
const child = spawn(process.execPath, [entry], {
|
|
124
158
|
env: releaseEnvironment(environment, release),
|
|
@@ -132,9 +166,9 @@ async function launchUi(release, environment) {
|
|
|
132
166
|
export function releaseEnvironment(environment, release) {
|
|
133
167
|
return {
|
|
134
168
|
...environment,
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
169
|
+
[PRODUCT_IDENTITY.environment.releaseId]: release.releaseId,
|
|
170
|
+
[PRODUCT_IDENTITY.environment.releaseRoot]: release.releaseRoot,
|
|
171
|
+
[PRODUCT_IDENTITY.environment.releaseDigest]: release.contentDigest,
|
|
138
172
|
};
|
|
139
173
|
}
|
|
140
174
|
export async function waitForVerifiedEndpoint(path, release, timeoutMs) {
|
|
@@ -145,12 +179,12 @@ export async function waitForVerifiedEndpoint(path, release, timeoutMs) {
|
|
|
145
179
|
return;
|
|
146
180
|
await new Promise(resolvePromise => setTimeout(resolvePromise, 40));
|
|
147
181
|
}
|
|
148
|
-
throw new Error(`
|
|
182
|
+
throw new Error(PRODUCT_TEXT.diagnostic(`supervisor did not publish verified endpoint metadata within ${timeoutMs}ms`));
|
|
149
183
|
}
|
|
150
184
|
export async function readEndpointMetadata(path) {
|
|
151
185
|
try {
|
|
152
186
|
const value = JSON.parse(await readFile(path, "utf8"));
|
|
153
|
-
if (!value || typeof value.supervisorId !== "string" || typeof value.endpoint !== "string" || !Number.isSafeInteger(value.pid)
|
|
187
|
+
if (!value || value.schema !== PRODUCT_IDENTITY.protocol.supervisorSchema || typeof value.supervisorId !== "string" || typeof value.endpoint !== "string" || !Number.isSafeInteger(value.pid)
|
|
154
188
|
|| typeof value.pidStartIdentity !== "string" || typeof value.bootNonce !== "string" || typeof value.releaseId !== "string"
|
|
155
189
|
|| typeof value.releaseRoot !== "string" || typeof value.contentDigest !== "string" || !value.ownership
|
|
156
190
|
|| !Array.isArray(value.ownership.liveGenerationIds) || !Array.isArray(value.ownership.nonResumableGenerationIds)) {
|
|
@@ -273,11 +307,10 @@ export async function waitForProcessExit(pid, timeoutMs) {
|
|
|
273
307
|
return;
|
|
274
308
|
await new Promise(resolvePromise => setTimeout(resolvePromise, 25));
|
|
275
309
|
}
|
|
276
|
-
throw new Error(`
|
|
310
|
+
throw new Error(PRODUCT_TEXT.diagnostic(`supervisor ${pid} did not release process ownership within ${timeoutMs}ms`));
|
|
277
311
|
}
|
|
278
312
|
export async function removeEndpointArtifacts(metadataPath, endpoint) {
|
|
279
313
|
await rm(metadataPath, { force: true });
|
|
280
314
|
if (platform() !== "win32")
|
|
281
315
|
await rm(endpoint, { force: true });
|
|
282
316
|
}
|
|
283
|
-
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -37,4 +37,3 @@ export type CohortLaunchDecision = {
|
|
|
37
37
|
readonly pid: number | null;
|
|
38
38
|
};
|
|
39
39
|
export declare function selectCohortLaunch(candidate: MaterializedRelease, state: CohortState, endpoint: SupervisorEndpointMetadata | null, probe: OwnershipProbe): CohortLaunchDecision;
|
|
40
|
-
//# sourceMappingURL=cohort-selection.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MaterializedRelease } from "./release-store.js";
|
|
2
|
+
export declare const RELEASE_COHORT_SCHEMA: string;
|
|
2
3
|
export type ReleaseApproval = "candidate" | "approved" | "rejected";
|
|
3
4
|
export interface ReleaseRecord {
|
|
4
5
|
readonly releaseId: string;
|
|
@@ -18,7 +19,7 @@ export interface ReleaseReferences {
|
|
|
18
19
|
readonly retention: readonly string[];
|
|
19
20
|
}
|
|
20
21
|
export interface CohortState {
|
|
21
|
-
readonly
|
|
22
|
+
readonly schema: typeof RELEASE_COHORT_SCHEMA;
|
|
22
23
|
readonly revision: number;
|
|
23
24
|
readonly releases: Readonly<Record<string, ReleaseRecord>>;
|
|
24
25
|
readonly references: ReleaseReferences;
|
|
@@ -35,6 +36,7 @@ export interface EndpointOwnership {
|
|
|
35
36
|
readonly nonResumableGenerationIds: readonly string[];
|
|
36
37
|
}
|
|
37
38
|
export interface SupervisorEndpointMetadata {
|
|
39
|
+
readonly schema: string;
|
|
38
40
|
readonly supervisorId: string;
|
|
39
41
|
readonly endpoint: string;
|
|
40
42
|
readonly pid: number;
|
|
@@ -65,4 +67,3 @@ export declare class CohortStateStore {
|
|
|
65
67
|
removeUnreferencedRelease(releaseId: string, externalReferences: readonly string[]): Promise<CohortState>;
|
|
66
68
|
}
|
|
67
69
|
export declare function emptyState(): CohortState;
|
|
68
|
-
//# sourceMappingURL=cohort-state.d.ts.map
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { mkdir, open, readFile, rename, rm } from "node:fs/promises";
|
|
3
3
|
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
5
|
+
export const RELEASE_COHORT_SCHEMA = PRODUCT_IDENTITY.protocol.releaseCohortSchema;
|
|
4
6
|
export class CohortStateStore {
|
|
5
7
|
path;
|
|
6
8
|
constructor(dataDir) {
|
|
@@ -153,7 +155,7 @@ export class CohortStateStore {
|
|
|
153
155
|
}
|
|
154
156
|
export function emptyState() {
|
|
155
157
|
return {
|
|
156
|
-
|
|
158
|
+
schema: RELEASE_COHORT_SCHEMA,
|
|
157
159
|
revision: 0,
|
|
158
160
|
releases: {},
|
|
159
161
|
references: { active: null, pending: null, approved: null, rollback: null, retention: [] },
|
|
@@ -184,7 +186,7 @@ async function acquireLock(path) {
|
|
|
184
186
|
}
|
|
185
187
|
}
|
|
186
188
|
function validateState(state) {
|
|
187
|
-
if (state.
|
|
189
|
+
if (state.schema !== RELEASE_COHORT_SCHEMA || !Number.isSafeInteger(state.revision) || state.revision < 0)
|
|
188
190
|
throw new Error("invalid release cohort state");
|
|
189
191
|
for (const reference of [state.references.active, state.references.pending, state.references.approved, state.references.rollback]) {
|
|
190
192
|
if (reference !== null && !state.releases[reference])
|
|
@@ -193,9 +195,8 @@ function validateState(state) {
|
|
|
193
195
|
}
|
|
194
196
|
function validateTransition(current, next) {
|
|
195
197
|
validateState(next);
|
|
196
|
-
if (next.
|
|
198
|
+
if (next.schema !== current.schema)
|
|
197
199
|
throw new Error("release cohort schema cannot change during a state update");
|
|
198
200
|
if (next.revision !== current.revision)
|
|
199
201
|
throw new Error("release cohort revision is controlled by the state store");
|
|
200
202
|
}
|
|
201
|
-
//# sourceMappingURL=cohort-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function mapWithConcurrency<Value, Result>(values: readonly Value[], concurrency: number, operation: (value: Value, index: number) => Promise<Result>): Promise<Result[]>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export async function mapWithConcurrency(values, concurrency, operation) {
|
|
2
|
+
if (!Number.isSafeInteger(concurrency) || concurrency < 1)
|
|
3
|
+
throw new RangeError("concurrency must be a positive safe integer");
|
|
4
|
+
const results = new Array(values.length);
|
|
5
|
+
let nextIndex = 0;
|
|
6
|
+
const worker = async () => {
|
|
7
|
+
while (true) {
|
|
8
|
+
const index = nextIndex;
|
|
9
|
+
nextIndex += 1;
|
|
10
|
+
if (index >= values.length)
|
|
11
|
+
return;
|
|
12
|
+
results[index] = await operation(values[index], index);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, values.length) }, worker));
|
|
16
|
+
return results;
|
|
17
|
+
}
|