@timurproko/a1 0.1.8-dev.235df0e → 0.1.8-dev.260
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 +107 -67
- package/bin/cli.js +28 -10
- package/bin/guardian.js +8 -3
- package/bin/module-identity.js +69 -35
- package/bin/pi-tui.d.ts +6 -0
- package/bin/pi-tui.js +28 -0
- package/bin/release-cleanup.js +8 -0
- package/bin/supervisor.js +2 -2
- package/bin/sync-pi-tui-proxy.js +97 -0
- package/bin/ui.js +47 -20
- package/bin/warmup.js +27 -0
- package/dist/cli/capabilities.d.ts +6 -0
- package/dist/{src/cli → cli}/capabilities.js +1 -1
- package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
- package/dist/cli/dispatch.js +261 -0
- package/dist/cli/package-messages.d.ts +26 -0
- package/dist/cli/package-messages.js +71 -0
- package/dist/{src/cli → cli}/packages.d.ts +11 -2
- package/dist/{src/cli → cli}/packages.js +24 -27
- package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
- package/dist/cli/version-stats.js +112 -0
- package/dist/composition/agent-engine-bridge.d.ts +3 -0
- package/dist/composition/agent-engine-bridge.js +108 -0
- package/dist/composition/index.d.ts +3 -0
- package/dist/composition/index.js +3 -0
- package/dist/composition/owned-ui.d.ts +31 -0
- package/dist/composition/owned-ui.js +66 -0
- package/dist/composition/process.d.ts +16 -0
- package/dist/composition/process.js +45 -0
- package/dist/composition/settings-route-host.d.ts +8 -0
- package/dist/composition/settings-route-host.js +75 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +36 -0
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +25 -0
- package/dist/{src/features → features}/launch/development-launch.js +11 -3
- package/dist/{src/features → features}/launch/index.d.ts +0 -1
- package/dist/{src/features → features}/launch/index.js +0 -1
- package/dist/features/launch/intent.d.ts +10 -0
- package/dist/features/launch/intent.js +8 -0
- package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
- package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
- package/dist/{src/features → features}/launch/profile-paths.d.ts +1 -2
- package/dist/{src/features → features}/launch/profile-paths.js +2 -8
- package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
- package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
- package/dist/{src/features → features}/owned-ui/customization.js +3 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
- package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
- package/dist/{src/features → features}/owned-ui/index.js +2 -0
- package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
- package/dist/features/owned-ui/project-trust-prompt.js +149 -0
- package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
- package/dist/{src/features → features}/owned-ui/run.js +2 -0
- package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
- package/dist/features/owned-ui/session-fork-prompt.js +34 -0
- package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
- package/dist/{src/features → features}/owned-ui/settings-app.js +103 -54
- package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
- package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
- package/dist/{src/features → features}/workspace/reducer.js +2 -1
- package/dist/{src/features → features}/workspace/router.d.ts +2 -1
- package/dist/{src/features → features}/workspace/router.js +1 -0
- package/dist/{src/features → features}/workspace/store.d.ts +2 -1
- package/dist/{src/features → features}/workspace/store.js +1 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.js +18 -5
- package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
- package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
- package/dist/foundation/lifecycle/paths.d.ts +30 -0
- package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
- package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
- package/dist/foundation/lifecycle/session-selection.js +39 -0
- package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
- package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
- package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
- package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
- package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
- package/dist/{src/foundation → foundation}/release/bootstrap.d.ts +25 -6
- package/dist/{src/foundation → foundation}/release/bootstrap.js +124 -34
- package/dist/foundation/release/cohort-state.d.ts +156 -0
- package/dist/foundation/release/cohort-state.js +471 -0
- package/dist/foundation/release/dependency-layer.d.ts +82 -0
- package/dist/foundation/release/dependency-layer.js +497 -0
- package/dist/foundation/release/endpoints.d.ts +20 -0
- package/dist/foundation/release/endpoints.js +50 -0
- package/dist/foundation/release/immutable-platform.d.ts +6 -0
- package/dist/foundation/release/immutable-platform.js +13 -0
- package/dist/{src/foundation → foundation}/release/index.d.ts +4 -0
- package/dist/{src/foundation → foundation}/release/index.js +4 -0
- package/dist/foundation/release/release-gc.d.ts +71 -0
- package/dist/foundation/release/release-gc.js +734 -0
- package/dist/{src/foundation → foundation}/release/release-store.d.ts +7 -3
- package/dist/{src/foundation → foundation}/release/release-store.js +65 -13
- package/dist/{src/foundation → foundation}/release/release.d.ts +4 -1
- package/dist/{src/foundation → foundation}/release/release.js +10 -3
- package/dist/foundation/release/restart-certification.d.ts +67 -0
- package/dist/foundation/release/restart-certification.js +211 -0
- package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +1 -0
- package/dist/{src/foundation → foundation}/release/update-transaction.js +1 -0
- package/dist/{src/foundation → foundation}/release/update.d.ts +19 -3
- package/dist/{src/foundation → foundation}/release/update.js +116 -56
- package/dist/foundation/release/warmup.d.ts +3 -0
- package/dist/foundation/release/warmup.js +35 -0
- package/dist/foundation/startup/index.d.ts +1 -0
- package/dist/foundation/startup/index.js +1 -0
- package/dist/foundation/startup/startup-runtime.d.ts +36 -0
- package/dist/foundation/startup/startup-runtime.js +140 -0
- package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
- package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
- package/dist/foundation/supervision/index.d.ts +3 -0
- package/dist/foundation/supervision/index.js +3 -0
- package/dist/foundation/supervision/main.d.ts +1 -0
- package/dist/foundation/supervision/main.js +80 -0
- package/dist/foundation/supervision/paths.d.ts +1 -0
- package/dist/foundation/supervision/paths.js +1 -0
- package/dist/{src/foundation → foundation}/supervision/server.d.ts +19 -1
- package/dist/{src/foundation → foundation}/supervision/server.js +65 -3
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +1 -1
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +55 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +778 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.js +54 -6
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +3 -3
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +49 -18
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +36 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +78 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +25 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +92 -131
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +5 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +2 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.d.ts +57 -8
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +4 -2
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +13 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +27 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +10 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +36 -3
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +1 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +28 -4
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +714 -127
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +2 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +4 -2
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
- package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +47 -5
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
- package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
- package/dist/integrations/pi/engine/session-selection.js +90 -0
- package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
- package/dist/integrations/pi/engine/settings-effects.js +249 -0
- package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +18 -1
- package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
- package/dist/integrations/pi/session-ui/clipboard-image.js +29 -0
- package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.d.ts +1 -0
- package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.js +1 -0
- package/dist/integrations/pi/session-ui/prompt-chips.d.ts +23 -0
- package/dist/integrations/pi/session-ui/prompt-chips.js +246 -0
- package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
- package/dist/integrations/pi/session-ui/session-shell-root.d.ts +141 -0
- package/dist/integrations/pi/session-ui/session-shell-root.js +1158 -0
- package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
- package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/session-shell.js +479 -719
- package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +45 -0
- package/dist/integrations/pi/session-ui/session-viewport-controller.js +463 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
- package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
- package/dist/integrations/pi/session-ui/system-clipboard.js +130 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +8 -1
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +216 -9
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +29 -6
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +74 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +380 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.d.ts +2 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.js +2 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
- package/dist/native/darwin-arm64/manifest.json +4 -4
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +3 -3
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/{src/product-identity.d.ts → product-identity.d.ts} +3 -3
- package/dist/{src/product-identity.js → product-identity.js} +7 -5
- package/dist/{src/product-identity.json → product-identity.json} +11 -6
- package/dist/runtime-payload-inventory.json +122328 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
- package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +5 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.js +5 -0
- package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +1 -6
- package/dist/{src/foundation/ui-components → ui/components}/line-input.js +4 -9
- package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
- package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
- package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
- package/dist/{src/foundation/ui-components → ui/components}/mouse.js +23 -0
- package/dist/ui/components/progress-status.d.ts +2 -0
- package/dist/ui/components/progress-status.js +4 -0
- package/dist/ui/components/prompt-row.d.ts +14 -0
- package/dist/ui/components/prompt-row.js +20 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
- package/dist/ui/components/spans.d.ts +25 -0
- package/dist/ui/components/spans.js +257 -0
- package/dist/ui/components/submitted-prompt.d.ts +23 -0
- package/dist/ui/components/submitted-prompt.js +50 -0
- package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
- package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
- package/dist/ui/components/text-selection.d.ts +62 -0
- package/dist/ui/components/text-selection.js +208 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.js +66 -4
- package/dist/ui/components/transcript-viewport.d.ts +152 -0
- package/dist/ui/components/transcript-viewport.js +631 -0
- package/dist/ui/components/visible-hyperlinks.d.ts +19 -0
- package/dist/ui/components/visible-hyperlinks.js +64 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.js +33 -5
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +21 -2
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +32 -23
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.js +65 -55
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
- package/docs/architecture/boundaries.md +9 -9
- package/docs/architecture/code-documentation.md +77 -0
- package/docs/architecture/process-guardian-provenance.md +3 -1
- package/docs/architecture/project-structure.md +67 -30
- package/docs/architecture/resource-and-data-policy.md +1 -1
- package/docs/architecture/toolchain.md +10 -10
- package/docs/architecture/ui-reference-provenance.md +36 -5
- package/docs/ci-release-runbook.md +186 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/manual-ghost-link-baseline.md +89 -0
- package/docs/manual-launch-instance-acceptance.md +12 -35
- package/docs/manual-owned-ui-checkpoint.md +78 -0
- package/docs/manual-pi-boundary-candidate.md +4 -5
- package/docs/manual-terminal-colour-check.md +4 -3
- package/docs/repository-governance-live-acceptance.md +77 -0
- package/package.json +37 -27
- package/dist/src/cli/capabilities.d.ts +0 -15
- package/dist/src/cli/dispatch.js +0 -177
- package/dist/src/cli/version-stats.js +0 -72
- package/dist/src/composition/index.d.ts +0 -48
- package/dist/src/composition/index.js +0 -258
- package/dist/src/features/launch/intent.d.ts +0 -7
- package/dist/src/features/launch/intent.js +0 -4
- package/dist/src/features/launch/profiles.d.ts +0 -12
- package/dist/src/features/launch/profiles.js +0 -26
- package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
- package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
- package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
- package/dist/src/foundation/release/cohort-state.d.ts +0 -70
- package/dist/src/foundation/release/cohort-state.js +0 -202
- package/dist/src/foundation/release/release-gc.d.ts +0 -5
- package/dist/src/foundation/release/release-gc.js +0 -16
- package/dist/src/foundation/supervision/index.d.ts +0 -3
- package/dist/src/foundation/supervision/index.js +0 -3
- package/dist/src/foundation/supervision/main.d.ts +0 -1
- package/dist/src/foundation/supervision/main.js +0 -41
- package/dist/src/foundation/supervision/paths.d.ts +0 -1
- package/dist/src/foundation/supervision/paths.js +0 -1
- package/dist/src/foundation/ui-components/spans.d.ts +0 -7
- package/dist/src/foundation/ui-components/spans.js +0 -59
- package/docs/manual-transparent-checkpoint.md +0 -53
- /package/dist/{src/cli → cli}/index.d.ts +0 -0
- /package/dist/{src/cli → cli}/index.js +0 -0
- /package/dist/{src/cli → cli}/version.d.ts +0 -0
- /package/dist/{src/cli → cli}/version.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
- /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
- /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
- /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
- /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/index.js +0 -0
- /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/presentation.js +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
- /package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/route-host.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
|
@@ -2,10 +2,11 @@ import { DatabaseSync } from "node:sqlite";
|
|
|
2
2
|
import { mkdirSync } from "node:fs";
|
|
3
3
|
import { dirname } from "node:path";
|
|
4
4
|
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
5
|
-
import { assertManagedAgentDescriptor, assertRecoveryAuthority, assertTerminalSessionLaunch, assertTerminalTopologySnapshot, } from "
|
|
5
|
+
import { assertManagedAgentDescriptor, assertRecoveryAuthority, assertTerminalSessionLaunch, assertTerminalTopologySnapshot, } from "../../contracts/workspace/index.js";
|
|
6
6
|
import { assertLaunchInstance, assertLaunchInstanceOutcome, assertNativeProcessIdentity, assertProcessContainmentIdentity, } from "../lifecycle/index.js";
|
|
7
7
|
export const DEFAULT_WORKSPACE_ID = "workspace-default";
|
|
8
8
|
const INITIAL_WORKSPACE_ID = DEFAULT_WORKSPACE_ID;
|
|
9
|
+
/** Owns WAL-backed control persistence and reconciles prior-boot records before current use. */
|
|
9
10
|
export class ControlStore {
|
|
10
11
|
bootNonce;
|
|
11
12
|
database;
|
|
@@ -30,8 +31,8 @@ export class ControlStore {
|
|
|
30
31
|
migrate() {
|
|
31
32
|
const versionRow = this.database.prepare("PRAGMA user_version").get();
|
|
32
33
|
const version = versionRow.user_version;
|
|
33
|
-
if (version >
|
|
34
|
-
throw new Error(`control database version ${version} is newer than supported version
|
|
34
|
+
if (version > 6)
|
|
35
|
+
throw new Error(`control database version ${version} is newer than supported version 6`);
|
|
35
36
|
if (version !== 0)
|
|
36
37
|
this.#assertCurrentControlSchema();
|
|
37
38
|
if (version === 0) {
|
|
@@ -187,7 +188,7 @@ export class ControlStore {
|
|
|
187
188
|
CREATE TABLE launch_instances (
|
|
188
189
|
id TEXT PRIMARY KEY,
|
|
189
190
|
owner_client_id TEXT NOT NULL,
|
|
190
|
-
profile_id TEXT NOT NULL CHECK (profile_id IN ('a1', 'pi'
|
|
191
|
+
profile_id TEXT NOT NULL CHECK (profile_id IN ('a1', 'pi')),
|
|
191
192
|
state TEXT NOT NULL CHECK (state IN ('requested', 'active', 'stopping', 'completed', 'interrupted')),
|
|
192
193
|
shutdown_policy TEXT NOT NULL CHECK (shutdown_policy = 'terminate-tree-on-close'),
|
|
193
194
|
guardian_identity_json TEXT NOT NULL CHECK (json_valid(guardian_identity_json)),
|
|
@@ -208,6 +209,40 @@ export class ControlStore {
|
|
|
208
209
|
CREATE INDEX idx_launch_instances_boot ON launch_instances(owner_boot_nonce, state);
|
|
209
210
|
PRAGMA user_version = 5;
|
|
210
211
|
COMMIT;
|
|
212
|
+
`);
|
|
213
|
+
}
|
|
214
|
+
if (version <= 5) {
|
|
215
|
+
this.database.exec(`
|
|
216
|
+
BEGIN IMMEDIATE;
|
|
217
|
+
ALTER TABLE launch_instances RENAME TO launch_instances_v5;
|
|
218
|
+
DROP INDEX idx_launch_instances_owner;
|
|
219
|
+
DROP INDEX idx_launch_instances_boot;
|
|
220
|
+
CREATE TABLE launch_instances (
|
|
221
|
+
id TEXT PRIMARY KEY,
|
|
222
|
+
owner_client_id TEXT NOT NULL,
|
|
223
|
+
profile_id TEXT NOT NULL CHECK (profile_id IN ('a1', 'pi')),
|
|
224
|
+
state TEXT NOT NULL CHECK (state IN ('requested', 'active', 'stopping', 'completed', 'interrupted')),
|
|
225
|
+
shutdown_policy TEXT NOT NULL CHECK (shutdown_policy = 'terminate-tree-on-close'),
|
|
226
|
+
guardian_identity_json TEXT NOT NULL CHECK (json_valid(guardian_identity_json)),
|
|
227
|
+
root_identity_json TEXT CHECK (root_identity_json IS NULL OR json_valid(root_identity_json)),
|
|
228
|
+
containment_identity_json TEXT CHECK (containment_identity_json IS NULL OR json_valid(containment_identity_json)),
|
|
229
|
+
created_at TEXT NOT NULL,
|
|
230
|
+
activated_at TEXT,
|
|
231
|
+
stopping_at TEXT,
|
|
232
|
+
completed_at TEXT,
|
|
233
|
+
outcome_json TEXT CHECK (outcome_json IS NULL OR json_valid(outcome_json)),
|
|
234
|
+
owner_boot_nonce TEXT NOT NULL,
|
|
235
|
+
CHECK ((state = 'requested' AND root_identity_json IS NULL AND containment_identity_json IS NULL AND activated_at IS NULL AND stopping_at IS NULL AND completed_at IS NULL AND outcome_json IS NULL)
|
|
236
|
+
OR (state = 'active' AND root_identity_json IS NOT NULL AND containment_identity_json IS NOT NULL AND activated_at IS NOT NULL AND stopping_at IS NULL AND completed_at IS NULL AND outcome_json IS NULL)
|
|
237
|
+
OR (state = 'stopping' AND root_identity_json IS NOT NULL AND containment_identity_json IS NOT NULL AND activated_at IS NOT NULL AND stopping_at IS NOT NULL AND completed_at IS NULL AND outcome_json IS NULL)
|
|
238
|
+
OR (state IN ('completed', 'interrupted') AND completed_at IS NOT NULL AND outcome_json IS NOT NULL))
|
|
239
|
+
);
|
|
240
|
+
INSERT INTO launch_instances SELECT * FROM launch_instances_v5 WHERE profile_id IN ('a1', 'pi');
|
|
241
|
+
DROP TABLE launch_instances_v5;
|
|
242
|
+
CREATE INDEX idx_launch_instances_owner ON launch_instances(owner_client_id, state);
|
|
243
|
+
CREATE INDEX idx_launch_instances_boot ON launch_instances(owner_boot_nonce, state);
|
|
244
|
+
PRAGMA user_version = 6;
|
|
245
|
+
COMMIT;
|
|
211
246
|
`);
|
|
212
247
|
}
|
|
213
248
|
if (version === 0) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type StructuredCapabilityContract } from "
|
|
1
|
+
import { type StructuredCapabilityContract } from "../../contracts/workspace/index.js";
|
|
2
2
|
export type StructuredBackpressureResource = "events" | "commands" | "snapshots" | "attachments" | "reconnect-replay";
|
|
3
3
|
export type StructuredBackpressureAction = "none" | "reject-payload" | "pause-adapter" | "reject-request" | "disconnect-adapter";
|
|
4
4
|
export interface StructuredResourceLease {
|
|
@@ -33,6 +33,7 @@ export type StructuredBackpressureReleaseResult = {
|
|
|
33
33
|
readonly code: "unknown-lease" | "invalid-request";
|
|
34
34
|
readonly diagnostic: string;
|
|
35
35
|
};
|
|
36
|
+
/** Issues bounded resource leases and selects the negotiated backpressure action on exhaustion. */
|
|
36
37
|
export declare class StructuredBackpressureController {
|
|
37
38
|
#private;
|
|
38
39
|
readonly adapterId: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { assertStructuredCapability, } from "
|
|
1
|
+
import { assertStructuredCapability, } from "../../contracts/workspace/index.js";
|
|
2
|
+
/** Issues bounded resource leases and selects the negotiated backpressure action on exhaustion. */
|
|
2
3
|
export class StructuredBackpressureController {
|
|
3
4
|
adapterId;
|
|
4
5
|
#budgets;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type StructuredCapabilityContract, type WorkspaceCommand } from "
|
|
1
|
+
import { type StructuredCapabilityContract, type WorkspaceCommand } from "../../contracts/workspace/index.js";
|
|
2
2
|
export type StructuredCommandRequest = Extract<WorkspaceCommand, {
|
|
3
3
|
readonly type: "structured-command";
|
|
4
4
|
}>;
|
|
@@ -38,6 +38,7 @@ export type StructuredCommandOutcomeResult = {
|
|
|
38
38
|
readonly code: string;
|
|
39
39
|
readonly diagnostic: string;
|
|
40
40
|
};
|
|
41
|
+
/** Tracks structured commands by correlation identity through one idempotent terminal outcome. */
|
|
41
42
|
export declare class StructuredCommandTracker {
|
|
42
43
|
#private;
|
|
43
44
|
readonly agentId: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { assertStructuredCapability, assertWorkspaceCommand, } from "
|
|
1
|
+
import { assertStructuredCapability, assertWorkspaceCommand, } from "../../contracts/workspace/index.js";
|
|
2
|
+
/** Tracks structured commands by correlation identity through one idempotent terminal outcome. */
|
|
2
3
|
export class StructuredCommandTracker {
|
|
3
4
|
agentId;
|
|
4
5
|
#capability;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AdapterId, type StructuredCapabilityContract, type StructuredFlowLimits } from "
|
|
1
|
+
import { type AdapterId, type StructuredCapabilityContract, type StructuredFlowLimits } from "../../contracts/workspace/index.js";
|
|
2
2
|
export declare const STRUCTURED_ADAPTER_ENVELOPE: string;
|
|
3
3
|
export declare const STRUCTURED_ADAPTER_ENVELOPE_REVISION: 1;
|
|
4
4
|
export declare const REQUIRED_STRUCTURED_FEATURES: readonly ["identity.adapter.v1", "commands.correlated.v1", "events.typed.v1", "flow-control.limits.v1"];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WORKSPACE_CONTRACT_VERSION, assertStructuredCapability, } from "
|
|
1
|
+
import { WORKSPACE_CONTRACT_VERSION, assertStructuredCapability, } from "../../contracts/workspace/index.js";
|
|
2
2
|
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
3
3
|
export const STRUCTURED_ADAPTER_ENVELOPE = PRODUCT_IDENTITY.protocol.structuredAgentSchema;
|
|
4
4
|
export const STRUCTURED_ADAPTER_ENVELOPE_REVISION = 1;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AgentRecoveryAuthority, type StructuredAgentSnapshot, type StructuredCapabilityContract, type StructuredRecoveryAuthority } from "
|
|
1
|
+
import { type AgentRecoveryAuthority, type StructuredAgentSnapshot, type StructuredCapabilityContract, type StructuredRecoveryAuthority } from "../../contracts/workspace/index.js";
|
|
2
2
|
import { StructuredEventReducer, type StructuredRuntimeView } from "./state.js";
|
|
3
3
|
export interface StructuredResumeProof {
|
|
4
4
|
readonly protocolVersion: number;
|
|
@@ -30,6 +30,7 @@ export type StructuredReconnectionResult = {
|
|
|
30
30
|
readonly code: string;
|
|
31
31
|
readonly diagnostic: string;
|
|
32
32
|
};
|
|
33
|
+
/** Accepts a recovery boundary once after validating negotiated identity, proof, and protocol continuity. */
|
|
33
34
|
export declare class StructuredReconnectionManager {
|
|
34
35
|
#private;
|
|
35
36
|
constructor(capability: StructuredCapabilityContract);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { WORKSPACE_CONTRACT_VERSION, assertRecoveryAuthority, assertStructuredAgentSnapshot, assertStructuredCapability, } from "
|
|
1
|
+
import { WORKSPACE_CONTRACT_VERSION, assertRecoveryAuthority, assertStructuredAgentSnapshot, assertStructuredCapability, } from "../../contracts/workspace/index.js";
|
|
2
2
|
import { StructuredEventReducer } from "./state.js";
|
|
3
|
+
/** Accepts a recovery boundary once after validating negotiated identity, proof, and protocol continuity. */
|
|
3
4
|
export class StructuredReconnectionManager {
|
|
4
5
|
#capability;
|
|
5
6
|
#acceptedBoundaries = new Set();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type StructuredAgentSnapshot, type StructuredCapabilityContract, type WorkspaceEvent } from "
|
|
1
|
+
import { type StructuredAgentSnapshot, type StructuredCapabilityContract, type WorkspaceEvent } from "../../contracts/workspace/index.js";
|
|
2
2
|
export type StructuredAgentEvent = Extract<WorkspaceEvent, {
|
|
3
3
|
readonly type: "structured-event";
|
|
4
4
|
}>;
|
|
@@ -44,6 +44,7 @@ export type StructuredSnapshotApplyResult = {
|
|
|
44
44
|
readonly code: string;
|
|
45
45
|
readonly diagnostic: string;
|
|
46
46
|
};
|
|
47
|
+
/** Applies ordered structured events and snapshots while exposing gaps as explicit resynchronization. */
|
|
47
48
|
export declare class StructuredEventReducer {
|
|
48
49
|
#private;
|
|
49
50
|
readonly agentId: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { assertStructuredAgentSnapshot, assertStructuredCapability, assertWorkspaceEvent, } from "
|
|
1
|
+
import { assertStructuredAgentSnapshot, assertStructuredCapability, assertWorkspaceEvent, } from "../../contracts/workspace/index.js";
|
|
2
|
+
/** Applies ordered structured events and snapshots while exposing gaps as explicit resynchronization. */
|
|
2
3
|
export class StructuredEventReducer {
|
|
3
4
|
agentId;
|
|
4
5
|
#capability;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runSupervisor(arguments_?: readonly string[]): Promise<void>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { assertImmutableExecutionRoot, CohortStateStore, readCertifiedReleaseManifest, recordParentCertifiedRelease } from "../release/index.js";
|
|
5
|
+
import { publishSupervisorStartupResult, supervisorStartupFailure, supervisorStartupReady, supervisorStartupResultPath } from "../lifecycle/index.js";
|
|
6
|
+
import { ControlStore } from "../storage/index.js";
|
|
7
|
+
import { resolveCohortEndpoint, resolveProductPaths } from "./paths.js";
|
|
8
|
+
import { SupervisorServer } from "./server.js";
|
|
9
|
+
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
10
|
+
export async function runSupervisor(arguments_ = []) {
|
|
11
|
+
const productPaths = resolveProductPaths();
|
|
12
|
+
mkdirSync(productPaths.runtimeDir, { recursive: true, mode: 0o700 });
|
|
13
|
+
mkdirSync(productPaths.endpointsDir, { recursive: true, mode: 0o700 });
|
|
14
|
+
let paths = productPaths;
|
|
15
|
+
const log = (message) => appendFileSync(paths.supervisorLogPath, `${new Date().toISOString()} ${message}\n`);
|
|
16
|
+
const releaseRoot = process.env[PRODUCT_IDENTITY.environment.releaseRoot];
|
|
17
|
+
const releaseId = process.env[PRODUCT_IDENTITY.environment.releaseId];
|
|
18
|
+
const contentDigest = process.env[PRODUCT_IDENTITY.environment.releaseDigest];
|
|
19
|
+
const attemptId = startupAttempt(arguments_);
|
|
20
|
+
const resultPath = attemptId ? supervisorStartupResultPath(productPaths.runtimeDir, attemptId) : null;
|
|
21
|
+
let stage = "release-environment";
|
|
22
|
+
let server = null;
|
|
23
|
+
try {
|
|
24
|
+
if (!releaseRoot || !releaseId || !contentDigest)
|
|
25
|
+
throw new Error(PRODUCT_TEXT.diagnostic("supervisor must be launched from a verified immutable release"));
|
|
26
|
+
stage = "release-certification";
|
|
27
|
+
const release = await readCertifiedReleaseManifest({ releaseRoot, releaseId, contentDigest }, resolve(paths.dataDir, "releases"), { allowLegacyParentCertification: true });
|
|
28
|
+
// Compatibility: an older updater may have written release evidence before restart seals
|
|
29
|
+
// existed, even when its layer certification has already been upgraded by a retry.
|
|
30
|
+
await recordParentCertifiedRelease(release, paths.dataDir);
|
|
31
|
+
stage = "immutable-root";
|
|
32
|
+
await assertImmutableExecutionRoot(release, paths.dataDir);
|
|
33
|
+
// Protocol: one endpoint per cohort: a superseded cohort keeps serving what it already has while the
|
|
34
|
+
// installed release listens on its own address.
|
|
35
|
+
paths = { ...productPaths, ...resolveCohortEndpoint(productPaths, release.releaseId) };
|
|
36
|
+
stage = "storage";
|
|
37
|
+
const bootNonce = randomUUID();
|
|
38
|
+
const store = new ControlStore(paths.databasePath, bootNonce);
|
|
39
|
+
const cohortState = new CohortStateStore(paths.dataDir);
|
|
40
|
+
server = new SupervisorServer(store, paths, release, bootNonce, undefined, undefined, undefined, async () => (await cohortState.read()).references.active);
|
|
41
|
+
stage = "endpoint-listen";
|
|
42
|
+
await server.listen();
|
|
43
|
+
if (resultPath && attemptId)
|
|
44
|
+
await publishSupervisorStartupResult(resultPath, supervisorStartupReady(attemptId, release.releaseId));
|
|
45
|
+
log(`supervisor ${server.id} listening at ${paths.endpoint} (pid ${process.pid})`);
|
|
46
|
+
let closing = false;
|
|
47
|
+
const close = async (signal) => {
|
|
48
|
+
if (closing)
|
|
49
|
+
return;
|
|
50
|
+
closing = true;
|
|
51
|
+
log(`received ${signal}; stopping supervised process tree`);
|
|
52
|
+
await server?.close(true);
|
|
53
|
+
process.exitCode = 0;
|
|
54
|
+
};
|
|
55
|
+
process.on("SIGINT", () => void close("SIGINT"));
|
|
56
|
+
process.on("SIGTERM", () => void close("SIGTERM"));
|
|
57
|
+
process.on("uncaughtException", error => {
|
|
58
|
+
log(`uncaught exception: ${error.stack ?? error.message}`);
|
|
59
|
+
process.exitCode = 1;
|
|
60
|
+
});
|
|
61
|
+
process.on("unhandledRejection", error => log(`unhandled rejection: ${String(error)}`));
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
await server?.close(true).catch(() => undefined);
|
|
65
|
+
const message = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
66
|
+
log(`startup failure at ${stage}: ${message}`);
|
|
67
|
+
if (resultPath && attemptId && releaseId) {
|
|
68
|
+
await publishSupervisorStartupResult(resultPath, supervisorStartupFailure(error, attemptId, releaseId, stage)).catch(() => undefined);
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function startupAttempt(arguments_) {
|
|
74
|
+
if (arguments_.length === 0)
|
|
75
|
+
return null;
|
|
76
|
+
if (arguments_.length !== 2 || arguments_[0] !== "--startup-attempt" || !arguments_[1]) {
|
|
77
|
+
throw new Error(PRODUCT_TEXT.diagnostic("supervisor startup arguments are invalid"));
|
|
78
|
+
}
|
|
79
|
+
return arguments_[1];
|
|
80
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { resolveCohortEndpoint, resolveProductPaths, type CohortEndpointPaths, type ProductPaths, } from "../lifecycle/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { resolveCohortEndpoint, resolveProductPaths, } from "../lifecycle/index.js";
|
|
@@ -2,6 +2,7 @@ import { type SupervisorSnapshot } from "../lifecycle/index.js";
|
|
|
2
2
|
import { type MaterializedRelease } from "../release/index.js";
|
|
3
3
|
import { ControlStore } from "../storage/index.js";
|
|
4
4
|
import { type ProductPaths } from "./paths.js";
|
|
5
|
+
/** Owns one release-cohort endpoint and the authenticated launch instances registered through it. */
|
|
5
6
|
export declare class SupervisorServer {
|
|
6
7
|
#private;
|
|
7
8
|
readonly store: ControlStore;
|
|
@@ -9,14 +10,31 @@ export declare class SupervisorServer {
|
|
|
9
10
|
readonly terminateProcess: (code: number) => void;
|
|
10
11
|
readonly reconciliationDeadlineMs: number;
|
|
11
12
|
readonly shutdownDeadlineMs: number;
|
|
13
|
+
/**
|
|
14
|
+
* Which release new sessions start on. A cohort that is no longer that release keeps
|
|
15
|
+
* serving the instances it already has, takes no new ones, and exits when its last one
|
|
16
|
+
* leaves. Absent, this supervisor never considers itself superseded.
|
|
17
|
+
*/
|
|
18
|
+
readonly readActiveReleaseId: (() => Promise<string | null>) | null;
|
|
19
|
+
readonly supersededPollMs: number;
|
|
12
20
|
readonly id: `${string}-${string}-${string}-${string}-${string}`;
|
|
13
21
|
readonly bootNonce: string;
|
|
14
22
|
readonly pidStartIdentity: string;
|
|
15
23
|
readonly startedAt: string;
|
|
16
24
|
readonly paths: ProductPaths;
|
|
17
|
-
constructor(store: ControlStore, paths: ProductPaths | undefined, release: MaterializedRelease, bootNonce?: string, terminateProcess?: (code: number) => void, reconciliationDeadlineMs?: number, shutdownDeadlineMs?: number
|
|
25
|
+
constructor(store: ControlStore, paths: ProductPaths | undefined, release: MaterializedRelease, bootNonce?: string, terminateProcess?: (code: number) => void, reconciliationDeadlineMs?: number, shutdownDeadlineMs?: number,
|
|
26
|
+
/**
|
|
27
|
+
* Which release new sessions start on. A cohort that is no longer that release keeps
|
|
28
|
+
* serving the instances it already has, takes no new ones, and exits when its last one
|
|
29
|
+
* leaves. Absent, this supervisor never considers itself superseded.
|
|
30
|
+
*/
|
|
31
|
+
readActiveReleaseId?: (() => Promise<string | null>) | null, supersededPollMs?: number);
|
|
18
32
|
snapshot(): SupervisorSnapshot;
|
|
19
33
|
listen(): Promise<void>;
|
|
34
|
+
/** Whether new sessions start on some other release. */
|
|
35
|
+
get superseded(): boolean;
|
|
36
|
+
/** Leaves, taking this cohort's own endpoint artifacts with it. */
|
|
37
|
+
retire(): Promise<void>;
|
|
20
38
|
close(stopAgents?: boolean): Promise<void>;
|
|
21
39
|
closeForReleaseReplacement(stopAgents: boolean): Promise<void>;
|
|
22
40
|
}
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { mkdir, rename, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { chmod, lstat, mkdir, rename, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { createConnection, createServer } from "node:net";
|
|
4
4
|
import { platform } from "node:os";
|
|
5
|
+
import { dirname } from "node:path";
|
|
5
6
|
import { assertLaunchInstanceOutcome, assertNativeProcessIdentity, assertProcessContainmentIdentity, } from "../lifecycle/index.js";
|
|
6
7
|
import { encodeFrame, isCommandMessage, isControlHello, LineFrameDecoder, localControlHello, MAX_CONTROL_FRAME_BYTES, negotiateControlFeatures } from "../protocol/index.js";
|
|
7
8
|
import { processIsAlive } from "../release/index.js";
|
|
8
9
|
import { ControlStore } from "../storage/index.js";
|
|
9
10
|
import { resolveProductPaths } from "./paths.js";
|
|
10
11
|
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
12
|
+
/** Owns one release-cohort endpoint and the authenticated launch instances registered through it. */
|
|
11
13
|
export class SupervisorServer {
|
|
12
14
|
store;
|
|
13
15
|
release;
|
|
14
16
|
terminateProcess;
|
|
15
17
|
reconciliationDeadlineMs;
|
|
16
18
|
shutdownDeadlineMs;
|
|
19
|
+
readActiveReleaseId;
|
|
20
|
+
supersededPollMs;
|
|
17
21
|
id = randomUUID();
|
|
18
22
|
bootNonce;
|
|
19
23
|
pidStartIdentity = `${process.pid}:${Math.floor(Date.now() - process.uptime() * 1_000)}`;
|
|
@@ -31,12 +35,22 @@ export class SupervisorServer {
|
|
|
31
35
|
#results = new Map();
|
|
32
36
|
#metadataWrites = Promise.resolve();
|
|
33
37
|
#closing = false;
|
|
34
|
-
|
|
38
|
+
#superseded = false;
|
|
39
|
+
#supersededPoll = null;
|
|
40
|
+
constructor(store, paths = resolveProductPaths(), release, bootNonce = randomUUID(), terminateProcess = code => process.exit(code), reconciliationDeadlineMs = 3_000, shutdownDeadlineMs = 1_500,
|
|
41
|
+
/**
|
|
42
|
+
* Which release new sessions start on. A cohort that is no longer that release keeps
|
|
43
|
+
* serving the instances it already has, takes no new ones, and exits when its last one
|
|
44
|
+
* leaves. Absent, this supervisor never considers itself superseded.
|
|
45
|
+
*/
|
|
46
|
+
readActiveReleaseId = null, supersededPollMs = 1_000) {
|
|
35
47
|
this.store = store;
|
|
36
48
|
this.release = release;
|
|
37
49
|
this.terminateProcess = terminateProcess;
|
|
38
50
|
this.reconciliationDeadlineMs = reconciliationDeadlineMs;
|
|
39
51
|
this.shutdownDeadlineMs = shutdownDeadlineMs;
|
|
52
|
+
this.readActiveReleaseId = readActiveReleaseId;
|
|
53
|
+
this.supersededPollMs = supersededPollMs;
|
|
40
54
|
this.bootNonce = bootNonce;
|
|
41
55
|
this.paths = paths;
|
|
42
56
|
for (const instance of store.loadActiveLaunchInstances())
|
|
@@ -56,7 +70,10 @@ export class SupervisorServer {
|
|
|
56
70
|
if (this.#server)
|
|
57
71
|
throw new Error("supervisor is already listening");
|
|
58
72
|
await mkdir(this.paths.runtimeDir, { recursive: true, mode: 0o700 });
|
|
73
|
+
await mkdir(this.paths.endpointsDir, { recursive: true, mode: 0o700 });
|
|
59
74
|
if (platform() !== "win32") {
|
|
75
|
+
if (this.paths.endpointDirectory)
|
|
76
|
+
await ensureManagedEndpointDirectory(dirname(this.paths.endpoint));
|
|
60
77
|
if (await endpointIsLive(this.paths.endpoint))
|
|
61
78
|
throw new Error(PRODUCT_TEXT.diagnostic(`supervisor already owns ${this.paths.endpoint}`));
|
|
62
79
|
await rm(this.paths.endpoint, { force: true });
|
|
@@ -71,12 +88,41 @@ export class SupervisorServer {
|
|
|
71
88
|
});
|
|
72
89
|
});
|
|
73
90
|
await this.#writeEndpointMetadata();
|
|
91
|
+
if (this.readActiveReleaseId) {
|
|
92
|
+
const poll = setInterval(() => void this.#refreshCohortRole(), this.supersededPollMs);
|
|
93
|
+
poll.unref();
|
|
94
|
+
this.#supersededPoll = poll;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Invariant: superseding a cohort never interrupts its held instances; it retires only when empty.
|
|
98
|
+
async #refreshCohortRole() {
|
|
99
|
+
if (this.#closing || !this.readActiveReleaseId)
|
|
100
|
+
return;
|
|
101
|
+
const active = await this.readActiveReleaseId().catch(() => null);
|
|
102
|
+
if (active === null)
|
|
103
|
+
return;
|
|
104
|
+
this.#superseded = active !== this.release.releaseId;
|
|
105
|
+
if (this.#superseded && this.#instances.size === 0)
|
|
106
|
+
await this.retire();
|
|
107
|
+
}
|
|
108
|
+
/** Whether new sessions start on some other release. */
|
|
109
|
+
get superseded() {
|
|
110
|
+
return this.#superseded;
|
|
111
|
+
}
|
|
112
|
+
/** Leaves, taking this cohort's own endpoint artifacts with it. */
|
|
113
|
+
async retire() {
|
|
114
|
+
if (this.#closing)
|
|
115
|
+
return;
|
|
116
|
+
await this.close(false);
|
|
74
117
|
}
|
|
75
118
|
async close(stopAgents = false) {
|
|
76
119
|
if (stopAgents && !await this.#drainInstances("update", this.shutdownDeadlineMs)) {
|
|
77
120
|
throw new Error("active launch instances did not release ownership within the shutdown deadline");
|
|
78
121
|
}
|
|
79
122
|
this.#closing = true;
|
|
123
|
+
if (this.#supersededPoll)
|
|
124
|
+
clearInterval(this.#supersededPoll);
|
|
125
|
+
this.#supersededPoll = null;
|
|
80
126
|
for (const client of this.#clients)
|
|
81
127
|
client.destroy();
|
|
82
128
|
if (this.#server)
|
|
@@ -197,6 +243,9 @@ export class SupervisorServer {
|
|
|
197
243
|
#createLaunchInstance(command, socket, clientId) {
|
|
198
244
|
assertNativeProcessIdentity(command.guardianIdentity);
|
|
199
245
|
const existing = this.store.loadLaunchInstance(command.instanceId);
|
|
246
|
+
if (this.#superseded && !existing) {
|
|
247
|
+
throw new Error(PRODUCT_TEXT.diagnostic(`release ${this.release.releaseId} is no longer the release new sessions start on`));
|
|
248
|
+
}
|
|
200
249
|
if (existing) {
|
|
201
250
|
if (existing.ownerClientId !== clientId
|
|
202
251
|
|| existing.profileId !== command.profileId
|
|
@@ -279,6 +328,9 @@ export class SupervisorServer {
|
|
|
279
328
|
this.#uncertainInstances.delete(stored.id);
|
|
280
329
|
this.#unbindOwner(stored.id, socket);
|
|
281
330
|
this.#mutated();
|
|
331
|
+
// Invariant: the last session on a superseded cohort has left; there is nothing here to keep.
|
|
332
|
+
if (this.#superseded && this.#instances.size === 0)
|
|
333
|
+
void this.retire();
|
|
282
334
|
}
|
|
283
335
|
#ownedInstance(instanceId, socket, clientId) {
|
|
284
336
|
const instance = this.#instances.get(instanceId) ?? this.store.loadLaunchInstance(instanceId);
|
|
@@ -370,7 +422,7 @@ export class SupervisorServer {
|
|
|
370
422
|
const deadline = Date.now() + timeoutMs;
|
|
371
423
|
while (Date.now() < deadline) {
|
|
372
424
|
if (this.#instances.size === 0) {
|
|
373
|
-
//
|
|
425
|
+
// Concurrency: allow the terminal command result to flush before closing owner sockets.
|
|
374
426
|
await new Promise(resolvePromise => setTimeout(resolvePromise, 25));
|
|
375
427
|
return this.#instances.size === 0;
|
|
376
428
|
}
|
|
@@ -440,6 +492,16 @@ function sameContainmentIdentity(left, right) {
|
|
|
440
492
|
function isMessageType(value, type) {
|
|
441
493
|
return typeof value === "object" && value !== null && "type" in value && value.type === type;
|
|
442
494
|
}
|
|
495
|
+
async function ensureManagedEndpointDirectory(path) {
|
|
496
|
+
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
497
|
+
const metadata = await lstat(path);
|
|
498
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink())
|
|
499
|
+
throw new Error(`managed endpoint path is not a directory: ${path}`);
|
|
500
|
+
const currentUser = process.getuid?.();
|
|
501
|
+
if (currentUser !== undefined && metadata.uid !== currentUser)
|
|
502
|
+
throw new Error(`managed endpoint directory has another owner: ${path}`);
|
|
503
|
+
await chmod(path, 0o700);
|
|
504
|
+
}
|
|
443
505
|
async function endpointIsLive(endpoint) {
|
|
444
506
|
return await new Promise(resolve => {
|
|
445
507
|
const socket = createConnection(endpoint);
|
package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OwnedUiTranscriptBlock } from "
|
|
1
|
+
import type { OwnedUiTranscriptBlock } from "../../../contracts/owned-ui/index.js";
|
|
2
2
|
export declare function adaptPiUserMessage(block: OwnedUiTranscriptBlock, width: number): readonly string[];
|
|
3
3
|
export declare function adaptPiAssistantMessage(block: OwnedUiTranscriptBlock, width: number): readonly string[];
|
|
4
4
|
export declare function adaptPiToolExecution(block: OwnedUiTranscriptBlock, width: number, cwd: string): readonly string[];
|
package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts
RENAMED
|
@@ -10,6 +10,7 @@ export interface PiComponentConformanceReport {
|
|
|
10
10
|
readonly componentResults: readonly PiComponentConformanceResult[];
|
|
11
11
|
readonly componentFamilies: readonly string[];
|
|
12
12
|
}
|
|
13
|
+
/** Identifies the Pi presentation-conformance stage that failed against the pinned component surface. */
|
|
13
14
|
export declare class PiComponentConformanceError extends Error {
|
|
14
15
|
readonly stage: "theme" | "components";
|
|
15
16
|
constructor(stage: "theme" | "components", cause: unknown);
|
package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js
RENAMED
|
@@ -2,9 +2,10 @@ import { mkdtemp, rm } from "node:fs/promises";
|
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { AssistantMessageComponent, ExtensionSelectorComponent, initTheme, LoginDialogComponent, ModelSelectorComponent, SettingsSelectorComponent, ThemeSelectorComponent, ThinkingSelectorComponent, ToolExecutionComponent, UserMessageComponent, UserMessageSelectorComponent, VERSION, } from "@earendil-works/pi-coding-agent";
|
|
5
|
-
import { OWNED_UI_CONTRACT_VERSION } from "
|
|
5
|
+
import { OWNED_UI_CONTRACT_VERSION } from "../../../contracts/owned-ui/index.js";
|
|
6
6
|
import { createTuiFacade, validatedAssistantMessage } from "./shell-components.js";
|
|
7
|
-
import { PRODUCT_IDENTITY } from "
|
|
7
|
+
import { PRODUCT_IDENTITY } from "../../../product-identity.js";
|
|
8
|
+
/** Identifies the Pi presentation-conformance stage that failed against the pinned component surface. */
|
|
8
9
|
export class PiComponentConformanceError extends Error {
|
|
9
10
|
stage;
|
|
10
11
|
constructor(stage, cause) {
|
|
@@ -3,7 +3,7 @@ export * from "./conformance.js";
|
|
|
3
3
|
export * from "./shell-components.js";
|
|
4
4
|
export * from "./theme.js";
|
|
5
5
|
export * from "./upstream/theme/theme-controller.js";
|
|
6
|
-
export { applyConfiguredPiTheme, getAvailablePiThemes } from "./upstream/theme/theme.js";
|
|
6
|
+
export { applyConfiguredPiTheme, getAvailablePiThemes, onPiThemeChange } from "./upstream/theme/theme.js";
|
|
7
7
|
export * from "./upstream/components/countdown-timer.js";
|
|
8
8
|
export * from "./upstream/components/extension-editor.js";
|
|
9
9
|
export * from "./upstream/components/session-selector.js";
|
|
@@ -3,7 +3,7 @@ export * from "./conformance.js";
|
|
|
3
3
|
export * from "./shell-components.js";
|
|
4
4
|
export * from "./theme.js";
|
|
5
5
|
export * from "./upstream/theme/theme-controller.js";
|
|
6
|
-
export { applyConfiguredPiTheme, getAvailablePiThemes } from "./upstream/theme/theme.js";
|
|
6
|
+
export { applyConfiguredPiTheme, getAvailablePiThemes, onPiThemeChange } from "./upstream/theme/theme.js";
|
|
7
7
|
export * from "./upstream/components/countdown-timer.js";
|
|
8
8
|
export * from "./upstream/components/extension-editor.js";
|
|
9
9
|
export * from "./upstream/components/session-selector.js";
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type Editor } from "#pi-tui";
|
|
2
|
+
import type { KeybindingsManager } from "./upstream/adjacent/core/keybindings.js";
|
|
3
|
+
import type { PiShellClipboardContent, PiShellEditorTextRange } from "./shell-shared-facade.js";
|
|
4
|
+
/**
|
|
5
|
+
* Middleware boundary around Pi's editor. Interceptors may claim an input or
|
|
6
|
+
* delegate to the next interceptor/vanilla editor, and may decorate the rows
|
|
7
|
+
* vanilla Pi renders. This keeps owned UX additions out of the synchronized
|
|
8
|
+
* Pi editor port and gives future interactions one registration point.
|
|
9
|
+
*/
|
|
10
|
+
export interface OwnedEditorUxInterceptor {
|
|
11
|
+
handleInput(data: string, next: () => void): void;
|
|
12
|
+
render(width: number, next: () => string[]): string[];
|
|
13
|
+
reset(): void;
|
|
14
|
+
handlePointer?(event: OwnedEditorPointerEvent): boolean;
|
|
15
|
+
hasSelection?(): boolean;
|
|
16
|
+
ownsPointer?(): boolean;
|
|
17
|
+
pasteClipboard?(): boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface OwnedEditorPointerEvent {
|
|
20
|
+
readonly kind: "press" | "motion" | "release";
|
|
21
|
+
readonly button: number;
|
|
22
|
+
readonly column: number;
|
|
23
|
+
/** One-based row relative to the top of the editor component. */
|
|
24
|
+
readonly row: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class OwnedEditorUxInterception {
|
|
27
|
+
readonly interceptors: readonly OwnedEditorUxInterceptor[];
|
|
28
|
+
readonly fallback: {
|
|
29
|
+
handleInput(data: string): void;
|
|
30
|
+
render(width: number): string[];
|
|
31
|
+
};
|
|
32
|
+
constructor(interceptors: readonly OwnedEditorUxInterceptor[], fallback: {
|
|
33
|
+
handleInput(data: string): void;
|
|
34
|
+
render(width: number): string[];
|
|
35
|
+
});
|
|
36
|
+
handleInput(data: string): void;
|
|
37
|
+
render(width: number): string[];
|
|
38
|
+
reset(): void;
|
|
39
|
+
handlePointer(event: OwnedEditorPointerEvent): boolean;
|
|
40
|
+
hasSelection(): boolean;
|
|
41
|
+
ownsPointer(): boolean;
|
|
42
|
+
pasteClipboard(): boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface PromptSelectionUxOptions {
|
|
45
|
+
readonly copyText: (text: string) => void;
|
|
46
|
+
readonly readClipboardContent: () => Promise<PiShellClipboardContent | null>;
|
|
47
|
+
readonly transformPastedContent: (content: PiShellClipboardContent) => string;
|
|
48
|
+
readonly atomicRanges: (line: string) => readonly PiShellEditorTextRange[];
|
|
49
|
+
readonly expandCopiedText: (text: string) => string;
|
|
50
|
+
readonly paintSelection: (line: string, from: number, to: number, atomic: boolean) => string;
|
|
51
|
+
readonly decorateRow: (row: string, width: number) => string;
|
|
52
|
+
readonly requestRender: () => void;
|
|
53
|
+
readonly getRows: () => number;
|
|
54
|
+
}
|
|
55
|
+
export declare function createPromptSelectionInterceptor(editor: Editor, keybindings: KeybindingsManager, options: PromptSelectionUxOptions): OwnedEditorUxInterceptor;
|