@timurproko/a1 0.1.8-dev.50ebb19 → 0.1.8-dev.510
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 +209 -63
- package/bin/activate.js +8 -0
- package/bin/cli.js +33 -11
- package/bin/guardian.js +16 -6
- package/bin/module-identity.js +76 -69
- package/bin/module-resolver.js +138 -0
- package/bin/pinned-pi-public.d.ts +3 -0
- package/bin/pinned-pi-public.js +93 -0
- package/bin/release-cleanup.js +8 -0
- package/bin/supervisor.js +2 -2
- package/bin/sync-pi-tui-proxy.js +7 -0
- package/bin/ui.js +67 -22
- package/bin/update-recovery.js +343 -0
- package/bin/warmup.js +28 -0
- package/dist/app/session-shell/clipboard-diagnostics.d.ts +16 -0
- package/dist/app/session-shell/clipboard-diagnostics.js +65 -0
- package/dist/app/session-shell/clipboard-image.d.ts +11 -0
- package/dist/app/session-shell/clipboard-image.js +38 -0
- package/dist/app/session-shell/editor-hyperlink-budget.d.ts +9 -0
- package/dist/app/session-shell/editor-hyperlink-budget.js +23 -0
- package/dist/app/session-shell/helper-pool.d.ts +33 -0
- package/dist/app/session-shell/helper-pool.js +98 -0
- package/dist/app/session-shell/image-preparation-client.d.ts +20 -0
- package/dist/app/session-shell/image-preparation-client.js +145 -0
- package/dist/app/session-shell/image-preparation.d.ts +18 -0
- package/dist/app/session-shell/image-preparation.js +126 -0
- package/dist/app/session-shell/image-source.d.ts +13 -0
- package/dist/app/session-shell/image-source.js +171 -0
- package/dist/app/session-shell/image-worker.d.ts +17 -0
- package/dist/app/session-shell/image-worker.js +23 -0
- package/dist/app/session-shell/index.d.ts +7 -0
- package/dist/app/session-shell/index.js +4 -0
- package/dist/app/session-shell/paste-executor.d.ts +18 -0
- package/dist/app/session-shell/paste-executor.js +253 -0
- package/dist/app/session-shell/paste-helper.js +173 -0
- package/dist/app/session-shell/paste-preparation-client.d.ts +31 -0
- package/dist/app/session-shell/paste-preparation-client.js +170 -0
- package/dist/app/session-shell/paste-protocol.d.ts +78 -0
- package/dist/app/session-shell/paste-protocol.js +18 -0
- package/dist/app/session-shell/paste-text-preparation.d.ts +6 -0
- package/dist/app/session-shell/paste-text-preparation.js +134 -0
- package/dist/app/session-shell/paste-text-worker.js +12 -0
- package/dist/app/session-shell/paste-types.d.ts +17 -0
- package/dist/app/session-shell/path-chip-presentation.d.ts +7 -0
- package/dist/app/session-shell/path-chip-presentation.js +24 -0
- package/dist/app/session-shell/prompt-chips.d.ts +76 -0
- package/dist/app/session-shell/prompt-chips.js +507 -0
- package/dist/app/session-shell/prompt-history-controller.d.ts +36 -0
- package/dist/app/session-shell/prompt-history-controller.js +170 -0
- package/dist/app/session-shell/prompt-suggestion-controller.d.ts +37 -0
- package/dist/app/session-shell/prompt-suggestion-controller.js +219 -0
- package/dist/app/session-shell/quit-outro-effects.d.ts +29 -0
- package/dist/app/session-shell/quit-outro-effects.js +242 -0
- package/dist/app/session-shell/quit-outro.d.ts +38 -0
- package/dist/app/session-shell/quit-outro.js +98 -0
- package/dist/app/session-shell/response-copy-coordinator.d.ts +27 -0
- package/dist/app/session-shell/response-copy-coordinator.js +187 -0
- package/dist/app/session-shell/response-copy-helper.js +122 -0
- package/dist/app/session-shell/response-copy-protocol.d.ts +56 -0
- package/dist/app/session-shell/response-copy-protocol.js +5 -0
- package/dist/app/session-shell/response-copy-transport.d.ts +39 -0
- package/dist/app/session-shell/response-copy-transport.js +217 -0
- package/dist/app/session-shell/session-shell-root.d.ts +275 -0
- package/dist/app/session-shell/session-shell-root.js +1376 -0
- package/dist/app/session-shell/session-shell.d.ts +66 -0
- package/dist/app/session-shell/session-shell.js +2116 -0
- package/dist/app/session-shell/session-viewport-controller.d.ts +61 -0
- package/dist/app/session-shell/session-viewport-controller.js +597 -0
- package/dist/app/session-shell/stream-presentation-coalescer.d.ts +29 -0
- package/dist/app/session-shell/stream-presentation-coalescer.js +79 -0
- package/dist/app/session-shell/system-clipboard.d.ts +20 -0
- package/dist/app/session-shell/system-clipboard.js +159 -0
- package/dist/app/session-shell/text-paste.d.ts +5 -0
- package/dist/app/session-shell/text-paste.js +16 -0
- package/dist/cli/capabilities.d.ts +6 -0
- package/dist/cli/capabilities.js +7 -0
- package/dist/cli/dispatch.d.ts +46 -0
- package/dist/cli/dispatch.js +261 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/package-messages.d.ts +26 -0
- package/dist/cli/package-messages.js +71 -0
- package/dist/cli/packages.d.ts +32 -0
- package/dist/cli/packages.js +81 -0
- package/dist/cli/version-stats.d.ts +22 -0
- package/dist/cli/version-stats.js +112 -0
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +2 -0
- package/dist/composition/owned-ui.d.ts +37 -0
- package/dist/composition/owned-ui.js +154 -0
- package/dist/composition/settings-route-host.d.ts +20 -0
- package/dist/composition/settings-route-host.js +141 -0
- package/dist/contracts/agent-engine/capability-ports.d.ts +95 -0
- package/dist/contracts/agent-engine/domain-validation.js +107 -0
- package/dist/contracts/agent-engine/domain.d.ts +138 -0
- package/dist/contracts/agent-engine/index.d.ts +11 -0
- package/dist/contracts/agent-engine/index.js +6 -0
- package/dist/contracts/agent-engine/package-ports.d.ts +60 -0
- package/dist/contracts/agent-engine/ports.js +1 -0
- package/dist/contracts/owned-ui/extension-ui.d.ts +310 -0
- package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
- package/dist/contracts/owned-ui/image-attachments.js +67 -0
- package/dist/contracts/owned-ui/index.d.ts +12 -0
- package/dist/contracts/owned-ui/index.js +8 -0
- package/dist/contracts/owned-ui/model.d.ts +374 -0
- package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
- package/dist/contracts/owned-ui/prompt-history.js +23 -0
- package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
- package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
- package/dist/contracts/owned-ui/validation.d.ts +15 -0
- package/dist/contracts/owned-ui/validation.js +523 -0
- package/dist/contracts/presentation/index.d.ts +104 -0
- package/dist/features/launch/development-launch.js +36 -0
- package/dist/features/launch/index.d.ts +12 -0
- package/dist/features/launch/index.js +6 -0
- package/dist/features/launch/intent.d.ts +12 -0
- package/dist/features/launch/intent.js +8 -0
- package/dist/features/launch/prepare-launch.d.ts +11 -0
- package/dist/features/launch/prepare-launch.js +14 -0
- package/dist/features/launch/profile-paths.d.ts +16 -0
- package/dist/features/launch/profile-paths.js +36 -0
- package/dist/features/launch/runtime-selection.d.ts +16 -0
- package/dist/features/launch/runtime-selection.js +13 -0
- package/dist/features/owned-ui/index.d.ts +9 -0
- package/dist/features/owned-ui/index.js +6 -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/features/owned-ui/reference-routes.d.ts +6 -0
- package/dist/features/owned-ui/reference-routes.js +6 -0
- package/dist/features/owned-ui/reference-screen-app.d.ts +37 -0
- package/dist/features/owned-ui/reference-screen-app.js +232 -0
- package/dist/features/owned-ui/run.d.ts +17 -0
- package/dist/features/owned-ui/run.js +64 -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/features/owned-ui/settings-app.d.ts +21 -0
- package/dist/features/owned-ui/settings-app.js +802 -0
- package/dist/features/owned-ui/settings-route.d.ts +2 -0
- package/dist/features/owned-ui/settings-route.js +2 -0
- package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
- package/dist/features/prompt-history/image-sidecar.js +130 -0
- package/dist/features/prompt-history/index.d.ts +4 -0
- package/dist/features/prompt-history/index.js +3 -0
- package/dist/features/prompt-history/paths.d.ts +5 -0
- package/dist/features/prompt-history/paths.js +17 -0
- package/dist/features/prompt-history/service.d.ts +54 -0
- package/dist/features/prompt-history/service.js +425 -0
- package/dist/features/prompt-history/store.d.ts +16 -0
- package/dist/features/prompt-history/store.js +219 -0
- package/dist/features/prompt-history/worker.d.ts +9 -0
- package/dist/features/prompt-history/worker.js +45 -0
- package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
- package/dist/features/prompt-suggestions/diagnostics.js +82 -0
- package/dist/features/prompt-suggestions/index.d.ts +2 -0
- package/dist/features/prompt-suggestions/index.js +1 -0
- package/dist/foundation/launch-context/index.d.ts +59 -0
- package/dist/foundation/launch-context/index.js +136 -0
- package/dist/foundation/launch-guardian/index.d.ts +2 -0
- package/dist/foundation/launch-guardian/index.js +1 -0
- package/dist/foundation/launch-guardian/main.d.ts +33 -0
- package/dist/foundation/launch-guardian/main.js +180 -0
- package/dist/foundation/lifecycle/commands.js +1 -0
- package/dist/foundation/lifecycle/index.d.ts +11 -0
- package/dist/foundation/lifecycle/index.js +5 -0
- package/dist/foundation/lifecycle/model.d.ts +64 -0
- package/dist/foundation/lifecycle/model.js +40 -0
- package/dist/foundation/lifecycle/paths.d.ts +30 -0
- package/dist/foundation/lifecycle/paths.js +70 -0
- 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/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
- package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
- package/dist/foundation/process-containment/index.d.ts +8 -0
- package/dist/foundation/process-containment/index.js +6 -0
- package/dist/foundation/process-containment/linux-process-inspector.d.ts +7 -0
- package/dist/foundation/process-containment/linux-process-inspector.js +27 -0
- package/dist/foundation/process-containment/native-guardian-containment.d.ts +17 -0
- package/dist/foundation/process-containment/native-guardian-containment.js +140 -0
- package/dist/foundation/process-containment/windows-process-inspector.d.ts +19 -0
- package/dist/foundation/process-containment/windows-process-inspector.js +56 -0
- package/dist/foundation/protocol/client.d.ts +18 -0
- package/dist/foundation/protocol/client.js +130 -0
- package/dist/foundation/protocol/index.d.ts +3 -0
- package/dist/foundation/protocol/index.js +2 -0
- package/dist/foundation/protocol/messages.d.ts +90 -0
- package/dist/foundation/protocol/messages.js +100 -0
- package/dist/foundation/release/bootstrap.d.ts +51 -0
- package/dist/foundation/release/bootstrap.js +427 -0
- package/dist/foundation/release/cohort-state.d.ts +157 -0
- package/dist/foundation/release/cohort-state.js +472 -0
- package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
- package/dist/foundation/release/dependency-certification-retention.js +88 -0
- package/dist/foundation/release/dependency-certification.d.ts +24 -0
- package/dist/foundation/release/dependency-certification.js +266 -0
- package/dist/foundation/release/dependency-layer.d.ts +78 -0
- package/dist/foundation/release/dependency-layer.js +466 -0
- package/dist/foundation/release/endpoints.d.ts +24 -0
- package/dist/foundation/release/endpoints.js +134 -0
- package/dist/foundation/release/immutable-platform.d.ts +6 -0
- package/dist/foundation/release/immutable-platform.js +13 -0
- package/dist/foundation/release/index.d.ts +32 -0
- package/dist/foundation/release/index.js +17 -0
- package/dist/foundation/release/release-gc.d.ts +71 -0
- package/dist/foundation/release/release-gc.js +764 -0
- package/dist/foundation/release/release-store.d.ts +49 -0
- package/dist/foundation/release/release-store.js +235 -0
- package/dist/foundation/release/release.d.ts +43 -0
- package/dist/foundation/release/release.js +215 -0
- package/dist/foundation/release/restart-certification.d.ts +68 -0
- package/dist/foundation/release/restart-certification.js +227 -0
- package/dist/foundation/release/types.d.ts +11 -0
- package/dist/foundation/release/types.js +1 -0
- package/dist/foundation/release/update-activation.d.ts +72 -0
- package/dist/foundation/release/update-activation.js +204 -0
- package/dist/foundation/release/update-launch.d.ts +6 -0
- package/dist/foundation/release/update-launch.js +17 -0
- package/dist/foundation/release/update-recovery.d.ts +76 -0
- package/dist/foundation/release/update-recovery.js +356 -0
- package/dist/foundation/release/update-transaction.d.ts +42 -0
- package/dist/foundation/release/update-transaction.js +101 -0
- package/dist/foundation/release/update.d.ts +114 -0
- package/dist/foundation/release/update.js +633 -0
- package/dist/foundation/release/warmup.d.ts +3 -0
- package/dist/foundation/release/warmup.js +47 -0
- package/dist/foundation/startup/index.d.ts +4 -0
- package/dist/foundation/startup/index.js +2 -0
- package/dist/foundation/startup/startup-budget.d.ts +46 -0
- package/dist/foundation/startup/startup-budget.js +42 -0
- package/dist/foundation/startup/startup-descriptor.js +34 -0
- package/dist/foundation/startup/startup-runtime.d.ts +27 -0
- package/dist/foundation/startup/startup-runtime.js +128 -0
- package/dist/foundation/storage/control-store.d.ts +18 -0
- package/dist/foundation/storage/control-store.js +342 -0
- package/dist/foundation/storage/index.d.ts +1 -0
- package/dist/foundation/storage/index.js +1 -0
- 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 +84 -0
- package/dist/foundation/supervision/paths.d.ts +1 -0
- package/dist/foundation/supervision/paths.js +1 -0
- package/dist/foundation/supervision/server.d.ts +46 -0
- package/dist/foundation/supervision/server.js +573 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.js +87 -0
- package/dist/foundation/terminal-cleanup/index.d.ts +3 -0
- package/dist/foundation/terminal-cleanup/index.js +2 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
- package/dist/integrations/pi/components/components.d.ts +4 -0
- package/dist/integrations/pi/components/components.js +64 -0
- package/dist/integrations/pi/components/conformance.d.ts +18 -0
- package/dist/integrations/pi/components/conformance.js +70 -0
- package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
- package/dist/integrations/pi/components/editor-interaction.js +1 -0
- package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
- package/dist/integrations/pi/components/history-editor-loader.js +5 -0
- package/dist/integrations/pi/components/index.d.ts +23 -0
- package/dist/integrations/pi/components/index.js +14 -0
- package/dist/integrations/pi/components/models-dialog.d.ts +55 -0
- package/dist/integrations/pi/components/models-dialog.js +310 -0
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +1094 -0
- package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
- package/dist/integrations/pi/components/path-word-ranges.js +37 -0
- package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
- package/dist/integrations/pi/components/prompt-input-port.js +1 -0
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +167 -0
- package/dist/integrations/pi/components/resources/builtin-themes.js +168 -0
- package/dist/integrations/pi/components/shell-components.d.ts +7 -0
- package/dist/integrations/pi/components/shell-components.js +7 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +21 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +322 -0
- package/dist/integrations/pi/components/shell-extension-ui.d.ts +35 -0
- package/dist/integrations/pi/components/shell-extension-ui.js +280 -0
- package/dist/integrations/pi/components/shell-footer-status.d.ts +7 -0
- package/dist/integrations/pi/components/shell-footer-status.js +249 -0
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +53 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +134 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.js +433 -0
- package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +133 -0
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +255 -0
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +225 -0
- package/dist/integrations/pi/components/shell-shared-facade.js +92 -0
- package/dist/integrations/pi/components/skills-command.d.ts +47 -0
- package/dist/integrations/pi/components/skills-command.js +118 -0
- package/dist/integrations/pi/components/skills-dialog.d.ts +9 -0
- package/dist/integrations/pi/components/skills-dialog.js +112 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +17 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +49 -0
- package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
- package/dist/integrations/pi/components/tool-image-presentation.js +83 -0
- package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
- package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
- package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
- package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +445 -0
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +370 -0
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
- package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +13 -0
- package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +29 -0
- package/dist/integrations/pi/components/upstream/components/daxnuts.js +146 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.d.ts +4 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +48 -0
- package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +20 -0
- package/dist/integrations/pi/components/upstream/components/extension-editor.js +84 -0
- package/dist/integrations/pi/components/upstream/components/mermaid.js +81 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +52 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +222 -0
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +59 -0
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +346 -0
- package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +11 -0
- package/dist/integrations/pi/components/upstream/components/session-footer.js +123 -0
- package/dist/integrations/pi/components/upstream/components/session-selector-search.js +161 -0
- package/dist/integrations/pi/components/upstream/components/session-selector.d.ts +95 -0
- package/dist/integrations/pi/components/upstream/components/session-selector.js +893 -0
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +21 -0
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +46 -0
- package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +35 -0
- package/dist/integrations/pi/components/upstream/components/status-indicator.js +69 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +67 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +365 -0
- package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +101 -0
- package/dist/integrations/pi/components/upstream/components/tree-selector.js +1275 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +33 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.js +81 -0
- package/dist/integrations/pi/components/upstream/external-editor.js +43 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +289 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.js +2144 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +35 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +51 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.js +43 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +31 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +25 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +39 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +103 -0
- package/dist/integrations/pi/components/upstream/model-search.d.ts +18 -0
- package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +33 -0
- package/dist/integrations/pi/components/upstream/theme/theme-controller.js +114 -0
- package/dist/integrations/pi/components/upstream/theme/theme.d.ts +61 -0
- package/dist/integrations/pi/components/upstream/theme/theme.js +337 -0
- package/dist/integrations/pi/engine/adapter.d.ts +139 -0
- package/dist/integrations/pi/engine/adapter.js +660 -0
- package/dist/integrations/pi/engine/changelog.d.ts +2 -0
- package/dist/integrations/pi/engine/changelog.js +63 -0
- package/dist/integrations/pi/engine/command-dispatch.d.ts +41 -0
- package/dist/integrations/pi/engine/command-dispatch.js +125 -0
- package/dist/integrations/pi/engine/compaction-progress.d.ts +28 -0
- package/dist/integrations/pi/engine/compaction-progress.js +96 -0
- package/dist/integrations/pi/engine/conformance.d.ts +39 -0
- package/dist/integrations/pi/engine/conformance.js +140 -0
- package/dist/integrations/pi/engine/event-delivery.d.ts +100 -0
- package/dist/integrations/pi/engine/event-delivery.js +184 -0
- package/dist/integrations/pi/engine/extension-ui-binding.d.ts +35 -0
- package/dist/integrations/pi/engine/extension-ui-binding.js +81 -0
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/integrations/pi/engine/index.d.ts +18 -0
- package/dist/integrations/pi/engine/index.js +10 -0
- package/dist/integrations/pi/engine/message-values.d.ts +29 -0
- package/dist/integrations/pi/engine/message-values.js +168 -0
- package/dist/integrations/pi/engine/package-integration.d.ts +13 -0
- package/dist/integrations/pi/engine/package-integration.js +118 -0
- package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
- package/dist/integrations/pi/engine/pending-delivery.js +156 -0
- package/dist/integrations/pi/engine/pi-settings-metadata.json +385 -0
- 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/integrations/pi/engine/prompt-suggestions.d.ts +30 -0
- package/dist/integrations/pi/engine/prompt-suggestions.js +102 -0
- package/dist/integrations/pi/engine/provider-authentication.d.ts +34 -0
- package/dist/integrations/pi/engine/provider-authentication.js +209 -0
- package/dist/integrations/pi/engine/resource-catalog.d.ts +50 -0
- package/dist/integrations/pi/engine/resource-catalog.js +299 -0
- package/dist/integrations/pi/engine/resources/changelog.json +12 -0
- package/dist/integrations/pi/engine/runtime-integration.d.ts +53 -0
- package/dist/integrations/pi/engine/runtime-integration.js +118 -0
- package/dist/integrations/pi/engine/session-events.d.ts +48 -0
- package/dist/integrations/pi/engine/session-events.js +223 -0
- package/dist/integrations/pi/engine/session-integration.d.ts +67 -0
- package/dist/integrations/pi/engine/session-integration.js +195 -0
- package/dist/integrations/pi/engine/session-runtime.d.ts +84 -0
- package/dist/integrations/pi/engine/session-runtime.js +249 -0
- 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-bridge.d.ts +121 -0
- package/dist/integrations/pi/engine/settings-bridge.js +514 -0
- package/dist/integrations/pi/engine/settings-metadata.d.ts +31 -0
- package/dist/integrations/pi/engine/settings-metadata.js +67 -0
- package/dist/integrations/pi/engine/settings-port.d.ts +42 -0
- package/dist/integrations/pi/engine/settings-port.js +353 -0
- package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
- package/dist/integrations/pi/engine/tool-rendering.js +145 -0
- package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
- package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
- package/dist/integrations/pi/engine/transcript-projection.d.ts +39 -0
- package/dist/integrations/pi/engine/transcript-projection.js +405 -0
- package/dist/integrations/pi/engine/usage-view.d.ts +4 -0
- package/dist/integrations/pi/engine/usage-view.js +56 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
- package/dist/integrations/pi/engine/workflow-contexts.d.ts +66 -0
- package/dist/integrations/pi/engine/workflow-contexts.js +360 -0
- package/dist/integrations/pi/engine/workflow-runner.d.ts +60 -0
- package/dist/integrations/pi/engine/workflow-runner.js +533 -0
- package/dist/integrations/pi/engine/workflow-support.d.ts +33 -0
- package/dist/integrations/pi/engine/workflow-support.js +352 -0
- package/dist/integrations/pi/engine/workflows.d.ts +275 -0
- package/dist/integrations/pi/engine/workflows.js +71 -0
- package/dist/integrations/pi/startup-public.d.ts +2 -0
- package/dist/integrations/pi/startup-public.js +2223 -0
- package/dist/integrations/pi/startup-public.manifest.json +12502 -0
- package/dist/integrations/pi/tui-runtime/adapter.d.ts +56 -0
- package/dist/integrations/pi/tui-runtime/adapter.js +783 -0
- package/dist/integrations/pi/tui-runtime/contracts.d.ts +156 -0
- package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +88 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +433 -0
- package/dist/integrations/pi/tui-runtime/index.d.ts +9 -0
- package/dist/integrations/pi/tui-runtime/index.js +5 -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/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
- package/dist/integrations/pi/tui-runtime/mouse-report-input.js +57 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.js +158 -0
- package/dist/integrations/pi/tui-runtime/presentation-adapter.d.ts +4 -0
- package/dist/integrations/pi/tui-runtime/presentation-adapter.js +48 -0
- 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/product-identity.d.ts +37 -0
- package/dist/product-identity.js +119 -0
- package/dist/product-identity.json +85 -0
- package/dist/runtime-payload-inventory.json +127148 -0
- package/dist/ui/apps/contracts.d.ts +72 -0
- package/dist/ui/apps/host.d.ts +42 -0
- package/dist/ui/apps/host.js +156 -0
- package/dist/ui/apps/index.d.ts +5 -0
- package/dist/ui/apps/index.js +3 -0
- package/dist/ui/apps/registry.d.ts +12 -0
- package/dist/ui/apps/registry.js +33 -0
- package/dist/ui/components/dialog-panel.js +49 -0
- package/dist/ui/components/frame.d.ts +22 -0
- package/dist/ui/components/frame.js +55 -0
- package/dist/ui/components/index.d.ts +47 -0
- package/dist/ui/components/index.js +25 -0
- package/dist/ui/components/line-input.d.ts +68 -0
- package/dist/ui/components/line-input.js +224 -0
- package/dist/ui/components/list-view.d.ts +60 -0
- package/dist/ui/components/list-view.js +82 -0
- package/dist/ui/components/mouse.d.ts +25 -0
- package/dist/ui/components/mouse.js +70 -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-input.d.ts +32 -0
- package/dist/ui/components/prompt-input.js +51 -0
- package/dist/ui/components/scrollbar.d.ts +88 -0
- package/dist/ui/components/scrollbar.js +137 -0
- package/dist/ui/components/selection-copy.d.ts +24 -0
- package/dist/ui/components/selection-copy.js +39 -0
- package/dist/ui/components/shortcuts.d.ts +58 -0
- package/dist/ui/components/shortcuts.js +82 -0
- package/dist/ui/components/spans.d.ts +28 -0
- package/dist/ui/components/spans.js +266 -0
- package/dist/ui/components/submitted-prompt.d.ts +23 -0
- package/dist/ui/components/submitted-prompt.js +50 -0
- package/dist/ui/components/surface.d.ts +20 -0
- package/dist/ui/components/surface.js +44 -0
- package/dist/ui/components/text-selection.d.ts +62 -0
- package/dist/ui/components/text-selection.js +210 -0
- package/dist/ui/components/text.d.ts +38 -0
- package/dist/ui/components/text.js +185 -0
- package/dist/ui/components/transcript-viewport.d.ts +173 -0
- package/dist/ui/components/transcript-viewport.js +753 -0
- package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
- package/dist/ui/components/visible-hyperlinks.js +97 -0
- package/dist/ui/settings/declarations.d.ts +127 -0
- package/dist/ui/settings/declarations.js +124 -0
- package/dist/ui/settings/index.d.ts +10 -0
- package/dist/ui/settings/index.js +5 -0
- package/dist/ui/settings/manager.d.ts +54 -0
- package/dist/ui/settings/manager.js +256 -0
- package/dist/ui/settings/migrations.d.ts +13 -0
- package/dist/ui/settings/migrations.js +92 -0
- package/dist/ui/settings/sections.d.ts +52 -0
- package/dist/ui/settings/sections.js +112 -0
- package/docs/architecture/boundaries.md +17 -13
- package/docs/architecture/code-documentation.md +77 -0
- package/docs/architecture/history-editor-provenance.md +100 -0
- package/docs/architecture/internal-naming.md +93 -0
- package/docs/architecture/process-guardian-provenance.md +3 -1
- package/docs/architecture/project-structure.md +69 -30
- package/docs/architecture/prompt-suggestions.md +68 -0
- package/docs/architecture/resource-and-data-policy.md +28 -2
- package/docs/architecture/response-copy-delivery.md +85 -0
- package/docs/architecture/terminal-host-proof-gate.md +1 -1
- package/docs/architecture/terminal-host-spike-evidence.md +1 -1
- package/docs/architecture/tool-image-presentation.md +62 -0
- package/docs/architecture/toolchain.md +32 -10
- package/docs/architecture/ui-reference-provenance.md +61 -6
- package/docs/ci-release-runbook.md +256 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/features/modal-content-interaction.md +38 -0
- package/docs/features/prompt-history.md +149 -0
- package/docs/local-worktree-cleanup.md +212 -0
- package/docs/manual-code-streaming-cleanup.md +88 -0
- 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 +79 -0
- package/docs/manual-pi-boundary-candidate.md +4 -5
- package/docs/manual-terminal-colour-check.md +4 -3
- package/docs/openspec-archive-automation.md +259 -0
- package/docs/repository-governance-live-acceptance.md +77 -0
- package/docs/validation.md +100 -0
- package/package.json +52 -34
- package/dist/src/cli/capabilities.d.ts +0 -15
- package/dist/src/cli/capabilities.js +0 -7
- package/dist/src/cli/dispatch.d.ts +0 -32
- package/dist/src/cli/dispatch.js +0 -142
- package/dist/src/cli/index.d.ts +0 -5
- package/dist/src/cli/index.js +0 -5
- package/dist/src/cli/packages.d.ts +0 -23
- package/dist/src/cli/packages.js +0 -84
- package/dist/src/cli/version-stats.d.ts +0 -16
- package/dist/src/cli/version-stats.js +0 -72
- package/dist/src/cli/version.d.ts +0 -2
- package/dist/src/cli/version.js +0 -23
- package/dist/src/composition/index.d.ts +0 -48
- package/dist/src/composition/index.js +0 -258
- package/dist/src/features/launch/development-launch.js +0 -28
- package/dist/src/features/launch/index.d.ts +0 -7
- package/dist/src/features/launch/index.js +0 -7
- package/dist/src/features/launch/intent.d.ts +0 -7
- package/dist/src/features/launch/intent.js +0 -4
- package/dist/src/features/launch/prepare-launch.d.ts +0 -13
- package/dist/src/features/launch/prepare-launch.js +0 -21
- package/dist/src/features/launch/profile-paths.d.ts +0 -15
- package/dist/src/features/launch/profile-paths.js +0 -31
- package/dist/src/features/launch/profiles.d.ts +0 -12
- package/dist/src/features/launch/profiles.js +0 -26
- package/dist/src/features/launch/runtime-selection.d.ts +0 -19
- package/dist/src/features/launch/runtime-selection.js +0 -13
- package/dist/src/features/owned-ui/customization.d.ts +0 -38
- package/dist/src/features/owned-ui/customization.js +0 -108
- package/dist/src/features/owned-ui/diagnostics.d.ts +0 -33
- package/dist/src/features/owned-ui/diagnostics.js +0 -94
- package/dist/src/features/owned-ui/index.d.ts +0 -4
- package/dist/src/features/owned-ui/index.js +0 -4
- package/dist/src/features/owned-ui/run.d.ts +0 -11
- package/dist/src/features/owned-ui/run.js +0 -15
- package/dist/src/features/owned-ui/settings-app.d.ts +0 -22
- package/dist/src/features/owned-ui/settings-app.js +0 -633
- package/dist/src/features/workspace/capabilities.d.ts +0 -31
- package/dist/src/features/workspace/capabilities.js +0 -75
- package/dist/src/features/workspace/index.d.ts +0 -6
- package/dist/src/features/workspace/index.js +0 -6
- package/dist/src/features/workspace/presentation.d.ts +0 -30
- package/dist/src/features/workspace/presentation.js +0 -70
- package/dist/src/features/workspace/reconciliation.d.ts +0 -15
- package/dist/src/features/workspace/reconciliation.js +0 -82
- package/dist/src/features/workspace/reducer.d.ts +0 -42
- package/dist/src/features/workspace/reducer.js +0 -213
- package/dist/src/features/workspace/router.d.ts +0 -31
- package/dist/src/features/workspace/router.js +0 -124
- package/dist/src/features/workspace/store.d.ts +0 -17
- package/dist/src/features/workspace/store.js +0 -54
- package/dist/src/foundation/agent-engine-contracts/capability-ports.d.ts +0 -95
- package/dist/src/foundation/agent-engine-contracts/domain-validation.js +0 -89
- package/dist/src/foundation/agent-engine-contracts/domain.d.ts +0 -116
- package/dist/src/foundation/agent-engine-contracts/index.d.ts +0 -8
- package/dist/src/foundation/agent-engine-contracts/index.js +0 -8
- package/dist/src/foundation/agent-engine-contracts/package-ports.d.ts +0 -54
- package/dist/src/foundation/launch-guardian/index.d.ts +0 -1
- package/dist/src/foundation/launch-guardian/index.js +0 -1
- package/dist/src/foundation/launch-guardian/main.d.ts +0 -31
- package/dist/src/foundation/launch-guardian/main.js +0 -165
- package/dist/src/foundation/lifecycle/index.d.ts +0 -4
- package/dist/src/foundation/lifecycle/index.js +0 -4
- package/dist/src/foundation/lifecycle/model.d.ts +0 -64
- package/dist/src/foundation/lifecycle/model.js +0 -40
- package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
- package/dist/src/foundation/lifecycle/paths.js +0 -42
- package/dist/src/foundation/native-host-protocol/codec.d.ts +0 -11
- package/dist/src/foundation/native-host-protocol/codec.js +0 -56
- package/dist/src/foundation/native-host-protocol/evidence.d.ts +0 -67
- package/dist/src/foundation/native-host-protocol/evidence.js +0 -141
- package/dist/src/foundation/native-host-protocol/index.d.ts +0 -4
- package/dist/src/foundation/native-host-protocol/index.js +0 -4
- package/dist/src/foundation/native-host-protocol/messages.d.ts +0 -56
- package/dist/src/foundation/native-host-protocol/messages.js +0 -149
- package/dist/src/foundation/native-host-protocol/proof-gate.d.ts +0 -13
- package/dist/src/foundation/native-host-protocol/proof-gate.js +0 -33
- package/dist/src/foundation/owned-ui-contracts/extension-ui.d.ts +0 -302
- package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
- package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
- package/dist/src/foundation/owned-ui-contracts/model.d.ts +0 -241
- package/dist/src/foundation/owned-ui-contracts/validation.d.ts +0 -11
- package/dist/src/foundation/owned-ui-contracts/validation.js +0 -395
- package/dist/src/foundation/owned-ui-settings/declarations.d.ts +0 -13
- package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
- package/dist/src/foundation/owned-ui-settings/index.d.ts +0 -6
- package/dist/src/foundation/owned-ui-settings/index.js +0 -6
- package/dist/src/foundation/owned-ui-settings/migrations.d.ts +0 -13
- package/dist/src/foundation/owned-ui-settings/migrations.js +0 -28
- package/dist/src/foundation/owned-ui-settings/sections.d.ts +0 -70
- package/dist/src/foundation/owned-ui-settings/sections.js +0 -93
- package/dist/src/foundation/owned-ui-settings/session.d.ts +0 -44
- package/dist/src/foundation/owned-ui-settings/session.js +0 -145
- package/dist/src/foundation/owned-ui-settings/store.d.ts +0 -28
- package/dist/src/foundation/owned-ui-settings/store.js +0 -90
- package/dist/src/foundation/pi-component-adapter/components.d.ts +0 -4
- package/dist/src/foundation/pi-component-adapter/components.js +0 -64
- package/dist/src/foundation/pi-component-adapter/conformance.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/conformance.js +0 -69
- package/dist/src/foundation/pi-component-adapter/index.d.ts +0 -13
- package/dist/src/foundation/pi-component-adapter/index.js +0 -13
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.d.ts +0 -165
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.js +0 -166
- package/dist/src/foundation/pi-component-adapter/shell-components.d.ts +0 -6
- package/dist/src/foundation/pi-component-adapter/shell-components.js +0 -6
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.d.ts +0 -11
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.d.ts +0 -35
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.js +0 -279
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.d.ts +0 -7
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.js +0 -189
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.js +0 -429
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.d.ts +0 -113
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.js +0 -235
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.js +0 -87
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.d.ts +0 -422
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.js +0 -296
- package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.js +0 -51
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.d.ts +0 -22
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.js +0 -142
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.d.ts +0 -4
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.js +0 -81
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.d.ts +0 -24
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.js +0 -105
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.d.ts +0 -2
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.js +0 -18
- package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.js +0 -77
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.d.ts +0 -55
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.js +0 -342
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.js +0 -120
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.js +0 -159
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.d.ts +0 -95
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.js +0 -889
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.d.ts +0 -19
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.js +0 -44
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.d.ts +0 -30
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.js +0 -59
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.d.ts +0 -98
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.js +0 -1272
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.d.ts +0 -33
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.js +0 -76
- package/dist/src/foundation/pi-component-adapter/upstream/external-editor.js +0 -39
- package/dist/src/foundation/pi-component-adapter/upstream/model-search.d.ts +0 -15
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.d.ts +0 -25
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.js +0 -117
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.d.ts +0 -61
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.js +0 -326
- package/dist/src/foundation/pi-engine-adapter/adapter.d.ts +0 -164
- package/dist/src/foundation/pi-engine-adapter/adapter.js +0 -2367
- package/dist/src/foundation/pi-engine-adapter/conformance.d.ts +0 -37
- package/dist/src/foundation/pi-engine-adapter/conformance.js +0 -130
- package/dist/src/foundation/pi-engine-adapter/index.d.ts +0 -10
- package/dist/src/foundation/pi-engine-adapter/index.js +0 -10
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.d.ts +0 -30
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.js +0 -61
- package/dist/src/foundation/pi-engine-adapter/package-integration.d.ts +0 -13
- package/dist/src/foundation/pi-engine-adapter/package-integration.js +0 -112
- package/dist/src/foundation/pi-engine-adapter/pi-settings-metadata.json +0 -374
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.d.ts +0 -31
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.js +0 -80
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.d.ts +0 -35
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.js +0 -67
- package/dist/src/foundation/pi-engine-adapter/session-integration.d.ts +0 -43
- package/dist/src/foundation/pi-engine-adapter/session-integration.js +0 -97
- package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
- package/dist/src/foundation/pi-engine-adapter/settings-integration.js +0 -233
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.d.ts +0 -20
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.js +0 -48
- package/dist/src/foundation/pi-engine-adapter/workflows.d.ts +0 -173
- package/dist/src/foundation/pi-engine-adapter/workflows.js +0 -60
- package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
- package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
- 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/pi-owned-ui-integration/session-shell.js +0 -1518
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.d.ts +0 -39
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.js +0 -493
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.d.ts +0 -18
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.js +0 -145
- package/dist/src/foundation/pi-tui-runtime-adapter/contracts.d.ts +0 -120
- package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.js +0 -48
- package/dist/src/foundation/presentation-contracts/index.d.ts +0 -96
- package/dist/src/foundation/process-containment/index.d.ts +0 -5
- package/dist/src/foundation/process-containment/index.js +0 -5
- package/dist/src/foundation/process-containment/linux-process-inspector.d.ts +0 -6
- package/dist/src/foundation/process-containment/linux-process-inspector.js +0 -26
- package/dist/src/foundation/process-containment/native-guardian-containment.d.ts +0 -16
- package/dist/src/foundation/process-containment/native-guardian-containment.js +0 -139
- package/dist/src/foundation/process-containment/windows-process-inspector.d.ts +0 -17
- package/dist/src/foundation/process-containment/windows-process-inspector.js +0 -53
- package/dist/src/foundation/protocol/client.d.ts +0 -17
- package/dist/src/foundation/protocol/client.js +0 -129
- package/dist/src/foundation/protocol/index.d.ts +0 -2
- package/dist/src/foundation/protocol/index.js +0 -2
- package/dist/src/foundation/protocol/messages.d.ts +0 -89
- package/dist/src/foundation/protocol/messages.js +0 -99
- package/dist/src/foundation/release/bootstrap.d.ts +0 -29
- package/dist/src/foundation/release/bootstrap.js +0 -335
- 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/index.d.ts +0 -10
- package/dist/src/foundation/release/index.js +0 -10
- 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/release/release-store.d.ts +0 -43
- package/dist/src/foundation/release/release-store.js +0 -175
- package/dist/src/foundation/release/release.d.ts +0 -38
- package/dist/src/foundation/release/release.js +0 -204
- package/dist/src/foundation/release/update-transaction.d.ts +0 -31
- package/dist/src/foundation/release/update-transaction.js +0 -89
- package/dist/src/foundation/release/update.d.ts +0 -82
- package/dist/src/foundation/release/update.js +0 -527
- package/dist/src/foundation/storage/control-store.d.ts +0 -61
- package/dist/src/foundation/storage/control-store.js +0 -530
- package/dist/src/foundation/storage/index.d.ts +0 -1
- package/dist/src/foundation/storage/index.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/backpressure.d.ts +0 -46
- package/dist/src/foundation/structured-agent-runtime/backpressure.js +0 -118
- package/dist/src/foundation/structured-agent-runtime/commands.d.ts +0 -52
- package/dist/src/foundation/structured-agent-runtime/commands.js +0 -164
- package/dist/src/foundation/structured-agent-runtime/handshake.d.ts +0 -41
- package/dist/src/foundation/structured-agent-runtime/handshake.js +0 -151
- package/dist/src/foundation/structured-agent-runtime/index.d.ts +0 -5
- package/dist/src/foundation/structured-agent-runtime/index.js +0 -5
- package/dist/src/foundation/structured-agent-runtime/reconnection.d.ts +0 -37
- package/dist/src/foundation/structured-agent-runtime/reconnection.js +0 -129
- package/dist/src/foundation/structured-agent-runtime/state.d.ts +0 -56
- package/dist/src/foundation/structured-agent-runtime/state.js +0 -118
- 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/supervision/server.d.ts +0 -22
- package/dist/src/foundation/supervision/server.js +0 -451
- package/dist/src/foundation/ui-apps/contracts.d.ts +0 -42
- package/dist/src/foundation/ui-apps/host.d.ts +0 -42
- package/dist/src/foundation/ui-apps/host.js +0 -152
- package/dist/src/foundation/ui-apps/index.d.ts +0 -3
- package/dist/src/foundation/ui-apps/index.js +0 -3
- package/dist/src/foundation/ui-apps/registry.d.ts +0 -11
- package/dist/src/foundation/ui-apps/registry.js +0 -32
- package/dist/src/foundation/ui-components/dialog-panel.js +0 -47
- package/dist/src/foundation/ui-components/frame.d.ts +0 -21
- package/dist/src/foundation/ui-components/frame.js +0 -54
- package/dist/src/foundation/ui-components/index.d.ts +0 -18
- package/dist/src/foundation/ui-components/index.js +0 -18
- package/dist/src/foundation/ui-components/line-input.d.ts +0 -74
- package/dist/src/foundation/ui-components/line-input.js +0 -245
- package/dist/src/foundation/ui-components/list-view.d.ts +0 -66
- package/dist/src/foundation/ui-components/list-view.js +0 -76
- package/dist/src/foundation/ui-components/mouse.d.ts +0 -15
- package/dist/src/foundation/ui-components/mouse.js +0 -46
- package/dist/src/foundation/ui-components/scrollbar.d.ts +0 -62
- package/dist/src/foundation/ui-components/scrollbar.js +0 -102
- package/dist/src/foundation/ui-components/shortcuts.d.ts +0 -57
- package/dist/src/foundation/ui-components/shortcuts.js +0 -81
- package/dist/src/foundation/ui-components/spans.d.ts +0 -7
- package/dist/src/foundation/ui-components/spans.js +0 -59
- package/dist/src/foundation/ui-components/surface.d.ts +0 -20
- package/dist/src/foundation/ui-components/surface.js +0 -38
- package/dist/src/foundation/ui-components/text.d.ts +0 -24
- package/dist/src/foundation/ui-components/text.js +0 -123
- package/dist/src/foundation/workspace-contracts/index.d.ts +0 -2
- package/dist/src/foundation/workspace-contracts/index.js +0 -2
- package/dist/src/foundation/workspace-contracts/model.d.ts +0 -248
- package/dist/src/foundation/workspace-contracts/model.js +0 -2
- package/dist/src/foundation/workspace-contracts/validation.d.ts +0 -13
- package/dist/src/foundation/workspace-contracts/validation.js +0 -335
- package/dist/src/product-identity.d.ts +0 -37
- package/dist/src/product-identity.js +0 -150
- package/dist/src/product-identity.json +0 -99
- package/docs/manual-transparent-checkpoint.md +0 -53
- /package/dist/{src/foundation/agent-engine-contracts/domain.js → app/session-shell/paste-helper.d.ts} +0 -0
- /package/dist/{src/foundation/agent-engine-contracts/ports.js → app/session-shell/paste-text-worker.d.ts} +0 -0
- /package/dist/{src/foundation/lifecycle/commands.js → app/session-shell/paste-types.js} +0 -0
- /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → app/session-shell/response-copy-helper.d.ts} +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/pi-tui-runtime-adapter/contracts.js → contracts/agent-engine/domain.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}/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.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.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/foundation → foundation}/lifecycle/commands.d.ts +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}/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}/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/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.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/session-selector-search.d.ts +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/model-search.js +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/ui-apps → ui/apps}/contracts.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}/resolution.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
/** Verifies Linux process identity from the PID and kernel start-time field in procfs. */
|
|
3
|
+
export class LinuxNativeProcessInspector {
|
|
4
|
+
async observe(pid) {
|
|
5
|
+
if (!Number.isSafeInteger(pid) || pid <= 0)
|
|
6
|
+
throw new TypeError("inspected PID must be a positive safe integer");
|
|
7
|
+
let stat;
|
|
8
|
+
try {
|
|
9
|
+
stat = await readFile(`/proc/${pid}/stat`, "utf8");
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
13
|
+
return null;
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
const commandEnd = stat.lastIndexOf(")");
|
|
17
|
+
const fields = commandEnd >= 0 ? stat.slice(commandEnd + 1).trim().split(/\s+/) : [];
|
|
18
|
+
const startTicks = fields[19];
|
|
19
|
+
if (!startTicks || !/^\d+$/.test(startTicks))
|
|
20
|
+
throw new Error("process stat has no valid start-time field");
|
|
21
|
+
return { pid, startIdentity: `linux-proc-start:${startTicks}` };
|
|
22
|
+
}
|
|
23
|
+
async matches(identity) {
|
|
24
|
+
const observed = await this.observe(identity.pid);
|
|
25
|
+
return observed !== null && observed.startIdentity === identity.startIdentity;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { NativeProcessIdentity, ProcessContainmentIdentity } from "../lifecycle/index.js";
|
|
2
|
+
import type { ContainedProcessHandle, ContainedSpawnOptions, ProcessContainment } from "./contracts.js";
|
|
3
|
+
/** Delegates one root runtime to the native guardian and exposes its verified containment identity. */
|
|
4
|
+
export declare class NativeGuardianContainment implements ProcessContainment {
|
|
5
|
+
#private;
|
|
6
|
+
readonly instanceId: string;
|
|
7
|
+
readonly helperPath: string;
|
|
8
|
+
readonly statusPath: string;
|
|
9
|
+
constructor(instanceId: string, helperPath: string, statusPath: string);
|
|
10
|
+
get identity(): ProcessContainmentIdentity;
|
|
11
|
+
spawn(executable: string, arguments_: readonly string[], options: ContainedSpawnOptions): Promise<ContainedProcessHandle>;
|
|
12
|
+
contains(identity: NativeProcessIdentity): Promise<boolean>;
|
|
13
|
+
stop(force: boolean): Promise<void>;
|
|
14
|
+
waitForEmpty(timeoutMs: number): Promise<boolean>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveProcessGuardianPath(releaseRoot: string, environment?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, architecture?: string): string;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdir, readFile, rm } from "node:fs/promises";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
5
|
+
/** Delegates one root runtime to the native guardian and exposes its verified containment identity. */
|
|
6
|
+
export class NativeGuardianContainment {
|
|
7
|
+
#identity;
|
|
8
|
+
#helper = null;
|
|
9
|
+
#rootIdentity = null;
|
|
10
|
+
#outcome = null;
|
|
11
|
+
instanceId;
|
|
12
|
+
helperPath;
|
|
13
|
+
statusPath;
|
|
14
|
+
constructor(instanceId, helperPath, statusPath) {
|
|
15
|
+
this.instanceId = instanceId;
|
|
16
|
+
this.helperPath = helperPath;
|
|
17
|
+
this.statusPath = statusPath;
|
|
18
|
+
this.#identity = { provider: "native-guardian-pending", token: instanceId };
|
|
19
|
+
}
|
|
20
|
+
get identity() {
|
|
21
|
+
return this.#identity;
|
|
22
|
+
}
|
|
23
|
+
async spawn(executable, arguments_, options) {
|
|
24
|
+
if (this.#helper)
|
|
25
|
+
throw new Error("process containment already has a root runtime");
|
|
26
|
+
await mkdir(dirname(this.statusPath), { recursive: true, mode: 0o700 });
|
|
27
|
+
await rm(this.statusPath, { force: true });
|
|
28
|
+
const helper = spawn(this.helperPath, [
|
|
29
|
+
"--parent-pid", String(process.pid),
|
|
30
|
+
"--instance", this.instanceId,
|
|
31
|
+
"--status-file", this.statusPath,
|
|
32
|
+
"--", executable, ...arguments_,
|
|
33
|
+
], {
|
|
34
|
+
cwd: options.cwd,
|
|
35
|
+
env: { ...options.environment, ...(options.terminalType ? { TERM: options.terminalType } : {}) },
|
|
36
|
+
shell: false,
|
|
37
|
+
stdio: "inherit",
|
|
38
|
+
windowsHide: false,
|
|
39
|
+
});
|
|
40
|
+
this.#helper = helper;
|
|
41
|
+
this.#outcome = helperOutcome(helper);
|
|
42
|
+
const status = await waitForReadyStatus(this.statusPath, this.#outcome, 5_000);
|
|
43
|
+
this.#rootIdentity = { pid: status.pid, startIdentity: status.startIdentity };
|
|
44
|
+
this.#identity = { provider: status.containmentProvider, token: status.containmentToken };
|
|
45
|
+
return { identity: this.#rootIdentity, outcome: this.#outcome };
|
|
46
|
+
}
|
|
47
|
+
async contains(identity) {
|
|
48
|
+
return this.#rootIdentity !== null
|
|
49
|
+
&& identity.pid === this.#rootIdentity.pid
|
|
50
|
+
&& identity.startIdentity === this.#rootIdentity.startIdentity;
|
|
51
|
+
}
|
|
52
|
+
async stop(force) {
|
|
53
|
+
const root = this.#rootIdentity;
|
|
54
|
+
if (!root)
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
process.kill(root.pid, force ? "SIGKILL" : "SIGTERM");
|
|
58
|
+
}
|
|
59
|
+
catch { }
|
|
60
|
+
}
|
|
61
|
+
async waitForEmpty(timeoutMs) {
|
|
62
|
+
if (!this.#helper || this.#helper.exitCode !== null || this.#helper.signalCode !== null)
|
|
63
|
+
return true;
|
|
64
|
+
return await new Promise(resolvePromise => {
|
|
65
|
+
const timer = setTimeout(() => finish(false), timeoutMs);
|
|
66
|
+
timer.unref();
|
|
67
|
+
const finish = (empty) => {
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
this.#helper?.off("close", onClose);
|
|
70
|
+
resolvePromise(empty);
|
|
71
|
+
};
|
|
72
|
+
const onClose = () => finish(true);
|
|
73
|
+
this.#helper?.once("close", onClose);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async close() {
|
|
77
|
+
const helper = this.#helper;
|
|
78
|
+
if (helper && helper.exitCode === null && helper.signalCode === null)
|
|
79
|
+
helper.kill("SIGKILL");
|
|
80
|
+
await this.waitForEmpty(1_500);
|
|
81
|
+
await rm(this.statusPath, { force: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function resolveProcessGuardianPath(releaseRoot, environment = process.env, platform = process.platform, architecture = process.arch) {
|
|
85
|
+
const override = environment[PRODUCT_IDENTITY.environment.processGuardianPath]?.trim();
|
|
86
|
+
if (override)
|
|
87
|
+
return resolve(override);
|
|
88
|
+
const executable = platform === "win32"
|
|
89
|
+
? `${PRODUCT_IDENTITY.artifacts.processGuardianExecutable}.exe`
|
|
90
|
+
: PRODUCT_IDENTITY.artifacts.processGuardianExecutable;
|
|
91
|
+
return resolve(releaseRoot, "dist", "native", `${platform}-${architecture}`, executable);
|
|
92
|
+
}
|
|
93
|
+
function helperOutcome(helper) {
|
|
94
|
+
return new Promise(resolvePromise => {
|
|
95
|
+
let settled = false;
|
|
96
|
+
const settle = (outcome) => {
|
|
97
|
+
if (settled)
|
|
98
|
+
return;
|
|
99
|
+
settled = true;
|
|
100
|
+
resolvePromise(outcome);
|
|
101
|
+
};
|
|
102
|
+
helper.once("error", error => settle({ kind: "guardian-error", message: error.message, code: errorCode(error) }));
|
|
103
|
+
helper.once("close", (code, signal) => {
|
|
104
|
+
if (signal)
|
|
105
|
+
settle({ kind: "signaled", signal });
|
|
106
|
+
else
|
|
107
|
+
settle({ kind: "exited", exitCode: code ?? 1 });
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async function waitForReadyStatus(path, outcome, timeoutMs) {
|
|
112
|
+
const deadline = Date.now() + timeoutMs;
|
|
113
|
+
let terminalOutcome = null;
|
|
114
|
+
void outcome.then(value => { terminalOutcome = value; });
|
|
115
|
+
while (Date.now() < deadline) {
|
|
116
|
+
try {
|
|
117
|
+
const value = JSON.parse(await readFile(path, "utf8"));
|
|
118
|
+
if (isReadyStatus(value))
|
|
119
|
+
return value;
|
|
120
|
+
throw new Error("process guardian published invalid ready status");
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
if (terminalOutcome)
|
|
127
|
+
throw new Error(`process guardian exited before readiness: ${JSON.stringify(terminalOutcome)}`);
|
|
128
|
+
await new Promise(resolvePromise => setTimeout(resolvePromise, 20));
|
|
129
|
+
}
|
|
130
|
+
throw new Error(`process guardian did not publish readiness within ${timeoutMs}ms`);
|
|
131
|
+
}
|
|
132
|
+
function isReadyStatus(value) {
|
|
133
|
+
return Number.isSafeInteger(value.pid) && Number(value.pid) > 0
|
|
134
|
+
&& typeof value.startIdentity === "string" && value.startIdentity.length > 0
|
|
135
|
+
&& typeof value.containmentProvider === "string" && value.containmentProvider.length > 0
|
|
136
|
+
&& typeof value.containmentToken === "string" && value.containmentToken.length > 0;
|
|
137
|
+
}
|
|
138
|
+
function errorCode(error) {
|
|
139
|
+
return "code" in error && typeof error.code === "string" ? error.code : null;
|
|
140
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { NativeProcessIdentity } from "../lifecycle/index.js";
|
|
2
|
+
import type { NativeProcessInspector } from "./contracts.js";
|
|
3
|
+
export interface InspectorCommandResult {
|
|
4
|
+
readonly exitCode: number;
|
|
5
|
+
readonly stdout: string;
|
|
6
|
+
readonly stderr: string;
|
|
7
|
+
}
|
|
8
|
+
export interface InspectorCommandRunner {
|
|
9
|
+
run(executable: string, arguments_: readonly string[]): Promise<InspectorCommandResult>;
|
|
10
|
+
}
|
|
11
|
+
/** Verifies Windows process identity through the bounded process-guardian inspection command. */
|
|
12
|
+
export declare class WindowsNativeProcessInspector implements NativeProcessInspector {
|
|
13
|
+
readonly helperPath: string;
|
|
14
|
+
private readonly runner;
|
|
15
|
+
private readonly identityPrefix;
|
|
16
|
+
constructor(helperPath: string, runner?: InspectorCommandRunner, identityPrefix?: string);
|
|
17
|
+
observe(pid: number): Promise<NativeProcessIdentity | null>;
|
|
18
|
+
matches(identity: NativeProcessIdentity): Promise<boolean>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
/** Verifies Windows process identity through the bounded process-guardian inspection command. */
|
|
3
|
+
export class WindowsNativeProcessInspector {
|
|
4
|
+
helperPath;
|
|
5
|
+
runner;
|
|
6
|
+
identityPrefix;
|
|
7
|
+
constructor(helperPath, runner = defaultRunner, identityPrefix = "windows-filetime:") {
|
|
8
|
+
this.helperPath = helperPath;
|
|
9
|
+
this.runner = runner;
|
|
10
|
+
this.identityPrefix = identityPrefix;
|
|
11
|
+
if (!helperPath || helperPath.includes("\0"))
|
|
12
|
+
throw new TypeError("process guardian helper path is invalid");
|
|
13
|
+
}
|
|
14
|
+
async observe(pid) {
|
|
15
|
+
if (!Number.isSafeInteger(pid) || pid <= 0)
|
|
16
|
+
throw new TypeError("inspected PID must be a positive safe integer");
|
|
17
|
+
const result = await this.runner.run(this.helperPath, ["--inspect-pid", String(pid)]);
|
|
18
|
+
if (result.exitCode === 3)
|
|
19
|
+
return null;
|
|
20
|
+
if (result.exitCode !== 0) {
|
|
21
|
+
const detail = result.stderr.trim() || `helper exited ${result.exitCode}`;
|
|
22
|
+
throw Object.assign(new Error(`cannot inspect native process identity: ${detail}`), { code: "PROCESS_INSPECTION_FAILED" });
|
|
23
|
+
}
|
|
24
|
+
let value;
|
|
25
|
+
try {
|
|
26
|
+
value = JSON.parse(result.stdout);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw Object.assign(new Error("process guardian returned malformed identity data"), { code: "PROCESS_INSPECTION_INVALID" });
|
|
30
|
+
}
|
|
31
|
+
if (!isIdentity(value) || value.pid !== pid || !value.startIdentity.startsWith(this.identityPrefix)) {
|
|
32
|
+
throw Object.assign(new Error("process guardian returned mismatched identity data"), { code: "PROCESS_INSPECTION_INVALID" });
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
async matches(identity) {
|
|
37
|
+
const observed = await this.observe(identity.pid);
|
|
38
|
+
return observed !== null && observed.startIdentity === identity.startIdentity;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const defaultRunner = {
|
|
42
|
+
async run(executable, arguments_) {
|
|
43
|
+
return await new Promise(resolvePromise => {
|
|
44
|
+
execFile(executable, [...arguments_], { windowsHide: true, timeout: 2_000, maxBuffer: 8 * 1_024 }, (error, stdout, stderr) => {
|
|
45
|
+
const exitCode = error && "code" in error && typeof error.code === "number" ? error.code : error ? 1 : 0;
|
|
46
|
+
resolvePromise({ exitCode, stdout, stderr });
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
function isIdentity(value) {
|
|
52
|
+
return typeof value === "object" && value !== null
|
|
53
|
+
&& "pid" in value && Number.isSafeInteger(value.pid) && Number(value.pid) > 0
|
|
54
|
+
&& "startIdentity" in value && typeof value.startIdentity === "string"
|
|
55
|
+
&& value.startIdentity.length > 0 && value.startIdentity.length <= 512 && !value.startIdentity.includes("\0");
|
|
56
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { CommandResult, LaunchInstanceStopIntent, SupervisorCommand, SupervisorSnapshot } from "../lifecycle/index.js";
|
|
3
|
+
interface ClientEvents {
|
|
4
|
+
snapshot: [SupervisorSnapshot];
|
|
5
|
+
stopIntent: [LaunchInstanceStopIntent];
|
|
6
|
+
disconnect: [];
|
|
7
|
+
}
|
|
8
|
+
/** Maintains one negotiated supervisor connection and rejects all pending commands on disconnect. */
|
|
9
|
+
export declare class SupervisorClient extends EventEmitter<ClientEvents> {
|
|
10
|
+
#private;
|
|
11
|
+
readonly clientId: `${string}-${string}-${string}-${string}-${string}`;
|
|
12
|
+
readonly releaseId?: string;
|
|
13
|
+
constructor(releaseId?: string);
|
|
14
|
+
connect(endpoint: string, timeoutMs?: number): Promise<SupervisorSnapshot>;
|
|
15
|
+
command(command: SupervisorCommand): Promise<CommandResult>;
|
|
16
|
+
close(): void;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { connect } from "node:net";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { CONTROL_ENVELOPE, CONTROL_ENVELOPE_REVISION, encodeFrame, LineFrameDecoder, localControlHello, negotiateControlFeatures } from "./messages.js";
|
|
5
|
+
/** Maintains one negotiated supervisor connection and rejects all pending commands on disconnect. */
|
|
6
|
+
export class SupervisorClient extends EventEmitter {
|
|
7
|
+
clientId = randomUUID();
|
|
8
|
+
releaseId;
|
|
9
|
+
constructor(releaseId) {
|
|
10
|
+
super();
|
|
11
|
+
if (releaseId !== undefined)
|
|
12
|
+
this.releaseId = releaseId;
|
|
13
|
+
}
|
|
14
|
+
#socket = null;
|
|
15
|
+
#pending = new Map();
|
|
16
|
+
async connect(endpoint, timeoutMs = 5_000) {
|
|
17
|
+
if (this.#socket)
|
|
18
|
+
throw new Error("client is already connected");
|
|
19
|
+
const deadline = Date.now() + timeoutMs;
|
|
20
|
+
let lastError = null;
|
|
21
|
+
while (Date.now() < deadline) {
|
|
22
|
+
try {
|
|
23
|
+
return await this.#connectOnce(endpoint, Math.max(1, deadline - Date.now()));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
27
|
+
if (!isTransientEndpointError(lastError))
|
|
28
|
+
throw lastError;
|
|
29
|
+
await new Promise(resolve => setTimeout(resolve, Math.min(40, Math.max(1, deadline - Date.now()))));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
throw new Error(`supervisor endpoint ${endpoint} remained unavailable for ${timeoutMs}ms`, { cause: lastError ?? undefined });
|
|
33
|
+
}
|
|
34
|
+
#connectOnce(endpoint, timeoutMs) {
|
|
35
|
+
const socket = connect(endpoint);
|
|
36
|
+
this.#socket = socket;
|
|
37
|
+
socket.setNoDelay(true);
|
|
38
|
+
const decoder = new LineFrameDecoder();
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
let welcomed = false;
|
|
41
|
+
const timeout = setTimeout(() => {
|
|
42
|
+
const error = transientError(`supervisor connection timed out after ${timeoutMs}ms`, "ETIMEDOUT");
|
|
43
|
+
fail(error);
|
|
44
|
+
socket.destroy();
|
|
45
|
+
}, timeoutMs);
|
|
46
|
+
const fail = (error) => {
|
|
47
|
+
clearTimeout(timeout);
|
|
48
|
+
if (!welcomed)
|
|
49
|
+
reject(error);
|
|
50
|
+
};
|
|
51
|
+
socket.once("error", fail);
|
|
52
|
+
socket.on("close", () => {
|
|
53
|
+
if (this.#socket === socket)
|
|
54
|
+
this.#socket = null;
|
|
55
|
+
if (!welcomed) {
|
|
56
|
+
fail(transientError("supervisor disconnected before completing its handshake", "ECONNRESET"));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const pending of this.#pending.values())
|
|
60
|
+
pending.reject(new Error("supervisor disconnected"));
|
|
61
|
+
this.#pending.clear();
|
|
62
|
+
this.emit("disconnect");
|
|
63
|
+
});
|
|
64
|
+
socket.on("data", chunk => {
|
|
65
|
+
try {
|
|
66
|
+
for (const value of decoder.push(chunk)) {
|
|
67
|
+
const message = value;
|
|
68
|
+
if (message.type === "server-hello" && message.snapshot) {
|
|
69
|
+
const hello = message;
|
|
70
|
+
if (hello.envelope !== CONTROL_ENVELOPE || hello.envelopeRevision !== CONTROL_ENVELOPE_REVISION || !Array.isArray(hello.requiredFeatures) || !Array.isArray(hello.optionalFeatures) || typeof hello.contractDigest !== "string") {
|
|
71
|
+
fail(new Error("supervisor returned an invalid control handshake"));
|
|
72
|
+
socket.destroy();
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const negotiation = negotiateControlFeatures(localControlHello(this.releaseId), hello);
|
|
76
|
+
if (!negotiation.ok) {
|
|
77
|
+
fail(new Error(negotiation.diagnostic));
|
|
78
|
+
socket.destroy();
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
welcomed = true;
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
resolve(message.snapshot);
|
|
84
|
+
}
|
|
85
|
+
else if (message.type === "snapshot" && message.snapshot) {
|
|
86
|
+
this.emit("snapshot", message.snapshot);
|
|
87
|
+
}
|
|
88
|
+
else if (message.type === "command-result" && message.result) {
|
|
89
|
+
const pending = this.#pending.get(message.result.requestId);
|
|
90
|
+
if (pending) {
|
|
91
|
+
this.#pending.delete(message.result.requestId);
|
|
92
|
+
pending.resolve(message.result);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (message.type === "stop-launch-instance" && message.instanceId && message.requestId && message.reason) {
|
|
96
|
+
this.emit("stopIntent", message);
|
|
97
|
+
}
|
|
98
|
+
else if (message.type === "protocol-error") {
|
|
99
|
+
fail(new Error(message.message ?? "protocol error"));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
fail(error instanceof Error ? error : new Error(String(error)));
|
|
105
|
+
socket.destroy();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
socket.once("connect", () => socket.write(encodeFrame({ type: "client-hello", clientId: this.clientId, ...localControlHello(this.releaseId) })));
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
command(command) {
|
|
112
|
+
if (!this.#socket)
|
|
113
|
+
return Promise.reject(new Error("supervisor is not connected"));
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
this.#pending.set(command.requestId, { resolve, reject });
|
|
116
|
+
this.#socket?.write(encodeFrame({ type: "command", command }));
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
close() {
|
|
120
|
+
this.#socket?.end();
|
|
121
|
+
this.#socket = null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function isTransientEndpointError(error) {
|
|
125
|
+
const code = "code" in error ? String(error.code) : "";
|
|
126
|
+
return ["ENOENT", "ECONNREFUSED", "ECONNRESET", "EPIPE", "ETIMEDOUT"].includes(code);
|
|
127
|
+
}
|
|
128
|
+
function transientError(message, code) {
|
|
129
|
+
return Object.assign(new Error(message), { code });
|
|
130
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { SupervisorClient } from "./client.js";
|
|
2
|
+
export { CONTROL_ENVELOPE, CONTROL_ENVELOPE_REVISION, GENERATED_CONTRACT_DIGEST, LineFrameDecoder, MAX_CONTROL_FRAME_BYTES, OPTIONAL_CONTROL_FEATURES, REQUIRED_CONTROL_FEATURES, encodeFrame, isCommandMessage, isControlHello, localControlHello, negotiateControlFeatures, } from "./messages.js";
|
|
3
|
+
export type { ClientMessage, ControlFeature, ControlHello, ControlNegotiation, ServerMessage } from "./messages.js";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { SupervisorClient } from "./client.js";
|
|
2
|
+
export { CONTROL_ENVELOPE, CONTROL_ENVELOPE_REVISION, GENERATED_CONTRACT_DIGEST, LineFrameDecoder, MAX_CONTROL_FRAME_BYTES, OPTIONAL_CONTROL_FEATURES, REQUIRED_CONTROL_FEATURES, encodeFrame, isCommandMessage, isControlHello, localControlHello, negotiateControlFeatures, } from "./messages.js";
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { CommandResult, LaunchInstanceStopIntent, SupervisorCommand, SupervisorSnapshot } from "../lifecycle/index.js";
|
|
2
|
+
export declare const CONTROL_ENVELOPE: string;
|
|
3
|
+
export declare const CONTROL_ENVELOPE_REVISION: 1;
|
|
4
|
+
export declare const REQUIRED_CONTROL_FEATURES: readonly ["handshake.features.v1", "snapshot.revision.v1", "commands.request-identity.v1", "generation.lifecycle.v1", "launch.instance-lifecycle.v1"];
|
|
5
|
+
export declare const OPTIONAL_CONTROL_FEATURES: readonly ["messages.unknown-additive-ignore.v1", "snapshot.resynchronize.v1"];
|
|
6
|
+
export type ControlFeature = string;
|
|
7
|
+
export declare const GENERATED_CONTRACT_DIGEST: string;
|
|
8
|
+
export declare const MAX_CONTROL_FRAME_BYTES: number;
|
|
9
|
+
export interface ControlHello {
|
|
10
|
+
readonly envelope: typeof CONTROL_ENVELOPE;
|
|
11
|
+
readonly envelopeRevision: typeof CONTROL_ENVELOPE_REVISION;
|
|
12
|
+
readonly requiredFeatures: readonly ControlFeature[];
|
|
13
|
+
readonly optionalFeatures: readonly ControlFeature[];
|
|
14
|
+
readonly contractDigest: string;
|
|
15
|
+
readonly releaseId?: string;
|
|
16
|
+
}
|
|
17
|
+
export type ClientMessage = {
|
|
18
|
+
readonly type: "identity-probe";
|
|
19
|
+
} | {
|
|
20
|
+
readonly type: "release-idle-ownership";
|
|
21
|
+
readonly bootNonce: string;
|
|
22
|
+
readonly candidateReleaseId: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly type: "release-update-ownership";
|
|
25
|
+
readonly bootNonce: string;
|
|
26
|
+
readonly targetVersion: string;
|
|
27
|
+
} | ({
|
|
28
|
+
readonly type: "client-hello";
|
|
29
|
+
readonly clientId: string;
|
|
30
|
+
} & ControlHello) | {
|
|
31
|
+
readonly type: "command";
|
|
32
|
+
readonly command: SupervisorCommand;
|
|
33
|
+
};
|
|
34
|
+
export type ServerMessage = {
|
|
35
|
+
readonly type: "identity";
|
|
36
|
+
readonly supervisorId: string;
|
|
37
|
+
readonly bootNonce: string;
|
|
38
|
+
readonly pidStartIdentity: string;
|
|
39
|
+
readonly releaseId: string;
|
|
40
|
+
} | {
|
|
41
|
+
readonly type: "release-ownership-result";
|
|
42
|
+
readonly released: boolean;
|
|
43
|
+
readonly reason: string;
|
|
44
|
+
readonly liveInstanceIds: readonly string[];
|
|
45
|
+
} | {
|
|
46
|
+
readonly type: "release-update-result";
|
|
47
|
+
readonly accepted: boolean;
|
|
48
|
+
readonly reason: string;
|
|
49
|
+
readonly liveInstanceIds: readonly string[];
|
|
50
|
+
} | ({
|
|
51
|
+
readonly type: "server-hello";
|
|
52
|
+
readonly supervisorId: string;
|
|
53
|
+
readonly bootNonce: string;
|
|
54
|
+
readonly pidStartIdentity: string;
|
|
55
|
+
readonly negotiatedFeatures: readonly string[];
|
|
56
|
+
readonly snapshot: SupervisorSnapshot;
|
|
57
|
+
} & ControlHello) | {
|
|
58
|
+
readonly type: "snapshot";
|
|
59
|
+
readonly snapshot: SupervisorSnapshot;
|
|
60
|
+
} | {
|
|
61
|
+
readonly type: "command-result";
|
|
62
|
+
readonly result: CommandResult;
|
|
63
|
+
} | LaunchInstanceStopIntent | {
|
|
64
|
+
readonly type: "protocol-error";
|
|
65
|
+
readonly code: string;
|
|
66
|
+
readonly message: string;
|
|
67
|
+
readonly diagnostics?: unknown;
|
|
68
|
+
};
|
|
69
|
+
export interface ControlNegotiation {
|
|
70
|
+
readonly ok: boolean;
|
|
71
|
+
readonly negotiatedFeatures: readonly string[];
|
|
72
|
+
readonly missingFromClient: readonly string[];
|
|
73
|
+
readonly missingFromServer: readonly string[];
|
|
74
|
+
readonly diagnostic: string;
|
|
75
|
+
}
|
|
76
|
+
export declare function localControlHello(releaseId?: string): ControlHello;
|
|
77
|
+
export declare function negotiateControlFeatures(client: ControlHello, server?: ControlHello): ControlNegotiation;
|
|
78
|
+
export declare function encodeFrame(message: ClientMessage | ServerMessage | Readonly<Record<string, unknown>>): string;
|
|
79
|
+
/** Incrementally decodes size-bounded newline-delimited control frames from arbitrary chunks. */
|
|
80
|
+
export declare class LineFrameDecoder {
|
|
81
|
+
#private;
|
|
82
|
+
push(chunk: Buffer | string): unknown[];
|
|
83
|
+
}
|
|
84
|
+
export declare function isControlHello(value: unknown): value is {
|
|
85
|
+
readonly type: "client-hello";
|
|
86
|
+
readonly clientId: string;
|
|
87
|
+
} & ControlHello;
|
|
88
|
+
export declare function isCommandMessage(value: unknown): value is Extract<ClientMessage, {
|
|
89
|
+
type: "command";
|
|
90
|
+
}>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
3
|
+
export const CONTROL_ENVELOPE = PRODUCT_IDENTITY.protocol.controlEnvelope;
|
|
4
|
+
export const CONTROL_ENVELOPE_REVISION = 1;
|
|
5
|
+
export const REQUIRED_CONTROL_FEATURES = [
|
|
6
|
+
"handshake.features.v1",
|
|
7
|
+
"snapshot.revision.v1",
|
|
8
|
+
"commands.request-identity.v1",
|
|
9
|
+
"generation.lifecycle.v1",
|
|
10
|
+
"launch.instance-lifecycle.v1",
|
|
11
|
+
];
|
|
12
|
+
export const OPTIONAL_CONTROL_FEATURES = [
|
|
13
|
+
"messages.unknown-additive-ignore.v1",
|
|
14
|
+
"snapshot.resynchronize.v1",
|
|
15
|
+
];
|
|
16
|
+
export const GENERATED_CONTRACT_DIGEST = createHash("sha256").update(JSON.stringify({
|
|
17
|
+
envelope: CONTROL_ENVELOPE,
|
|
18
|
+
revision: CONTROL_ENVELOPE_REVISION,
|
|
19
|
+
required: [...REQUIRED_CONTROL_FEATURES].sort(),
|
|
20
|
+
optional: [...OPTIONAL_CONTROL_FEATURES].sort(),
|
|
21
|
+
})).digest("hex");
|
|
22
|
+
export const MAX_CONTROL_FRAME_BYTES = 4 * 1024 * 1024;
|
|
23
|
+
export function localControlHello(releaseId) {
|
|
24
|
+
return {
|
|
25
|
+
envelope: CONTROL_ENVELOPE,
|
|
26
|
+
envelopeRevision: CONTROL_ENVELOPE_REVISION,
|
|
27
|
+
requiredFeatures: REQUIRED_CONTROL_FEATURES,
|
|
28
|
+
optionalFeatures: OPTIONAL_CONTROL_FEATURES,
|
|
29
|
+
contractDigest: GENERATED_CONTRACT_DIGEST,
|
|
30
|
+
...(releaseId ? { releaseId } : {}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function negotiateControlFeatures(client, server = localControlHello()) {
|
|
34
|
+
if (client.envelope !== server.envelope || client.envelopeRevision !== server.envelopeRevision) {
|
|
35
|
+
return {
|
|
36
|
+
ok: false,
|
|
37
|
+
negotiatedFeatures: [],
|
|
38
|
+
missingFromClient: [],
|
|
39
|
+
missingFromServer: [],
|
|
40
|
+
diagnostic: `control envelope mismatch: client ${client.envelope}/${client.envelopeRevision}; server ${server.envelope}/${server.envelopeRevision}`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const clientFeatures = new Set([...client.requiredFeatures, ...client.optionalFeatures]);
|
|
44
|
+
const serverFeatures = new Set([...server.requiredFeatures, ...server.optionalFeatures]);
|
|
45
|
+
const missingFromClient = server.requiredFeatures.filter(feature => !clientFeatures.has(feature));
|
|
46
|
+
const missingFromServer = client.requiredFeatures.filter(feature => !serverFeatures.has(feature));
|
|
47
|
+
const negotiatedFeatures = [...clientFeatures].filter(feature => serverFeatures.has(feature)).sort();
|
|
48
|
+
return {
|
|
49
|
+
ok: missingFromClient.length === 0 && missingFromServer.length === 0,
|
|
50
|
+
negotiatedFeatures,
|
|
51
|
+
missingFromClient,
|
|
52
|
+
missingFromServer,
|
|
53
|
+
diagnostic: missingFromClient.length === 0 && missingFromServer.length === 0
|
|
54
|
+
? `control features negotiated (${negotiatedFeatures.join(", ")}); contract client=${client.contractDigest} server=${server.contractDigest}`
|
|
55
|
+
: `required control features unavailable; client missing [${missingFromClient.join(", ")}], server missing [${missingFromServer.join(", ")}]; contract client=${client.contractDigest} server=${server.contractDigest}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function encodeFrame(message) {
|
|
59
|
+
return `${JSON.stringify(message)}\n`;
|
|
60
|
+
}
|
|
61
|
+
/** Incrementally decodes size-bounded newline-delimited control frames from arbitrary chunks. */
|
|
62
|
+
export class LineFrameDecoder {
|
|
63
|
+
#buffer = "";
|
|
64
|
+
push(chunk) {
|
|
65
|
+
this.#buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
66
|
+
if (Buffer.byteLength(this.#buffer, "utf8") > MAX_CONTROL_FRAME_BYTES) {
|
|
67
|
+
this.#buffer = "";
|
|
68
|
+
throw new Error("control frame exceeds maximum size");
|
|
69
|
+
}
|
|
70
|
+
const messages = [];
|
|
71
|
+
let newline = this.#buffer.indexOf("\n");
|
|
72
|
+
while (newline >= 0) {
|
|
73
|
+
const line = this.#buffer.slice(0, newline);
|
|
74
|
+
this.#buffer = this.#buffer.slice(newline + 1);
|
|
75
|
+
if (line.length > 0)
|
|
76
|
+
messages.push(JSON.parse(line));
|
|
77
|
+
newline = this.#buffer.indexOf("\n");
|
|
78
|
+
}
|
|
79
|
+
return messages;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function isControlHello(value) {
|
|
83
|
+
if (!isRecord(value) || value.type !== "client-hello" || typeof value.clientId !== "string")
|
|
84
|
+
return false;
|
|
85
|
+
return value.envelope === CONTROL_ENVELOPE
|
|
86
|
+
&& value.envelopeRevision === CONTROL_ENVELOPE_REVISION
|
|
87
|
+
&& isStringArray(value.requiredFeatures)
|
|
88
|
+
&& isStringArray(value.optionalFeatures)
|
|
89
|
+
&& typeof value.contractDigest === "string"
|
|
90
|
+
&& (value.releaseId === undefined || typeof value.releaseId === "string");
|
|
91
|
+
}
|
|
92
|
+
export function isCommandMessage(value) {
|
|
93
|
+
return isRecord(value) && value.type === "command" && isRecord(value.command) && typeof value.command.type === "string";
|
|
94
|
+
}
|
|
95
|
+
function isRecord(value) {
|
|
96
|
+
return typeof value === "object" && value !== null;
|
|
97
|
+
}
|
|
98
|
+
function isStringArray(value) {
|
|
99
|
+
return Array.isArray(value) && value.every(item => typeof item === "string" && item.length > 0);
|
|
100
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type SupervisorEndpointMetadata } from "./cohort-state.js";
|
|
2
|
+
import { resolveProductPaths, type SessionSelection, type LaunchProfileId, type SupervisorStartupAttemptIdentity } from "../lifecycle/index.js";
|
|
3
|
+
import { cleanupProvenIdleOwner } from "./process-cleanup.js";
|
|
4
|
+
import { type MaterializedRelease, type VerifyMaterializedReleaseOptions } from "./release-store.js";
|
|
5
|
+
export interface BootstrapOptions {
|
|
6
|
+
readonly packageRoot: string;
|
|
7
|
+
readonly launchIntent?: {
|
|
8
|
+
readonly kind: "interactive";
|
|
9
|
+
readonly profileId: LaunchProfileId;
|
|
10
|
+
readonly sessionSelection?: SessionSelection;
|
|
11
|
+
};
|
|
12
|
+
readonly environment?: NodeJS.ProcessEnv;
|
|
13
|
+
readonly output?: Pick<NodeJS.WriteStream, "write">;
|
|
14
|
+
/**
|
|
15
|
+
* Whether a materialized release copy is fit to launch. The active release
|
|
16
|
+
* is normally reused while its version matches the installation, but a copy
|
|
17
|
+
* can be broken in ways a version cannot see — materialized from a tree a
|
|
18
|
+
* blocked postinstall never finished repairing. The probe is injected from
|
|
19
|
+
* the bin entry because deciding it requires inspecting dependency
|
|
20
|
+
* resolution, which stays out of production code. Absent means every
|
|
21
|
+
* release is fit.
|
|
22
|
+
*/
|
|
23
|
+
readonly releaseIsLaunchable?: (releaseRoot: string) => boolean;
|
|
24
|
+
/** Test seam for bounded maintenance scheduled after stale endpoint sweeping. */
|
|
25
|
+
readonly scheduleMaintenance?: (dataDir: string, paths: ReturnType<typeof resolveProductPaths>) => Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export declare function runBootstrap(options: BootstrapOptions): Promise<number>;
|
|
28
|
+
export declare function certifyMaterializedRelease(release: MaterializedRelease, dataDir: string, verification?: VerifyMaterializedReleaseOptions): Promise<string>;
|
|
29
|
+
/** Persist current-format evidence after an authenticated parent has certified the exact release. */
|
|
30
|
+
export declare function recordParentCertifiedRelease(release: MaterializedRelease, dataDir: string): Promise<string>;
|
|
31
|
+
export interface SupervisorStartupAttempt extends SupervisorStartupAttemptIdentity {
|
|
32
|
+
readonly childOutcome: Promise<{
|
|
33
|
+
readonly exitCode: number | null;
|
|
34
|
+
readonly signal: NodeJS.Signals | null;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
/** Reuse a verified owner, or join the winner if another launch starts the same cohort first. */
|
|
38
|
+
export declare function ensureSupervisor(release: MaterializedRelease, environment: NodeJS.ProcessEnv): Promise<void>;
|
|
39
|
+
export declare function startSupervisor(release: MaterializedRelease, environment: NodeJS.ProcessEnv): Promise<SupervisorStartupAttempt>;
|
|
40
|
+
/**
|
|
41
|
+
* Hand a release the key set its own build reads. A retained pre-cutover release is
|
|
42
|
+
* still startable this way, which is what lets a launch fall back to the previous
|
|
43
|
+
* version instead of failing while an installation is being replaced.
|
|
44
|
+
*/
|
|
45
|
+
export declare function releaseEnvironment(environment: NodeJS.ProcessEnv, release: MaterializedRelease, profile?: LaunchProfileId): NodeJS.ProcessEnv;
|
|
46
|
+
export declare function waitForVerifiedEndpoint(path: string, release: MaterializedRelease, timeoutMs: number, startup?: SupervisorStartupAttempt): Promise<void>;
|
|
47
|
+
export declare function releaseVerifiedIdleOwner(metadata: SupervisorEndpointMetadata, dataDir: string, operations?: {
|
|
48
|
+
readonly waitForExit?: typeof waitForProcessExit;
|
|
49
|
+
readonly cleanup?: typeof cleanupProvenIdleOwner;
|
|
50
|
+
}): Promise<boolean>;
|
|
51
|
+
export declare function waitForProcessExit(pid: number, timeoutMs: number): Promise<void>;
|