@timurproko/a1 0.1.8-dev.50ebb19 → 0.1.8-dev.510
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +209 -63
- package/bin/activate.js +8 -0
- package/bin/cli.js +33 -11
- package/bin/guardian.js +16 -6
- package/bin/module-identity.js +76 -69
- package/bin/module-resolver.js +138 -0
- package/bin/pinned-pi-public.d.ts +3 -0
- package/bin/pinned-pi-public.js +93 -0
- package/bin/release-cleanup.js +8 -0
- package/bin/supervisor.js +2 -2
- package/bin/sync-pi-tui-proxy.js +7 -0
- package/bin/ui.js +67 -22
- package/bin/update-recovery.js +343 -0
- package/bin/warmup.js +28 -0
- package/dist/app/session-shell/clipboard-diagnostics.d.ts +16 -0
- package/dist/app/session-shell/clipboard-diagnostics.js +65 -0
- package/dist/app/session-shell/clipboard-image.d.ts +11 -0
- package/dist/app/session-shell/clipboard-image.js +38 -0
- package/dist/app/session-shell/editor-hyperlink-budget.d.ts +9 -0
- package/dist/app/session-shell/editor-hyperlink-budget.js +23 -0
- package/dist/app/session-shell/helper-pool.d.ts +33 -0
- package/dist/app/session-shell/helper-pool.js +98 -0
- package/dist/app/session-shell/image-preparation-client.d.ts +20 -0
- package/dist/app/session-shell/image-preparation-client.js +145 -0
- package/dist/app/session-shell/image-preparation.d.ts +18 -0
- package/dist/app/session-shell/image-preparation.js +126 -0
- package/dist/app/session-shell/image-source.d.ts +13 -0
- package/dist/app/session-shell/image-source.js +171 -0
- package/dist/app/session-shell/image-worker.d.ts +17 -0
- package/dist/app/session-shell/image-worker.js +23 -0
- package/dist/app/session-shell/index.d.ts +7 -0
- package/dist/app/session-shell/index.js +4 -0
- package/dist/app/session-shell/paste-executor.d.ts +18 -0
- package/dist/app/session-shell/paste-executor.js +253 -0
- package/dist/app/session-shell/paste-helper.js +173 -0
- package/dist/app/session-shell/paste-preparation-client.d.ts +31 -0
- package/dist/app/session-shell/paste-preparation-client.js +170 -0
- package/dist/app/session-shell/paste-protocol.d.ts +78 -0
- package/dist/app/session-shell/paste-protocol.js +18 -0
- package/dist/app/session-shell/paste-text-preparation.d.ts +6 -0
- package/dist/app/session-shell/paste-text-preparation.js +134 -0
- package/dist/app/session-shell/paste-text-worker.js +12 -0
- package/dist/app/session-shell/paste-types.d.ts +17 -0
- package/dist/app/session-shell/path-chip-presentation.d.ts +7 -0
- package/dist/app/session-shell/path-chip-presentation.js +24 -0
- package/dist/app/session-shell/prompt-chips.d.ts +76 -0
- package/dist/app/session-shell/prompt-chips.js +507 -0
- package/dist/app/session-shell/prompt-history-controller.d.ts +36 -0
- package/dist/app/session-shell/prompt-history-controller.js +170 -0
- package/dist/app/session-shell/prompt-suggestion-controller.d.ts +37 -0
- package/dist/app/session-shell/prompt-suggestion-controller.js +219 -0
- package/dist/app/session-shell/quit-outro-effects.d.ts +29 -0
- package/dist/app/session-shell/quit-outro-effects.js +242 -0
- package/dist/app/session-shell/quit-outro.d.ts +38 -0
- package/dist/app/session-shell/quit-outro.js +98 -0
- package/dist/app/session-shell/response-copy-coordinator.d.ts +27 -0
- package/dist/app/session-shell/response-copy-coordinator.js +187 -0
- package/dist/app/session-shell/response-copy-helper.js +122 -0
- package/dist/app/session-shell/response-copy-protocol.d.ts +56 -0
- package/dist/app/session-shell/response-copy-protocol.js +5 -0
- package/dist/app/session-shell/response-copy-transport.d.ts +39 -0
- package/dist/app/session-shell/response-copy-transport.js +217 -0
- package/dist/app/session-shell/session-shell-root.d.ts +275 -0
- package/dist/app/session-shell/session-shell-root.js +1376 -0
- package/dist/app/session-shell/session-shell.d.ts +66 -0
- package/dist/app/session-shell/session-shell.js +2116 -0
- package/dist/app/session-shell/session-viewport-controller.d.ts +61 -0
- package/dist/app/session-shell/session-viewport-controller.js +597 -0
- package/dist/app/session-shell/stream-presentation-coalescer.d.ts +29 -0
- package/dist/app/session-shell/stream-presentation-coalescer.js +79 -0
- package/dist/app/session-shell/system-clipboard.d.ts +20 -0
- package/dist/app/session-shell/system-clipboard.js +159 -0
- package/dist/app/session-shell/text-paste.d.ts +5 -0
- package/dist/app/session-shell/text-paste.js +16 -0
- package/dist/cli/capabilities.d.ts +6 -0
- package/dist/cli/capabilities.js +7 -0
- package/dist/cli/dispatch.d.ts +46 -0
- package/dist/cli/dispatch.js +261 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/package-messages.d.ts +26 -0
- package/dist/cli/package-messages.js +71 -0
- package/dist/cli/packages.d.ts +32 -0
- package/dist/cli/packages.js +81 -0
- package/dist/cli/version-stats.d.ts +22 -0
- package/dist/cli/version-stats.js +112 -0
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +2 -0
- package/dist/composition/owned-ui.d.ts +37 -0
- package/dist/composition/owned-ui.js +154 -0
- package/dist/composition/settings-route-host.d.ts +20 -0
- package/dist/composition/settings-route-host.js +141 -0
- package/dist/contracts/agent-engine/capability-ports.d.ts +95 -0
- package/dist/contracts/agent-engine/domain-validation.js +107 -0
- package/dist/contracts/agent-engine/domain.d.ts +138 -0
- package/dist/contracts/agent-engine/index.d.ts +11 -0
- package/dist/contracts/agent-engine/index.js +6 -0
- package/dist/contracts/agent-engine/package-ports.d.ts +60 -0
- package/dist/contracts/agent-engine/ports.js +1 -0
- package/dist/contracts/owned-ui/extension-ui.d.ts +310 -0
- package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
- package/dist/contracts/owned-ui/image-attachments.js +67 -0
- package/dist/contracts/owned-ui/index.d.ts +12 -0
- package/dist/contracts/owned-ui/index.js +8 -0
- package/dist/contracts/owned-ui/model.d.ts +374 -0
- package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
- package/dist/contracts/owned-ui/prompt-history.js +23 -0
- package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
- package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
- package/dist/contracts/owned-ui/validation.d.ts +15 -0
- package/dist/contracts/owned-ui/validation.js +523 -0
- package/dist/contracts/presentation/index.d.ts +104 -0
- package/dist/features/launch/development-launch.js +36 -0
- package/dist/features/launch/index.d.ts +12 -0
- package/dist/features/launch/index.js +6 -0
- package/dist/features/launch/intent.d.ts +12 -0
- package/dist/features/launch/intent.js +8 -0
- package/dist/features/launch/prepare-launch.d.ts +11 -0
- package/dist/features/launch/prepare-launch.js +14 -0
- package/dist/features/launch/profile-paths.d.ts +16 -0
- package/dist/features/launch/profile-paths.js +36 -0
- package/dist/features/launch/runtime-selection.d.ts +16 -0
- package/dist/features/launch/runtime-selection.js +13 -0
- package/dist/features/owned-ui/index.d.ts +9 -0
- package/dist/features/owned-ui/index.js +6 -0
- package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
- package/dist/features/owned-ui/project-trust-prompt.js +149 -0
- package/dist/features/owned-ui/reference-routes.d.ts +6 -0
- package/dist/features/owned-ui/reference-routes.js +6 -0
- package/dist/features/owned-ui/reference-screen-app.d.ts +37 -0
- package/dist/features/owned-ui/reference-screen-app.js +232 -0
- package/dist/features/owned-ui/run.d.ts +17 -0
- package/dist/features/owned-ui/run.js +64 -0
- package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
- package/dist/features/owned-ui/session-fork-prompt.js +34 -0
- package/dist/features/owned-ui/settings-app.d.ts +21 -0
- package/dist/features/owned-ui/settings-app.js +802 -0
- package/dist/features/owned-ui/settings-route.d.ts +2 -0
- package/dist/features/owned-ui/settings-route.js +2 -0
- package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
- package/dist/features/prompt-history/image-sidecar.js +130 -0
- package/dist/features/prompt-history/index.d.ts +4 -0
- package/dist/features/prompt-history/index.js +3 -0
- package/dist/features/prompt-history/paths.d.ts +5 -0
- package/dist/features/prompt-history/paths.js +17 -0
- package/dist/features/prompt-history/service.d.ts +54 -0
- package/dist/features/prompt-history/service.js +425 -0
- package/dist/features/prompt-history/store.d.ts +16 -0
- package/dist/features/prompt-history/store.js +219 -0
- package/dist/features/prompt-history/worker.d.ts +9 -0
- package/dist/features/prompt-history/worker.js +45 -0
- package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
- package/dist/features/prompt-suggestions/diagnostics.js +82 -0
- package/dist/features/prompt-suggestions/index.d.ts +2 -0
- package/dist/features/prompt-suggestions/index.js +1 -0
- package/dist/foundation/launch-context/index.d.ts +59 -0
- package/dist/foundation/launch-context/index.js +136 -0
- package/dist/foundation/launch-guardian/index.d.ts +2 -0
- package/dist/foundation/launch-guardian/index.js +1 -0
- package/dist/foundation/launch-guardian/main.d.ts +33 -0
- package/dist/foundation/launch-guardian/main.js +180 -0
- package/dist/foundation/lifecycle/commands.js +1 -0
- package/dist/foundation/lifecycle/index.d.ts +11 -0
- package/dist/foundation/lifecycle/index.js +5 -0
- package/dist/foundation/lifecycle/model.d.ts +64 -0
- package/dist/foundation/lifecycle/model.js +40 -0
- package/dist/foundation/lifecycle/paths.d.ts +30 -0
- package/dist/foundation/lifecycle/paths.js +70 -0
- package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
- package/dist/foundation/lifecycle/session-selection.js +39 -0
- package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
- package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
- package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
- package/dist/foundation/process-containment/index.d.ts +8 -0
- package/dist/foundation/process-containment/index.js +6 -0
- package/dist/foundation/process-containment/linux-process-inspector.d.ts +7 -0
- package/dist/foundation/process-containment/linux-process-inspector.js +27 -0
- package/dist/foundation/process-containment/native-guardian-containment.d.ts +17 -0
- package/dist/foundation/process-containment/native-guardian-containment.js +140 -0
- package/dist/foundation/process-containment/windows-process-inspector.d.ts +19 -0
- package/dist/foundation/process-containment/windows-process-inspector.js +56 -0
- package/dist/foundation/protocol/client.d.ts +18 -0
- package/dist/foundation/protocol/client.js +130 -0
- package/dist/foundation/protocol/index.d.ts +3 -0
- package/dist/foundation/protocol/index.js +2 -0
- package/dist/foundation/protocol/messages.d.ts +90 -0
- package/dist/foundation/protocol/messages.js +100 -0
- package/dist/foundation/release/bootstrap.d.ts +51 -0
- package/dist/foundation/release/bootstrap.js +427 -0
- package/dist/foundation/release/cohort-state.d.ts +157 -0
- package/dist/foundation/release/cohort-state.js +472 -0
- package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
- package/dist/foundation/release/dependency-certification-retention.js +88 -0
- package/dist/foundation/release/dependency-certification.d.ts +24 -0
- package/dist/foundation/release/dependency-certification.js +266 -0
- package/dist/foundation/release/dependency-layer.d.ts +78 -0
- package/dist/foundation/release/dependency-layer.js +466 -0
- package/dist/foundation/release/endpoints.d.ts +24 -0
- package/dist/foundation/release/endpoints.js +134 -0
- package/dist/foundation/release/immutable-platform.d.ts +6 -0
- package/dist/foundation/release/immutable-platform.js +13 -0
- package/dist/foundation/release/index.d.ts +32 -0
- package/dist/foundation/release/index.js +17 -0
- package/dist/foundation/release/release-gc.d.ts +71 -0
- package/dist/foundation/release/release-gc.js +764 -0
- package/dist/foundation/release/release-store.d.ts +49 -0
- package/dist/foundation/release/release-store.js +235 -0
- package/dist/foundation/release/release.d.ts +43 -0
- package/dist/foundation/release/release.js +215 -0
- package/dist/foundation/release/restart-certification.d.ts +68 -0
- package/dist/foundation/release/restart-certification.js +227 -0
- package/dist/foundation/release/types.d.ts +11 -0
- package/dist/foundation/release/types.js +1 -0
- package/dist/foundation/release/update-activation.d.ts +72 -0
- package/dist/foundation/release/update-activation.js +204 -0
- package/dist/foundation/release/update-launch.d.ts +6 -0
- package/dist/foundation/release/update-launch.js +17 -0
- package/dist/foundation/release/update-recovery.d.ts +76 -0
- package/dist/foundation/release/update-recovery.js +356 -0
- package/dist/foundation/release/update-transaction.d.ts +42 -0
- package/dist/foundation/release/update-transaction.js +101 -0
- package/dist/foundation/release/update.d.ts +114 -0
- package/dist/foundation/release/update.js +633 -0
- package/dist/foundation/release/warmup.d.ts +3 -0
- package/dist/foundation/release/warmup.js +47 -0
- package/dist/foundation/startup/index.d.ts +4 -0
- package/dist/foundation/startup/index.js +2 -0
- package/dist/foundation/startup/startup-budget.d.ts +46 -0
- package/dist/foundation/startup/startup-budget.js +42 -0
- package/dist/foundation/startup/startup-descriptor.js +34 -0
- package/dist/foundation/startup/startup-runtime.d.ts +27 -0
- package/dist/foundation/startup/startup-runtime.js +128 -0
- package/dist/foundation/storage/control-store.d.ts +18 -0
- package/dist/foundation/storage/control-store.js +342 -0
- package/dist/foundation/storage/index.d.ts +1 -0
- package/dist/foundation/storage/index.js +1 -0
- package/dist/foundation/supervision/index.d.ts +3 -0
- package/dist/foundation/supervision/index.js +3 -0
- package/dist/foundation/supervision/main.d.ts +1 -0
- package/dist/foundation/supervision/main.js +84 -0
- package/dist/foundation/supervision/paths.d.ts +1 -0
- package/dist/foundation/supervision/paths.js +1 -0
- package/dist/foundation/supervision/server.d.ts +46 -0
- package/dist/foundation/supervision/server.js +573 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.js +87 -0
- package/dist/foundation/terminal-cleanup/index.d.ts +3 -0
- package/dist/foundation/terminal-cleanup/index.js +2 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
- package/dist/integrations/pi/components/components.d.ts +4 -0
- package/dist/integrations/pi/components/components.js +64 -0
- package/dist/integrations/pi/components/conformance.d.ts +18 -0
- package/dist/integrations/pi/components/conformance.js +70 -0
- package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
- package/dist/integrations/pi/components/editor-interaction.js +1 -0
- package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
- package/dist/integrations/pi/components/history-editor-loader.js +5 -0
- package/dist/integrations/pi/components/index.d.ts +23 -0
- package/dist/integrations/pi/components/index.js +14 -0
- package/dist/integrations/pi/components/models-dialog.d.ts +55 -0
- package/dist/integrations/pi/components/models-dialog.js +310 -0
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +1094 -0
- package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
- package/dist/integrations/pi/components/path-word-ranges.js +37 -0
- package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
- package/dist/integrations/pi/components/prompt-input-port.js +1 -0
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +167 -0
- package/dist/integrations/pi/components/resources/builtin-themes.js +168 -0
- package/dist/integrations/pi/components/shell-components.d.ts +7 -0
- package/dist/integrations/pi/components/shell-components.js +7 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +21 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +322 -0
- package/dist/integrations/pi/components/shell-extension-ui.d.ts +35 -0
- package/dist/integrations/pi/components/shell-extension-ui.js +280 -0
- package/dist/integrations/pi/components/shell-footer-status.d.ts +7 -0
- package/dist/integrations/pi/components/shell-footer-status.js +249 -0
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +53 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +134 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.js +433 -0
- package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +133 -0
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +255 -0
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +225 -0
- package/dist/integrations/pi/components/shell-shared-facade.js +92 -0
- package/dist/integrations/pi/components/skills-command.d.ts +47 -0
- package/dist/integrations/pi/components/skills-command.js +118 -0
- package/dist/integrations/pi/components/skills-dialog.d.ts +9 -0
- package/dist/integrations/pi/components/skills-dialog.js +112 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +17 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +49 -0
- package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
- package/dist/integrations/pi/components/tool-image-presentation.js +83 -0
- package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
- package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
- package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
- package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +445 -0
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +370 -0
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
- package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +13 -0
- package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +29 -0
- package/dist/integrations/pi/components/upstream/components/daxnuts.js +146 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.d.ts +4 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +48 -0
- package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +20 -0
- package/dist/integrations/pi/components/upstream/components/extension-editor.js +84 -0
- package/dist/integrations/pi/components/upstream/components/mermaid.js +81 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +52 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +222 -0
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +59 -0
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +346 -0
- package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +11 -0
- package/dist/integrations/pi/components/upstream/components/session-footer.js +123 -0
- package/dist/integrations/pi/components/upstream/components/session-selector-search.js +161 -0
- package/dist/integrations/pi/components/upstream/components/session-selector.d.ts +95 -0
- package/dist/integrations/pi/components/upstream/components/session-selector.js +893 -0
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +21 -0
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +46 -0
- package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +35 -0
- package/dist/integrations/pi/components/upstream/components/status-indicator.js +69 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +67 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +365 -0
- package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +101 -0
- package/dist/integrations/pi/components/upstream/components/tree-selector.js +1275 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +33 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.js +81 -0
- package/dist/integrations/pi/components/upstream/external-editor.js +43 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +289 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.js +2144 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +35 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +51 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.js +43 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +31 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +25 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +39 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +103 -0
- package/dist/integrations/pi/components/upstream/model-search.d.ts +18 -0
- package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +33 -0
- package/dist/integrations/pi/components/upstream/theme/theme-controller.js +114 -0
- package/dist/integrations/pi/components/upstream/theme/theme.d.ts +61 -0
- package/dist/integrations/pi/components/upstream/theme/theme.js +337 -0
- package/dist/integrations/pi/engine/adapter.d.ts +139 -0
- package/dist/integrations/pi/engine/adapter.js +660 -0
- package/dist/integrations/pi/engine/changelog.d.ts +2 -0
- package/dist/integrations/pi/engine/changelog.js +63 -0
- package/dist/integrations/pi/engine/command-dispatch.d.ts +41 -0
- package/dist/integrations/pi/engine/command-dispatch.js +125 -0
- package/dist/integrations/pi/engine/compaction-progress.d.ts +28 -0
- package/dist/integrations/pi/engine/compaction-progress.js +96 -0
- package/dist/integrations/pi/engine/conformance.d.ts +39 -0
- package/dist/integrations/pi/engine/conformance.js +140 -0
- package/dist/integrations/pi/engine/event-delivery.d.ts +100 -0
- package/dist/integrations/pi/engine/event-delivery.js +184 -0
- package/dist/integrations/pi/engine/extension-ui-binding.d.ts +35 -0
- package/dist/integrations/pi/engine/extension-ui-binding.js +81 -0
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/integrations/pi/engine/index.d.ts +18 -0
- package/dist/integrations/pi/engine/index.js +10 -0
- package/dist/integrations/pi/engine/message-values.d.ts +29 -0
- package/dist/integrations/pi/engine/message-values.js +168 -0
- package/dist/integrations/pi/engine/package-integration.d.ts +13 -0
- package/dist/integrations/pi/engine/package-integration.js +118 -0
- package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
- package/dist/integrations/pi/engine/pending-delivery.js +156 -0
- package/dist/integrations/pi/engine/pi-settings-metadata.json +385 -0
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
- package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
- package/dist/integrations/pi/engine/prompt-suggestions.d.ts +30 -0
- package/dist/integrations/pi/engine/prompt-suggestions.js +102 -0
- package/dist/integrations/pi/engine/provider-authentication.d.ts +34 -0
- package/dist/integrations/pi/engine/provider-authentication.js +209 -0
- package/dist/integrations/pi/engine/resource-catalog.d.ts +50 -0
- package/dist/integrations/pi/engine/resource-catalog.js +299 -0
- package/dist/integrations/pi/engine/resources/changelog.json +12 -0
- package/dist/integrations/pi/engine/runtime-integration.d.ts +53 -0
- package/dist/integrations/pi/engine/runtime-integration.js +118 -0
- package/dist/integrations/pi/engine/session-events.d.ts +48 -0
- package/dist/integrations/pi/engine/session-events.js +223 -0
- package/dist/integrations/pi/engine/session-integration.d.ts +67 -0
- package/dist/integrations/pi/engine/session-integration.js +195 -0
- package/dist/integrations/pi/engine/session-runtime.d.ts +84 -0
- package/dist/integrations/pi/engine/session-runtime.js +249 -0
- package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
- package/dist/integrations/pi/engine/session-selection.js +90 -0
- package/dist/integrations/pi/engine/settings-bridge.d.ts +121 -0
- package/dist/integrations/pi/engine/settings-bridge.js +514 -0
- package/dist/integrations/pi/engine/settings-metadata.d.ts +31 -0
- package/dist/integrations/pi/engine/settings-metadata.js +67 -0
- package/dist/integrations/pi/engine/settings-port.d.ts +42 -0
- package/dist/integrations/pi/engine/settings-port.js +353 -0
- package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
- package/dist/integrations/pi/engine/tool-rendering.js +145 -0
- package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
- package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
- package/dist/integrations/pi/engine/transcript-projection.d.ts +39 -0
- package/dist/integrations/pi/engine/transcript-projection.js +405 -0
- package/dist/integrations/pi/engine/usage-view.d.ts +4 -0
- package/dist/integrations/pi/engine/usage-view.js +56 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
- package/dist/integrations/pi/engine/workflow-contexts.d.ts +66 -0
- package/dist/integrations/pi/engine/workflow-contexts.js +360 -0
- package/dist/integrations/pi/engine/workflow-runner.d.ts +60 -0
- package/dist/integrations/pi/engine/workflow-runner.js +533 -0
- package/dist/integrations/pi/engine/workflow-support.d.ts +33 -0
- package/dist/integrations/pi/engine/workflow-support.js +352 -0
- package/dist/integrations/pi/engine/workflows.d.ts +275 -0
- package/dist/integrations/pi/engine/workflows.js +71 -0
- package/dist/integrations/pi/startup-public.d.ts +2 -0
- package/dist/integrations/pi/startup-public.js +2223 -0
- package/dist/integrations/pi/startup-public.manifest.json +12502 -0
- package/dist/integrations/pi/tui-runtime/adapter.d.ts +56 -0
- package/dist/integrations/pi/tui-runtime/adapter.js +783 -0
- package/dist/integrations/pi/tui-runtime/contracts.d.ts +156 -0
- package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +88 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +433 -0
- package/dist/integrations/pi/tui-runtime/index.d.ts +9 -0
- package/dist/integrations/pi/tui-runtime/index.js +5 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
- package/dist/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
- package/dist/integrations/pi/tui-runtime/mouse-report-input.js +57 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.js +158 -0
- package/dist/integrations/pi/tui-runtime/presentation-adapter.d.ts +4 -0
- package/dist/integrations/pi/tui-runtime/presentation-adapter.js +48 -0
- package/dist/native/darwin-arm64/manifest.json +4 -4
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +3 -3
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/product-identity.d.ts +37 -0
- package/dist/product-identity.js +119 -0
- package/dist/product-identity.json +85 -0
- package/dist/runtime-payload-inventory.json +127148 -0
- package/dist/ui/apps/contracts.d.ts +72 -0
- package/dist/ui/apps/host.d.ts +42 -0
- package/dist/ui/apps/host.js +156 -0
- package/dist/ui/apps/index.d.ts +5 -0
- package/dist/ui/apps/index.js +3 -0
- package/dist/ui/apps/registry.d.ts +12 -0
- package/dist/ui/apps/registry.js +33 -0
- package/dist/ui/components/dialog-panel.js +49 -0
- package/dist/ui/components/frame.d.ts +22 -0
- package/dist/ui/components/frame.js +55 -0
- package/dist/ui/components/index.d.ts +47 -0
- package/dist/ui/components/index.js +25 -0
- package/dist/ui/components/line-input.d.ts +68 -0
- package/dist/ui/components/line-input.js +224 -0
- package/dist/ui/components/list-view.d.ts +60 -0
- package/dist/ui/components/list-view.js +82 -0
- package/dist/ui/components/mouse.d.ts +25 -0
- package/dist/ui/components/mouse.js +70 -0
- package/dist/ui/components/progress-status.d.ts +2 -0
- package/dist/ui/components/progress-status.js +4 -0
- package/dist/ui/components/prompt-input.d.ts +32 -0
- package/dist/ui/components/prompt-input.js +51 -0
- package/dist/ui/components/scrollbar.d.ts +88 -0
- package/dist/ui/components/scrollbar.js +137 -0
- package/dist/ui/components/selection-copy.d.ts +24 -0
- package/dist/ui/components/selection-copy.js +39 -0
- package/dist/ui/components/shortcuts.d.ts +58 -0
- package/dist/ui/components/shortcuts.js +82 -0
- package/dist/ui/components/spans.d.ts +28 -0
- package/dist/ui/components/spans.js +266 -0
- package/dist/ui/components/submitted-prompt.d.ts +23 -0
- package/dist/ui/components/submitted-prompt.js +50 -0
- package/dist/ui/components/surface.d.ts +20 -0
- package/dist/ui/components/surface.js +44 -0
- package/dist/ui/components/text-selection.d.ts +62 -0
- package/dist/ui/components/text-selection.js +210 -0
- package/dist/ui/components/text.d.ts +38 -0
- package/dist/ui/components/text.js +185 -0
- package/dist/ui/components/transcript-viewport.d.ts +173 -0
- package/dist/ui/components/transcript-viewport.js +753 -0
- package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
- package/dist/ui/components/visible-hyperlinks.js +97 -0
- package/dist/ui/settings/declarations.d.ts +127 -0
- package/dist/ui/settings/declarations.js +124 -0
- package/dist/ui/settings/index.d.ts +10 -0
- package/dist/ui/settings/index.js +5 -0
- package/dist/ui/settings/manager.d.ts +54 -0
- package/dist/ui/settings/manager.js +256 -0
- package/dist/ui/settings/migrations.d.ts +13 -0
- package/dist/ui/settings/migrations.js +92 -0
- package/dist/ui/settings/sections.d.ts +52 -0
- package/dist/ui/settings/sections.js +112 -0
- package/docs/architecture/boundaries.md +17 -13
- package/docs/architecture/code-documentation.md +77 -0
- package/docs/architecture/history-editor-provenance.md +100 -0
- package/docs/architecture/internal-naming.md +93 -0
- package/docs/architecture/process-guardian-provenance.md +3 -1
- package/docs/architecture/project-structure.md +69 -30
- package/docs/architecture/prompt-suggestions.md +68 -0
- package/docs/architecture/resource-and-data-policy.md +28 -2
- package/docs/architecture/response-copy-delivery.md +85 -0
- package/docs/architecture/terminal-host-proof-gate.md +1 -1
- package/docs/architecture/terminal-host-spike-evidence.md +1 -1
- package/docs/architecture/tool-image-presentation.md +62 -0
- package/docs/architecture/toolchain.md +32 -10
- package/docs/architecture/ui-reference-provenance.md +61 -6
- package/docs/ci-release-runbook.md +256 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/features/modal-content-interaction.md +38 -0
- package/docs/features/prompt-history.md +149 -0
- package/docs/local-worktree-cleanup.md +212 -0
- package/docs/manual-code-streaming-cleanup.md +88 -0
- package/docs/manual-ghost-link-baseline.md +89 -0
- package/docs/manual-launch-instance-acceptance.md +12 -35
- package/docs/manual-owned-ui-checkpoint.md +79 -0
- package/docs/manual-pi-boundary-candidate.md +4 -5
- package/docs/manual-terminal-colour-check.md +4 -3
- package/docs/openspec-archive-automation.md +259 -0
- package/docs/repository-governance-live-acceptance.md +77 -0
- package/docs/validation.md +100 -0
- package/package.json +52 -34
- package/dist/src/cli/capabilities.d.ts +0 -15
- package/dist/src/cli/capabilities.js +0 -7
- package/dist/src/cli/dispatch.d.ts +0 -32
- package/dist/src/cli/dispatch.js +0 -142
- package/dist/src/cli/index.d.ts +0 -5
- package/dist/src/cli/index.js +0 -5
- package/dist/src/cli/packages.d.ts +0 -23
- package/dist/src/cli/packages.js +0 -84
- package/dist/src/cli/version-stats.d.ts +0 -16
- package/dist/src/cli/version-stats.js +0 -72
- package/dist/src/cli/version.d.ts +0 -2
- package/dist/src/cli/version.js +0 -23
- package/dist/src/composition/index.d.ts +0 -48
- package/dist/src/composition/index.js +0 -258
- package/dist/src/features/launch/development-launch.js +0 -28
- package/dist/src/features/launch/index.d.ts +0 -7
- package/dist/src/features/launch/index.js +0 -7
- package/dist/src/features/launch/intent.d.ts +0 -7
- package/dist/src/features/launch/intent.js +0 -4
- package/dist/src/features/launch/prepare-launch.d.ts +0 -13
- package/dist/src/features/launch/prepare-launch.js +0 -21
- package/dist/src/features/launch/profile-paths.d.ts +0 -15
- package/dist/src/features/launch/profile-paths.js +0 -31
- package/dist/src/features/launch/profiles.d.ts +0 -12
- package/dist/src/features/launch/profiles.js +0 -26
- package/dist/src/features/launch/runtime-selection.d.ts +0 -19
- package/dist/src/features/launch/runtime-selection.js +0 -13
- package/dist/src/features/owned-ui/customization.d.ts +0 -38
- package/dist/src/features/owned-ui/customization.js +0 -108
- package/dist/src/features/owned-ui/diagnostics.d.ts +0 -33
- package/dist/src/features/owned-ui/diagnostics.js +0 -94
- package/dist/src/features/owned-ui/index.d.ts +0 -4
- package/dist/src/features/owned-ui/index.js +0 -4
- package/dist/src/features/owned-ui/run.d.ts +0 -11
- package/dist/src/features/owned-ui/run.js +0 -15
- package/dist/src/features/owned-ui/settings-app.d.ts +0 -22
- package/dist/src/features/owned-ui/settings-app.js +0 -633
- package/dist/src/features/workspace/capabilities.d.ts +0 -31
- package/dist/src/features/workspace/capabilities.js +0 -75
- package/dist/src/features/workspace/index.d.ts +0 -6
- package/dist/src/features/workspace/index.js +0 -6
- package/dist/src/features/workspace/presentation.d.ts +0 -30
- package/dist/src/features/workspace/presentation.js +0 -70
- package/dist/src/features/workspace/reconciliation.d.ts +0 -15
- package/dist/src/features/workspace/reconciliation.js +0 -82
- package/dist/src/features/workspace/reducer.d.ts +0 -42
- package/dist/src/features/workspace/reducer.js +0 -213
- package/dist/src/features/workspace/router.d.ts +0 -31
- package/dist/src/features/workspace/router.js +0 -124
- package/dist/src/features/workspace/store.d.ts +0 -17
- package/dist/src/features/workspace/store.js +0 -54
- package/dist/src/foundation/agent-engine-contracts/capability-ports.d.ts +0 -95
- package/dist/src/foundation/agent-engine-contracts/domain-validation.js +0 -89
- package/dist/src/foundation/agent-engine-contracts/domain.d.ts +0 -116
- package/dist/src/foundation/agent-engine-contracts/index.d.ts +0 -8
- package/dist/src/foundation/agent-engine-contracts/index.js +0 -8
- package/dist/src/foundation/agent-engine-contracts/package-ports.d.ts +0 -54
- package/dist/src/foundation/launch-guardian/index.d.ts +0 -1
- package/dist/src/foundation/launch-guardian/index.js +0 -1
- package/dist/src/foundation/launch-guardian/main.d.ts +0 -31
- package/dist/src/foundation/launch-guardian/main.js +0 -165
- package/dist/src/foundation/lifecycle/index.d.ts +0 -4
- package/dist/src/foundation/lifecycle/index.js +0 -4
- package/dist/src/foundation/lifecycle/model.d.ts +0 -64
- package/dist/src/foundation/lifecycle/model.js +0 -40
- package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
- package/dist/src/foundation/lifecycle/paths.js +0 -42
- package/dist/src/foundation/native-host-protocol/codec.d.ts +0 -11
- package/dist/src/foundation/native-host-protocol/codec.js +0 -56
- package/dist/src/foundation/native-host-protocol/evidence.d.ts +0 -67
- package/dist/src/foundation/native-host-protocol/evidence.js +0 -141
- package/dist/src/foundation/native-host-protocol/index.d.ts +0 -4
- package/dist/src/foundation/native-host-protocol/index.js +0 -4
- package/dist/src/foundation/native-host-protocol/messages.d.ts +0 -56
- package/dist/src/foundation/native-host-protocol/messages.js +0 -149
- package/dist/src/foundation/native-host-protocol/proof-gate.d.ts +0 -13
- package/dist/src/foundation/native-host-protocol/proof-gate.js +0 -33
- package/dist/src/foundation/owned-ui-contracts/extension-ui.d.ts +0 -302
- package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
- package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
- package/dist/src/foundation/owned-ui-contracts/model.d.ts +0 -241
- package/dist/src/foundation/owned-ui-contracts/validation.d.ts +0 -11
- package/dist/src/foundation/owned-ui-contracts/validation.js +0 -395
- package/dist/src/foundation/owned-ui-settings/declarations.d.ts +0 -13
- package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
- package/dist/src/foundation/owned-ui-settings/index.d.ts +0 -6
- package/dist/src/foundation/owned-ui-settings/index.js +0 -6
- package/dist/src/foundation/owned-ui-settings/migrations.d.ts +0 -13
- package/dist/src/foundation/owned-ui-settings/migrations.js +0 -28
- package/dist/src/foundation/owned-ui-settings/sections.d.ts +0 -70
- package/dist/src/foundation/owned-ui-settings/sections.js +0 -93
- package/dist/src/foundation/owned-ui-settings/session.d.ts +0 -44
- package/dist/src/foundation/owned-ui-settings/session.js +0 -145
- package/dist/src/foundation/owned-ui-settings/store.d.ts +0 -28
- package/dist/src/foundation/owned-ui-settings/store.js +0 -90
- package/dist/src/foundation/pi-component-adapter/components.d.ts +0 -4
- package/dist/src/foundation/pi-component-adapter/components.js +0 -64
- package/dist/src/foundation/pi-component-adapter/conformance.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/conformance.js +0 -69
- package/dist/src/foundation/pi-component-adapter/index.d.ts +0 -13
- package/dist/src/foundation/pi-component-adapter/index.js +0 -13
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.d.ts +0 -165
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.js +0 -166
- package/dist/src/foundation/pi-component-adapter/shell-components.d.ts +0 -6
- package/dist/src/foundation/pi-component-adapter/shell-components.js +0 -6
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.d.ts +0 -11
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.d.ts +0 -35
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.js +0 -279
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.d.ts +0 -7
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.js +0 -189
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.js +0 -429
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.d.ts +0 -113
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.js +0 -235
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.js +0 -87
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.d.ts +0 -422
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.js +0 -296
- package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.js +0 -51
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.d.ts +0 -22
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.js +0 -142
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.d.ts +0 -4
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.js +0 -81
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.d.ts +0 -24
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.js +0 -105
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.d.ts +0 -2
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.js +0 -18
- package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.js +0 -77
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.d.ts +0 -55
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.js +0 -342
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.js +0 -120
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.js +0 -159
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.d.ts +0 -95
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.js +0 -889
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.d.ts +0 -19
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.js +0 -44
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.d.ts +0 -30
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.js +0 -59
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.d.ts +0 -98
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.js +0 -1272
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.d.ts +0 -33
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.js +0 -76
- package/dist/src/foundation/pi-component-adapter/upstream/external-editor.js +0 -39
- package/dist/src/foundation/pi-component-adapter/upstream/model-search.d.ts +0 -15
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.d.ts +0 -25
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.js +0 -117
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.d.ts +0 -61
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.js +0 -326
- package/dist/src/foundation/pi-engine-adapter/adapter.d.ts +0 -164
- package/dist/src/foundation/pi-engine-adapter/adapter.js +0 -2367
- package/dist/src/foundation/pi-engine-adapter/conformance.d.ts +0 -37
- package/dist/src/foundation/pi-engine-adapter/conformance.js +0 -130
- package/dist/src/foundation/pi-engine-adapter/index.d.ts +0 -10
- package/dist/src/foundation/pi-engine-adapter/index.js +0 -10
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.d.ts +0 -30
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.js +0 -61
- package/dist/src/foundation/pi-engine-adapter/package-integration.d.ts +0 -13
- package/dist/src/foundation/pi-engine-adapter/package-integration.js +0 -112
- package/dist/src/foundation/pi-engine-adapter/pi-settings-metadata.json +0 -374
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.d.ts +0 -31
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.js +0 -80
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.d.ts +0 -35
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.js +0 -67
- package/dist/src/foundation/pi-engine-adapter/session-integration.d.ts +0 -43
- package/dist/src/foundation/pi-engine-adapter/session-integration.js +0 -97
- package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
- package/dist/src/foundation/pi-engine-adapter/settings-integration.js +0 -233
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.d.ts +0 -20
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.js +0 -48
- package/dist/src/foundation/pi-engine-adapter/workflows.d.ts +0 -173
- package/dist/src/foundation/pi-engine-adapter/workflows.js +0 -60
- package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
- package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
- package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.js +0 -1518
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.d.ts +0 -39
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.js +0 -493
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.d.ts +0 -18
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.js +0 -145
- package/dist/src/foundation/pi-tui-runtime-adapter/contracts.d.ts +0 -120
- package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.js +0 -48
- package/dist/src/foundation/presentation-contracts/index.d.ts +0 -96
- package/dist/src/foundation/process-containment/index.d.ts +0 -5
- package/dist/src/foundation/process-containment/index.js +0 -5
- package/dist/src/foundation/process-containment/linux-process-inspector.d.ts +0 -6
- package/dist/src/foundation/process-containment/linux-process-inspector.js +0 -26
- package/dist/src/foundation/process-containment/native-guardian-containment.d.ts +0 -16
- package/dist/src/foundation/process-containment/native-guardian-containment.js +0 -139
- package/dist/src/foundation/process-containment/windows-process-inspector.d.ts +0 -17
- package/dist/src/foundation/process-containment/windows-process-inspector.js +0 -53
- package/dist/src/foundation/protocol/client.d.ts +0 -17
- package/dist/src/foundation/protocol/client.js +0 -129
- package/dist/src/foundation/protocol/index.d.ts +0 -2
- package/dist/src/foundation/protocol/index.js +0 -2
- package/dist/src/foundation/protocol/messages.d.ts +0 -89
- package/dist/src/foundation/protocol/messages.js +0 -99
- package/dist/src/foundation/release/bootstrap.d.ts +0 -29
- package/dist/src/foundation/release/bootstrap.js +0 -335
- package/dist/src/foundation/release/cohort-state.d.ts +0 -70
- package/dist/src/foundation/release/cohort-state.js +0 -202
- package/dist/src/foundation/release/index.d.ts +0 -10
- package/dist/src/foundation/release/index.js +0 -10
- package/dist/src/foundation/release/release-gc.d.ts +0 -5
- package/dist/src/foundation/release/release-gc.js +0 -16
- package/dist/src/foundation/release/release-store.d.ts +0 -43
- package/dist/src/foundation/release/release-store.js +0 -175
- package/dist/src/foundation/release/release.d.ts +0 -38
- package/dist/src/foundation/release/release.js +0 -204
- package/dist/src/foundation/release/update-transaction.d.ts +0 -31
- package/dist/src/foundation/release/update-transaction.js +0 -89
- package/dist/src/foundation/release/update.d.ts +0 -82
- package/dist/src/foundation/release/update.js +0 -527
- package/dist/src/foundation/storage/control-store.d.ts +0 -61
- package/dist/src/foundation/storage/control-store.js +0 -530
- package/dist/src/foundation/storage/index.d.ts +0 -1
- package/dist/src/foundation/storage/index.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/backpressure.d.ts +0 -46
- package/dist/src/foundation/structured-agent-runtime/backpressure.js +0 -118
- package/dist/src/foundation/structured-agent-runtime/commands.d.ts +0 -52
- package/dist/src/foundation/structured-agent-runtime/commands.js +0 -164
- package/dist/src/foundation/structured-agent-runtime/handshake.d.ts +0 -41
- package/dist/src/foundation/structured-agent-runtime/handshake.js +0 -151
- package/dist/src/foundation/structured-agent-runtime/index.d.ts +0 -5
- package/dist/src/foundation/structured-agent-runtime/index.js +0 -5
- package/dist/src/foundation/structured-agent-runtime/reconnection.d.ts +0 -37
- package/dist/src/foundation/structured-agent-runtime/reconnection.js +0 -129
- package/dist/src/foundation/structured-agent-runtime/state.d.ts +0 -56
- package/dist/src/foundation/structured-agent-runtime/state.js +0 -118
- package/dist/src/foundation/supervision/index.d.ts +0 -3
- package/dist/src/foundation/supervision/index.js +0 -3
- package/dist/src/foundation/supervision/main.d.ts +0 -1
- package/dist/src/foundation/supervision/main.js +0 -41
- package/dist/src/foundation/supervision/paths.d.ts +0 -1
- package/dist/src/foundation/supervision/paths.js +0 -1
- package/dist/src/foundation/supervision/server.d.ts +0 -22
- package/dist/src/foundation/supervision/server.js +0 -451
- package/dist/src/foundation/ui-apps/contracts.d.ts +0 -42
- package/dist/src/foundation/ui-apps/host.d.ts +0 -42
- package/dist/src/foundation/ui-apps/host.js +0 -152
- package/dist/src/foundation/ui-apps/index.d.ts +0 -3
- package/dist/src/foundation/ui-apps/index.js +0 -3
- package/dist/src/foundation/ui-apps/registry.d.ts +0 -11
- package/dist/src/foundation/ui-apps/registry.js +0 -32
- package/dist/src/foundation/ui-components/dialog-panel.js +0 -47
- package/dist/src/foundation/ui-components/frame.d.ts +0 -21
- package/dist/src/foundation/ui-components/frame.js +0 -54
- package/dist/src/foundation/ui-components/index.d.ts +0 -18
- package/dist/src/foundation/ui-components/index.js +0 -18
- package/dist/src/foundation/ui-components/line-input.d.ts +0 -74
- package/dist/src/foundation/ui-components/line-input.js +0 -245
- package/dist/src/foundation/ui-components/list-view.d.ts +0 -66
- package/dist/src/foundation/ui-components/list-view.js +0 -76
- package/dist/src/foundation/ui-components/mouse.d.ts +0 -15
- package/dist/src/foundation/ui-components/mouse.js +0 -46
- package/dist/src/foundation/ui-components/scrollbar.d.ts +0 -62
- package/dist/src/foundation/ui-components/scrollbar.js +0 -102
- package/dist/src/foundation/ui-components/shortcuts.d.ts +0 -57
- package/dist/src/foundation/ui-components/shortcuts.js +0 -81
- package/dist/src/foundation/ui-components/spans.d.ts +0 -7
- package/dist/src/foundation/ui-components/spans.js +0 -59
- package/dist/src/foundation/ui-components/surface.d.ts +0 -20
- package/dist/src/foundation/ui-components/surface.js +0 -38
- package/dist/src/foundation/ui-components/text.d.ts +0 -24
- package/dist/src/foundation/ui-components/text.js +0 -123
- package/dist/src/foundation/workspace-contracts/index.d.ts +0 -2
- package/dist/src/foundation/workspace-contracts/index.js +0 -2
- package/dist/src/foundation/workspace-contracts/model.d.ts +0 -248
- package/dist/src/foundation/workspace-contracts/model.js +0 -2
- package/dist/src/foundation/workspace-contracts/validation.d.ts +0 -13
- package/dist/src/foundation/workspace-contracts/validation.js +0 -335
- package/dist/src/product-identity.d.ts +0 -37
- package/dist/src/product-identity.js +0 -150
- package/dist/src/product-identity.json +0 -99
- package/docs/manual-transparent-checkpoint.md +0 -53
- /package/dist/{src/foundation/agent-engine-contracts/domain.js → app/session-shell/paste-helper.d.ts} +0 -0
- /package/dist/{src/foundation/agent-engine-contracts/ports.js → app/session-shell/paste-text-worker.d.ts} +0 -0
- /package/dist/{src/foundation/lifecycle/commands.js → app/session-shell/paste-types.js} +0 -0
- /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → app/session-shell/response-copy-helper.d.ts} +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → contracts/agent-engine/domain.js} +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
- /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access, readFile, realpath } from "node:fs/promises";
|
|
3
|
+
import { connect } from "node:net";
|
|
4
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
5
|
+
import crossSpawn from "cross-spawn";
|
|
6
|
+
import { valid as validSemver } from "semver";
|
|
7
|
+
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
8
|
+
import { certifyMaterializedRelease, ensureSupervisor, waitForProcessExit, } from "./bootstrap.js";
|
|
9
|
+
import { probeOwnership, readEndpointMetadata, removeEndpointArtifacts } from "./endpoints.js";
|
|
10
|
+
import { resolveCohortEndpoint, resolveProductPaths } from "../lifecycle/index.js";
|
|
11
|
+
import { encodeFrame, LineFrameDecoder } from "../protocol/index.js";
|
|
12
|
+
import { CohortStateStore } from "./cohort-state.js";
|
|
13
|
+
import { cleanupVerifiedOwner, processIsAlive } from "./process-cleanup.js";
|
|
14
|
+
import { materializeRelease, readMaterializedRelease } from "./release-store.js";
|
|
15
|
+
import { scheduleReleaseCleanup } from "./release-gc.js";
|
|
16
|
+
import { UPDATE_ACTIVATION_CONTRACT, activateInstalledRelease, delegateActivation, readActivationContracts, } from "./update-activation.js";
|
|
17
|
+
import { UpdateTransactionStore } from "./update-transaction.js";
|
|
18
|
+
import { removeUpdateRecoveryCapsule, runProtectedPackageReplacement } from "./update-recovery.js";
|
|
19
|
+
export const PRODUCT_PACKAGE = PRODUCT_TEXT.packageName;
|
|
20
|
+
const UPDATE_DIST_TAGS = { stable: "latest", next: "next" };
|
|
21
|
+
const defaultFileSystem = {
|
|
22
|
+
async readFile(path) { return await readFile(path, "utf8"); },
|
|
23
|
+
realpath,
|
|
24
|
+
access,
|
|
25
|
+
};
|
|
26
|
+
const defaultOutput = {
|
|
27
|
+
stdout(message) { process.stdout.write(message); },
|
|
28
|
+
stderr(message) { process.stderr.write(message); },
|
|
29
|
+
};
|
|
30
|
+
/** Bound on the child diagnostics an update keeps: enough for npm's failure reason, never a log. */
|
|
31
|
+
export const CHILD_DIAGNOSTIC_LIMIT = 8_000;
|
|
32
|
+
export function createNpmProcessRunner(platform = process.platform) {
|
|
33
|
+
return async (command, arguments_, request) => await new Promise((resolvePromise, rejectPromise) => {
|
|
34
|
+
// Invariant: no child of the updater shares the terminal. The progress bar is the only
|
|
35
|
+
// live output; a child's own text is kept, bounded, and shown with a failure or not at all.
|
|
36
|
+
const stdio = ["ignore", request.captureStdout ? "pipe" : "ignore", "pipe"];
|
|
37
|
+
const child = platform === "win32" ? crossSpawn(command, [...arguments_], { stdio }) : spawn(command, [...arguments_], { stdio });
|
|
38
|
+
const stdout = [];
|
|
39
|
+
let stderr = "";
|
|
40
|
+
child.stdout?.on("data", chunk => stdout.push(Buffer.from(chunk)));
|
|
41
|
+
child.stderr?.setEncoding("utf8");
|
|
42
|
+
child.stderr?.on("data", chunk => { stderr = `${stderr}${chunk}`.slice(-CHILD_DIAGNOSTIC_LIMIT); });
|
|
43
|
+
let settled = false;
|
|
44
|
+
child.once("error", error => { if (!settled) {
|
|
45
|
+
settled = true;
|
|
46
|
+
rejectPromise(error);
|
|
47
|
+
} });
|
|
48
|
+
child.once("close", code => { if (!settled) {
|
|
49
|
+
settled = true;
|
|
50
|
+
resolvePromise({ code, stdout: Buffer.concat(stdout).toString("utf8"), stderr });
|
|
51
|
+
} });
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* What an update does about the owner it found. A cohort running from retained immutable
|
|
56
|
+
* content keeps its work: the installation replaces files it does not read, and it listens on
|
|
57
|
+
* its own endpoint. A cohort running from the mutable installation is the one exception,
|
|
58
|
+
* because that installation is exactly what is about to be replaced under it.
|
|
59
|
+
*/
|
|
60
|
+
export function planUpdateOwnership(ownership, runsFromRetainedRelease) {
|
|
61
|
+
if (ownership === "dead")
|
|
62
|
+
return "clean-dead-record";
|
|
63
|
+
return runsFromRetainedRelease ? "leave-running" : "end-session";
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The endpoint of the active cohort, together with where it is recorded, so a caller that
|
|
67
|
+
* finds it can also clean it up. A release that predates cohort-scoped endpoints published
|
|
68
|
+
* one endpoint for the runtime directory, and that one is recognized too.
|
|
69
|
+
*/
|
|
70
|
+
async function readActiveEndpoint(paths, activeReleaseId, environment) {
|
|
71
|
+
if (activeReleaseId !== null) {
|
|
72
|
+
const cohort = resolveCohortEndpoint(paths, activeReleaseId, environment);
|
|
73
|
+
const metadata = await readEndpointMetadata(cohort.endpointMetadataPath);
|
|
74
|
+
if (metadata)
|
|
75
|
+
return { metadata, paths: cohort };
|
|
76
|
+
}
|
|
77
|
+
const legacyPaths = { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath };
|
|
78
|
+
const legacy = await readEndpointMetadata(legacyPaths.endpointMetadataPath);
|
|
79
|
+
return legacy ? { metadata: legacy, paths: legacyPaths } : null;
|
|
80
|
+
}
|
|
81
|
+
export function createUpdateLifecycleCoordinator(environment = process.env, fileSystem = defaultFileSystem, output = defaultOutput) {
|
|
82
|
+
const paths = resolveProductPaths(environment);
|
|
83
|
+
const stateStore = new CohortStateStore(paths.dataDir);
|
|
84
|
+
return {
|
|
85
|
+
async targetIsActive(targetVersion) {
|
|
86
|
+
const state = await stateStore.read();
|
|
87
|
+
const activeId = state.references.active;
|
|
88
|
+
if (!activeId || state.releases[activeId]?.packageVersion !== targetVersion)
|
|
89
|
+
return false;
|
|
90
|
+
const endpoint = await readActiveEndpoint(paths, activeId, environment);
|
|
91
|
+
return endpoint?.metadata.releaseId === activeId && await probeOwnership(endpoint.metadata) === "live-verified";
|
|
92
|
+
},
|
|
93
|
+
async shutdownVerifiedOwners(targetVersion) {
|
|
94
|
+
const state = await stateStore.read();
|
|
95
|
+
const activeId = state.references.active;
|
|
96
|
+
const priorActiveVersion = activeId ? state.releases[activeId]?.packageVersion ?? null : null;
|
|
97
|
+
const owner = await readActiveEndpoint(paths, activeId, environment);
|
|
98
|
+
if (!owner)
|
|
99
|
+
return { priorActiveVersion };
|
|
100
|
+
const endpoint = owner.metadata;
|
|
101
|
+
const ownership = await probeOwnership(endpoint);
|
|
102
|
+
if (ownership !== "live-verified" && ownership !== "dead") {
|
|
103
|
+
throw new Error(PRODUCT_TEXT.diagnostic(`refused update shutdown because supervisor ownership is ${ownership}`));
|
|
104
|
+
}
|
|
105
|
+
const plan = planUpdateOwnership(ownership, await canonicalImmutableRoot(paths.dataDir, endpoint.releaseRoot));
|
|
106
|
+
if (plan === "clean-dead-record") {
|
|
107
|
+
await removeEndpointArtifacts(owner.paths.endpointMetadataPath, owner.paths.endpoint);
|
|
108
|
+
return { priorActiveVersion };
|
|
109
|
+
}
|
|
110
|
+
// Rationale: leaving sessions alone is the expected outcome, and saying so mid-update tears
|
|
111
|
+
// the progress bar; only ending a session (below) is worth interrupting it for.
|
|
112
|
+
if (plan === "leave-running")
|
|
113
|
+
return { priorActiveVersion };
|
|
114
|
+
// Rationale: say whose work is ending before it ends.
|
|
115
|
+
const live = endpoint.ownership.liveInstanceIds.length;
|
|
116
|
+
if (live > 0) {
|
|
117
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`ending ${live === 1 ? "one session" : `${live} sessions`} that run from the installation being replaced; a session started by an installed release would have been left alone.`)}\n`);
|
|
118
|
+
}
|
|
119
|
+
const identity = await requestUpdateShutdown(endpoint, targetVersion, 2_000);
|
|
120
|
+
if (!identity.accepted && processIsAlive(endpoint.pid)) {
|
|
121
|
+
// Security: explicit update consent permits bounded cleanup of an authenticated
|
|
122
|
+
// older owner that predates the update-shutdown message.
|
|
123
|
+
const cleanup = await cleanupVerifiedOwner(endpoint, { allowLiveInstances: true, reason: "legacy-mutable-install" });
|
|
124
|
+
if (!cleanup.terminated)
|
|
125
|
+
throw new Error(`verified ${PRODUCT_TEXT.displayName} owner ${endpoint.pid} rejected shutdown and could not be terminated: ${identity.reason}`);
|
|
126
|
+
}
|
|
127
|
+
else if (identity.accepted) {
|
|
128
|
+
await waitForProcessExit(endpoint.pid, 3_000).catch(async () => {
|
|
129
|
+
const cleanup = await cleanupVerifiedOwner(endpoint, { allowLiveInstances: true, reason: "legacy-mutable-install" });
|
|
130
|
+
if (!cleanup.terminated)
|
|
131
|
+
throw new Error(`verified ${PRODUCT_TEXT.displayName} owner ${endpoint.pid} did not terminate`);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
await removeEndpointArtifacts(owner.paths.endpointMetadataPath, owner.paths.endpoint);
|
|
135
|
+
return { priorActiveVersion };
|
|
136
|
+
},
|
|
137
|
+
async verifyPackageUnlocked(packageRoot) {
|
|
138
|
+
if (fileSystem.access)
|
|
139
|
+
await fileSystem.access(packageRoot);
|
|
140
|
+
const probe = `${packageRoot}.${PRODUCT_IDENTITY.filesystem.slug}-unlock-probe`;
|
|
141
|
+
const { rename } = await import("node:fs/promises");
|
|
142
|
+
try {
|
|
143
|
+
await rename(packageRoot, probe);
|
|
144
|
+
await rename(probe, packageRoot);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
// Invariant: best-effort rollback runs if the first rename succeeded and the second did not.
|
|
148
|
+
await rename(probe, packageRoot).catch(() => { });
|
|
149
|
+
throw new Error(PRODUCT_TEXT.diagnostic(`package remains locked after verified shutdown: ${errorMessage(error)}`));
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
async activateInstalled(packageRoot, targetVersion, phase, onMaterializing, onWarmup) {
|
|
153
|
+
const request = { packageRoot, dataDir: paths.dataDir, targetVersion, environment };
|
|
154
|
+
const callbacks = {
|
|
155
|
+
phase,
|
|
156
|
+
...(onMaterializing ? { onMaterializing } : {}),
|
|
157
|
+
...(onWarmup ? { onWarmup } : {}),
|
|
158
|
+
};
|
|
159
|
+
// Compatibility: the tree npm just installed is newer than this updater, so its layout is
|
|
160
|
+
// its own to know. A tree that serves the contract activates itself with its own code;
|
|
161
|
+
// a tree from before the contract is activated here, with the layout it had then.
|
|
162
|
+
const contracts = await readActivationContracts(packageRoot, fileSystem.readFile);
|
|
163
|
+
if (contracts.includes(UPDATE_ACTIVATION_CONTRACT))
|
|
164
|
+
await delegateActivation(request, callbacks);
|
|
165
|
+
else
|
|
166
|
+
await activateInstalledRelease(request, callbacks);
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
const PROGRESS_BAR_WIDTH = 40;
|
|
171
|
+
const PROGRESS_TICK_MS = 200;
|
|
172
|
+
/**
|
|
173
|
+
* Copying the release owns 78–92 and is reported file by file, so the bar crosses
|
|
174
|
+
* that span with the work rather than parking at its start. What follows is short,
|
|
175
|
+
* which is why the remaining milestones sit close together.
|
|
176
|
+
*/
|
|
177
|
+
const MATERIALIZE_PROGRESS = Object.freeze({ from: 78, to: 92 });
|
|
178
|
+
const ACTIVATION_PROGRESS = {
|
|
179
|
+
materialized: { at: 92, creepTo: 94 },
|
|
180
|
+
certified: { at: 94, creepTo: 96 },
|
|
181
|
+
"active-reference-committed": { at: 96, creepTo: 99 },
|
|
182
|
+
};
|
|
183
|
+
/** Renders the terminal-only update meter; the visual preview shares this exact frame. */
|
|
184
|
+
export function renderUpdateProgressBar(percent) {
|
|
185
|
+
const bounded = Math.min(100, Math.max(0, Math.round(percent)));
|
|
186
|
+
const filled = Math.round((bounded / 100) * PROGRESS_BAR_WIDTH);
|
|
187
|
+
// Rationale: the completed run uses A1's scrollbar-aligned teal, followed by a
|
|
188
|
+
// darker gray track and one gray space before the percentage. Explicit RGB
|
|
189
|
+
// keeps each color stable even when the terminal remaps its ANSI palette.
|
|
190
|
+
const completed = "\u001b[38;2;138;190;183m";
|
|
191
|
+
const gray = "\u001b[38;2;128;128;128m";
|
|
192
|
+
const track = "\u001b[38;2;102;102;102m";
|
|
193
|
+
return `${completed}${"━".repeat(filled)}${track}${"─".repeat(PROGRESS_BAR_WIDTH - filled)}${gray} ${bounded}%\u001b[39m`;
|
|
194
|
+
}
|
|
195
|
+
function createUpdateProgress(output, enabled) {
|
|
196
|
+
let visible = false;
|
|
197
|
+
let current = 0;
|
|
198
|
+
let shown = -1;
|
|
199
|
+
let timer = null;
|
|
200
|
+
const draw = () => {
|
|
201
|
+
const rounded = Math.round(current);
|
|
202
|
+
if (rounded === shown)
|
|
203
|
+
return;
|
|
204
|
+
shown = rounded;
|
|
205
|
+
visible = true;
|
|
206
|
+
output.stdout(`\r${renderUpdateProgressBar(rounded)}`);
|
|
207
|
+
};
|
|
208
|
+
const stopCreep = () => {
|
|
209
|
+
if (timer !== null) {
|
|
210
|
+
clearInterval(timer);
|
|
211
|
+
timer = null;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
return {
|
|
215
|
+
set(percent, creepTo = percent) {
|
|
216
|
+
if (!enabled)
|
|
217
|
+
return;
|
|
218
|
+
stopCreep();
|
|
219
|
+
current = Math.max(current, percent);
|
|
220
|
+
shown = -1;
|
|
221
|
+
draw();
|
|
222
|
+
if (creepTo <= current)
|
|
223
|
+
return;
|
|
224
|
+
// Rationale: creep asymptotically toward (but never reach) the next milestone so
|
|
225
|
+
// long opaque phases such as npm install still show visible motion. The
|
|
226
|
+
// ceiling stays a whole point below the milestone: settling on `creepTo`
|
|
227
|
+
// itself would render as that milestone and make arriving at it invisible,
|
|
228
|
+
// which is what a stalled bar looks like.
|
|
229
|
+
timer = setInterval(() => {
|
|
230
|
+
current = Math.min(creepTo - 1, current + (creepTo - current) * 0.04);
|
|
231
|
+
draw();
|
|
232
|
+
}, PROGRESS_TICK_MS);
|
|
233
|
+
timer.unref?.();
|
|
234
|
+
},
|
|
235
|
+
// Rationale: the bar exists to say the update is still moving. Once it has finished
|
|
236
|
+
// there is a better line to occupy that row — the one naming what is now
|
|
237
|
+
// installed — so the bar gives the row back rather than leaving a full
|
|
238
|
+
// meter above a message that already implies it.
|
|
239
|
+
finish() {
|
|
240
|
+
stopCreep();
|
|
241
|
+
if (!visible)
|
|
242
|
+
return;
|
|
243
|
+
output.stdout(`\r${" ".repeat(PROGRESS_BAR_WIDTH + 6)}\r`);
|
|
244
|
+
visible = false;
|
|
245
|
+
shown = -1;
|
|
246
|
+
},
|
|
247
|
+
clear() {
|
|
248
|
+
stopCreep();
|
|
249
|
+
if (!visible)
|
|
250
|
+
return;
|
|
251
|
+
output.stdout(`\r${" ".repeat(PROGRESS_BAR_WIDTH + 6)}\r`);
|
|
252
|
+
visible = false;
|
|
253
|
+
shown = -1;
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/** The newest version the channel points at, which is what an unqualified update takes. */
|
|
258
|
+
async function resolveChannelHead(runner, distTag, output) {
|
|
259
|
+
const publicChannel = distTag === "next" ? "development" : "release";
|
|
260
|
+
const lookup = await runNpm(runner, ["view", `${PRODUCT_PACKAGE}@${distTag}`, "version"], true, output, `query the npm ${publicChannel} channel`);
|
|
261
|
+
if (lookup.result === null)
|
|
262
|
+
return { version: null, exitCode: lookup.exitCode };
|
|
263
|
+
const version = validSemver(lookup.result.stdout.trim());
|
|
264
|
+
if (version === null) {
|
|
265
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`received a malformed ${publicChannel} channel version from npm: ${JSON.stringify(lookup.result.stdout.trim())}.`)}\n`);
|
|
266
|
+
return { version: null, exitCode: 1 };
|
|
267
|
+
}
|
|
268
|
+
return { version, exitCode: 0 };
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Resolve a preview the caller named.
|
|
272
|
+
*
|
|
273
|
+
* A preview is published as `<version>-dev.<pull-request-number>`, so its decimal
|
|
274
|
+
* development number is enough to identify it. A full version is accepted too.
|
|
275
|
+
* The published list remains authoritative: nothing is constructed from the
|
|
276
|
+
* installed package's base version.
|
|
277
|
+
*/
|
|
278
|
+
async function resolveRequestedPreview(runner, requested, output) {
|
|
279
|
+
const lookup = await runNpm(runner, ["view", PRODUCT_PACKAGE, "versions", "--json"], true, output, "list the published versions");
|
|
280
|
+
if (lookup.result === null)
|
|
281
|
+
return { version: null, exitCode: lookup.exitCode };
|
|
282
|
+
let published;
|
|
283
|
+
try {
|
|
284
|
+
published = JSON.parse(lookup.result.stdout.trim() || "[]");
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`received a malformed version list from npm: ${JSON.stringify(lookup.result.stdout.trim())}.`)}\n`);
|
|
288
|
+
return { version: null, exitCode: 1 };
|
|
289
|
+
}
|
|
290
|
+
const versions = (Array.isArray(published) ? published : [published]).filter((value) => typeof value === "string");
|
|
291
|
+
const exact = versions.find(version => version === requested);
|
|
292
|
+
if (exact !== undefined) {
|
|
293
|
+
// Rationale: naming a release here would install it through the preview path, which is a
|
|
294
|
+
// different command with a different meaning.
|
|
295
|
+
if (!exact.includes("-dev.")) {
|
|
296
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`${exact} is a release, not a preview; run ${PRODUCT_TEXT.commandName} update to move to the current release.`)}\n`);
|
|
297
|
+
return { version: null, exitCode: 1 };
|
|
298
|
+
}
|
|
299
|
+
return { version: exact, exitCode: 0 };
|
|
300
|
+
}
|
|
301
|
+
const matches = versions.filter(version => version.endsWith(`-dev.${requested}`));
|
|
302
|
+
if (matches.length === 1)
|
|
303
|
+
return { version: matches[0], exitCode: 0 };
|
|
304
|
+
if (matches.length > 1) {
|
|
305
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`found more than one preview for ${requested}: ${matches.join(", ")}. Name the version instead.`)}\n`);
|
|
306
|
+
return { version: null, exitCode: 1 };
|
|
307
|
+
}
|
|
308
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`published no preview for ${requested}.`)}\n`);
|
|
309
|
+
return { version: null, exitCode: 1 };
|
|
310
|
+
}
|
|
311
|
+
export async function runSelfUpdate(options) {
|
|
312
|
+
const fileSystem = options.fileSystem ?? defaultFileSystem;
|
|
313
|
+
const output = options.output ?? defaultOutput;
|
|
314
|
+
const runner = options.runner ?? createNpmProcessRunner();
|
|
315
|
+
const channel = options.channel ?? "stable";
|
|
316
|
+
const distTag = UPDATE_DIST_TAGS[channel];
|
|
317
|
+
const now = options.now ?? (() => performance.now());
|
|
318
|
+
const measure = async (phase, operation) => {
|
|
319
|
+
const startedAt = now();
|
|
320
|
+
try {
|
|
321
|
+
return await operation();
|
|
322
|
+
}
|
|
323
|
+
finally {
|
|
324
|
+
options.onPhaseTiming?.({ phase, durationMs: Math.max(0, now() - startedAt) });
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
let runningVersion;
|
|
328
|
+
try {
|
|
329
|
+
const packageJson = JSON.parse(await measure("package-version", async () => await fileSystem.readFile(resolve(options.packageRoot, "package.json"))));
|
|
330
|
+
const parsedVersion = typeof packageJson.version === "string" ? validSemver(packageJson.version) : null;
|
|
331
|
+
if (parsedVersion === null)
|
|
332
|
+
throw new Error("package.json does not contain a valid semantic version");
|
|
333
|
+
runningVersion = parsedVersion;
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`could not read its running package version: ${errorMessage(error)}`)}\n`);
|
|
337
|
+
return 1;
|
|
338
|
+
}
|
|
339
|
+
const requested = options.target?.trim();
|
|
340
|
+
const resolved = await measure("target-resolution", async () => requested === undefined || requested.length === 0
|
|
341
|
+
? await resolveChannelHead(runner, distTag, output)
|
|
342
|
+
: await resolveRequestedPreview(runner, requested, output));
|
|
343
|
+
if (resolved.version === null)
|
|
344
|
+
return resolved.exitCode;
|
|
345
|
+
const targetVersion = resolved.version;
|
|
346
|
+
// Rationale: no full stop after a version: it already ends in a dot-separated identifier,
|
|
347
|
+
// and a trailing one reads as part of the version rather than as punctuation.
|
|
348
|
+
output.stdout(`${PRODUCT_TEXT.commandName} update: ${runningVersion} → ${targetVersion}\n`);
|
|
349
|
+
const progress = createUpdateProgress(output, options.progress ?? (options.output === undefined && process.stdout.isTTY === true));
|
|
350
|
+
const rootLookup = await measure("global-root", async () => await runNpm(runner, ["root", "--global"], true, output, "resolve npm's global package root"));
|
|
351
|
+
if (rootLookup.result === null)
|
|
352
|
+
return rootLookup.exitCode;
|
|
353
|
+
if (rootLookup.result.stdout.trim().length === 0) {
|
|
354
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic("could not verify its installation because npm returned an empty global package root.")}\n`);
|
|
355
|
+
return 1;
|
|
356
|
+
}
|
|
357
|
+
let packageRoot;
|
|
358
|
+
let globalRoot;
|
|
359
|
+
try {
|
|
360
|
+
[packageRoot, globalRoot] = await Promise.all([fileSystem.realpath(options.packageRoot), fileSystem.realpath(rootLookup.result.stdout.trim())]);
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`could not canonicalize the running and global npm paths: ${errorMessage(error)}`)}\n`);
|
|
364
|
+
return 1;
|
|
365
|
+
}
|
|
366
|
+
if (!isContainedBy(globalRoot, packageRoot)) {
|
|
367
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`refused to update automatically because ${packageRoot} is not managed beneath npm's global package root ${globalRoot}.`)}\n`);
|
|
368
|
+
return 1;
|
|
369
|
+
}
|
|
370
|
+
const environment = options.environment ?? process.env;
|
|
371
|
+
const paths = resolveProductPaths(environment);
|
|
372
|
+
const lifecycle = options.lifecycle ?? createUpdateLifecycleCoordinator(environment, fileSystem, output);
|
|
373
|
+
const transactionStore = options.transactionStore ?? new UpdateTransactionStore(paths.dataDir);
|
|
374
|
+
const maintenance = options.maintenance ?? (options.lifecycle
|
|
375
|
+
? async () => { }
|
|
376
|
+
: async () => await scheduleReleaseCleanup(paths.dataDir, paths));
|
|
377
|
+
let transaction = await transactionStore.read();
|
|
378
|
+
try {
|
|
379
|
+
if ((!transaction || transaction.status === "completed") && await lifecycle.targetIsActive(targetVersion)) {
|
|
380
|
+
await maintenance();
|
|
381
|
+
await transactionStore.clearCompleted();
|
|
382
|
+
output.stdout(`${PRODUCT_TEXT.commandName} is up to date — no update needed.\n`);
|
|
383
|
+
return 0;
|
|
384
|
+
}
|
|
385
|
+
// Rationale: the bar first appears here so a no-change run never flashes it.
|
|
386
|
+
progress.set(3, 15);
|
|
387
|
+
const cohortStore = new CohortStateStore(paths.dataDir);
|
|
388
|
+
let cohortState = await cohortStore.read();
|
|
389
|
+
let priorActiveReleaseId = cohortState.references.active;
|
|
390
|
+
if (options.runner === undefined && (priorActiveReleaseId === null || cohortState.releases[priorActiveReleaseId]?.approval !== "approved")) {
|
|
391
|
+
// Invariant: protected replacement needs an immutable launch authority that npm cannot rename.
|
|
392
|
+
const recoveryRelease = await materializeRelease(packageRoot, paths.dataDir);
|
|
393
|
+
await cohortStore.recordCandidate(recoveryRelease);
|
|
394
|
+
const diagnostics = await certifyMaterializedRelease(recoveryRelease, paths.dataDir);
|
|
395
|
+
await cohortStore.approve(recoveryRelease.releaseId, diagnostics);
|
|
396
|
+
await cohortStore.activate(recoveryRelease.releaseId);
|
|
397
|
+
cohortState = await cohortStore.read();
|
|
398
|
+
priorActiveReleaseId = recoveryRelease.releaseId;
|
|
399
|
+
}
|
|
400
|
+
transaction = await transactionStore.begin({
|
|
401
|
+
channel,
|
|
402
|
+
targetVersion,
|
|
403
|
+
packageRoot,
|
|
404
|
+
priorActiveReleaseId,
|
|
405
|
+
});
|
|
406
|
+
if (phaseBefore(transaction.phase, "ownership-released")) {
|
|
407
|
+
await measure("ownership-release", async () => {
|
|
408
|
+
await lifecycle.shutdownVerifiedOwners(targetVersion);
|
|
409
|
+
await lifecycle.verifyPackageUnlocked(packageRoot);
|
|
410
|
+
});
|
|
411
|
+
transaction = await transactionStore.advance("ownership-released");
|
|
412
|
+
}
|
|
413
|
+
progress.set(15, 70);
|
|
414
|
+
if (phaseBefore(transaction.phase, "package-installed")) {
|
|
415
|
+
if (options.packageReplacement || options.runner === undefined) {
|
|
416
|
+
const priorReleaseId = transaction.priorActiveReleaseId ?? priorActiveReleaseId;
|
|
417
|
+
const recordedPrior = priorReleaseId === null ? undefined : cohortState.releases[priorReleaseId];
|
|
418
|
+
if ((!recordedPrior || recordedPrior.approval !== "approved") && !options.packageReplacement) {
|
|
419
|
+
throw new Error(PRODUCT_TEXT.diagnostic("cannot protect package replacement because no approved prior release is available"));
|
|
420
|
+
}
|
|
421
|
+
const priorRelease = recordedPrior ?? {
|
|
422
|
+
releaseId: priorReleaseId ?? "injected-prior-release",
|
|
423
|
+
releaseRoot: packageRoot,
|
|
424
|
+
contentDigest: "0".repeat(64),
|
|
425
|
+
};
|
|
426
|
+
const replacementTransaction = transaction;
|
|
427
|
+
const replacement = await measure("npm-install", async () => await (options.packageReplacement ?? runProtectedPackageReplacement)({
|
|
428
|
+
dataDir: paths.dataDir,
|
|
429
|
+
globalRoot,
|
|
430
|
+
packageRoot,
|
|
431
|
+
transaction: replacementTransaction,
|
|
432
|
+
priorRelease,
|
|
433
|
+
output,
|
|
434
|
+
environment,
|
|
435
|
+
onRecoveryState: async (recovery) => {
|
|
436
|
+
if (transactionStore.setRecovery)
|
|
437
|
+
transaction = await transactionStore.setRecovery(recovery) ?? transaction;
|
|
438
|
+
},
|
|
439
|
+
}));
|
|
440
|
+
// Rationale: npm's own text explains a failed replacement and says nothing about a
|
|
441
|
+
// successful one, so it reaches the terminal only when the installation did not happen.
|
|
442
|
+
if (replacement.outcome !== "installed")
|
|
443
|
+
reportChildDiagnostics(output, replacement);
|
|
444
|
+
if (replacement.outcome === "installed")
|
|
445
|
+
transaction = await transactionStore.advance("package-installed");
|
|
446
|
+
if (replacement.cancelled) {
|
|
447
|
+
progress.clear();
|
|
448
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic("update cancelled safely; the launcher is available and the transaction can be resumed.")}\n`);
|
|
449
|
+
return 130;
|
|
450
|
+
}
|
|
451
|
+
if (replacement.outcome !== "installed") {
|
|
452
|
+
throw new UpdateFailure(unsuccessfulCode(replacement.npmExitCode), `npm exited with status ${formatExitCode(replacement.npmExitCode)}`);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
const installation = await measure("npm-install", async () => await runNpm(runner, ["install", "--global", "--loglevel=error", "--no-fund", "--no-audit", `${PRODUCT_PACKAGE}@${targetVersion}`], true, output, "start the global npm installation", false));
|
|
457
|
+
if (installation.result === null)
|
|
458
|
+
throw new UpdateFailure(installation.exitCode, "npm process failed");
|
|
459
|
+
if (installation.result.code !== 0) {
|
|
460
|
+
reportChildDiagnostics(output, installation.result);
|
|
461
|
+
throw new UpdateFailure(unsuccessfulCode(installation.result.code), `npm exited with status ${formatExitCode(installation.result.code)}`);
|
|
462
|
+
}
|
|
463
|
+
transaction = await transactionStore.advance("package-installed");
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
progress.set(70, 75);
|
|
467
|
+
// Concurrency: ownership can be reacquired after an interrupted installation (for
|
|
468
|
+
// example, if bare A1 is launched before the update is resumed). Recheck
|
|
469
|
+
// immediately before activation so recovery cannot start a second cohort.
|
|
470
|
+
await measure("ownership-release", async () => { await lifecycle.shutdownVerifiedOwners(targetVersion); });
|
|
471
|
+
progress.set(75, MATERIALIZE_PROGRESS.from);
|
|
472
|
+
let activationPhaseStartedAt = now();
|
|
473
|
+
await lifecycle.activateInstalled(packageRoot, targetVersion, async (phase) => {
|
|
474
|
+
options.onPhaseTiming?.({ phase, durationMs: Math.max(0, now() - activationPhaseStartedAt) });
|
|
475
|
+
transaction = await transactionStore.advance(phase);
|
|
476
|
+
progress.set(ACTIVATION_PROGRESS[phase].at, ACTIVATION_PROGRESS[phase].creepTo);
|
|
477
|
+
activationPhaseStartedAt = now();
|
|
478
|
+
}, ({ completed, total }) => {
|
|
479
|
+
const span = MATERIALIZE_PROGRESS.to - MATERIALIZE_PROGRESS.from;
|
|
480
|
+
const done = total > 0 ? Math.min(1, completed / total) : 0;
|
|
481
|
+
progress.set(MATERIALIZE_PROGRESS.from + span * done);
|
|
482
|
+
}, state => {
|
|
483
|
+
if (state === "started") {
|
|
484
|
+
activationPhaseStartedAt = now();
|
|
485
|
+
progress.set(98, 99);
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
options.onPhaseTiming?.({ phase: "warmup", durationMs: Math.max(0, now() - activationPhaseStartedAt) });
|
|
489
|
+
activationPhaseStartedAt = now();
|
|
490
|
+
progress.set(99);
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
options.onPhaseTiming?.({ phase: "supervisor-verified", durationMs: Math.max(0, now() - activationPhaseStartedAt) });
|
|
494
|
+
const transactionStartedAt = now();
|
|
495
|
+
await transactionStore.advance("supervisor-verified");
|
|
496
|
+
if (transaction.recovery?.capsulePath)
|
|
497
|
+
await removeUpdateRecoveryCapsule(paths.dataDir, transaction.transactionId);
|
|
498
|
+
// Invariant: successful output follows the durable cleanup disposition. Slow recursive
|
|
499
|
+
// removal belongs to the detached worker started by this maintenance coordinator.
|
|
500
|
+
await maintenance();
|
|
501
|
+
// Concurrency: this is the launch cutover. No failure-prone update work follows success.
|
|
502
|
+
await transactionStore.finish("completed");
|
|
503
|
+
await transactionStore.clearCompleted().catch(() => undefined);
|
|
504
|
+
options.onPhaseTiming?.({ phase: "transaction-complete", durationMs: Math.max(0, now() - transactionStartedAt) });
|
|
505
|
+
progress.finish();
|
|
506
|
+
output.stdout(`${PRODUCT_TEXT.commandName} updated successfully to ${targetVersion}\n`);
|
|
507
|
+
return 0;
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
progress.clear();
|
|
511
|
+
const message = errorMessage(error);
|
|
512
|
+
const rollback = options.lifecycle
|
|
513
|
+
? "previous test lifecycle retained"
|
|
514
|
+
: await rollbackPriorCohort(paths.dataDir, environment, transaction?.priorActiveReleaseId ?? null).catch(rollbackError => `rollback failed: ${errorMessage(rollbackError)}`);
|
|
515
|
+
if (transaction)
|
|
516
|
+
await transactionStore.finish(rollback === "rolled back" ? "rolled-back" : "failed", `${message}; ${rollback}`);
|
|
517
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`update failed: ${message}. ${rollback}. Diagnostics: ${transactionStore.path}`)}\n`);
|
|
518
|
+
return error instanceof UpdateFailure ? error.exitCode : 1;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
export function assertUpdatePerformanceBudget(evidence, maximumPostNpmDurationMs = 30_000) {
|
|
522
|
+
const failures = [];
|
|
523
|
+
if (evidence.fileCount < 1)
|
|
524
|
+
failures.push("fixture contains no payload files");
|
|
525
|
+
if (evidence.sourceReads !== evidence.fileCount)
|
|
526
|
+
failures.push(`source payload read count is ${evidence.sourceReads} for ${evidence.fileCount} files`);
|
|
527
|
+
const totalWrites = evidence.candidateWrites + (evidence.layerWrites ?? 0);
|
|
528
|
+
if (totalWrites !== evidence.fileCount)
|
|
529
|
+
failures.push(`runtime payload write count is ${totalWrites} for ${evidence.fileCount} files`);
|
|
530
|
+
if (evidence.verificationReads > 0)
|
|
531
|
+
failures.push(`fresh certification reread ${evidence.verificationReads} candidate files`);
|
|
532
|
+
if (evidence.postNpmDurationMs > maximumPostNpmDurationMs)
|
|
533
|
+
failures.push(`post-npm activation took ${Math.round(evidence.postNpmDurationMs)}ms; budget is ${maximumPostNpmDurationMs}ms`);
|
|
534
|
+
if (failures.length > 0)
|
|
535
|
+
throw new Error(`update performance budget failed: ${failures.join("; ")}`);
|
|
536
|
+
}
|
|
537
|
+
async function requestUpdateShutdown(metadata, targetVersion, timeoutMs) {
|
|
538
|
+
if (!processIsAlive(metadata.pid))
|
|
539
|
+
return { accepted: false, reason: "recorded owner is dead" };
|
|
540
|
+
return await new Promise(resolvePromise => {
|
|
541
|
+
const socket = connect(metadata.endpoint);
|
|
542
|
+
const decoder = new LineFrameDecoder();
|
|
543
|
+
let settled = false;
|
|
544
|
+
const finish = (value) => {
|
|
545
|
+
if (settled)
|
|
546
|
+
return;
|
|
547
|
+
settled = true;
|
|
548
|
+
socket.destroy();
|
|
549
|
+
resolvePromise(value);
|
|
550
|
+
};
|
|
551
|
+
socket.once("error", () => finish({ accepted: false, reason: "verified endpoint did not respond" }));
|
|
552
|
+
socket.once("connect", () => socket.write(encodeFrame({ type: "release-update-ownership", bootNonce: metadata.bootNonce, targetVersion })));
|
|
553
|
+
socket.on("data", chunk => {
|
|
554
|
+
try {
|
|
555
|
+
const message = decoder.push(chunk)[0];
|
|
556
|
+
if (message?.type === "release-update-result")
|
|
557
|
+
finish({ accepted: message.accepted === true, reason: String(message.reason ?? "shutdown rejected") });
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
finish({ accepted: false, reason: "invalid shutdown response" });
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
setTimeout(() => finish({ accepted: false, reason: "verified endpoint shutdown timed out" }), timeoutMs).unref();
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
async function runNpm(runner, arguments_, captureStdout, output, action, reportNonzero = true) {
|
|
567
|
+
let result;
|
|
568
|
+
try {
|
|
569
|
+
result = await runner("npm", arguments_, { captureStdout });
|
|
570
|
+
}
|
|
571
|
+
catch (error) {
|
|
572
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`could not execute npm to ${action}: ${errorMessage(error)}`)}\n`);
|
|
573
|
+
return { result: null, exitCode: 1 };
|
|
574
|
+
}
|
|
575
|
+
if (result.code !== 0 && reportNonzero) {
|
|
576
|
+
const explained = reportChildDiagnostics(output, result);
|
|
577
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`could not ${action}; npm exited with status ${formatExitCode(result.code)}.${explained ? " Review npm's diagnostics above." : ""}`)}\n`);
|
|
578
|
+
return { result: null, exitCode: unsuccessfulCode(result.code) };
|
|
579
|
+
}
|
|
580
|
+
return { result, exitCode: 0 };
|
|
581
|
+
}
|
|
582
|
+
/** Prints what a failed child said, bounded, and reports whether there was anything to print. */
|
|
583
|
+
function reportChildDiagnostics(output, result) {
|
|
584
|
+
const text = [result.stdout, result.stderr ?? ""].map(part => part.trim()).filter(part => part.length > 0).join("\n").slice(-CHILD_DIAGNOSTIC_LIMIT);
|
|
585
|
+
if (text.length === 0)
|
|
586
|
+
return false;
|
|
587
|
+
output.stderr(`${text}\n`);
|
|
588
|
+
return true;
|
|
589
|
+
}
|
|
590
|
+
async function rollbackPriorCohort(dataDir, environment, priorReleaseId) {
|
|
591
|
+
if (!priorReleaseId)
|
|
592
|
+
return "no prior cohort was available for rollback";
|
|
593
|
+
const stateStore = new CohortStateStore(dataDir);
|
|
594
|
+
const state = await stateStore.read();
|
|
595
|
+
const prior = state.releases[priorReleaseId];
|
|
596
|
+
if (!prior || prior.approval !== "approved")
|
|
597
|
+
return "prior cohort is not a verified rollback candidate";
|
|
598
|
+
if (state.references.active !== priorReleaseId) {
|
|
599
|
+
if (state.references.rollback === priorReleaseId)
|
|
600
|
+
await stateStore.rollback(true);
|
|
601
|
+
else
|
|
602
|
+
throw new Error(`prior release ${priorReleaseId} is not the recorded rollback cohort`);
|
|
603
|
+
}
|
|
604
|
+
const release = await readMaterializedRelease(prior.releaseRoot);
|
|
605
|
+
// Invariant: rollback reuses a surviving prior cohort rather than racing its occupied endpoint.
|
|
606
|
+
await ensureSupervisor(release, environment);
|
|
607
|
+
return "rolled back";
|
|
608
|
+
}
|
|
609
|
+
function phaseBefore(current, target) {
|
|
610
|
+
const phases = ["shutdown-intent", "ownership-released", "package-installed", "materialized", "certified", "active-reference-committed", "supervisor-verified"];
|
|
611
|
+
return phases.indexOf(current) < phases.indexOf(target);
|
|
612
|
+
}
|
|
613
|
+
class UpdateFailure extends Error {
|
|
614
|
+
exitCode;
|
|
615
|
+
constructor(exitCode, message) { super(message); this.exitCode = exitCode; }
|
|
616
|
+
}
|
|
617
|
+
async function canonicalImmutableRoot(dataDir, releaseRoot) {
|
|
618
|
+
try {
|
|
619
|
+
const [store, selected] = await Promise.all([realpath(resolve(dataDir, "releases")), realpath(releaseRoot)]);
|
|
620
|
+
const fromStore = relative(store, selected);
|
|
621
|
+
return fromStore.length > 0 && fromStore !== ".." && !fromStore.startsWith(`..${sep}`) && !isAbsolute(fromStore);
|
|
622
|
+
}
|
|
623
|
+
catch {
|
|
624
|
+
return false;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
function isContainedBy(parent, child) {
|
|
628
|
+
const pathFromParent = relative(parent, child);
|
|
629
|
+
return pathFromParent.length > 0 && pathFromParent !== ".." && !pathFromParent.startsWith(`..${sep}`) && !isAbsolute(pathFromParent);
|
|
630
|
+
}
|
|
631
|
+
function unsuccessfulCode(code) { return code === null || code === 0 ? 1 : code; }
|
|
632
|
+
function formatExitCode(code) { return code === null ? "unknown" : String(code); }
|
|
633
|
+
function errorMessage(error) { return error instanceof Error ? error.message : String(error); }
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type MaterializedRelease } from "./release-store.js";
|
|
2
|
+
/** Import the exact immutable startup graph in a terminal-free bounded child process. */
|
|
3
|
+
export declare function warmMaterializedRelease(release: MaterializedRelease, environment: NodeJS.ProcessEnv, timeoutMs?: number): Promise<void>;
|