@timurproko/a1 0.1.8-dev.49ff83a → 0.1.8-dev.508
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 +168 -65
- 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/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 +35 -0
- package/dist/app/session-shell/prompt-suggestion-controller.js +207 -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 +265 -0
- package/dist/app/session-shell/session-shell-root.js +1366 -0
- package/dist/app/session-shell/session-shell.d.ts +59 -0
- package/dist/app/session-shell/session-shell.js +1917 -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 +136 -0
- package/dist/composition/settings-route-host.d.ts +7 -0
- package/dist/composition/settings-route-host.js +110 -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 +378 -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 +6 -0
- package/dist/features/owned-ui/index.js +4 -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/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 +807 -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 +30 -0
- package/dist/foundation/release/index.js +16 -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-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 +119 -0
- package/dist/foundation/release/update.js +632 -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 +21 -0
- package/dist/integrations/pi/components/index.js +13 -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.js +298 -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 +248 -0
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +114 -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 +123 -0
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +242 -0
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +217 -0
- package/dist/integrations/pi/components/shell-shared-facade.js +92 -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 +46 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +187 -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 +135 -0
- package/dist/integrations/pi/engine/adapter.js +648 -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 +49 -0
- package/dist/integrations/pi/engine/resource-catalog.js +289 -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 +59 -0
- package/dist/integrations/pi/engine/workflow-contexts.js +316 -0
- package/dist/integrations/pi/engine/workflow-runner.d.ts +60 -0
- package/dist/integrations/pi/engine/workflow-runner.js +509 -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 +251 -0
- package/dist/integrations/pi/engine/workflows.js +63 -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 +127147 -0
- package/dist/ui/apps/contracts.d.ts +64 -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 +141 -0
- package/dist/ui/settings/declarations.js +135 -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 +74 -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 +91 -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 +60 -6
- package/docs/ci-release-runbook.md +256 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/features/modal-content-interaction.md +37 -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 +49 -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.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 -529
- 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}/shell-editor-autocomplete.d.ts +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,356 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
7
|
+
import { processIsAlive } from "./process-cleanup.js";
|
|
8
|
+
import { PRIVATE_LAUNCH_CONTRACT, assertCurrentLaunchContract } from "../launch-context/index.js";
|
|
9
|
+
export const UPDATE_RECOVERY_SCHEMA = "a1-update-recovery-v1";
|
|
10
|
+
const WORKER_TIMEOUT_MS = 15 * 60 * 1_000;
|
|
11
|
+
const POLL_MS = 50;
|
|
12
|
+
/** Resolve the complete public launcher set npm owns for the active platform. */
|
|
13
|
+
export function updateLauncherPaths(globalRoot, platform = process.platform) {
|
|
14
|
+
const launcherRoot = platform === "win32" ? dirname(globalRoot) : resolve(globalRoot, "..", "..", "bin");
|
|
15
|
+
return platform === "win32"
|
|
16
|
+
? [resolve(launcherRoot, "a1"), resolve(launcherRoot, "a1.cmd"), resolve(launcherRoot, "a1.ps1")]
|
|
17
|
+
: [resolve(launcherRoot, "a1")];
|
|
18
|
+
}
|
|
19
|
+
/** Validate transaction-scoped recovery authority without trusting npm temporary names. */
|
|
20
|
+
export async function readUpdateRecoveryCapsule(manifestPath, platform = process.platform) {
|
|
21
|
+
const capsule = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
22
|
+
assertCurrentLaunchContract(capsule);
|
|
23
|
+
if (capsule.schema !== UPDATE_RECOVERY_SCHEMA || !/^[0-9a-f-]{36}$/i.test(capsule.transactionId) || typeof capsule.targetVersion !== "string"
|
|
24
|
+
|| capsule.packageName !== PRODUCT_TEXT.packageName || typeof capsule.packageRoot !== "string" || typeof capsule.globalRoot !== "string"
|
|
25
|
+
|| typeof capsule.launcherRoot !== "string" || !Array.isArray(capsule.launchers) || typeof capsule.priorReleaseId !== "string"
|
|
26
|
+
|| typeof capsule.priorReleaseRoot !== "string" || !/^[a-f0-9]{64}$/.test(capsule.priorContentDigest) || capsule.releaseManifestName !== PRODUCT_IDENTITY.manifest.releaseFilename || typeof capsule.recoveryEntry !== "string"
|
|
27
|
+
|| !/^[a-f0-9]{64}$/.test(capsule.recoveryEntryDigest) || typeof capsule.nodeExecutable !== "string" || typeof capsule.npmCli !== "string" || !Array.isArray(capsule.npmArguments)
|
|
28
|
+
|| typeof capsule.cancellationPath !== "string" || typeof capsule.resultPath !== "string" || typeof capsule.ownerPath !== "string") {
|
|
29
|
+
throw new Error("invalid A1 update recovery capsule");
|
|
30
|
+
}
|
|
31
|
+
const canonicalGlobal = await realpath(capsule.globalRoot);
|
|
32
|
+
const canonicalPackage = await realpath(capsule.packageRoot).catch(() => resolve(capsule.packageRoot));
|
|
33
|
+
const expectedPackage = resolve(canonicalGlobal, ...capsule.packageName.split("/"));
|
|
34
|
+
if (!samePath(canonicalPackage, expectedPackage) || !containedBy(canonicalGlobal, canonicalPackage))
|
|
35
|
+
throw new Error("recovery package root is outside npm global root");
|
|
36
|
+
const expectedNpmArguments = ["install", "--global", "--loglevel=error", "--no-fund", "--no-audit", `${capsule.packageName}@${capsule.targetVersion}`];
|
|
37
|
+
if (JSON.stringify(capsule.npmArguments) !== JSON.stringify(expectedNpmArguments))
|
|
38
|
+
throw new Error("recovery npm arguments differ from the selected target");
|
|
39
|
+
const expectedLaunchers = updateLauncherPaths(canonicalGlobal, platform);
|
|
40
|
+
if (JSON.stringify(capsule.launchers.map(path => resolve(path))) !== JSON.stringify(expectedLaunchers.map(path => resolve(path)))) {
|
|
41
|
+
throw new Error("recovery launcher set differs from the canonical npm launcher set");
|
|
42
|
+
}
|
|
43
|
+
for (const path of capsule.launchers)
|
|
44
|
+
assertDirectChild(resolve(capsule.launcherRoot), resolve(path));
|
|
45
|
+
const lexicalCapsuleRoot = dirname(resolve(manifestPath));
|
|
46
|
+
if (lexicalCapsuleRoot.split(sep).at(-1) !== capsule.transactionId)
|
|
47
|
+
throw new Error("recovery capsule path differs from its transaction identity");
|
|
48
|
+
const capsuleRoot = await realpath(lexicalCapsuleRoot);
|
|
49
|
+
const entry = await realpath(capsule.recoveryEntry);
|
|
50
|
+
assertDirectChild(capsuleRoot, entry);
|
|
51
|
+
if (!samePath(entry, resolve(capsuleRoot, "recovery.js")))
|
|
52
|
+
throw new Error("recovery entry path differs from the managed capsule");
|
|
53
|
+
const expectedSidecars = [resolve(lexicalCapsuleRoot, "cancel.json"), resolve(lexicalCapsuleRoot, "result.json"), resolve(lexicalCapsuleRoot, "owner.json")];
|
|
54
|
+
if (![capsule.cancellationPath, capsule.resultPath, capsule.ownerPath].every((path, index) => samePath(resolve(path), expectedSidecars[index]))) {
|
|
55
|
+
throw new Error("recovery sidecar paths differ from the managed capsule");
|
|
56
|
+
}
|
|
57
|
+
const dataDir = dirname(dirname(capsuleRoot));
|
|
58
|
+
const releasesRoot = await realpath(resolve(dataDir, "releases"));
|
|
59
|
+
const priorReleaseRoot = await realpath(capsule.priorReleaseRoot);
|
|
60
|
+
assertDirectChild(releasesRoot, priorReleaseRoot);
|
|
61
|
+
if (priorReleaseRoot.split(sep).at(-1) !== capsule.priorReleaseId)
|
|
62
|
+
throw new Error("recovery prior release identity is invalid");
|
|
63
|
+
const priorManifest = JSON.parse(await readFile(resolve(priorReleaseRoot, capsule.releaseManifestName), "utf8"));
|
|
64
|
+
assertCurrentLaunchContract(priorManifest);
|
|
65
|
+
if (priorManifest.releaseId !== capsule.priorReleaseId || priorManifest.contentDigest !== capsule.priorContentDigest) {
|
|
66
|
+
throw new Error("recovery prior release manifest differs from the capsule");
|
|
67
|
+
}
|
|
68
|
+
if (resolve(capsule.nodeExecutable) !== resolve(process.execPath))
|
|
69
|
+
throw new Error("recovery Node executable differs from the current runtime");
|
|
70
|
+
const npmMetadata = await lstat(capsule.npmCli);
|
|
71
|
+
if (!npmMetadata.isFile() || npmMetadata.isSymbolicLink())
|
|
72
|
+
throw new Error("recovery npm entry is invalid");
|
|
73
|
+
const digest = createHash("sha256").update(await readFile(entry)).digest("hex");
|
|
74
|
+
if (digest !== capsule.recoveryEntryDigest)
|
|
75
|
+
throw new Error("recovery entry digest differs from capsule");
|
|
76
|
+
return capsule;
|
|
77
|
+
}
|
|
78
|
+
/** Prepare durable recovery authority before npm can mutate the live launcher set. */
|
|
79
|
+
export async function prepareUpdateRecoveryCapsule(options) {
|
|
80
|
+
const root = resolve(options.dataDir, "update-recovery");
|
|
81
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
82
|
+
const finalRoot = resolve(root, options.transaction.transactionId);
|
|
83
|
+
const existingManifest = resolve(finalRoot, "capsule.json");
|
|
84
|
+
if (await lstat(existingManifest).catch(() => null))
|
|
85
|
+
return { capsule: await readUpdateRecoveryCapsule(existingManifest, options.platform), manifestPath: existingManifest };
|
|
86
|
+
const candidate = resolve(root, `.candidate-${options.transaction.transactionId}-${randomUUID()}`);
|
|
87
|
+
await mkdir(candidate, { mode: 0o700 });
|
|
88
|
+
try {
|
|
89
|
+
const sourceEntry = fileURLToPath(new URL("../../../bin/update-recovery.js", import.meta.url));
|
|
90
|
+
const entryBytes = await readFile(sourceEntry);
|
|
91
|
+
const candidateEntry = resolve(candidate, "recovery.js");
|
|
92
|
+
const recoveryEntry = resolve(finalRoot, "recovery.js");
|
|
93
|
+
await writeFile(candidateEntry, entryBytes, { flag: "wx", mode: 0o500 });
|
|
94
|
+
await chmod(candidateEntry, 0o500);
|
|
95
|
+
const canonicalGlobal = await realpath(options.globalRoot);
|
|
96
|
+
const platform = options.platform ?? process.platform;
|
|
97
|
+
const launcherRoot = platform === "win32" ? dirname(canonicalGlobal) : resolve(canonicalGlobal, "..", "..", "bin");
|
|
98
|
+
const npmCli = await resolveNpmCli(canonicalGlobal, options.environment ?? process.env);
|
|
99
|
+
const capsule = {
|
|
100
|
+
schema: UPDATE_RECOVERY_SCHEMA,
|
|
101
|
+
launchContract: PRIVATE_LAUNCH_CONTRACT,
|
|
102
|
+
transactionId: options.transaction.transactionId,
|
|
103
|
+
packageName: PRODUCT_TEXT.packageName,
|
|
104
|
+
targetVersion: options.transaction.targetVersion,
|
|
105
|
+
packageRoot: resolve(options.packageRoot),
|
|
106
|
+
globalRoot: canonicalGlobal,
|
|
107
|
+
launcherRoot,
|
|
108
|
+
launchers: updateLauncherPaths(canonicalGlobal, platform),
|
|
109
|
+
priorReleaseId: options.priorRelease.releaseId,
|
|
110
|
+
priorReleaseRoot: resolve(options.priorRelease.releaseRoot),
|
|
111
|
+
priorContentDigest: options.priorRelease.contentDigest,
|
|
112
|
+
releaseManifestName: PRODUCT_IDENTITY.manifest.releaseFilename,
|
|
113
|
+
recoveryEntry,
|
|
114
|
+
recoveryEntryDigest: createHash("sha256").update(entryBytes).digest("hex"),
|
|
115
|
+
nodeExecutable: process.execPath,
|
|
116
|
+
npmCli,
|
|
117
|
+
npmArguments: ["install", "--global", "--loglevel=error", "--no-fund", "--no-audit", `${PRODUCT_TEXT.packageName}@${options.transaction.targetVersion}`],
|
|
118
|
+
cancellationPath: resolve(finalRoot, "cancel.json"),
|
|
119
|
+
resultPath: resolve(finalRoot, "result.json"),
|
|
120
|
+
ownerPath: resolve(finalRoot, "owner.json"),
|
|
121
|
+
createdAt: new Date().toISOString(),
|
|
122
|
+
};
|
|
123
|
+
await writeDurableJson(resolve(candidate, "capsule.json"), capsule);
|
|
124
|
+
try {
|
|
125
|
+
await rename(candidate, finalRoot);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (!await lstat(finalRoot).catch(() => null))
|
|
129
|
+
throw error;
|
|
130
|
+
await rm(candidate, { recursive: true, force: true });
|
|
131
|
+
}
|
|
132
|
+
const manifestPath = resolve(finalRoot, "capsule.json");
|
|
133
|
+
return { capsule: await readUpdateRecoveryCapsule(manifestPath, options.platform), manifestPath };
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
await rm(candidate, { recursive: true, force: true });
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Execute global replacement behind a detached owner and coordinate terminal cancellation. */
|
|
141
|
+
export async function runProtectedPackageReplacement(options) {
|
|
142
|
+
const prepared = await prepareUpdateRecoveryCapsule(options);
|
|
143
|
+
const capsule = prepared.capsule;
|
|
144
|
+
await options.onRecoveryState?.({
|
|
145
|
+
capsulePath: prepared.manifestPath,
|
|
146
|
+
status: "prepared",
|
|
147
|
+
guardianPid: null,
|
|
148
|
+
guardianStartIdentity: null,
|
|
149
|
+
cancellationRequested: false,
|
|
150
|
+
launcherDisposition: "pending",
|
|
151
|
+
});
|
|
152
|
+
let owner = await readLiveRecoveryOwner(capsule.ownerPath, capsule.transactionId);
|
|
153
|
+
const ownerIsLive = owner !== null;
|
|
154
|
+
const priorResult = await readRecoveryResult(capsule.resultPath, capsule.transactionId).catch(() => null);
|
|
155
|
+
if (!ownerIsLive && priorResult?.outcome !== "installed") {
|
|
156
|
+
const startLease = resolve(dirname(prepared.manifestPath), "worker-starting.lock");
|
|
157
|
+
if (await acquireStartLease(startLease)) {
|
|
158
|
+
await Promise.all([rm(capsule.resultPath, { force: true }), rm(capsule.cancellationPath, { force: true }), rm(capsule.ownerPath, { force: true })]);
|
|
159
|
+
owner = null;
|
|
160
|
+
try {
|
|
161
|
+
await (options.workerSpawner ?? spawnRecoveryWorker)(capsule.recoveryEntry, prepared.manifestPath, options.environment ?? process.env);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
await rm(startLease, { force: true });
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
let runningRecorded = false;
|
|
170
|
+
let cancellationReported = false;
|
|
171
|
+
let cancellationWrite = null;
|
|
172
|
+
const requestCancellation = (signal) => {
|
|
173
|
+
cancellationWrite ??= writeDurableJson(capsule.cancellationPath, { schema: UPDATE_RECOVERY_SCHEMA, transactionId: capsule.transactionId, signal, requestedAt: new Date().toISOString() });
|
|
174
|
+
if (!cancellationReported) {
|
|
175
|
+
cancellationReported = true;
|
|
176
|
+
options.output.stderr(`${PRODUCT_TEXT.diagnostic("cancellation requested; restoring a callable launcher before exiting.")}\n`);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const onSigint = () => requestCancellation("SIGINT");
|
|
180
|
+
const onSigterm = () => requestCancellation("SIGTERM");
|
|
181
|
+
process.on("SIGINT", onSigint);
|
|
182
|
+
process.on("SIGTERM", onSigterm);
|
|
183
|
+
try {
|
|
184
|
+
const deadline = Date.now() + (options.timeoutMs ?? WORKER_TIMEOUT_MS);
|
|
185
|
+
while (Date.now() < deadline) {
|
|
186
|
+
const result = await readRecoveryResult(capsule.resultPath, capsule.transactionId).catch(() => null);
|
|
187
|
+
if (result) {
|
|
188
|
+
const recovery = {
|
|
189
|
+
capsulePath: prepared.manifestPath,
|
|
190
|
+
status: result.outcome === "installed" ? "package-installed" : "recovery-launcher",
|
|
191
|
+
guardianPid: typeof owner?.pid === "number" ? owner.pid : null,
|
|
192
|
+
guardianStartIdentity: typeof owner?.startIdentity === "string" ? owner.startIdentity : null,
|
|
193
|
+
cancellationRequested: result.cancelled,
|
|
194
|
+
launcherDisposition: result.launcherDisposition,
|
|
195
|
+
};
|
|
196
|
+
if (cancellationWrite)
|
|
197
|
+
await cancellationWrite;
|
|
198
|
+
await options.onRecoveryState?.(recovery);
|
|
199
|
+
return { ...result, recovery };
|
|
200
|
+
}
|
|
201
|
+
owner = await readLiveRecoveryOwner(capsule.ownerPath, capsule.transactionId) ?? owner;
|
|
202
|
+
if (!runningRecorded && owner?.transactionId === capsule.transactionId && typeof owner.pid === "number" && typeof owner.startIdentity === "string") {
|
|
203
|
+
runningRecorded = true;
|
|
204
|
+
await rm(resolve(dirname(prepared.manifestPath), "worker-starting.lock"), { force: true });
|
|
205
|
+
await options.onRecoveryState?.({
|
|
206
|
+
capsulePath: prepared.manifestPath,
|
|
207
|
+
status: "running",
|
|
208
|
+
guardianPid: owner.pid,
|
|
209
|
+
guardianStartIdentity: owner.startIdentity,
|
|
210
|
+
cancellationRequested: false,
|
|
211
|
+
launcherDisposition: "pending",
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
await new Promise(resolvePromise => setTimeout(resolvePromise, POLL_MS));
|
|
215
|
+
}
|
|
216
|
+
requestCancellation("SIGTERM");
|
|
217
|
+
if (cancellationWrite)
|
|
218
|
+
await cancellationWrite;
|
|
219
|
+
throw new Error("A1 update recovery guardian timed out before establishing a callable launcher");
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
process.off("SIGINT", onSigint);
|
|
223
|
+
process.off("SIGTERM", onSigterm);
|
|
224
|
+
try {
|
|
225
|
+
await cancellationWrite;
|
|
226
|
+
}
|
|
227
|
+
catch { }
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export async function removeUpdateRecoveryCapsule(dataDir, transactionId) {
|
|
231
|
+
if (!/^[0-9a-f-]+$/i.test(transactionId))
|
|
232
|
+
throw new Error("invalid update recovery transaction identity");
|
|
233
|
+
await rm(resolve(dataDir, "update-recovery", transactionId), { recursive: true, force: true });
|
|
234
|
+
}
|
|
235
|
+
/** Classify a complete launcher set without following linked or mixed launcher files. */
|
|
236
|
+
export async function inspectUpdateLauncherSet(capsule, platform = process.platform) {
|
|
237
|
+
let disposition = null;
|
|
238
|
+
const targetToken = `node_modules/${capsule.packageName}/bin/cli.js`;
|
|
239
|
+
for (const path of capsule.launchers) {
|
|
240
|
+
const metadata = await lstat(path).catch(() => null);
|
|
241
|
+
if (!metadata?.isFile() || metadata.isSymbolicLink() || (platform !== "win32" && (metadata.mode & 0o111) === 0))
|
|
242
|
+
return "unavailable";
|
|
243
|
+
const source = (await readFile(path, "utf8")).replaceAll("\\", "/");
|
|
244
|
+
const current = source.includes(capsule.recoveryEntry.replaceAll("\\", "/")) ? "recovery"
|
|
245
|
+
: source.includes(targetToken) ? "target" : null;
|
|
246
|
+
if (current === null || disposition !== null && disposition !== current)
|
|
247
|
+
return "unavailable";
|
|
248
|
+
disposition = current;
|
|
249
|
+
}
|
|
250
|
+
return disposition ?? "unavailable";
|
|
251
|
+
}
|
|
252
|
+
/** Remove terminal recovery capsules only after no canonical launcher references them. */
|
|
253
|
+
export async function cleanupUpdateRecoveryCapsules(dataDir) {
|
|
254
|
+
const root = resolve(dataDir, "update-recovery");
|
|
255
|
+
for (const entry of await readdir(root, { withFileTypes: true }).catch(() => [])) {
|
|
256
|
+
if (!entry.isDirectory() || entry.name.startsWith(".candidate-"))
|
|
257
|
+
continue;
|
|
258
|
+
const capsuleRoot = resolve(root, entry.name);
|
|
259
|
+
const manifestPath = resolve(capsuleRoot, "capsule.json");
|
|
260
|
+
try {
|
|
261
|
+
const capsule = await readUpdateRecoveryCapsule(manifestPath);
|
|
262
|
+
if (await inspectUpdateLauncherSet(capsule) !== "recovery")
|
|
263
|
+
await rm(capsuleRoot, { recursive: true, force: true });
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// Security: malformed recovery authority is retained for diagnostics rather than used as deletion authority.
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
async function spawnRecoveryWorker(entry, manifestPath, environment) {
|
|
271
|
+
const child = spawn(process.execPath, [entry, "--worker", manifestPath], { detached: true, stdio: "ignore", windowsHide: true, env: environment });
|
|
272
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
273
|
+
child.once("spawn", resolvePromise);
|
|
274
|
+
child.once("error", rejectPromise);
|
|
275
|
+
});
|
|
276
|
+
child.unref();
|
|
277
|
+
}
|
|
278
|
+
async function resolveNpmCli(globalRoot, environment) {
|
|
279
|
+
const candidates = [environment.npm_execpath, resolve(globalRoot, "npm", "bin", "npm-cli.js")].filter((value) => typeof value === "string" && value.length > 0);
|
|
280
|
+
for (const candidate of candidates) {
|
|
281
|
+
const canonical = await realpath(candidate).catch(() => null);
|
|
282
|
+
if (canonical && await lstat(canonical).then(metadata => metadata.isFile()).catch(() => false))
|
|
283
|
+
return canonical;
|
|
284
|
+
}
|
|
285
|
+
throw new Error("could not resolve npm's JavaScript entry for protected package replacement");
|
|
286
|
+
}
|
|
287
|
+
async function readLiveRecoveryOwner(path, transactionId) {
|
|
288
|
+
const owner = await readJson(path).catch(() => null);
|
|
289
|
+
const metadata = await lstat(path).catch(() => null);
|
|
290
|
+
if (!owner || owner.transactionId !== transactionId || typeof owner.pid !== "number" || typeof owner.startIdentity !== "string"
|
|
291
|
+
|| !metadata || Date.now() - metadata.mtimeMs > 2_000 || !processIsAlive(owner.pid))
|
|
292
|
+
return null;
|
|
293
|
+
return owner;
|
|
294
|
+
}
|
|
295
|
+
async function acquireStartLease(path) {
|
|
296
|
+
try {
|
|
297
|
+
const file = await open(path, "wx", 0o600);
|
|
298
|
+
await file.writeFile(JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() }));
|
|
299
|
+
await file.close();
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
if (!(error instanceof Error && "code" in error && error.code === "EEXIST"))
|
|
304
|
+
throw error;
|
|
305
|
+
const metadata = await lstat(path).catch(() => null);
|
|
306
|
+
if (metadata && Date.now() - metadata.mtimeMs > 5_000) {
|
|
307
|
+
await rm(path, { force: true });
|
|
308
|
+
return await acquireStartLease(path);
|
|
309
|
+
}
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
async function readRecoveryResult(path, transactionId) {
|
|
314
|
+
const value = await readJson(path).catch(error => {
|
|
315
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
316
|
+
return null;
|
|
317
|
+
throw error;
|
|
318
|
+
});
|
|
319
|
+
if (value === null)
|
|
320
|
+
return null;
|
|
321
|
+
if (value.schema !== UPDATE_RECOVERY_SCHEMA || value.transactionId !== transactionId || !["installed", "recovery-launcher", "failed"].includes(value.outcome)
|
|
322
|
+
|| !["target", "recovery", "unavailable"].includes(value.launcherDisposition) || typeof value.cancelled !== "boolean"
|
|
323
|
+
|| typeof value.stdout !== "string" || typeof value.stderr !== "string")
|
|
324
|
+
throw new Error("invalid A1 update recovery result");
|
|
325
|
+
return value;
|
|
326
|
+
}
|
|
327
|
+
async function writeDurableJson(path, value) {
|
|
328
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
329
|
+
const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
330
|
+
const file = await open(temporary, "wx", 0o600);
|
|
331
|
+
try {
|
|
332
|
+
await file.writeFile(JSON.stringify(value, null, 2));
|
|
333
|
+
await file.sync();
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
await file.close();
|
|
337
|
+
}
|
|
338
|
+
await rename(temporary, path);
|
|
339
|
+
}
|
|
340
|
+
async function readJson(path) { return JSON.parse(await readFile(path, "utf8")); }
|
|
341
|
+
function samePath(left, right) {
|
|
342
|
+
return process.platform === "win32" ? resolve(left).toLowerCase() === resolve(right).toLowerCase() : resolve(left) === resolve(right);
|
|
343
|
+
}
|
|
344
|
+
function containedBy(parent, child) {
|
|
345
|
+
const fromParent = relative(parent, child);
|
|
346
|
+
return fromParent.length > 0 && fromParent !== ".." && !fromParent.startsWith(`..${sep}`) && !isAbsolute(fromParent);
|
|
347
|
+
}
|
|
348
|
+
function assertDirectChild(parent, child) {
|
|
349
|
+
const expectedParent = resolve(parent);
|
|
350
|
+
const actualParent = dirname(resolve(child));
|
|
351
|
+
const matches = process.platform === "win32"
|
|
352
|
+
? actualParent.toLowerCase() === expectedParent.toLowerCase()
|
|
353
|
+
: actualParent === expectedParent;
|
|
354
|
+
if (!matches)
|
|
355
|
+
throw new Error(`update recovery path is outside its managed root: ${child}`);
|
|
356
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export declare const UPDATE_JOURNAL_SCHEMA: string;
|
|
2
|
+
import type { UpdateChannel } from "./types.js";
|
|
3
|
+
export type UpdateTransactionPhase = "shutdown-intent" | "ownership-released" | "package-installed" | "materialized" | "certified" | "active-reference-committed" | "supervisor-verified";
|
|
4
|
+
export interface UpdateRecoveryState {
|
|
5
|
+
readonly capsulePath: string;
|
|
6
|
+
readonly status: "prepared" | "running" | "package-installed" | "recovery-launcher";
|
|
7
|
+
readonly guardianPid: number | null;
|
|
8
|
+
readonly guardianStartIdentity: string | null;
|
|
9
|
+
readonly cancellationRequested: boolean;
|
|
10
|
+
readonly launcherDisposition: "pending" | "target" | "recovery" | "unavailable";
|
|
11
|
+
}
|
|
12
|
+
export interface UpdateTransaction {
|
|
13
|
+
readonly schema: typeof UPDATE_JOURNAL_SCHEMA;
|
|
14
|
+
readonly transactionId: string;
|
|
15
|
+
readonly channel: UpdateChannel;
|
|
16
|
+
readonly targetVersion: string;
|
|
17
|
+
readonly packageRoot: string;
|
|
18
|
+
readonly priorActiveReleaseId: string | null;
|
|
19
|
+
readonly phase: UpdateTransactionPhase;
|
|
20
|
+
readonly status: "active" | "completed" | "rolled-back" | "failed";
|
|
21
|
+
readonly error: string | null;
|
|
22
|
+
readonly recovery?: UpdateRecoveryState;
|
|
23
|
+
readonly startedAt: string;
|
|
24
|
+
readonly updatedAt: string;
|
|
25
|
+
}
|
|
26
|
+
/** Persists the durable update journal and permits only validated forward transaction phases. */
|
|
27
|
+
export declare class UpdateTransactionStore {
|
|
28
|
+
#private;
|
|
29
|
+
readonly path: string;
|
|
30
|
+
constructor(dataDir: string);
|
|
31
|
+
read(): Promise<UpdateTransaction | null>;
|
|
32
|
+
begin(input: {
|
|
33
|
+
channel: UpdateChannel;
|
|
34
|
+
targetVersion: string;
|
|
35
|
+
packageRoot: string;
|
|
36
|
+
priorActiveReleaseId: string | null;
|
|
37
|
+
}): Promise<UpdateTransaction>;
|
|
38
|
+
advance(phase: UpdateTransactionPhase): Promise<UpdateTransaction>;
|
|
39
|
+
setRecovery(recovery: UpdateRecoveryState): Promise<UpdateTransaction>;
|
|
40
|
+
finish(status: "completed" | "rolled-back" | "failed", error?: string | null): Promise<UpdateTransaction>;
|
|
41
|
+
clearCompleted(): Promise<void>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, open, readFile, rename, rm } from "node:fs/promises";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
5
|
+
export const UPDATE_JOURNAL_SCHEMA = PRODUCT_IDENTITY.protocol.updateJournalSchema;
|
|
6
|
+
/** Persists the durable update journal and permits only validated forward transaction phases. */
|
|
7
|
+
export class UpdateTransactionStore {
|
|
8
|
+
path;
|
|
9
|
+
constructor(dataDir) { this.path = resolve(dataDir, "update-transaction.json"); }
|
|
10
|
+
async read() {
|
|
11
|
+
try {
|
|
12
|
+
const value = JSON.parse(await readFile(this.path, "utf8"));
|
|
13
|
+
validate(value);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
18
|
+
return null;
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async begin(input) {
|
|
23
|
+
const current = await this.read();
|
|
24
|
+
if (current?.status === "active") {
|
|
25
|
+
if (current.targetVersion !== input.targetVersion || current.channel !== input.channel) {
|
|
26
|
+
throw new Error(PRODUCT_TEXT.diagnostic(`has unfinished update ${current.transactionId} targeting ${current.targetVersion}; reconcile it before starting ${input.targetVersion}`));
|
|
27
|
+
}
|
|
28
|
+
return current;
|
|
29
|
+
}
|
|
30
|
+
const now = new Date().toISOString();
|
|
31
|
+
return await this.#write({
|
|
32
|
+
schema: UPDATE_JOURNAL_SCHEMA,
|
|
33
|
+
transactionId: randomUUID(),
|
|
34
|
+
...input,
|
|
35
|
+
phase: "shutdown-intent",
|
|
36
|
+
status: "active",
|
|
37
|
+
error: null,
|
|
38
|
+
startedAt: now,
|
|
39
|
+
updatedAt: now,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async advance(phase) {
|
|
43
|
+
const current = await this.#requiredActive();
|
|
44
|
+
if (phaseOrder(phase) < phaseOrder(current.phase))
|
|
45
|
+
return current;
|
|
46
|
+
return await this.#write({ ...current, phase, updatedAt: new Date().toISOString() });
|
|
47
|
+
}
|
|
48
|
+
async setRecovery(recovery) {
|
|
49
|
+
const current = await this.#requiredActive();
|
|
50
|
+
return await this.#write({ ...current, recovery, updatedAt: new Date().toISOString() });
|
|
51
|
+
}
|
|
52
|
+
async finish(status, error = null) {
|
|
53
|
+
const current = await this.read();
|
|
54
|
+
if (!current)
|
|
55
|
+
throw new Error(`no ${PRODUCT_TEXT.displayName} update transaction is recorded`);
|
|
56
|
+
return await this.#write({ ...current, status, error, updatedAt: new Date().toISOString() });
|
|
57
|
+
}
|
|
58
|
+
async clearCompleted() {
|
|
59
|
+
const current = await this.read();
|
|
60
|
+
if (current && current.status !== "active")
|
|
61
|
+
await rm(this.path, { force: true });
|
|
62
|
+
}
|
|
63
|
+
async #requiredActive() {
|
|
64
|
+
const current = await this.read();
|
|
65
|
+
if (!current || current.status !== "active")
|
|
66
|
+
throw new Error(`no active ${PRODUCT_TEXT.displayName} update transaction is recorded`);
|
|
67
|
+
return current;
|
|
68
|
+
}
|
|
69
|
+
async #write(value) {
|
|
70
|
+
validate(value);
|
|
71
|
+
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
72
|
+
const temporary = `${this.path}.${process.pid}.${randomUUID()}.tmp`;
|
|
73
|
+
const file = await open(temporary, "wx", 0o600);
|
|
74
|
+
try {
|
|
75
|
+
await file.writeFile(JSON.stringify(value, null, 2));
|
|
76
|
+
await file.sync();
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await file.close();
|
|
80
|
+
}
|
|
81
|
+
await rename(temporary, this.path);
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function phaseOrder(phase) {
|
|
86
|
+
return ["shutdown-intent", "ownership-released", "package-installed", "materialized", "certified", "active-reference-committed", "supervisor-verified"].indexOf(phase);
|
|
87
|
+
}
|
|
88
|
+
function validate(value) {
|
|
89
|
+
if (value.schema !== UPDATE_JOURNAL_SCHEMA || typeof value.transactionId !== "string" || !["stable", "next"].includes(value.channel)
|
|
90
|
+
|| typeof value.targetVersion !== "string" || typeof value.packageRoot !== "string" || typeof value.startedAt !== "string"
|
|
91
|
+
|| typeof value.updatedAt !== "string" || phaseOrder(value.phase) < 0 || !["active", "completed", "rolled-back", "failed"].includes(value.status)
|
|
92
|
+
|| (value.recovery !== undefined && !validRecovery(value.recovery))) {
|
|
93
|
+
throw new Error(`invalid ${PRODUCT_TEXT.displayName} update transaction journal`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function validRecovery(value) {
|
|
97
|
+
return typeof value.capsulePath === "string" && ["prepared", "running", "package-installed", "recovery-launcher"].includes(value.status)
|
|
98
|
+
&& (value.guardianPid === null || Number.isSafeInteger(value.guardianPid) && value.guardianPid > 0)
|
|
99
|
+
&& (value.guardianStartIdentity === null || typeof value.guardianStartIdentity === "string")
|
|
100
|
+
&& typeof value.cancellationRequested === "boolean" && ["pending", "target", "recovery", "unavailable"].includes(value.launcherDisposition);
|
|
101
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { UpdateChannel } from "./types.js";
|
|
2
|
+
import { type UpdateRecoveryState, type UpdateTransaction, type UpdateTransactionPhase } from "./update-transaction.js";
|
|
3
|
+
import { type ProtectedPackageReplacementResult } from "./update-recovery.js";
|
|
4
|
+
export declare const PRODUCT_PACKAGE: string;
|
|
5
|
+
export type { UpdateChannel } from "./types.js";
|
|
6
|
+
export interface ProcessRequest {
|
|
7
|
+
captureStdout: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ProcessResult {
|
|
10
|
+
code: number | null;
|
|
11
|
+
stdout: string;
|
|
12
|
+
}
|
|
13
|
+
export type UpdateProcessRunner = (command: string, arguments_: readonly string[], request: ProcessRequest) => Promise<ProcessResult>;
|
|
14
|
+
export interface UpdateFileSystem {
|
|
15
|
+
readFile(path: string): Promise<string>;
|
|
16
|
+
realpath(path: string): Promise<string>;
|
|
17
|
+
access?(path: string): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export interface UpdateOutput {
|
|
20
|
+
stdout(message: string): void;
|
|
21
|
+
stderr(message: string): void;
|
|
22
|
+
}
|
|
23
|
+
export type UpdateMeasuredPhase = "package-version" | "target-resolution" | "global-root" | "ownership-release" | "npm-install" | "materialized" | "certified" | "active-reference-committed" | "warmup" | "supervisor-verified" | "transaction-complete";
|
|
24
|
+
export interface UpdatePhaseTimingEvent {
|
|
25
|
+
readonly phase: UpdateMeasuredPhase;
|
|
26
|
+
readonly durationMs: number;
|
|
27
|
+
}
|
|
28
|
+
export interface UpdatePerformanceEvidence {
|
|
29
|
+
readonly fileCount: number;
|
|
30
|
+
readonly sourceReads: number;
|
|
31
|
+
readonly candidateWrites: number;
|
|
32
|
+
readonly verificationReads: number;
|
|
33
|
+
readonly layerWrites?: number;
|
|
34
|
+
readonly layerReusedFiles?: number;
|
|
35
|
+
readonly layerReusedBytes?: number;
|
|
36
|
+
readonly payloadExcludedFiles?: number;
|
|
37
|
+
readonly payloadExcludedBytes?: number;
|
|
38
|
+
readonly warmupDurationMs?: number;
|
|
39
|
+
readonly postNpmDurationMs: number;
|
|
40
|
+
}
|
|
41
|
+
export interface SelfUpdateOptions {
|
|
42
|
+
packageRoot: string;
|
|
43
|
+
channel?: UpdateChannel;
|
|
44
|
+
/** A specific preview to install, named by its development number or full version. */
|
|
45
|
+
target?: string;
|
|
46
|
+
environment?: NodeJS.ProcessEnv;
|
|
47
|
+
fileSystem?: UpdateFileSystem;
|
|
48
|
+
output?: UpdateOutput;
|
|
49
|
+
runner?: UpdateProcessRunner;
|
|
50
|
+
lifecycle?: UpdateLifecycleCoordinator;
|
|
51
|
+
transactionStore?: UpdateTransactionJournal;
|
|
52
|
+
/** Test seam for protected global package replacement. */
|
|
53
|
+
packageReplacement?: (input: UpdatePackageReplacementInput) => Promise<ProtectedPackageReplacementResult>;
|
|
54
|
+
/** Test or embedding seam for post-activation release maintenance. */
|
|
55
|
+
maintenance?: () => Promise<void>;
|
|
56
|
+
progress?: boolean;
|
|
57
|
+
onPhaseTiming?: (event: UpdatePhaseTimingEvent) => void;
|
|
58
|
+
now?: () => number;
|
|
59
|
+
}
|
|
60
|
+
export type UpdateActivationPhase = Extract<UpdateTransactionPhase, "materialized" | "certified" | "active-reference-committed">;
|
|
61
|
+
/**
|
|
62
|
+
* Copying the release is the longest step with nothing to say for itself, so it
|
|
63
|
+
* reports the files it has written against the files it must write. A caller that
|
|
64
|
+
* shows progress can then move with the work instead of guessing at it.
|
|
65
|
+
*/
|
|
66
|
+
export interface UpdateMaterializationProgress {
|
|
67
|
+
readonly completed: number;
|
|
68
|
+
readonly total: number;
|
|
69
|
+
}
|
|
70
|
+
export interface UpdateLifecycleCoordinator {
|
|
71
|
+
targetIsActive(targetVersion: string): Promise<boolean>;
|
|
72
|
+
shutdownVerifiedOwners(targetVersion: string): Promise<{
|
|
73
|
+
priorActiveVersion: string | null;
|
|
74
|
+
}>;
|
|
75
|
+
verifyPackageUnlocked(packageRoot: string): Promise<void>;
|
|
76
|
+
activateInstalled(packageRoot: string, targetVersion: string, phase: (phase: UpdateActivationPhase) => Promise<void>, onMaterializing?: (progress: UpdateMaterializationProgress) => void, onWarmup?: (state: "started" | "completed") => void): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
export interface UpdateTransactionJournal {
|
|
79
|
+
readonly path: string;
|
|
80
|
+
read(): Promise<UpdateTransaction | null>;
|
|
81
|
+
begin(input: {
|
|
82
|
+
channel: UpdateChannel;
|
|
83
|
+
targetVersion: string;
|
|
84
|
+
packageRoot: string;
|
|
85
|
+
priorActiveReleaseId: string | null;
|
|
86
|
+
}): Promise<UpdateTransaction>;
|
|
87
|
+
advance(phase: UpdateTransactionPhase): Promise<UpdateTransaction>;
|
|
88
|
+
setRecovery?(recovery: UpdateRecoveryState): Promise<UpdateTransaction>;
|
|
89
|
+
finish(status: "completed" | "rolled-back" | "failed", error?: string | null): Promise<UpdateTransaction>;
|
|
90
|
+
clearCompleted(): Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
export interface UpdatePackageReplacementInput {
|
|
93
|
+
readonly dataDir: string;
|
|
94
|
+
readonly globalRoot: string;
|
|
95
|
+
readonly packageRoot: string;
|
|
96
|
+
readonly transaction: UpdateTransaction;
|
|
97
|
+
readonly priorRelease: {
|
|
98
|
+
readonly releaseId: string;
|
|
99
|
+
readonly releaseRoot: string;
|
|
100
|
+
readonly contentDigest: string;
|
|
101
|
+
};
|
|
102
|
+
readonly output: UpdateOutput;
|
|
103
|
+
readonly environment: NodeJS.ProcessEnv;
|
|
104
|
+
readonly onRecoveryState: (state: UpdateRecoveryState) => Promise<void>;
|
|
105
|
+
}
|
|
106
|
+
export declare function createNpmProcessRunner(platform?: NodeJS.Platform): UpdateProcessRunner;
|
|
107
|
+
export type UpdateOwnershipAction = "clean-dead-record" | "leave-running" | "end-session";
|
|
108
|
+
/**
|
|
109
|
+
* What an update does about the owner it found. A cohort running from retained immutable
|
|
110
|
+
* content keeps its work: the installation replaces files it does not read, and it listens on
|
|
111
|
+
* its own endpoint. A cohort running from the mutable installation is the one exception,
|
|
112
|
+
* because that installation is exactly what is about to be replaced under it.
|
|
113
|
+
*/
|
|
114
|
+
export declare function planUpdateOwnership(ownership: "live-verified" | "dead", runsFromRetainedRelease: boolean): UpdateOwnershipAction;
|
|
115
|
+
export declare function createUpdateLifecycleCoordinator(environment?: NodeJS.ProcessEnv, fileSystem?: UpdateFileSystem, output?: UpdateOutput): UpdateLifecycleCoordinator;
|
|
116
|
+
/** Renders the terminal-only update meter; the visual preview shares this exact frame. */
|
|
117
|
+
export declare function renderUpdateProgressBar(percent: number): string;
|
|
118
|
+
export declare function runSelfUpdate(options: SelfUpdateOptions): Promise<number>;
|
|
119
|
+
export declare function assertUpdatePerformanceBudget(evidence: UpdatePerformanceEvidence, maximumPostNpmDurationMs?: number): void;
|