@timurproko/a1 0.1.8-dev.21b95d6 → 0.1.8-dev.224
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 +4 -1
- 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 +1 -1
- package/bin/sync-pi-tui-proxy.js +97 -0
- package/bin/ui.js +25 -6
- package/bin/warmup.js +18 -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 +6 -0
- package/dist/cli/dispatch.js +202 -0
- package/dist/{src/cli → cli}/packages.d.ts +10 -2
- package/dist/{src/cli → cli}/packages.js +24 -20
- 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 +28 -0
- package/dist/composition/owned-ui.js +64 -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/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/{src/features → features}/launch/intent.d.ts +3 -2
- package/dist/features/launch/intent.js +3 -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 +1 -0
- package/dist/{src/features → features}/owned-ui/index.js +1 -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/{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.js +10 -2
- 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 +28 -0
- package/dist/{src/foundation → foundation}/lifecycle/paths.js +21 -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/{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 +1 -0
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +1 -0
- 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 +14 -4
- package/dist/{src/foundation → foundation}/release/bootstrap.js +66 -13
- package/dist/foundation/release/cohort-state.d.ts +131 -0
- package/dist/foundation/release/cohort-state.js +384 -0
- package/dist/foundation/release/dependency-layer.d.ts +78 -0
- package/dist/foundation/release/dependency-layer.js +487 -0
- package/dist/foundation/release/endpoints.d.ts +20 -0
- package/dist/foundation/release/endpoints.js +50 -0
- package/dist/{src/foundation → foundation}/release/index.d.ts +3 -0
- package/dist/{src/foundation → foundation}/release/index.js +3 -0
- package/dist/foundation/release/release-gc.d.ts +60 -0
- package/dist/foundation/release/release-gc.js +538 -0
- package/dist/{src/foundation → foundation}/release/release-store.d.ts +3 -1
- package/dist/{src/foundation → foundation}/release/release-store.js +60 -10
- package/dist/{src/foundation → foundation}/release/release.d.ts +4 -1
- package/dist/{src/foundation → foundation}/release/release.js +10 -3
- 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 +114 -54
- 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/{src/foundation → foundation}/supervision/main.js +11 -5
- 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 +51 -2
- 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/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 +32 -17
- 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 +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.d.ts +52 -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 +22 -4
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +289 -68
- 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 +3 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +3 -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 +2 -2
- 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 +16 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +39 -4
- 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/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/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 +137 -0
- package/dist/integrations/pi/session-ui/session-shell-root.js +1106 -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 +415 -775
- package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +44 -0
- package/dist/integrations/pi/session-ui/session-viewport-controller.js +434 -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 +63 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +240 -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 +1 -1
- 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 +4 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.js +4 -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 +235 -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 +146 -0
- package/dist/ui/components/transcript-viewport.js +629 -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/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 +34 -5
- package/docs/ci-release-runbook.md +186 -79
- package/docs/features/launch-profiles.md +10 -19
- 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.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 -112
- 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/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.d.ts +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}/launch-guardian/main.d.ts +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/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/index.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}/process-containment/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/index.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 → foundation}/supervision/main.d.ts +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}/index.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.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}/shell-selectors-dialogs.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.d.ts +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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry,
|
|
1
|
+
import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, dialogValueColumn, numericValues, RAIL_COLUMNS, renderDialogPanel, renderEmptyState, renderGroupHeader, renderInputRow, renderListRow, renderNote, renderStatusLine, dialogRowAt, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, isThumbRow, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
|
|
2
2
|
export const SETTINGS_APP_ID = "settings";
|
|
3
3
|
export const SETTINGS_ROUTE = "settings";
|
|
4
4
|
const SCOPE = SETTINGS_APP_ID;
|
|
@@ -29,6 +29,7 @@ SETTINGS_SHORTCUTS.declare({ key: "left", scope: DIALOG_SCOPE, description: "Cha
|
|
|
29
29
|
SETTINGS_SHORTCUTS.declare({ key: "right", scope: DIALOG_SCOPE, description: "Change this part", section: "Parts" }, "part-change");
|
|
30
30
|
SETTINGS_SHORTCUTS.declare({ key: "up", scope: DIALOG_SCOPE, description: "Previous part", section: "Parts" }, "part-previous");
|
|
31
31
|
SETTINGS_SHORTCUTS.declare({ key: "down", scope: DIALOG_SCOPE, description: "Next part", section: "Parts" }, "part-next");
|
|
32
|
+
assertNoShortcutConflicts(SETTINGS_SHORTCUTS.assemble());
|
|
32
33
|
const KEYS = {
|
|
33
34
|
"\u001b[A": "up",
|
|
34
35
|
"\u001b[B": "down",
|
|
@@ -56,6 +57,8 @@ export class SettingsApp {
|
|
|
56
57
|
#session;
|
|
57
58
|
#selectedKey;
|
|
58
59
|
#scroll = 0;
|
|
60
|
+
// Invariant: keyboard navigation requests visibility once; pointer scrolling then stays free.
|
|
61
|
+
#selectionNeedsReveal = true;
|
|
59
62
|
#reveal;
|
|
60
63
|
#notice = null;
|
|
61
64
|
#filter = null;
|
|
@@ -63,19 +66,15 @@ export class SettingsApp {
|
|
|
63
66
|
#structured = null;
|
|
64
67
|
#loading = true;
|
|
65
68
|
#interruptArmed = false;
|
|
66
|
-
|
|
69
|
+
// Invariant: pending values remain visible until the source reflects them.
|
|
67
70
|
#pending = new Map();
|
|
68
71
|
#footerHeight = 1;
|
|
69
|
-
/** Column the dialog's values start at, so a label stays a label. */
|
|
70
72
|
#dialogValueColumn = 0;
|
|
71
|
-
/** Screen row the dialog panel starts on, for pointer hits. */
|
|
72
73
|
#panelTop = 0;
|
|
73
74
|
#panelTopForFrame = 0;
|
|
74
|
-
/** Row key under the pointer, and where each row was drawn last frame. */
|
|
75
75
|
#hoverKey = null;
|
|
76
76
|
#hoverRegion = "label";
|
|
77
77
|
#frameRows = [];
|
|
78
|
-
/** Where the value menu was drawn last frame, for hit testing. */
|
|
79
78
|
#menuFrame = null;
|
|
80
79
|
constructor(session) {
|
|
81
80
|
this.#session = session;
|
|
@@ -90,15 +89,19 @@ export class SettingsApp {
|
|
|
90
89
|
const theme = host.theme ?? PLAIN_THEME;
|
|
91
90
|
this.#interruptArmed = host.interruptArmed;
|
|
92
91
|
const rows = this.#rows();
|
|
92
|
+
const selected = indexOfKey(rows, this.#selectedKey);
|
|
93
93
|
const footer = this.#footerLines(rect.width, theme);
|
|
94
94
|
this.#footerHeight = footer.length;
|
|
95
95
|
this.#panelTopForFrame = Math.max(0, rect.height - footer.length);
|
|
96
96
|
this.#panelTop = this.#panelTopForFrame;
|
|
97
97
|
const bodyHeight = Math.max(0, rect.height - footer.length);
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
if (this.#selectionNeedsReveal) {
|
|
99
|
+
this.#scroll = scrollForSelection(rows, bodyHeight, this.#scroll, selected, this.#reveal);
|
|
100
|
+
this.#selectionNeedsReveal = false;
|
|
101
|
+
}
|
|
100
102
|
this.#reveal = undefined;
|
|
101
103
|
const layout = layoutList(rows, bodyHeight, this.#scroll);
|
|
104
|
+
this.#scroll = layout.scroll;
|
|
102
105
|
const contentWidth = Math.max(0, rect.width - RAIL_COLUMNS);
|
|
103
106
|
const valueColumn = this.#valueColumn(rows);
|
|
104
107
|
const geometry = scrollbarGeometry({
|
|
@@ -121,14 +124,13 @@ export class SettingsApp {
|
|
|
121
124
|
for (const index of layout.rowIndexes) {
|
|
122
125
|
const row = rows[index];
|
|
123
126
|
if (row !== undefined && row.kind === "element") {
|
|
127
|
+
const view = this.#viewRow(row.value);
|
|
124
128
|
this.#frameRows.push({
|
|
125
|
-
key:
|
|
129
|
+
key: view.key,
|
|
126
130
|
screenRow: body.length,
|
|
127
131
|
valueColumn,
|
|
128
|
-
valueWidth:
|
|
129
|
-
|
|
130
|
-
: row.value.value === null ? 0 : displayWidth(displayValue(row.value.value)),
|
|
131
|
-
stepper: isStepper(row.value),
|
|
132
|
+
valueWidth: displayWidth(view.value),
|
|
133
|
+
stepper: view.stepper !== undefined,
|
|
132
134
|
});
|
|
133
135
|
}
|
|
134
136
|
body.push(this.#renderRow(row, index === selected, contentWidth, valueColumn, theme));
|
|
@@ -148,7 +150,8 @@ export class SettingsApp {
|
|
|
148
150
|
return this.#menuKey(data);
|
|
149
151
|
if (this.#filter !== null)
|
|
150
152
|
return this.#filterKey(data);
|
|
151
|
-
const
|
|
153
|
+
const key = KEYS[data] ?? data;
|
|
154
|
+
const action = SETTINGS_SHORTCUTS.resolve(key, SCOPE);
|
|
152
155
|
if (action === null)
|
|
153
156
|
return { consumed: false };
|
|
154
157
|
const rows = this.#rows();
|
|
@@ -186,11 +189,14 @@ export class SettingsApp {
|
|
|
186
189
|
}
|
|
187
190
|
case "first":
|
|
188
191
|
case "last": {
|
|
189
|
-
// End lands on the very last setting, not on the head of its section.
|
|
192
|
+
// Invariant: End lands on the very last setting, not on the head of its section.
|
|
190
193
|
const selectable = selectableIndexes(rows);
|
|
191
194
|
const target = action === "last" ? selectable.at(-1) : selectable[0];
|
|
192
|
-
if (target !== undefined)
|
|
193
|
-
this.#
|
|
195
|
+
if (target !== undefined) {
|
|
196
|
+
this.#select(rows, target);
|
|
197
|
+
if (action === "first")
|
|
198
|
+
this.#scroll = 0;
|
|
199
|
+
}
|
|
194
200
|
return { consumed: true };
|
|
195
201
|
}
|
|
196
202
|
case "previous-value":
|
|
@@ -208,7 +214,7 @@ export class SettingsApp {
|
|
|
208
214
|
const overRow = menuRowAt(frame, event.row - 1, event.column);
|
|
209
215
|
const overMenu = overRow !== null;
|
|
210
216
|
if (event.kind === "motion") {
|
|
211
|
-
//
|
|
217
|
+
// Invariant: the menu owns the pointer, but the row it came from is still the thing
|
|
212
218
|
// being changed, so its value keeps reading as the one under the pointer.
|
|
213
219
|
// Only a dialog that takes the screen puts that out.
|
|
214
220
|
const hadHover = this.#hoverKey !== menu.anchorKey || this.#hoverRegion !== "value";
|
|
@@ -227,7 +233,7 @@ export class SettingsApp {
|
|
|
227
233
|
if (event.kind !== "press")
|
|
228
234
|
return { consumed: true, render: false };
|
|
229
235
|
if (overRow === null) {
|
|
230
|
-
//
|
|
236
|
+
// Invariant: a press anywhere else dismisses the menu rather than acting through it.
|
|
231
237
|
this.#menu = null;
|
|
232
238
|
return { consumed: true };
|
|
233
239
|
}
|
|
@@ -239,7 +245,7 @@ export class SettingsApp {
|
|
|
239
245
|
}
|
|
240
246
|
const open = this.#structured;
|
|
241
247
|
if (open !== null) {
|
|
242
|
-
//
|
|
248
|
+
// Invariant: the panel owns the pointer while it is open; its flag rows are the targets.
|
|
243
249
|
// The panel's rows begin one line below its rule.
|
|
244
250
|
const panel = { firstRow: this.#panelTop + 1, rows: open.flags.length, valueColumn: this.#dialogValueColumn };
|
|
245
251
|
const row = event.row - 1 - panel.firstRow;
|
|
@@ -253,7 +259,7 @@ export class SettingsApp {
|
|
|
253
259
|
}
|
|
254
260
|
if (event.kind === "press") {
|
|
255
261
|
open.index = row;
|
|
256
|
-
//
|
|
262
|
+
// Rationale: pointing at the label picks the row; the value is what changes it,
|
|
257
263
|
// exactly as in the list behind the dialog.
|
|
258
264
|
const key = open.flags[row] ?? "";
|
|
259
265
|
const width = displayWidth((open.record[key] ?? false) ? "true" : "false");
|
|
@@ -263,6 +269,15 @@ export class SettingsApp {
|
|
|
263
269
|
}
|
|
264
270
|
return { consumed: true, render: false };
|
|
265
271
|
}
|
|
272
|
+
if (event.kind === "wheel-up" || event.kind === "wheel-down") {
|
|
273
|
+
// Invariant: the whole list pane owns wheel scrolling, including blank space beside
|
|
274
|
+
// short labels. It must not depend on finding an item under the pointer.
|
|
275
|
+
if (event.row < 1 || event.row > this.#panelTopForFrame)
|
|
276
|
+
return { consumed: false };
|
|
277
|
+
const distance = scrollbarWheelRows(this.#scrollbarSpeed());
|
|
278
|
+
this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? distance : -distance));
|
|
279
|
+
return { consumed: true };
|
|
280
|
+
}
|
|
266
281
|
const row = this.#frameRows.find(candidate => candidate.screenRow === event.row - 1);
|
|
267
282
|
const previousKey = this.#hoverKey;
|
|
268
283
|
const previousRegion = this.#hoverRegion;
|
|
@@ -277,7 +292,7 @@ export class SettingsApp {
|
|
|
277
292
|
const rows = this.#rows();
|
|
278
293
|
const index = rows.findIndex(candidate => rowKey(candidate) === row.key);
|
|
279
294
|
if (index >= 0) {
|
|
280
|
-
//
|
|
295
|
+
// Rationale: the pointer acts where it points; the arrow belongs to the keyboard.
|
|
281
296
|
this.#notice = null;
|
|
282
297
|
if (this.#hoverRegion === "minus")
|
|
283
298
|
this.#cycle(rows, index, -1);
|
|
@@ -288,10 +303,6 @@ export class SettingsApp {
|
|
|
288
303
|
}
|
|
289
304
|
return { consumed: true };
|
|
290
305
|
}
|
|
291
|
-
if (event.kind === "wheel-up" || event.kind === "wheel-down") {
|
|
292
|
-
this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? 3 : -3));
|
|
293
|
-
return { consumed: true };
|
|
294
|
-
}
|
|
295
306
|
const changed = previousKey !== this.#hoverKey || previousRegion !== this.#hoverRegion;
|
|
296
307
|
return { consumed: event.kind !== "motion", render: changed };
|
|
297
308
|
}
|
|
@@ -305,7 +316,7 @@ export class SettingsApp {
|
|
|
305
316
|
return;
|
|
306
317
|
}
|
|
307
318
|
const shown = this.#shownValue(entry);
|
|
308
|
-
//
|
|
319
|
+
// Rationale: a number is stepped, not picked from a list: it has its own two controls,
|
|
309
320
|
// and pointing at it is not a request for anything else.
|
|
310
321
|
if (typeof shown === "number")
|
|
311
322
|
return;
|
|
@@ -314,16 +325,12 @@ export class SettingsApp {
|
|
|
314
325
|
return;
|
|
315
326
|
}
|
|
316
327
|
const current = shown === null ? 0 : Math.max(0, entry.choices.indexOf(shown));
|
|
317
|
-
//
|
|
318
|
-
|
|
319
|
-
this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: -1 };
|
|
328
|
+
// Compatibility: pinned SelectList opens on the value currently in effect.
|
|
329
|
+
this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: current };
|
|
320
330
|
}
|
|
321
|
-
|
|
322
|
-
* A structured setting is a set of flags, so it opens as its own list rather
|
|
323
|
-
* than as a value menu: each row names one flag and toggles it in place.
|
|
324
|
-
*/
|
|
331
|
+
// Rationale: a structured setting opens as its own flag list rather than a value menu.
|
|
325
332
|
#openStructured(entry) {
|
|
326
|
-
//
|
|
333
|
+
// Invariant: the flags come from the declaration, not from the stored value: an unset
|
|
327
334
|
// flag still has a row, showing the default the source would apply.
|
|
328
335
|
if (entry.flags.length === 0) {
|
|
329
336
|
this.#notice = `${labelOf(entry)} has nothing to configure`;
|
|
@@ -337,7 +344,7 @@ export class SettingsApp {
|
|
|
337
344
|
const value = stored[flag.key];
|
|
338
345
|
record[flag.key] = typeof value === "boolean" ? value : flag.fallback;
|
|
339
346
|
}
|
|
340
|
-
//
|
|
347
|
+
// Invariant: the dialog takes the screen: the row it was opened from stops being the
|
|
341
348
|
// thing under the pointer, so it stops looking like it.
|
|
342
349
|
this.#hoverKey = null;
|
|
343
350
|
this.#hoverRegion = "label";
|
|
@@ -385,7 +392,7 @@ export class SettingsApp {
|
|
|
385
392
|
return { consumed: true };
|
|
386
393
|
}
|
|
387
394
|
if (key === "up" || key === "down") {
|
|
388
|
-
//
|
|
395
|
+
// Compatibility: the keyboard starts from the value in effect rather than from the top.
|
|
389
396
|
menu.index = menu.index < 0
|
|
390
397
|
? menu.current
|
|
391
398
|
: Math.min(menu.choices.length - 1, Math.max(0, menu.index + (key === "down" ? 1 : -1)));
|
|
@@ -403,9 +410,20 @@ export class SettingsApp {
|
|
|
403
410
|
if (input === null)
|
|
404
411
|
return { consumed: false };
|
|
405
412
|
const key = KEYS[data];
|
|
413
|
+
if (key === "home" || key === "end") {
|
|
414
|
+
const rows = this.#rows();
|
|
415
|
+
const selectable = selectableIndexes(rows);
|
|
416
|
+
const target = key === "end" ? selectable.at(-1) : selectable[0];
|
|
417
|
+
if (target !== undefined) {
|
|
418
|
+
this.#select(rows, target);
|
|
419
|
+
if (key === "home")
|
|
420
|
+
this.#scroll = 0;
|
|
421
|
+
}
|
|
422
|
+
return { consumed: true };
|
|
423
|
+
}
|
|
406
424
|
if (key === "up" || key === "down" || key === "shift+up" || key === "shift+down") {
|
|
407
425
|
const rows = this.#rows();
|
|
408
|
-
//
|
|
426
|
+
// Rationale: nothing found means nothing to move through; the key is still swallowed
|
|
409
427
|
// rather than typed into the search.
|
|
410
428
|
if (selectableIndexes(rows).length === 0)
|
|
411
429
|
return { consumed: true, render: false };
|
|
@@ -437,7 +455,7 @@ export class SettingsApp {
|
|
|
437
455
|
}
|
|
438
456
|
const shown = this.#shownValue(entry);
|
|
439
457
|
if (typeof shown === "number") {
|
|
440
|
-
//
|
|
458
|
+
// Rationale: at the end of the range there is nothing to say: the arrow already reads
|
|
441
459
|
// as unavailable, so a message would only repeat it.
|
|
442
460
|
const next = steppedValue(rangeOf(entry), shown, delta);
|
|
443
461
|
if (next !== null)
|
|
@@ -458,25 +476,38 @@ export class SettingsApp {
|
|
|
458
476
|
}
|
|
459
477
|
#apply(entry, value) {
|
|
460
478
|
const key = `${entry.backend}:${entry.id}`;
|
|
461
|
-
//
|
|
479
|
+
// Invariant: shown immediately so the row never lags a keypress, and so the next press
|
|
462
480
|
// steps from here rather than from a value the source has not caught up to.
|
|
463
481
|
this.#pending.set(key, value);
|
|
464
482
|
void this.#session.change(entry.backend, entry.id, value).then(outcome => {
|
|
465
|
-
if (outcome.failure !== null) {
|
|
483
|
+
if (outcome.failure !== null || outcome.status === "failed") {
|
|
466
484
|
this.#pending.delete(key);
|
|
467
|
-
this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure}`;
|
|
485
|
+
this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure ?? "the effect failed"}`;
|
|
468
486
|
return;
|
|
469
487
|
}
|
|
470
|
-
|
|
488
|
+
if (outcome.status === "unavailable" || outcome.limitationReason !== null) {
|
|
489
|
+
this.#pending.delete(key);
|
|
490
|
+
this.#notice = outcome.limitationReason ?? `${labelOf(entry)} is unavailable`;
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
// Concurrency: a later press may have moved on; only the last request clears itself.
|
|
471
494
|
if (this.#pending.get(key) === value)
|
|
472
495
|
this.#pending.delete(key);
|
|
473
|
-
this.#notice = outcome.
|
|
496
|
+
this.#notice = outcome.status === "deferred" && outcome.application !== null
|
|
497
|
+
? `${labelOf(entry)} is stored and applies ${applicationLabel(outcome.application)}`
|
|
498
|
+
: null;
|
|
474
499
|
});
|
|
475
500
|
}
|
|
476
|
-
/** What the row shows: the value asked for if one is outstanding, else the source's. */
|
|
477
501
|
#shownValue(entry) {
|
|
478
502
|
return this.#pending.get(`${entry.backend}:${entry.id}`) ?? entry.value;
|
|
479
503
|
}
|
|
504
|
+
#scrollbarSpeed() {
|
|
505
|
+
const entry = this.#session.sections()
|
|
506
|
+
.flatMap(section => section.entries)
|
|
507
|
+
.find(candidate => candidate.backend === "a1" && candidate.id === "scrollbarSpeed");
|
|
508
|
+
const value = entry === undefined ? this.#session.value("scrollbarSpeed") : this.#shownValue(entry);
|
|
509
|
+
return isScrollbarSpeed(value) ? value : "normal";
|
|
510
|
+
}
|
|
480
511
|
#jump(rows, target) {
|
|
481
512
|
this.#select(rows, target);
|
|
482
513
|
this.#reveal = blockRowSpan(rows, target);
|
|
@@ -485,6 +516,7 @@ export class SettingsApp {
|
|
|
485
516
|
if (index < 0)
|
|
486
517
|
return;
|
|
487
518
|
this.#selectedKey = rowKey(rows[index]);
|
|
519
|
+
this.#selectionNeedsReveal = true;
|
|
488
520
|
this.#notice = null;
|
|
489
521
|
}
|
|
490
522
|
#rows() {
|
|
@@ -494,7 +526,7 @@ export class SettingsApp {
|
|
|
494
526
|
|| labelOf(entry).toLowerCase().includes(needle);
|
|
495
527
|
const rows = [];
|
|
496
528
|
for (const section of this.#session.sections()) {
|
|
497
|
-
//
|
|
529
|
+
// Rationale: a section named by the search is what the reader asked for, so it arrives
|
|
498
530
|
// whole rather than narrowed to the entries that happen to repeat its name.
|
|
499
531
|
const named = needle.length > 0 && section.title.toLowerCase().includes(needle);
|
|
500
532
|
const entries = named ? section.entries : section.entries.filter(matches);
|
|
@@ -510,7 +542,7 @@ export class SettingsApp {
|
|
|
510
542
|
if (section.readOnlyReason !== null && (needle.length === 0 || named)) {
|
|
511
543
|
rows.push({ kind: "note", group: section.id, text: section.readOnlyReason });
|
|
512
544
|
}
|
|
513
|
-
//
|
|
545
|
+
// Invariant: presented in the order the source reports, which is the order the
|
|
514
546
|
// pinned engine shows and is neither declaration order nor alphabetical.
|
|
515
547
|
for (const entry of entries) {
|
|
516
548
|
rows.push({
|
|
@@ -543,18 +575,18 @@ export class SettingsApp {
|
|
|
543
575
|
const hovered = this.#hoverKey === key;
|
|
544
576
|
return renderListRow(this.#viewRow(entry), { selected, hovered, region: this.#hoverRegion }, valueColumn, width, theme);
|
|
545
577
|
}
|
|
546
|
-
/** What the list view needs to draw a setting: its words, and where it can go. */
|
|
547
578
|
#viewRow(entry) {
|
|
548
579
|
const shown = this.#shownValue(entry);
|
|
549
580
|
const value = entry.structured
|
|
550
581
|
? CONFIGURE
|
|
551
|
-
: shown === null
|
|
582
|
+
: shown === null
|
|
583
|
+
? describeRaw(entry.rawValue)
|
|
584
|
+
: effectiveDisplay(entry, shown);
|
|
552
585
|
const range = rangeOf(entry);
|
|
553
586
|
return {
|
|
554
587
|
key: `${entry.backend}:${entry.id}`,
|
|
555
588
|
label: labelOf(entry),
|
|
556
589
|
value,
|
|
557
|
-
...(entry.origin === "default" ? { suffix: "(default)" } : {}),
|
|
558
590
|
...(typeof shown === "number" && entry.editable ? { stepper: stepperEnds(range, shown) } : {}),
|
|
559
591
|
};
|
|
560
592
|
}
|
|
@@ -578,13 +610,12 @@ export class SettingsApp {
|
|
|
578
610
|
this.#menuFrame = frame;
|
|
579
611
|
return renderValueMenu(lines, state, frame, theme);
|
|
580
612
|
}
|
|
581
|
-
/** What the panel needs to present a structured setting's parts. */
|
|
582
613
|
#dialogLines(open, width, theme) {
|
|
583
614
|
const rows = open.flags.map(key => {
|
|
584
615
|
const declared = open.entry.flags.find(flag => flag.key === key);
|
|
585
616
|
return {
|
|
586
617
|
label: declared?.label ?? humanizeLabel(key),
|
|
587
|
-
//
|
|
618
|
+
// Protocol: the engine writes these as the booleans they are rather than as yes/no.
|
|
588
619
|
value: (open.record[key] ?? false) ? "true" : "false",
|
|
589
620
|
...(declared?.description === undefined ? {} : { description: declared.description }),
|
|
590
621
|
};
|
|
@@ -597,8 +628,6 @@ export class SettingsApp {
|
|
|
597
628
|
const open = this.#structured;
|
|
598
629
|
if (open !== null)
|
|
599
630
|
return this.#dialogLines(open, width, theme);
|
|
600
|
-
// The hint is the declarations, so a key cannot be described here and bound
|
|
601
|
-
// to something else.
|
|
602
631
|
const hint = this.#interruptArmed ? "press ctrl+c again to exit A1" : SETTINGS_SHORTCUTS.hint(SCOPE);
|
|
603
632
|
const status = renderStatusLine({ hint, report: this.#notice }, width, theme);
|
|
604
633
|
const input = this.#filter;
|
|
@@ -624,6 +653,23 @@ function displayValue(value) {
|
|
|
624
653
|
return value ? "yes" : "no";
|
|
625
654
|
return String(value);
|
|
626
655
|
}
|
|
656
|
+
function effectiveDisplay(entry, stored) {
|
|
657
|
+
const effective = entry.effectiveValue;
|
|
658
|
+
if (effective === stored)
|
|
659
|
+
return displayValue(stored);
|
|
660
|
+
const shownEffective = typeof effective === "string" || typeof effective === "number" || typeof effective === "boolean"
|
|
661
|
+
? displayValue(effective)
|
|
662
|
+
: describeRaw(effective);
|
|
663
|
+
return `${displayValue(stored)} (effective ${shownEffective}; ${applicationLabel(entry.application)})`;
|
|
664
|
+
}
|
|
665
|
+
function applicationLabel(application) {
|
|
666
|
+
switch (application) {
|
|
667
|
+
case "live": return "live";
|
|
668
|
+
case "next-session": return "in the next session";
|
|
669
|
+
case "next-start": return "on the next start";
|
|
670
|
+
case "current-exit": return "when the current session exits";
|
|
671
|
+
}
|
|
672
|
+
}
|
|
627
673
|
function describeRaw(value) {
|
|
628
674
|
if (value === null || value === undefined)
|
|
629
675
|
return "unset";
|
|
@@ -631,3 +677,6 @@ function describeRaw(value) {
|
|
|
631
677
|
return Array.isArray(value) ? `${value.length} items` : "structured value";
|
|
632
678
|
return String(value);
|
|
633
679
|
}
|
|
680
|
+
function isScrollbarSpeed(value) {
|
|
681
|
+
return value === "normal" || value === "fast" || value === "high";
|
|
682
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ManagedAgentDescriptor } from "../../
|
|
1
|
+
import type { ManagedAgentDescriptor } from "../../contracts/workspace/index.js";
|
|
2
2
|
export type WorkspaceCapabilityAction = {
|
|
3
3
|
readonly type: "structured-command";
|
|
4
4
|
readonly command: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ManagedAgentDescriptor } from "../../
|
|
1
|
+
import { type ManagedAgentDescriptor } from "../../contracts/workspace/index.js";
|
|
2
2
|
export interface WorkspaceAgentFailure {
|
|
3
3
|
readonly code: string;
|
|
4
4
|
readonly message: string;
|
|
@@ -23,6 +23,7 @@ export type WorkspaceReducerResult<T = undefined> = {
|
|
|
23
23
|
readonly code: string;
|
|
24
24
|
readonly diagnostic: string;
|
|
25
25
|
};
|
|
26
|
+
/** Applies validated workspace mutations and advances the revision only when observable state changes. */
|
|
26
27
|
export declare class WorkspaceReducer {
|
|
27
28
|
#private;
|
|
28
29
|
readonly workspaceId: string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { assertManagedAgentDescriptor, } from "../../
|
|
1
|
+
import { assertManagedAgentDescriptor, } from "../../contracts/workspace/index.js";
|
|
2
2
|
const REMOVABLE_STATES = new Set(["stopped", "failed", "discontinuous"]);
|
|
3
|
+
/** Applies validated workspace mutations and advances the revision only when observable state changes. */
|
|
3
4
|
export class WorkspaceReducer {
|
|
4
5
|
workspaceId;
|
|
5
6
|
#agents = new Map();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type StructuredCommandRecord } from "../../foundation/structured-agent-runtime/index.js";
|
|
2
|
-
import type { ManagedAgentDescriptor } from "../../
|
|
2
|
+
import type { ManagedAgentDescriptor } from "../../contracts/workspace/index.js";
|
|
3
3
|
import { WorkspaceReducer, type WorkspaceAgentState, type WorkspaceView } from "./reducer.js";
|
|
4
4
|
export interface RoutedStructuredCommand {
|
|
5
5
|
readonly agentId: string;
|
|
@@ -16,6 +16,7 @@ export type WorkspaceRouterResult<T = undefined> = {
|
|
|
16
16
|
readonly code: string;
|
|
17
17
|
readonly diagnostic: string;
|
|
18
18
|
};
|
|
19
|
+
/** Serializes workspace actions and capability-gates structured commands at the selected-agent boundary. */
|
|
19
20
|
export declare class WorkspaceRouter {
|
|
20
21
|
#private;
|
|
21
22
|
readonly reducer: WorkspaceReducer;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { StructuredCommandTracker, } from "../../foundation/structured-agent-runtime/index.js";
|
|
2
2
|
import { gateWorkspaceAction } from "./capabilities.js";
|
|
3
3
|
import { WorkspaceReducer } from "./reducer.js";
|
|
4
|
+
/** Serializes workspace actions and capability-gates structured commands at the selected-agent boundary. */
|
|
4
5
|
export class WorkspaceRouter {
|
|
5
6
|
reducer;
|
|
6
7
|
#trackers = new Map();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { AgentRecoveryAuthority, RecoveryReferenceId } from "../../
|
|
1
|
+
import type { AgentRecoveryAuthority, RecoveryReferenceId } from "../../contracts/workspace/index.js";
|
|
2
2
|
import { WorkspaceReducer, type WorkspaceView } from "./reducer.js";
|
|
3
|
+
/** Persists complete workspace views and recovery references through the control-store boundary. */
|
|
3
4
|
export declare class WorkspaceStore {
|
|
4
5
|
#private;
|
|
5
6
|
constructor(path: string);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ControlStore, DEFAULT_WORKSPACE_ID, } from "../../foundation/storage/index.js";
|
|
2
2
|
import { WorkspaceReducer } from "./reducer.js";
|
|
3
|
+
/** Persists complete workspace views and recovery references through the control-store boundary. */
|
|
3
4
|
export class WorkspaceStore {
|
|
4
5
|
#store;
|
|
5
6
|
constructor(path) {
|
|
@@ -4,7 +4,8 @@ import { resolve } from "node:path";
|
|
|
4
4
|
import { assertLaunchProfileId } from "../lifecycle/index.js";
|
|
5
5
|
import { closeVerifiedContainment, LinuxNativeProcessInspector, NativeGuardianContainment, resolveProcessGuardianPath, verifyProcessGuardianArtifact, WindowsNativeProcessInspector, } from "../process-containment/index.js";
|
|
6
6
|
import { SupervisorClient } from "../protocol/index.js";
|
|
7
|
-
import { resolveProductPaths } from "../supervision/index.js";
|
|
7
|
+
import { resolveCohortEndpoint, resolveProductPaths } from "../supervision/index.js";
|
|
8
|
+
import { markStartupPhase } from "../startup/index.js";
|
|
8
9
|
export async function runLaunchGuardian(options) {
|
|
9
10
|
assertLaunchProfileId(options.profileId);
|
|
10
11
|
const environment = { ...(options.environment ?? process.env) };
|
|
@@ -17,7 +18,14 @@ export async function runLaunchGuardian(options) {
|
|
|
17
18
|
if (!guardianIdentity)
|
|
18
19
|
throw diagnosticError("launch guardian cannot verify its own native process identity", "PROCESS_IDENTITY_UNAVAILABLE");
|
|
19
20
|
const client = options.control ?? new SupervisorClient(environment[PRODUCT_IDENTITY.environment.releaseId]);
|
|
20
|
-
|
|
21
|
+
// Invariant: an instance belongs to the cohort that launched it and talks to that cohort's endpoint
|
|
22
|
+
// for its whole life, whatever release becomes the active one meanwhile.
|
|
23
|
+
const releaseId = environment[PRODUCT_IDENTITY.environment.releaseId];
|
|
24
|
+
const endpoint = releaseId
|
|
25
|
+
? resolveCohortEndpoint(paths, releaseId, environment).endpoint
|
|
26
|
+
: paths.endpoint;
|
|
27
|
+
await client.connect(endpoint);
|
|
28
|
+
await markStartupPhase(environment, "guardian-connected");
|
|
21
29
|
const containment = options.containment ?? new NativeGuardianContainment(instanceId, helperPath, resolve(paths.runtimeDir, "launch-instances", `${instanceId}.ready.json`));
|
|
22
30
|
const stop = stopRequests(client, instanceId);
|
|
23
31
|
let rootIdentity = null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PRODUCT_TEXT } from "../../product-identity.js";
|
|
2
2
|
export function assertLaunchProfileId(value) {
|
|
3
|
-
if (value !== "a1" && value !== "pi"
|
|
3
|
+
if (value !== "a1" && value !== "pi")
|
|
4
4
|
throw new TypeError(PRODUCT_TEXT.diagnostic(`launch profile is invalid: ${String(value)}`));
|
|
5
5
|
}
|
|
6
6
|
export function assertDimensions(dimensions) {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ProductPaths {
|
|
2
|
+
readonly configDir: string;
|
|
3
|
+
readonly dataDir: string;
|
|
4
|
+
readonly runtimeDir: string;
|
|
5
|
+
readonly databasePath: string;
|
|
6
|
+
/** The endpoint written by releases that predate cohort-scoped identity. */
|
|
7
|
+
readonly endpoint: string;
|
|
8
|
+
/** The metadata written by releases that predate cohort-scoped identity. */
|
|
9
|
+
readonly endpointMetadataPath: string;
|
|
10
|
+
readonly endpointsDir: string;
|
|
11
|
+
readonly supervisorLogPath: string;
|
|
12
|
+
}
|
|
13
|
+
/** Where one cohort listens, and where it records that it is listening. */
|
|
14
|
+
export interface CohortEndpointPaths {
|
|
15
|
+
readonly endpoint: string;
|
|
16
|
+
readonly endpointMetadataPath: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Endpoint identity for one release cohort. Two cohorts can be live at once — an update
|
|
20
|
+
* leaves a working session on the release it started on — so the name a supervisor listens
|
|
21
|
+
* on has to name the release as well as the runtime directory, or the two contend for one
|
|
22
|
+
* endpoint and replacing one means ending the other.
|
|
23
|
+
*
|
|
24
|
+
* An explicit endpoint override keeps its single endpoint: it is how an isolated run pins
|
|
25
|
+
* the address it is going to talk to.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveCohortEndpoint(paths: ProductPaths, releaseId: string, environment?: NodeJS.ProcessEnv, hostPlatform?: NodeJS.Platform): CohortEndpointPaths;
|
|
28
|
+
export declare function resolveProductPaths(environment?: NodeJS.ProcessEnv, hostPlatform?: NodeJS.Platform, fallbackHome?: string): ProductPaths;
|
|
@@ -2,6 +2,26 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { homedir, platform } from "node:os";
|
|
3
3
|
import { posix, win32 } from "node:path";
|
|
4
4
|
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
5
|
+
/**
|
|
6
|
+
* Endpoint identity for one release cohort. Two cohorts can be live at once — an update
|
|
7
|
+
* leaves a working session on the release it started on — so the name a supervisor listens
|
|
8
|
+
* on has to name the release as well as the runtime directory, or the two contend for one
|
|
9
|
+
* endpoint and replacing one means ending the other.
|
|
10
|
+
*
|
|
11
|
+
* An explicit endpoint override keeps its single endpoint: it is how an isolated run pins
|
|
12
|
+
* the address it is going to talk to.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveCohortEndpoint(paths, releaseId, environment = process.env, hostPlatform = platform()) {
|
|
15
|
+
if (environment[PRODUCT_IDENTITY.environment.endpoint]) {
|
|
16
|
+
return { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath };
|
|
17
|
+
}
|
|
18
|
+
const path = hostPlatform === "win32" ? win32 : posix;
|
|
19
|
+
const token = createHash("sha256").update(releaseId).digest("hex").slice(0, 16);
|
|
20
|
+
const endpoint = hostPlatform === "win32"
|
|
21
|
+
? `${paths.endpoint}-${token}`
|
|
22
|
+
: path.join(paths.runtimeDir, `${token}-${PRODUCT_IDENTITY.endpoint.unixSocketFilename}`);
|
|
23
|
+
return { endpoint, endpointMetadataPath: path.join(paths.endpointsDir, `${token}.json`) };
|
|
24
|
+
}
|
|
5
25
|
export function resolveProductPaths(environment = process.env, hostPlatform = platform(), fallbackHome = homedir()) {
|
|
6
26
|
const windows = hostPlatform === "win32";
|
|
7
27
|
const path = windows ? win32 : posix;
|
|
@@ -37,6 +57,7 @@ export function resolveProductPaths(environment = process.env, hostPlatform = pl
|
|
|
37
57
|
databasePath: path.resolve(databaseOverride ?? path.join(dataDir, PRODUCT_IDENTITY.endpoint.databaseFilename)),
|
|
38
58
|
endpoint,
|
|
39
59
|
endpointMetadataPath: path.join(runtimeDir, PRODUCT_IDENTITY.endpoint.metadataFilename),
|
|
60
|
+
endpointsDir: path.join(runtimeDir, "endpoints"),
|
|
40
61
|
supervisorLogPath: path.join(runtimeDir, PRODUCT_IDENTITY.endpoint.supervisorLogFilename),
|
|
41
62
|
};
|
|
42
63
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type NativeHostProofMessage } from "./messages.js";
|
|
2
|
+
/** Identifies a bounded native-host framing or message-contract failure. */
|
|
2
3
|
export declare class NativeHostProtocolError extends Error {
|
|
3
4
|
readonly code: "frame-too-large" | "malformed-frame" | "invalid-message";
|
|
4
5
|
constructor(code: "frame-too-large" | "malformed-frame" | "invalid-message", message: string);
|
|
5
6
|
}
|
|
7
|
+
/** Encodes and incrementally decodes size-bounded newline-delimited native-host proof messages. */
|
|
6
8
|
export declare class NativeHostFrameCodec {
|
|
7
9
|
#private;
|
|
8
10
|
encode(message: NativeHostProofMessage): string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MAX_NATIVE_HOST_MESSAGE_BYTES, assertNativeHostProofMessage, } from "./messages.js";
|
|
2
|
+
/** Identifies a bounded native-host framing or message-contract failure. */
|
|
2
3
|
export class NativeHostProtocolError extends Error {
|
|
3
4
|
code;
|
|
4
5
|
constructor(code, message) {
|
|
@@ -7,6 +8,7 @@ export class NativeHostProtocolError extends Error {
|
|
|
7
8
|
this.name = "NativeHostProtocolError";
|
|
8
9
|
}
|
|
9
10
|
}
|
|
11
|
+
/** Encodes and incrementally decodes size-bounded newline-delimited native-host proof messages. */
|
|
10
12
|
export class NativeHostFrameCodec {
|
|
11
13
|
#buffer = "";
|
|
12
14
|
encode(message) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CorrelationId, type NativeHostCommand, type NativeHostEvent, type NativeHostHello, type PaneId, type TerminalSessionLaunch } from "
|
|
1
|
+
import { type CorrelationId, type NativeHostCommand, type NativeHostEvent, type NativeHostHello, type PaneId, type TerminalSessionLaunch } from "../../contracts/workspace/index.js";
|
|
2
2
|
export declare const NATIVE_HOST_PROTOCOL_NAME: string;
|
|
3
3
|
export declare const MAX_NATIVE_HOST_MESSAGE_BYTES: number;
|
|
4
4
|
export type NativeHostProofMessage = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NATIVE_HOST_PROTOCOL_VERSION, assertNativeHostCommand, assertTerminalSessionLaunch, } from "
|
|
1
|
+
import { NATIVE_HOST_PROTOCOL_VERSION, assertNativeHostCommand, assertTerminalSessionLaunch, } from "../../contracts/workspace/index.js";
|
|
2
2
|
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
3
3
|
export const NATIVE_HOST_PROTOCOL_NAME = PRODUCT_IDENTITY.protocol.nativeHostSchema;
|
|
4
4
|
export const MAX_NATIVE_HOST_MESSAGE_BYTES = 1024 * 1024;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { NativeProcessIdentity } from "../lifecycle/index.js";
|
|
2
2
|
import type { NativeProcessInspector } from "./contracts.js";
|
|
3
|
+
/** Verifies Linux process identity from the PID and kernel start-time field in procfs. */
|
|
3
4
|
export declare class LinuxNativeProcessInspector implements NativeProcessInspector {
|
|
4
5
|
observe(pid: number): Promise<NativeProcessIdentity | null>;
|
|
5
6
|
matches(identity: NativeProcessIdentity): Promise<boolean>;
|