@timurproko/a1 0.1.8-dev.3b54f21 → 0.1.8-dev.402
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 +159 -65
- package/bin/cli.js +28 -10
- package/bin/guardian.js +12 -6
- package/bin/module-identity.js +69 -35
- package/bin/pi-tui.d.ts +6 -0
- package/bin/pi-tui.js +28 -0
- package/bin/release-cleanup.js +8 -0
- package/bin/supervisor.js +2 -2
- package/bin/sync-pi-tui-proxy.js +97 -0
- package/bin/ui.js +62 -21
- package/bin/update-recovery.js +274 -0
- package/bin/warmup.js +27 -0
- package/dist/cli/capabilities.d.ts +6 -0
- package/dist/{src/cli → cli}/capabilities.js +1 -1
- package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
- package/dist/cli/dispatch.js +261 -0
- package/dist/cli/package-messages.d.ts +26 -0
- package/dist/cli/package-messages.js +71 -0
- package/dist/{src/cli → cli}/packages.d.ts +11 -2
- package/dist/{src/cli → cli}/packages.js +24 -27
- package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
- package/dist/cli/version-stats.js +112 -0
- package/dist/composition/agent-engine-bridge.d.ts +3 -0
- package/dist/composition/agent-engine-bridge.js +108 -0
- package/dist/composition/index.d.ts +3 -0
- package/dist/composition/index.js +3 -0
- package/dist/composition/owned-ui.d.ts +35 -0
- package/dist/composition/owned-ui.js +118 -0
- package/dist/composition/process.d.ts +16 -0
- package/dist/composition/process.js +45 -0
- package/dist/composition/settings-route-host.d.ts +8 -0
- package/dist/composition/settings-route-host.js +75 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
- package/dist/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 +8 -0
- package/dist/contracts/owned-ui/index.js +8 -0
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +123 -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/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +5 -1
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +129 -4
- package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +8 -0
- package/dist/{src/features → features}/launch/development-launch.js +11 -3
- package/dist/{src/features → features}/launch/index.d.ts +0 -1
- package/dist/{src/features → features}/launch/index.js +0 -1
- package/dist/features/launch/intent.d.ts +10 -0
- package/dist/features/launch/intent.js +8 -0
- package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
- package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
- package/dist/{src/features → features}/launch/profile-paths.d.ts +3 -2
- package/dist/{src/features → features}/launch/profile-paths.js +13 -8
- package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
- package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
- package/dist/{src/features → features}/owned-ui/customization.js +3 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
- package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
- package/dist/{src/features → features}/owned-ui/index.js +2 -0
- package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
- package/dist/features/owned-ui/project-trust-prompt.js +149 -0
- package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
- package/dist/features/owned-ui/run.js +32 -0
- package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
- package/dist/features/owned-ui/session-fork-prompt.js +34 -0
- package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
- package/dist/{src/features → features}/owned-ui/settings-app.js +105 -56
- 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 +223 -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 +1 -0
- package/dist/features/prompt-suggestions/index.js +1 -0
- package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
- package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
- package/dist/{src/features → features}/workspace/reducer.js +2 -1
- package/dist/{src/features → features}/workspace/router.d.ts +2 -1
- package/dist/{src/features → features}/workspace/router.js +1 -0
- package/dist/{src/features → features}/workspace/store.d.ts +2 -1
- package/dist/{src/features → features}/workspace/store.js +1 -0
- package/dist/foundation/launch-context/index.d.ts +59 -0
- package/dist/foundation/launch-context/index.js +136 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.js +23 -8
- package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
- package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
- package/dist/foundation/lifecycle/paths.d.ts +30 -0
- package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
- package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
- package/dist/foundation/lifecycle/session-selection.js +39 -0
- package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
- package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
- package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
- package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
- package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
- package/dist/foundation/release/bootstrap.d.ts +55 -0
- package/dist/{src/foundation → foundation}/release/bootstrap.js +219 -46
- 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 +81 -0
- package/dist/foundation/release/dependency-layer.js +466 -0
- package/dist/foundation/release/endpoints.d.ts +20 -0
- package/dist/foundation/release/endpoints.js +50 -0
- package/dist/foundation/release/immutable-platform.d.ts +6 -0
- package/dist/foundation/release/immutable-platform.js +13 -0
- package/dist/{src/foundation → foundation}/release/index.d.ts +6 -0
- package/dist/{src/foundation → foundation}/release/index.js +6 -0
- package/dist/foundation/release/release-gc.d.ts +71 -0
- package/dist/foundation/release/release-gc.js +764 -0
- package/dist/{src/foundation → foundation}/release/release-store.d.ts +9 -3
- package/dist/{src/foundation → foundation}/release/release-store.js +74 -14
- package/dist/{src/foundation → foundation}/release/release.d.ts +6 -1
- package/dist/{src/foundation → foundation}/release/release.js +15 -4
- package/dist/foundation/release/restart-certification.d.ts +68 -0
- package/dist/foundation/release/restart-certification.js +227 -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/{src/foundation → foundation}/release/update-transaction.d.ts +11 -0
- package/dist/{src/foundation → foundation}/release/update-transaction.js +13 -1
- package/dist/{src/foundation → foundation}/release/update.d.ts +40 -4
- package/dist/{src/foundation → foundation}/release/update.js +196 -78
- package/dist/foundation/release/warmup.d.ts +3 -0
- package/dist/foundation/release/warmup.js +47 -0
- package/dist/foundation/startup/index.d.ts +1 -0
- package/dist/foundation/startup/index.js +1 -0
- package/dist/foundation/startup/startup-runtime.d.ts +36 -0
- package/dist/foundation/startup/startup-runtime.js +142 -0
- package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
- package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
- package/dist/foundation/supervision/index.d.ts +3 -0
- package/dist/foundation/supervision/index.js +3 -0
- package/dist/foundation/supervision/main.d.ts +1 -0
- package/dist/foundation/supervision/main.js +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 +51 -0
- package/dist/{src/foundation → foundation}/supervision/server.js +142 -20
- package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.js +85 -0
- package/dist/foundation/terminal-cleanup/index.d.ts +2 -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/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
- package/dist/integrations/pi/components/editor-interaction.d.ts +38 -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/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +2 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +2 -1
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +1093 -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/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +297 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +4 -4
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +58 -23
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +114 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +174 -170
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +8 -4
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +10 -6
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +213 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +5 -2
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +15 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +43 -0
- package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
- package/dist/integrations/pi/components/tool-image-presentation.js +86 -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/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +11 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +41 -3
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +42 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +40 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +166 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +3 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +3 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +12 -7
- package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +61 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +344 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +280 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.js +2062 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +32 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +48 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.js +40 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +28 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +22 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +36 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +100 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +74 -6
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +1340 -228
- package/dist/integrations/pi/engine/changelog.d.ts +2 -0
- package/dist/integrations/pi/engine/changelog.js +63 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +4 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +15 -5
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
- package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
- package/dist/integrations/pi/engine/pending-delivery.js +158 -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/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
- package/dist/integrations/pi/engine/resources/changelog.json +12 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +56 -5
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
- package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
- package/dist/integrations/pi/engine/session-selection.js +90 -0
- package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
- package/dist/integrations/pi/engine/settings-effects.js +249 -0
- package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
- package/dist/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/windows-filesystem-hygiene.d.ts +21 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +19 -2
- package/dist/integrations/pi/session-ui/clipboard-diagnostics.d.ts +16 -0
- package/dist/integrations/pi/session-ui/clipboard-diagnostics.js +65 -0
- package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
- package/dist/integrations/pi/session-ui/clipboard-image.js +38 -0
- package/dist/integrations/pi/session-ui/editor-hyperlink-budget.d.ts +9 -0
- package/dist/integrations/pi/session-ui/editor-hyperlink-budget.js +23 -0
- package/dist/integrations/pi/session-ui/image-preparation-client.d.ts +20 -0
- package/dist/integrations/pi/session-ui/image-preparation-client.js +145 -0
- package/dist/integrations/pi/session-ui/image-preparation.d.ts +18 -0
- package/dist/integrations/pi/session-ui/image-preparation.js +126 -0
- package/dist/integrations/pi/session-ui/image-source.d.ts +13 -0
- package/dist/integrations/pi/session-ui/image-source.js +171 -0
- package/dist/integrations/pi/session-ui/image-worker.d.ts +17 -0
- package/dist/integrations/pi/session-ui/image-worker.js +23 -0
- package/dist/integrations/pi/session-ui/index.d.ts +5 -0
- package/dist/integrations/pi/session-ui/index.js +5 -0
- package/dist/integrations/pi/session-ui/paste-executor.d.ts +10 -0
- package/dist/integrations/pi/session-ui/paste-executor.js +232 -0
- package/dist/integrations/pi/session-ui/paste-helper.d.ts +1 -0
- package/dist/integrations/pi/session-ui/paste-helper.js +173 -0
- package/dist/integrations/pi/session-ui/paste-preparation-client.d.ts +16 -0
- package/dist/integrations/pi/session-ui/paste-preparation-client.js +159 -0
- package/dist/integrations/pi/session-ui/paste-protocol.d.ts +78 -0
- package/dist/integrations/pi/session-ui/paste-protocol.js +18 -0
- package/dist/integrations/pi/session-ui/paste-text-preparation.d.ts +20 -0
- package/dist/integrations/pi/session-ui/paste-text-preparation.js +134 -0
- package/dist/integrations/pi/session-ui/paste-text-worker.d.ts +1 -0
- package/dist/integrations/pi/session-ui/paste-text-worker.js +12 -0
- package/dist/integrations/pi/session-ui/path-chip-presentation.d.ts +7 -0
- package/dist/integrations/pi/session-ui/path-chip-presentation.js +24 -0
- package/dist/integrations/pi/session-ui/prompt-chips.d.ts +72 -0
- package/dist/integrations/pi/session-ui/prompt-chips.js +503 -0
- package/dist/integrations/pi/session-ui/prompt-history-controller.d.ts +36 -0
- package/dist/integrations/pi/session-ui/prompt-history-controller.js +170 -0
- package/dist/integrations/pi/session-ui/prompt-suggestion-controller.d.ts +35 -0
- package/dist/integrations/pi/session-ui/prompt-suggestion-controller.js +207 -0
- package/dist/integrations/pi/session-ui/response-copy-coordinator.d.ts +27 -0
- package/dist/integrations/pi/session-ui/response-copy-coordinator.js +189 -0
- package/dist/integrations/pi/session-ui/response-copy-helper.d.ts +1 -0
- package/dist/integrations/pi/session-ui/response-copy-helper.js +122 -0
- package/dist/integrations/pi/session-ui/response-copy-protocol.d.ts +56 -0
- package/dist/integrations/pi/session-ui/response-copy-protocol.js +5 -0
- package/dist/integrations/pi/session-ui/response-copy-transport.d.ts +31 -0
- package/dist/integrations/pi/session-ui/response-copy-transport.js +187 -0
- package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
- package/dist/integrations/pi/session-ui/route-host.js +1 -0
- package/dist/integrations/pi/session-ui/session-shell-root.d.ts +221 -0
- package/dist/integrations/pi/session-ui/session-shell-root.js +1305 -0
- package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
- package/dist/integrations/pi/session-ui/session-shell.js +1792 -0
- package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +56 -0
- package/dist/integrations/pi/session-ui/session-viewport-controller.js +569 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
- package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
- package/dist/integrations/pi/session-ui/system-clipboard.js +156 -0
- package/dist/integrations/pi/session-ui/text-paste.d.ts +5 -0
- package/dist/integrations/pi/session-ui/text-paste.js +16 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +10 -1
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +255 -11
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +32 -6
- package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +81 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +424 -0
- package/dist/integrations/pi/tui-runtime/index.d.ts +7 -0
- package/dist/integrations/pi/tui-runtime/index.js +7 -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 +59 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.js +159 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
- package/dist/native/darwin-arm64/manifest.json +4 -4
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +3 -3
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/{src/product-identity.d.ts → product-identity.d.ts} +4 -4
- package/dist/{src/product-identity.js → product-identity.js} +7 -38
- package/dist/{src/product-identity.json → product-identity.json} +13 -27
- package/dist/runtime-payload-inventory.json +122333 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
- package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +7 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.js +7 -0
- package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +2 -8
- package/dist/{src/foundation/ui-components → ui/components}/line-input.js +7 -28
- package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
- package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
- package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
- package/dist/{src/foundation/ui-components → ui/components}/mouse.js +24 -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 +54 -0
- package/dist/ui/components/prompt-row.d.ts +14 -0
- package/dist/ui/components/prompt-row.js +20 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
- package/dist/ui/components/selection-copy.d.ts +24 -0
- package/dist/ui/components/selection-copy.js +39 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
- package/dist/ui/components/spans.d.ts +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/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
- package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
- package/dist/ui/components/text-selection.d.ts +62 -0
- package/dist/ui/components/text-selection.js +210 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.js +67 -5
- 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/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
- package/dist/ui/settings/declarations.js +94 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +28 -2
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +41 -22
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
- package/dist/ui/settings/session.js +164 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
- package/docs/architecture/boundaries.md +14 -10
- package/docs/architecture/code-documentation.md +77 -0
- package/docs/architecture/history-editor-provenance.md +100 -0
- package/docs/architecture/internal-naming.md +91 -0
- package/docs/architecture/process-guardian-provenance.md +3 -1
- package/docs/architecture/project-structure.md +69 -30
- package/docs/architecture/prompt-suggestions.md +68 -0
- package/docs/architecture/resource-and-data-policy.md +28 -2
- package/docs/architecture/response-copy-delivery.md +83 -0
- package/docs/architecture/tool-image-presentation.md +62 -0
- package/docs/architecture/toolchain.md +24 -10
- package/docs/architecture/ui-reference-provenance.md +59 -5
- package/docs/ci-release-runbook.md +236 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/features/modal-content-interaction.md +37 -0
- package/docs/features/prompt-history.md +149 -0
- package/docs/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 +78 -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 +124 -0
- package/docs/repository-governance-live-acceptance.md +77 -0
- package/package.json +45 -28
- package/dist/src/cli/capabilities.d.ts +0 -15
- package/dist/src/cli/dispatch.js +0 -142
- package/dist/src/cli/version-stats.js +0 -72
- package/dist/src/composition/index.d.ts +0 -48
- package/dist/src/composition/index.js +0 -258
- package/dist/src/features/launch/intent.d.ts +0 -7
- package/dist/src/features/launch/intent.js +0 -4
- package/dist/src/features/launch/profiles.d.ts +0 -12
- package/dist/src/features/launch/profiles.js +0 -26
- package/dist/src/features/owned-ui/run.js +0 -15
- package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
- 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-settings/declarations.js +0 -39
- package/dist/src/foundation/owned-ui-settings/session.js +0 -145
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
- 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-engine-adapter/settings-integration.d.ts +0 -55
- 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/index.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
- package/dist/src/foundation/release/bootstrap.d.ts +0 -29
- package/dist/src/foundation/release/cohort-state.d.ts +0 -70
- package/dist/src/foundation/release/cohort-state.js +0 -202
- package/dist/src/foundation/release/release-gc.d.ts +0 -5
- package/dist/src/foundation/release/release-gc.js +0 -16
- package/dist/src/foundation/supervision/index.d.ts +0 -3
- package/dist/src/foundation/supervision/index.js +0 -3
- package/dist/src/foundation/supervision/main.d.ts +0 -1
- package/dist/src/foundation/supervision/main.js +0 -41
- package/dist/src/foundation/supervision/paths.d.ts +0 -1
- package/dist/src/foundation/supervision/paths.js +0 -1
- package/dist/src/foundation/supervision/server.d.ts +0 -22
- package/dist/src/foundation/ui-components/spans.d.ts +0 -7
- package/dist/src/foundation/ui-components/spans.js +0 -59
- package/docs/manual-transparent-checkpoint.md +0 -53
- /package/dist/{src/cli → cli}/index.d.ts +0 -0
- /package/dist/{src/cli → cli}/index.js +0 -0
- /package/dist/{src/cli → cli}/version.d.ts +0 -0
- /package/dist/{src/cli → cli}/version.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
- /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
- /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
- /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
- /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/index.js +0 -0
- /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/presentation.js +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
- /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → integrations/pi/components/editor-interaction.js} +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → integrations/pi/components/prompt-input-port.js} +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
|
@@ -5,22 +5,18 @@ import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
|
5
5
|
import crossSpawn from "cross-spawn";
|
|
6
6
|
import { valid as validSemver } from "semver";
|
|
7
7
|
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
8
|
-
import { certifyMaterializedRelease, probeOwnership, readEndpointMetadata, removeEndpointArtifacts,
|
|
9
|
-
import { resolveProductPaths } from "../lifecycle/index.js";
|
|
8
|
+
import { certifyMaterializedRelease, probeOwnership, readEndpointMetadata, removeEndpointArtifacts, ensureSupervisor, waitForProcessExit, } from "./bootstrap.js";
|
|
9
|
+
import { resolveCohortEndpoint, resolveProductPaths } from "../lifecycle/index.js";
|
|
10
10
|
import { encodeFrame, LineFrameDecoder } from "../protocol/index.js";
|
|
11
11
|
import { CohortStateStore } from "./cohort-state.js";
|
|
12
12
|
import { cleanupVerifiedOwner, processIsAlive } from "./process-cleanup.js";
|
|
13
13
|
import { materializeRelease, readMaterializedRelease } from "./release-store.js";
|
|
14
|
+
import { scheduleReleaseCleanup } from "./release-gc.js";
|
|
15
|
+
import { warmMaterializedRelease } from "./warmup.js";
|
|
14
16
|
import { UpdateTransactionStore } from "./update-transaction.js";
|
|
17
|
+
import { removeUpdateRecoveryCapsule, runProtectedPackageReplacement } from "./update-recovery.js";
|
|
15
18
|
export const PRODUCT_PACKAGE = PRODUCT_TEXT.packageName;
|
|
16
19
|
const UPDATE_DIST_TAGS = { stable: "latest", next: "next" };
|
|
17
|
-
/**
|
|
18
|
-
* What each channel is called when A1 says it out loud. The internal name stays
|
|
19
|
-
* `stable` because that is what the channel is, but what a reader is moving to is
|
|
20
|
-
* a release, and that is the word the repository, its tags, and its GitHub
|
|
21
|
-
* releases all use.
|
|
22
|
-
*/
|
|
23
|
-
const UPDATE_CHANNEL_LABELS = { stable: "release", next: "next" };
|
|
24
20
|
const defaultFileSystem = {
|
|
25
21
|
async readFile(path) { return await readFile(path, "utf8"); },
|
|
26
22
|
realpath,
|
|
@@ -47,6 +43,33 @@ export function createNpmProcessRunner(platform = process.platform) {
|
|
|
47
43
|
} });
|
|
48
44
|
});
|
|
49
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* What an update does about the owner it found. A cohort running from retained immutable
|
|
48
|
+
* content keeps its work: the installation replaces files it does not read, and it listens on
|
|
49
|
+
* its own endpoint. A cohort running from the mutable installation is the one exception,
|
|
50
|
+
* because that installation is exactly what is about to be replaced under it.
|
|
51
|
+
*/
|
|
52
|
+
export function planUpdateOwnership(ownership, runsFromRetainedRelease) {
|
|
53
|
+
if (ownership === "dead")
|
|
54
|
+
return "clean-dead-record";
|
|
55
|
+
return runsFromRetainedRelease ? "leave-running" : "end-session";
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The endpoint of the active cohort, together with where it is recorded, so a caller that
|
|
59
|
+
* finds it can also clean it up. A release that predates cohort-scoped endpoints published
|
|
60
|
+
* one endpoint for the runtime directory, and that one is recognized too.
|
|
61
|
+
*/
|
|
62
|
+
async function readActiveEndpoint(paths, activeReleaseId, environment) {
|
|
63
|
+
if (activeReleaseId !== null) {
|
|
64
|
+
const cohort = resolveCohortEndpoint(paths, activeReleaseId, environment);
|
|
65
|
+
const metadata = await readEndpointMetadata(cohort.endpointMetadataPath);
|
|
66
|
+
if (metadata)
|
|
67
|
+
return { metadata, paths: cohort };
|
|
68
|
+
}
|
|
69
|
+
const legacyPaths = { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath };
|
|
70
|
+
const legacy = await readEndpointMetadata(legacyPaths.endpointMetadataPath);
|
|
71
|
+
return legacy ? { metadata: legacy, paths: legacyPaths } : null;
|
|
72
|
+
}
|
|
50
73
|
export function createUpdateLifecycleCoordinator(environment = process.env, fileSystem = defaultFileSystem, output = defaultOutput) {
|
|
51
74
|
const paths = resolveProductPaths(environment);
|
|
52
75
|
const stateStore = new CohortStateStore(paths.dataDir);
|
|
@@ -56,45 +79,51 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
|
|
|
56
79
|
const activeId = state.references.active;
|
|
57
80
|
if (!activeId || state.releases[activeId]?.packageVersion !== targetVersion)
|
|
58
81
|
return false;
|
|
59
|
-
const endpoint = await
|
|
60
|
-
return endpoint?.releaseId === activeId && await probeOwnership(endpoint) === "live-verified";
|
|
82
|
+
const endpoint = await readActiveEndpoint(paths, activeId, environment);
|
|
83
|
+
return endpoint?.metadata.releaseId === activeId && await probeOwnership(endpoint.metadata) === "live-verified";
|
|
61
84
|
},
|
|
62
85
|
async shutdownVerifiedOwners(targetVersion) {
|
|
63
86
|
const state = await stateStore.read();
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
87
|
+
const activeId = state.references.active;
|
|
88
|
+
const priorActiveVersion = activeId ? state.releases[activeId]?.packageVersion ?? null : null;
|
|
89
|
+
const owner = await readActiveEndpoint(paths, activeId, environment);
|
|
90
|
+
if (!owner)
|
|
67
91
|
return { priorActiveVersion };
|
|
92
|
+
const endpoint = owner.metadata;
|
|
68
93
|
const ownership = await probeOwnership(endpoint);
|
|
69
94
|
if (ownership !== "live-verified" && ownership !== "dead") {
|
|
70
95
|
throw new Error(PRODUCT_TEXT.diagnostic(`refused update shutdown because supervisor ownership is ${ownership}`));
|
|
71
96
|
}
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
97
|
+
const plan = planUpdateOwnership(ownership, await canonicalImmutableRoot(paths.dataDir, endpoint.releaseRoot));
|
|
98
|
+
if (plan === "clean-dead-record") {
|
|
99
|
+
await removeEndpointArtifacts(owner.paths.endpointMetadataPath, owner.paths.endpoint);
|
|
100
|
+
return { priorActiveVersion };
|
|
101
|
+
}
|
|
102
|
+
// Rationale: leaving sessions alone is the expected outcome, and saying so mid-update tears
|
|
103
|
+
// the progress bar; only ending a session (below) is worth interrupting it for.
|
|
104
|
+
if (plan === "leave-running")
|
|
105
|
+
return { priorActiveVersion };
|
|
106
|
+
// Rationale: say whose work is ending before it ends.
|
|
107
|
+
const live = endpoint.ownership.liveInstanceIds.length;
|
|
108
|
+
if (live > 0) {
|
|
109
|
+
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`);
|
|
110
|
+
}
|
|
111
|
+
const identity = await requestUpdateShutdown(endpoint, targetVersion, 2_000);
|
|
77
112
|
if (!identity.accepted && processIsAlive(endpoint.pid)) {
|
|
78
|
-
//
|
|
113
|
+
// Security: explicit update consent permits bounded cleanup of an authenticated
|
|
79
114
|
// older owner that predates the update-shutdown message.
|
|
80
|
-
const cleanup = await cleanupVerifiedOwner(endpoint, {
|
|
81
|
-
allowLiveInstances: true,
|
|
82
|
-
reason: legacyMutableInstall ? "legacy-mutable-install" : "explicit-update",
|
|
83
|
-
});
|
|
115
|
+
const cleanup = await cleanupVerifiedOwner(endpoint, { allowLiveInstances: true, reason: "legacy-mutable-install" });
|
|
84
116
|
if (!cleanup.terminated)
|
|
85
117
|
throw new Error(`verified ${PRODUCT_TEXT.displayName} owner ${endpoint.pid} rejected shutdown and could not be terminated: ${identity.reason}`);
|
|
86
118
|
}
|
|
87
119
|
else if (identity.accepted) {
|
|
88
120
|
await waitForProcessExit(endpoint.pid, 3_000).catch(async () => {
|
|
89
|
-
const cleanup = await cleanupVerifiedOwner(endpoint, {
|
|
90
|
-
allowLiveInstances: true,
|
|
91
|
-
reason: legacyMutableInstall ? "legacy-mutable-install" : "explicit-update",
|
|
92
|
-
});
|
|
121
|
+
const cleanup = await cleanupVerifiedOwner(endpoint, { allowLiveInstances: true, reason: "legacy-mutable-install" });
|
|
93
122
|
if (!cleanup.terminated)
|
|
94
123
|
throw new Error(`verified ${PRODUCT_TEXT.displayName} owner ${endpoint.pid} did not terminate`);
|
|
95
124
|
});
|
|
96
125
|
}
|
|
97
|
-
await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
|
|
126
|
+
await removeEndpointArtifacts(owner.paths.endpointMetadataPath, owner.paths.endpoint);
|
|
98
127
|
return { priorActiveVersion };
|
|
99
128
|
},
|
|
100
129
|
async verifyPackageUnlocked(packageRoot) {
|
|
@@ -107,12 +136,12 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
|
|
|
107
136
|
await rename(probe, packageRoot);
|
|
108
137
|
}
|
|
109
138
|
catch (error) {
|
|
110
|
-
//
|
|
139
|
+
// Invariant: best-effort rollback runs if the first rename succeeded and the second did not.
|
|
111
140
|
await rename(probe, packageRoot).catch(() => { });
|
|
112
141
|
throw new Error(PRODUCT_TEXT.diagnostic(`package remains locked after verified shutdown: ${errorMessage(error)}`));
|
|
113
142
|
}
|
|
114
143
|
},
|
|
115
|
-
async activateInstalled(packageRoot, targetVersion, phase, onMaterializing) {
|
|
144
|
+
async activateInstalled(packageRoot, targetVersion, phase, onMaterializing, onWarmup) {
|
|
116
145
|
let total = 0;
|
|
117
146
|
let completed = 0;
|
|
118
147
|
const candidate = await materializeRelease(packageRoot, paths.dataDir, {
|
|
@@ -121,7 +150,7 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
|
|
|
121
150
|
onMaterializing?.({ completed, total });
|
|
122
151
|
},
|
|
123
152
|
onOperation: event => {
|
|
124
|
-
if (event.operation !== "candidate-write")
|
|
153
|
+
if (event.operation !== "candidate-write" && event.operation !== "layer-write")
|
|
125
154
|
return;
|
|
126
155
|
completed += 1;
|
|
127
156
|
onMaterializing?.({ completed, total });
|
|
@@ -134,14 +163,17 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
|
|
|
134
163
|
const diagnostics = await certifyMaterializedRelease(candidate, paths.dataDir);
|
|
135
164
|
await stateStore.approve(candidate.releaseId, diagnostics);
|
|
136
165
|
await phase("certified");
|
|
166
|
+
onWarmup?.("started");
|
|
167
|
+
await warmMaterializedRelease(candidate, environment);
|
|
168
|
+
onWarmup?.("completed");
|
|
169
|
+
await ensureSupervisor(candidate, environment);
|
|
170
|
+
// Invariant: warmup and authenticated readiness precede changing the active reference.
|
|
137
171
|
await stateStore.activate(candidate.releaseId);
|
|
138
172
|
await phase("active-reference-committed");
|
|
139
|
-
await startSupervisor(candidate, environment);
|
|
140
|
-
await waitForVerifiedEndpoint(paths.endpointMetadataPath, candidate, 8_000);
|
|
141
173
|
},
|
|
142
174
|
};
|
|
143
175
|
}
|
|
144
|
-
const PROGRESS_BAR_WIDTH =
|
|
176
|
+
const PROGRESS_BAR_WIDTH = 40;
|
|
145
177
|
const PROGRESS_TICK_MS = 200;
|
|
146
178
|
/**
|
|
147
179
|
* Copying the release owns 78–92 and is reported file by file, so the bar crosses
|
|
@@ -154,10 +186,15 @@ const ACTIVATION_PROGRESS = {
|
|
|
154
186
|
certified: { at: 94, creepTo: 96 },
|
|
155
187
|
"active-reference-committed": { at: 96, creepTo: 99 },
|
|
156
188
|
};
|
|
157
|
-
|
|
189
|
+
/** Renders the terminal-only update meter; the visual preview shares this exact frame. */
|
|
190
|
+
export function renderUpdateProgressBar(percent) {
|
|
158
191
|
const bounded = Math.min(100, Math.max(0, Math.round(percent)));
|
|
159
192
|
const filled = Math.round((bounded / 100) * PROGRESS_BAR_WIDTH);
|
|
160
|
-
|
|
193
|
+
// Rationale: a gray line, a darker gray track, and one space before the percentage.
|
|
194
|
+
// Explicit RGB keeps both grays neutral even when the terminal remaps its ANSI palette.
|
|
195
|
+
const gray = "\u001b[38;2;128;128;128m";
|
|
196
|
+
const track = "\u001b[38;2;102;102;102m";
|
|
197
|
+
return `${gray}${"━".repeat(filled)}${track}${"─".repeat(PROGRESS_BAR_WIDTH - filled)}${gray} ${bounded}%\u001b[39m`;
|
|
161
198
|
}
|
|
162
199
|
function createUpdateProgress(output, enabled) {
|
|
163
200
|
let visible = false;
|
|
@@ -170,7 +207,7 @@ function createUpdateProgress(output, enabled) {
|
|
|
170
207
|
return;
|
|
171
208
|
shown = rounded;
|
|
172
209
|
visible = true;
|
|
173
|
-
output.stdout(`\r${
|
|
210
|
+
output.stdout(`\r${renderUpdateProgressBar(rounded)}`);
|
|
174
211
|
};
|
|
175
212
|
const stopCreep = () => {
|
|
176
213
|
if (timer !== null) {
|
|
@@ -188,7 +225,7 @@ function createUpdateProgress(output, enabled) {
|
|
|
188
225
|
draw();
|
|
189
226
|
if (creepTo <= current)
|
|
190
227
|
return;
|
|
191
|
-
//
|
|
228
|
+
// Rationale: creep asymptotically toward (but never reach) the next milestone so
|
|
192
229
|
// long opaque phases such as npm install still show visible motion. The
|
|
193
230
|
// ceiling stays a whole point below the milestone: settling on `creepTo`
|
|
194
231
|
// itself would render as that milestone and make arriving at it invisible,
|
|
@@ -199,7 +236,7 @@ function createUpdateProgress(output, enabled) {
|
|
|
199
236
|
}, PROGRESS_TICK_MS);
|
|
200
237
|
timer.unref?.();
|
|
201
238
|
},
|
|
202
|
-
//
|
|
239
|
+
// Rationale: the bar exists to say the update is still moving. Once it has finished
|
|
203
240
|
// there is a better line to occupy that row — the one naming what is now
|
|
204
241
|
// installed — so the bar gives the row back rather than leaving a full
|
|
205
242
|
// meter above a message that already implies it.
|
|
@@ -223,12 +260,13 @@ function createUpdateProgress(output, enabled) {
|
|
|
223
260
|
}
|
|
224
261
|
/** The newest version the channel points at, which is what an unqualified update takes. */
|
|
225
262
|
async function resolveChannelHead(runner, distTag, output) {
|
|
226
|
-
const
|
|
263
|
+
const publicChannel = distTag === "next" ? "development" : "release";
|
|
264
|
+
const lookup = await runNpm(runner, ["view", `${PRODUCT_PACKAGE}@${distTag}`, "version"], true, output, `query the npm ${publicChannel} channel`);
|
|
227
265
|
if (lookup.result === null)
|
|
228
266
|
return { version: null, exitCode: lookup.exitCode };
|
|
229
267
|
const version = validSemver(lookup.result.stdout.trim());
|
|
230
268
|
if (version === null) {
|
|
231
|
-
output.stderr(`${PRODUCT_TEXT.diagnostic(`received a malformed ${
|
|
269
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`received a malformed ${publicChannel} channel version from npm: ${JSON.stringify(lookup.result.stdout.trim())}.`)}\n`);
|
|
232
270
|
return { version: null, exitCode: 1 };
|
|
233
271
|
}
|
|
234
272
|
return { version, exitCode: 0 };
|
|
@@ -236,14 +274,10 @@ async function resolveChannelHead(runner, distTag, output) {
|
|
|
236
274
|
/**
|
|
237
275
|
* Resolve a preview the caller named.
|
|
238
276
|
*
|
|
239
|
-
* A preview is published as `<version>-dev.<
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
* The published list is the authority: naming a commit that was never published,
|
|
245
|
-
* or one published more than once under different versions, is an error rather
|
|
246
|
-
* than a guess.
|
|
277
|
+
* A preview is published as `<version>-dev.<pull-request-number>`, so its decimal
|
|
278
|
+
* development number is enough to identify it. A full version is accepted too.
|
|
279
|
+
* The published list remains authoritative: nothing is constructed from the
|
|
280
|
+
* installed package's base version.
|
|
247
281
|
*/
|
|
248
282
|
async function resolveRequestedPreview(runner, requested, output) {
|
|
249
283
|
const lookup = await runNpm(runner, ["view", PRODUCT_PACKAGE, "versions", "--json"], true, output, "list the published versions");
|
|
@@ -260,9 +294,8 @@ async function resolveRequestedPreview(runner, requested, output) {
|
|
|
260
294
|
const versions = (Array.isArray(published) ? published : [published]).filter((value) => typeof value === "string");
|
|
261
295
|
const exact = versions.find(version => version === requested);
|
|
262
296
|
if (exact !== undefined) {
|
|
263
|
-
//
|
|
264
|
-
// different command with a different meaning.
|
|
265
|
-
// one, so only the fuller spelling of a preview reaches this.
|
|
297
|
+
// Rationale: naming a release here would install it through the preview path, which is a
|
|
298
|
+
// different command with a different meaning.
|
|
266
299
|
if (!exact.includes("-dev.")) {
|
|
267
300
|
output.stderr(`${PRODUCT_TEXT.diagnostic(`${exact} is a release, not a preview; run ${PRODUCT_TEXT.commandName} update to move to the current release.`)}\n`);
|
|
268
301
|
return { version: null, exitCode: 1 };
|
|
@@ -314,7 +347,9 @@ export async function runSelfUpdate(options) {
|
|
|
314
347
|
if (resolved.version === null)
|
|
315
348
|
return resolved.exitCode;
|
|
316
349
|
const targetVersion = resolved.version;
|
|
317
|
-
|
|
350
|
+
// Rationale: no full stop after a version: it already ends in a dot-separated identifier,
|
|
351
|
+
// and a trailing one reads as part of the version rather than as punctuation.
|
|
352
|
+
output.stdout(`${PRODUCT_TEXT.commandName} update: ${runningVersion} → ${targetVersion}\n`);
|
|
318
353
|
const progress = createUpdateProgress(output, options.progress ?? (options.output === undefined && process.stdout.isTTY === true));
|
|
319
354
|
const rootLookup = await measure("global-root", async () => await runNpm(runner, ["root", "--global"], true, output, "resolve npm's global package root"));
|
|
320
355
|
if (rootLookup.result === null)
|
|
@@ -340,25 +375,37 @@ export async function runSelfUpdate(options) {
|
|
|
340
375
|
const paths = resolveProductPaths(environment);
|
|
341
376
|
const lifecycle = options.lifecycle ?? createUpdateLifecycleCoordinator(environment, fileSystem, output);
|
|
342
377
|
const transactionStore = options.transactionStore ?? new UpdateTransactionStore(paths.dataDir);
|
|
378
|
+
const maintenance = options.maintenance ?? (options.lifecycle
|
|
379
|
+
? async () => { }
|
|
380
|
+
: async () => await scheduleReleaseCleanup(paths.dataDir, paths));
|
|
343
381
|
let transaction = await transactionStore.read();
|
|
344
382
|
try {
|
|
345
|
-
if (await lifecycle.targetIsActive(targetVersion)) {
|
|
346
|
-
|
|
347
|
-
await transactionStore.advance("supervisor-verified");
|
|
348
|
-
await transactionStore.finish("completed");
|
|
349
|
-
}
|
|
383
|
+
if ((!transaction || transaction.status === "completed") && await lifecycle.targetIsActive(targetVersion)) {
|
|
384
|
+
await maintenance();
|
|
350
385
|
await transactionStore.clearCompleted();
|
|
351
386
|
output.stdout(`${PRODUCT_TEXT.commandName} is up to date — no update needed.\n`);
|
|
352
387
|
return 0;
|
|
353
388
|
}
|
|
354
|
-
//
|
|
389
|
+
// Rationale: the bar first appears here so a no-change run never flashes it.
|
|
355
390
|
progress.set(3, 15);
|
|
356
|
-
const
|
|
391
|
+
const cohortStore = new CohortStateStore(paths.dataDir);
|
|
392
|
+
let cohortState = await cohortStore.read();
|
|
393
|
+
let priorActiveReleaseId = cohortState.references.active;
|
|
394
|
+
if (options.runner === undefined && (priorActiveReleaseId === null || cohortState.releases[priorActiveReleaseId]?.approval !== "approved")) {
|
|
395
|
+
// Invariant: protected replacement needs an immutable launch authority that npm cannot rename.
|
|
396
|
+
const recoveryRelease = await materializeRelease(packageRoot, paths.dataDir);
|
|
397
|
+
await cohortStore.recordCandidate(recoveryRelease);
|
|
398
|
+
const diagnostics = await certifyMaterializedRelease(recoveryRelease, paths.dataDir);
|
|
399
|
+
await cohortStore.approve(recoveryRelease.releaseId, diagnostics);
|
|
400
|
+
await cohortStore.activate(recoveryRelease.releaseId);
|
|
401
|
+
cohortState = await cohortStore.read();
|
|
402
|
+
priorActiveReleaseId = recoveryRelease.releaseId;
|
|
403
|
+
}
|
|
357
404
|
transaction = await transactionStore.begin({
|
|
358
405
|
channel,
|
|
359
406
|
targetVersion,
|
|
360
407
|
packageRoot,
|
|
361
|
-
priorActiveReleaseId
|
|
408
|
+
priorActiveReleaseId,
|
|
362
409
|
});
|
|
363
410
|
if (phaseBefore(transaction.phase, "ownership-released")) {
|
|
364
411
|
await measure("ownership-release", async () => {
|
|
@@ -369,18 +416,73 @@ export async function runSelfUpdate(options) {
|
|
|
369
416
|
}
|
|
370
417
|
progress.set(15, 70);
|
|
371
418
|
if (phaseBefore(transaction.phase, "package-installed")) {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
419
|
+
if (options.packageReplacement || options.runner === undefined) {
|
|
420
|
+
const priorReleaseId = transaction.priorActiveReleaseId ?? priorActiveReleaseId;
|
|
421
|
+
const recordedPrior = priorReleaseId === null ? undefined : cohortState.releases[priorReleaseId];
|
|
422
|
+
if ((!recordedPrior || recordedPrior.approval !== "approved") && !options.packageReplacement) {
|
|
423
|
+
throw new Error(PRODUCT_TEXT.diagnostic("cannot protect package replacement because no approved prior release is available"));
|
|
424
|
+
}
|
|
425
|
+
const priorRelease = recordedPrior ?? {
|
|
426
|
+
releaseId: priorReleaseId ?? "injected-prior-release",
|
|
427
|
+
releaseRoot: packageRoot,
|
|
428
|
+
contentDigest: "0".repeat(64),
|
|
429
|
+
};
|
|
430
|
+
const replacementTransaction = transaction;
|
|
431
|
+
const replacement = await measure("npm-install", async () => await (options.packageReplacement ?? runProtectedPackageReplacement)({
|
|
432
|
+
dataDir: paths.dataDir,
|
|
433
|
+
globalRoot,
|
|
434
|
+
packageRoot,
|
|
435
|
+
transaction: replacementTransaction,
|
|
436
|
+
priorRelease,
|
|
437
|
+
output,
|
|
438
|
+
environment,
|
|
439
|
+
onRecoveryState: async (recovery) => {
|
|
440
|
+
if (transactionStore.setRecovery)
|
|
441
|
+
transaction = await transactionStore.setRecovery(recovery) ?? transaction;
|
|
442
|
+
},
|
|
443
|
+
}));
|
|
444
|
+
if (replacement.stdout.trim().length > 0 && replacement.outcome !== "installed")
|
|
445
|
+
output.stderr(`${replacement.stdout.trimEnd()}\n`);
|
|
446
|
+
if (replacement.stderr.trim().length > 0)
|
|
447
|
+
output.stderr(`${replacement.stderr.trimEnd()}\n`);
|
|
448
|
+
if (replacement.outcome === "installed")
|
|
449
|
+
transaction = await transactionStore.advance("package-installed");
|
|
450
|
+
if (replacement.cancelled) {
|
|
451
|
+
progress.clear();
|
|
452
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic("update cancelled safely; the launcher is available and the transaction can be resumed.")}\n`);
|
|
453
|
+
return 130;
|
|
454
|
+
}
|
|
455
|
+
if (replacement.outcome !== "installed") {
|
|
456
|
+
throw new UpdateFailure(unsuccessfulCode(replacement.npmExitCode), `npm exited with status ${formatExitCode(replacement.npmExitCode)}`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
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));
|
|
461
|
+
if (installation.result === null)
|
|
462
|
+
throw new UpdateFailure(installation.exitCode, "npm process failed");
|
|
463
|
+
if (installation.result.code !== 0) {
|
|
464
|
+
if (installation.result.stdout.trim().length > 0)
|
|
465
|
+
output.stderr(`${installation.result.stdout.trimEnd()}\n`);
|
|
466
|
+
throw new UpdateFailure(unsuccessfulCode(installation.result.code), `npm exited with status ${formatExitCode(installation.result.code)}`);
|
|
467
|
+
}
|
|
468
|
+
transaction = await transactionStore.advance("package-installed");
|
|
379
469
|
}
|
|
380
|
-
|
|
470
|
+
}
|
|
471
|
+
// Compatibility: npm 12 blocks install scripts unless allowScripts covers the package, so
|
|
472
|
+
// the postinstall that points the #pi-tui proxy at the tree npm just built
|
|
473
|
+
// may never have run. Run the shipped script directly: the proxy must be
|
|
474
|
+
// correct before the release store copies this tree. A failure is reported
|
|
475
|
+
// and left to the launch-time self-heal rather than failing the update.
|
|
476
|
+
try {
|
|
477
|
+
const proxySync = await runner(process.execPath, [resolve(packageRoot, "bin", "sync-pi-tui-proxy.js")], { captureStdout: true });
|
|
478
|
+
if (proxySync.code !== 0)
|
|
479
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`could not point the #pi-tui proxy at the installed tree (exited ${formatExitCode(proxySync.code)}).`)}\n`);
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
output.stderr(`${PRODUCT_TEXT.diagnostic(`could not point the #pi-tui proxy at the installed tree: ${errorMessage(error)}`)}\n`);
|
|
381
483
|
}
|
|
382
484
|
progress.set(70, 75);
|
|
383
|
-
//
|
|
485
|
+
// Concurrency: ownership can be reacquired after an interrupted installation (for
|
|
384
486
|
// example, if bare A1 is launched before the update is resumed). Recheck
|
|
385
487
|
// immediately before activation so recovery cannot start a second cohort.
|
|
386
488
|
await measure("ownership-release", async () => { await lifecycle.shutdownVerifiedOwners(targetVersion); });
|
|
@@ -395,15 +497,31 @@ export async function runSelfUpdate(options) {
|
|
|
395
497
|
const span = MATERIALIZE_PROGRESS.to - MATERIALIZE_PROGRESS.from;
|
|
396
498
|
const done = total > 0 ? Math.min(1, completed / total) : 0;
|
|
397
499
|
progress.set(MATERIALIZE_PROGRESS.from + span * done);
|
|
500
|
+
}, state => {
|
|
501
|
+
if (state === "started") {
|
|
502
|
+
activationPhaseStartedAt = now();
|
|
503
|
+
progress.set(98, 99);
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
options.onPhaseTiming?.({ phase: "warmup", durationMs: Math.max(0, now() - activationPhaseStartedAt) });
|
|
507
|
+
activationPhaseStartedAt = now();
|
|
508
|
+
progress.set(99);
|
|
509
|
+
}
|
|
398
510
|
});
|
|
399
511
|
options.onPhaseTiming?.({ phase: "supervisor-verified", durationMs: Math.max(0, now() - activationPhaseStartedAt) });
|
|
400
512
|
const transactionStartedAt = now();
|
|
401
513
|
await transactionStore.advance("supervisor-verified");
|
|
514
|
+
if (transaction.recovery?.capsulePath)
|
|
515
|
+
await removeUpdateRecoveryCapsule(paths.dataDir, transaction.transactionId);
|
|
516
|
+
// Invariant: successful output follows the durable cleanup disposition. Slow recursive
|
|
517
|
+
// removal belongs to the detached worker started by this maintenance coordinator.
|
|
518
|
+
await maintenance();
|
|
519
|
+
// Concurrency: this is the launch cutover. No failure-prone update work follows success.
|
|
402
520
|
await transactionStore.finish("completed");
|
|
403
|
-
await transactionStore.clearCompleted();
|
|
521
|
+
await transactionStore.clearCompleted().catch(() => undefined);
|
|
404
522
|
options.onPhaseTiming?.({ phase: "transaction-complete", durationMs: Math.max(0, now() - transactionStartedAt) });
|
|
405
523
|
progress.finish();
|
|
406
|
-
output.stdout(`${PRODUCT_TEXT.commandName} updated successfully: ${targetVersion}
|
|
524
|
+
output.stdout(`${PRODUCT_TEXT.commandName} updated successfully: ${targetVersion}\n`);
|
|
407
525
|
return 0;
|
|
408
526
|
}
|
|
409
527
|
catch (error) {
|
|
@@ -424,8 +542,9 @@ export function assertUpdatePerformanceBudget(evidence, maximumPostNpmDurationMs
|
|
|
424
542
|
failures.push("fixture contains no payload files");
|
|
425
543
|
if (evidence.sourceReads !== evidence.fileCount)
|
|
426
544
|
failures.push(`source payload read count is ${evidence.sourceReads} for ${evidence.fileCount} files`);
|
|
427
|
-
|
|
428
|
-
|
|
545
|
+
const totalWrites = evidence.candidateWrites + (evidence.layerWrites ?? 0);
|
|
546
|
+
if (totalWrites !== evidence.fileCount)
|
|
547
|
+
failures.push(`runtime payload write count is ${totalWrites} for ${evidence.fileCount} files`);
|
|
429
548
|
if (evidence.verificationReads > 0)
|
|
430
549
|
failures.push(`fresh certification reread ${evidence.verificationReads} candidate files`);
|
|
431
550
|
if (evidence.postNpmDurationMs > maximumPostNpmDurationMs)
|
|
@@ -492,9 +611,8 @@ async function rollbackPriorCohort(dataDir, environment, priorReleaseId) {
|
|
|
492
611
|
throw new Error(`prior release ${priorReleaseId} is not the recorded rollback cohort`);
|
|
493
612
|
}
|
|
494
613
|
const release = await readMaterializedRelease(prior.releaseRoot);
|
|
495
|
-
|
|
496
|
-
await
|
|
497
|
-
await waitForVerifiedEndpoint(paths.endpointMetadataPath, release, 8_000);
|
|
614
|
+
// Invariant: rollback reuses a surviving prior cohort rather than racing its occupied endpoint.
|
|
615
|
+
await ensureSupervisor(release, environment);
|
|
498
616
|
return "rolled back";
|
|
499
617
|
}
|
|
500
618
|
function phaseBefore(current, target) {
|
|
@@ -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>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { resolveReleaseEntryPoint } from "./release-store.js";
|
|
3
|
+
import { releaseEnvironment } from "./bootstrap.js";
|
|
4
|
+
import { launchContractTarget, launchEnvironmentKeys } from "../launch-context/index.js";
|
|
5
|
+
const WARMUP_DIAGNOSTIC_LIMIT = 2_000;
|
|
6
|
+
/** Summarize the child's own failure text without letting an unbounded graph error escape. */
|
|
7
|
+
function warmupDiagnostics(text) {
|
|
8
|
+
const lines = text.split(/\r?\n/).map(line => line.trim()).filter(line => line.length > 0);
|
|
9
|
+
return lines.length === 0 ? "" : `: ${lines.slice(0, 4).join(" | ").slice(0, WARMUP_DIAGNOSTIC_LIMIT)}`;
|
|
10
|
+
}
|
|
11
|
+
/** Import the exact immutable startup graph in a terminal-free bounded child process. */
|
|
12
|
+
export async function warmMaterializedRelease(release, environment, timeoutMs = 30_000) {
|
|
13
|
+
const entry = await resolveReleaseEntryPoint(release, "bin/warmup.js");
|
|
14
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
15
|
+
// Rationale: the child still gets no terminal, but a discarded failure reason leaves an
|
|
16
|
+
// update reporting only an exit status. Its own diagnostics are read and bounded so the
|
|
17
|
+
// transaction journal records why the graph could not be imported.
|
|
18
|
+
const child = spawn(process.execPath, [entry], {
|
|
19
|
+
env: { ...releaseEnvironment(environment, release), [launchEnvironmentKeys(launchContractTarget(release)).immutableWarmup]: "1" },
|
|
20
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
21
|
+
windowsHide: true,
|
|
22
|
+
});
|
|
23
|
+
let diagnostics = "";
|
|
24
|
+
child.stderr?.setEncoding("utf8");
|
|
25
|
+
child.stderr?.on("data", chunk => { diagnostics = `${diagnostics}${chunk}`.slice(-WARMUP_DIAGNOSTIC_LIMIT); });
|
|
26
|
+
let settled = false;
|
|
27
|
+
const finish = (error) => {
|
|
28
|
+
if (settled)
|
|
29
|
+
return;
|
|
30
|
+
settled = true;
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
if (error)
|
|
33
|
+
rejectPromise(error);
|
|
34
|
+
else
|
|
35
|
+
resolvePromise();
|
|
36
|
+
};
|
|
37
|
+
child.once("error", error => finish(error));
|
|
38
|
+
child.once("close", (code, signal) => finish(code === 0
|
|
39
|
+
? undefined
|
|
40
|
+
: new Error(`immutable startup warmup exited with ${code === null ? signal ?? "unknown status" : `status ${code}`}${warmupDiagnostics(diagnostics)}`)));
|
|
41
|
+
const timer = setTimeout(() => {
|
|
42
|
+
child.kill();
|
|
43
|
+
finish(new Error(`immutable startup warmup exceeded ${timeoutMs}ms`));
|
|
44
|
+
}, timeoutMs);
|
|
45
|
+
timer.unref?.();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./startup-runtime.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./startup-runtime.js";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
2
|
+
export type StartupPhase = "command-invoked" | "bootstrap-start" | "bootstrap-selected" | "durable-validation-start" | "durable-validation-complete" | "replacement-supervisor-start" | "replacement-supervisor-ready" | "guardian-start" | "guardian-connected" | "ui-entry" | "ui-modules-loaded" | "pi-services" | "resource-discovery" | "session-created" | "settings-loaded" | "first-input-ready-render";
|
|
3
|
+
export interface StartupPerformanceEvidence {
|
|
4
|
+
readonly profileId: "a1" | "pi";
|
|
5
|
+
readonly launchKind: "post-update" | "no-live-supervisor" | "warm";
|
|
6
|
+
readonly events: readonly StartupTraceEvent[];
|
|
7
|
+
}
|
|
8
|
+
export interface StartupTraceEvent {
|
|
9
|
+
readonly schema: typeof PRODUCT_IDENTITY.evidence.startupTraceSchema;
|
|
10
|
+
readonly traceId: string;
|
|
11
|
+
readonly phase: StartupPhase;
|
|
12
|
+
readonly elapsedMs: number;
|
|
13
|
+
readonly processId: number;
|
|
14
|
+
readonly profileId: string;
|
|
15
|
+
readonly releaseId: string | null;
|
|
16
|
+
readonly dependencyLayerIds: readonly string[];
|
|
17
|
+
readonly nodeVersion: string;
|
|
18
|
+
readonly fileReadOperations: number;
|
|
19
|
+
}
|
|
20
|
+
/** Initialize opt-in startup tracing from a caller-provided evidence path. */
|
|
21
|
+
export declare function initializeStartupTrace(environment: NodeJS.ProcessEnv, profileId: string, startedAtMs?: number): void;
|
|
22
|
+
/** Append one redacted phase event; ordinary launches without trace context perform no I/O. */
|
|
23
|
+
export declare function markStartupPhase(environment: NodeJS.ProcessEnv, phase: StartupPhase): Promise<void>;
|
|
24
|
+
export declare function assertImmutableWarmupEnvironment(environment: NodeJS.ProcessEnv): void;
|
|
25
|
+
/** Enable the compile cache directly from launch environment without loading profile services. */
|
|
26
|
+
export declare function enableEnvironmentCompileCache(environment: NodeJS.ProcessEnv): string | null;
|
|
27
|
+
/** Enable Node's supported persistent compile cache in an immutable-identity namespace. */
|
|
28
|
+
export declare function enableStartupCompileCache(dataDir: string, releaseId: string | null, dependencyLayerIds: readonly string[]): string | null;
|
|
29
|
+
export declare function startupCompileCachePath(dataDir: string, releaseId: string | null, dependencyLayerIds: readonly string[]): string;
|
|
30
|
+
/** Retain current compile namespaces plus a bounded number of recent fallbacks. */
|
|
31
|
+
export declare function collectCompileCaches(dataDir: string, protectedPaths: readonly string[], keepRecent?: number): Promise<void>;
|
|
32
|
+
export declare function assertStartupPerformanceBudget(evidence: StartupPerformanceEvidence, budgets?: {
|
|
33
|
+
readonly postUpdateMs: number;
|
|
34
|
+
readonly warmMs: number;
|
|
35
|
+
}): void;
|
|
36
|
+
export declare function parseStartupTrace(source: string): readonly StartupTraceEvent[];
|