@timurproko/a1 0.1.8-dev.49ff83a → 0.1.8-dev.508
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -65
- package/bin/cli.js +33 -11
- package/bin/guardian.js +16 -6
- package/bin/module-identity.js +76 -69
- package/bin/module-resolver.js +138 -0
- package/bin/pinned-pi-public.d.ts +3 -0
- package/bin/pinned-pi-public.js +93 -0
- package/bin/release-cleanup.js +8 -0
- package/bin/supervisor.js +2 -2
- package/bin/ui.js +67 -22
- package/bin/update-recovery.js +343 -0
- package/bin/warmup.js +28 -0
- package/dist/app/session-shell/clipboard-diagnostics.d.ts +16 -0
- package/dist/app/session-shell/clipboard-diagnostics.js +65 -0
- package/dist/app/session-shell/clipboard-image.d.ts +11 -0
- package/dist/app/session-shell/clipboard-image.js +38 -0
- package/dist/app/session-shell/editor-hyperlink-budget.d.ts +9 -0
- package/dist/app/session-shell/editor-hyperlink-budget.js +23 -0
- package/dist/app/session-shell/helper-pool.d.ts +33 -0
- package/dist/app/session-shell/helper-pool.js +98 -0
- package/dist/app/session-shell/image-preparation-client.d.ts +20 -0
- package/dist/app/session-shell/image-preparation-client.js +145 -0
- package/dist/app/session-shell/image-preparation.d.ts +18 -0
- package/dist/app/session-shell/image-preparation.js +126 -0
- package/dist/app/session-shell/image-source.d.ts +13 -0
- package/dist/app/session-shell/image-source.js +171 -0
- package/dist/app/session-shell/image-worker.d.ts +17 -0
- package/dist/app/session-shell/image-worker.js +23 -0
- package/dist/app/session-shell/index.d.ts +7 -0
- package/dist/app/session-shell/index.js +4 -0
- package/dist/app/session-shell/paste-executor.d.ts +18 -0
- package/dist/app/session-shell/paste-executor.js +253 -0
- package/dist/app/session-shell/paste-helper.js +173 -0
- package/dist/app/session-shell/paste-preparation-client.d.ts +31 -0
- package/dist/app/session-shell/paste-preparation-client.js +170 -0
- package/dist/app/session-shell/paste-protocol.d.ts +78 -0
- package/dist/app/session-shell/paste-protocol.js +18 -0
- package/dist/app/session-shell/paste-text-preparation.d.ts +6 -0
- package/dist/app/session-shell/paste-text-preparation.js +134 -0
- package/dist/app/session-shell/paste-text-worker.js +12 -0
- package/dist/app/session-shell/paste-types.d.ts +17 -0
- package/dist/app/session-shell/path-chip-presentation.d.ts +7 -0
- package/dist/app/session-shell/path-chip-presentation.js +24 -0
- package/dist/app/session-shell/prompt-chips.d.ts +76 -0
- package/dist/app/session-shell/prompt-chips.js +507 -0
- package/dist/app/session-shell/prompt-history-controller.d.ts +36 -0
- package/dist/app/session-shell/prompt-history-controller.js +170 -0
- package/dist/app/session-shell/prompt-suggestion-controller.d.ts +35 -0
- package/dist/app/session-shell/prompt-suggestion-controller.js +207 -0
- package/dist/app/session-shell/quit-outro-effects.d.ts +29 -0
- package/dist/app/session-shell/quit-outro-effects.js +242 -0
- package/dist/app/session-shell/quit-outro.d.ts +38 -0
- package/dist/app/session-shell/quit-outro.js +98 -0
- package/dist/app/session-shell/response-copy-coordinator.d.ts +27 -0
- package/dist/app/session-shell/response-copy-coordinator.js +187 -0
- package/dist/app/session-shell/response-copy-helper.js +122 -0
- package/dist/app/session-shell/response-copy-protocol.d.ts +56 -0
- package/dist/app/session-shell/response-copy-protocol.js +5 -0
- package/dist/app/session-shell/response-copy-transport.d.ts +39 -0
- package/dist/app/session-shell/response-copy-transport.js +217 -0
- package/dist/app/session-shell/session-shell-root.d.ts +265 -0
- package/dist/app/session-shell/session-shell-root.js +1366 -0
- package/dist/app/session-shell/session-shell.d.ts +59 -0
- package/dist/app/session-shell/session-shell.js +1917 -0
- package/dist/app/session-shell/session-viewport-controller.d.ts +61 -0
- package/dist/app/session-shell/session-viewport-controller.js +597 -0
- package/dist/app/session-shell/stream-presentation-coalescer.d.ts +29 -0
- package/dist/app/session-shell/stream-presentation-coalescer.js +79 -0
- package/dist/app/session-shell/system-clipboard.d.ts +20 -0
- package/dist/app/session-shell/system-clipboard.js +159 -0
- package/dist/app/session-shell/text-paste.d.ts +5 -0
- package/dist/app/session-shell/text-paste.js +16 -0
- package/dist/cli/capabilities.d.ts +6 -0
- package/dist/cli/capabilities.js +7 -0
- package/dist/cli/dispatch.d.ts +46 -0
- package/dist/cli/dispatch.js +261 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/package-messages.d.ts +26 -0
- package/dist/cli/package-messages.js +71 -0
- package/dist/cli/packages.d.ts +32 -0
- package/dist/cli/packages.js +81 -0
- package/dist/cli/version-stats.d.ts +22 -0
- package/dist/cli/version-stats.js +112 -0
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +2 -0
- package/dist/composition/owned-ui.d.ts +37 -0
- package/dist/composition/owned-ui.js +136 -0
- package/dist/composition/settings-route-host.d.ts +7 -0
- package/dist/composition/settings-route-host.js +110 -0
- package/dist/contracts/agent-engine/capability-ports.d.ts +95 -0
- package/dist/contracts/agent-engine/domain-validation.js +107 -0
- package/dist/contracts/agent-engine/domain.d.ts +138 -0
- package/dist/contracts/agent-engine/index.d.ts +11 -0
- package/dist/contracts/agent-engine/index.js +6 -0
- package/dist/contracts/agent-engine/package-ports.d.ts +60 -0
- package/dist/contracts/agent-engine/ports.js +1 -0
- package/dist/contracts/owned-ui/extension-ui.d.ts +310 -0
- package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
- package/dist/contracts/owned-ui/image-attachments.js +67 -0
- package/dist/contracts/owned-ui/index.d.ts +12 -0
- package/dist/contracts/owned-ui/index.js +8 -0
- package/dist/contracts/owned-ui/model.d.ts +378 -0
- package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
- package/dist/contracts/owned-ui/prompt-history.js +23 -0
- package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
- package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
- package/dist/contracts/owned-ui/validation.d.ts +15 -0
- package/dist/contracts/owned-ui/validation.js +523 -0
- package/dist/contracts/presentation/index.d.ts +104 -0
- package/dist/features/launch/development-launch.js +36 -0
- package/dist/features/launch/index.d.ts +12 -0
- package/dist/features/launch/index.js +6 -0
- package/dist/features/launch/intent.d.ts +12 -0
- package/dist/features/launch/intent.js +8 -0
- package/dist/features/launch/prepare-launch.d.ts +11 -0
- package/dist/features/launch/prepare-launch.js +14 -0
- package/dist/features/launch/profile-paths.d.ts +16 -0
- package/dist/features/launch/profile-paths.js +36 -0
- package/dist/features/launch/runtime-selection.d.ts +16 -0
- package/dist/features/launch/runtime-selection.js +13 -0
- package/dist/features/owned-ui/index.d.ts +6 -0
- package/dist/features/owned-ui/index.js +4 -0
- package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
- package/dist/features/owned-ui/project-trust-prompt.js +149 -0
- package/dist/features/owned-ui/run.d.ts +17 -0
- package/dist/features/owned-ui/run.js +64 -0
- package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
- package/dist/features/owned-ui/session-fork-prompt.js +34 -0
- package/dist/features/owned-ui/settings-app.d.ts +21 -0
- package/dist/features/owned-ui/settings-app.js +807 -0
- package/dist/features/owned-ui/settings-route.d.ts +2 -0
- package/dist/features/owned-ui/settings-route.js +2 -0
- package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
- package/dist/features/prompt-history/image-sidecar.js +130 -0
- package/dist/features/prompt-history/index.d.ts +4 -0
- package/dist/features/prompt-history/index.js +3 -0
- package/dist/features/prompt-history/paths.d.ts +5 -0
- package/dist/features/prompt-history/paths.js +17 -0
- package/dist/features/prompt-history/service.d.ts +54 -0
- package/dist/features/prompt-history/service.js +425 -0
- package/dist/features/prompt-history/store.d.ts +16 -0
- package/dist/features/prompt-history/store.js +219 -0
- package/dist/features/prompt-history/worker.d.ts +9 -0
- package/dist/features/prompt-history/worker.js +45 -0
- package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
- package/dist/features/prompt-suggestions/diagnostics.js +82 -0
- package/dist/features/prompt-suggestions/index.d.ts +2 -0
- package/dist/features/prompt-suggestions/index.js +1 -0
- package/dist/foundation/launch-context/index.d.ts +59 -0
- package/dist/foundation/launch-context/index.js +136 -0
- package/dist/foundation/launch-guardian/index.d.ts +2 -0
- package/dist/foundation/launch-guardian/index.js +1 -0
- package/dist/foundation/launch-guardian/main.d.ts +33 -0
- package/dist/foundation/launch-guardian/main.js +180 -0
- package/dist/foundation/lifecycle/commands.js +1 -0
- package/dist/foundation/lifecycle/index.d.ts +11 -0
- package/dist/foundation/lifecycle/index.js +5 -0
- package/dist/foundation/lifecycle/model.d.ts +64 -0
- package/dist/foundation/lifecycle/model.js +40 -0
- package/dist/foundation/lifecycle/paths.d.ts +30 -0
- package/dist/foundation/lifecycle/paths.js +70 -0
- package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
- package/dist/foundation/lifecycle/session-selection.js +39 -0
- package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
- package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
- package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
- package/dist/foundation/process-containment/index.d.ts +8 -0
- package/dist/foundation/process-containment/index.js +6 -0
- package/dist/foundation/process-containment/linux-process-inspector.d.ts +7 -0
- package/dist/foundation/process-containment/linux-process-inspector.js +27 -0
- package/dist/foundation/process-containment/native-guardian-containment.d.ts +17 -0
- package/dist/foundation/process-containment/native-guardian-containment.js +140 -0
- package/dist/foundation/process-containment/windows-process-inspector.d.ts +19 -0
- package/dist/foundation/process-containment/windows-process-inspector.js +56 -0
- package/dist/foundation/protocol/client.d.ts +18 -0
- package/dist/foundation/protocol/client.js +130 -0
- package/dist/foundation/protocol/index.d.ts +3 -0
- package/dist/foundation/protocol/index.js +2 -0
- package/dist/foundation/protocol/messages.d.ts +90 -0
- package/dist/foundation/protocol/messages.js +100 -0
- package/dist/foundation/release/bootstrap.d.ts +51 -0
- package/dist/foundation/release/bootstrap.js +427 -0
- package/dist/foundation/release/cohort-state.d.ts +157 -0
- package/dist/foundation/release/cohort-state.js +472 -0
- package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
- package/dist/foundation/release/dependency-certification-retention.js +88 -0
- package/dist/foundation/release/dependency-certification.d.ts +24 -0
- package/dist/foundation/release/dependency-certification.js +266 -0
- package/dist/foundation/release/dependency-layer.d.ts +78 -0
- package/dist/foundation/release/dependency-layer.js +466 -0
- package/dist/foundation/release/endpoints.d.ts +24 -0
- package/dist/foundation/release/endpoints.js +134 -0
- package/dist/foundation/release/immutable-platform.d.ts +6 -0
- package/dist/foundation/release/immutable-platform.js +13 -0
- package/dist/foundation/release/index.d.ts +30 -0
- package/dist/foundation/release/index.js +16 -0
- package/dist/foundation/release/release-gc.d.ts +71 -0
- package/dist/foundation/release/release-gc.js +764 -0
- package/dist/foundation/release/release-store.d.ts +49 -0
- package/dist/foundation/release/release-store.js +235 -0
- package/dist/foundation/release/release.d.ts +43 -0
- package/dist/foundation/release/release.js +215 -0
- package/dist/foundation/release/restart-certification.d.ts +68 -0
- package/dist/foundation/release/restart-certification.js +227 -0
- package/dist/foundation/release/types.d.ts +11 -0
- package/dist/foundation/release/types.js +1 -0
- package/dist/foundation/release/update-launch.d.ts +6 -0
- package/dist/foundation/release/update-launch.js +17 -0
- package/dist/foundation/release/update-recovery.d.ts +76 -0
- package/dist/foundation/release/update-recovery.js +356 -0
- package/dist/foundation/release/update-transaction.d.ts +42 -0
- package/dist/foundation/release/update-transaction.js +101 -0
- package/dist/foundation/release/update.d.ts +119 -0
- package/dist/foundation/release/update.js +632 -0
- package/dist/foundation/release/warmup.d.ts +3 -0
- package/dist/foundation/release/warmup.js +47 -0
- package/dist/foundation/startup/index.d.ts +4 -0
- package/dist/foundation/startup/index.js +2 -0
- package/dist/foundation/startup/startup-budget.d.ts +46 -0
- package/dist/foundation/startup/startup-budget.js +42 -0
- package/dist/foundation/startup/startup-descriptor.js +34 -0
- package/dist/foundation/startup/startup-runtime.d.ts +27 -0
- package/dist/foundation/startup/startup-runtime.js +128 -0
- package/dist/foundation/storage/control-store.d.ts +18 -0
- package/dist/foundation/storage/control-store.js +342 -0
- package/dist/foundation/storage/index.d.ts +1 -0
- package/dist/foundation/storage/index.js +1 -0
- package/dist/foundation/supervision/index.d.ts +3 -0
- package/dist/foundation/supervision/index.js +3 -0
- package/dist/foundation/supervision/main.d.ts +1 -0
- package/dist/foundation/supervision/main.js +84 -0
- package/dist/foundation/supervision/paths.d.ts +1 -0
- package/dist/foundation/supervision/paths.js +1 -0
- package/dist/foundation/supervision/server.d.ts +46 -0
- package/dist/foundation/supervision/server.js +573 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.js +87 -0
- package/dist/foundation/terminal-cleanup/index.d.ts +3 -0
- package/dist/foundation/terminal-cleanup/index.js +2 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
- package/dist/integrations/pi/components/components.d.ts +4 -0
- package/dist/integrations/pi/components/components.js +64 -0
- package/dist/integrations/pi/components/conformance.d.ts +18 -0
- package/dist/integrations/pi/components/conformance.js +70 -0
- package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
- package/dist/integrations/pi/components/editor-interaction.js +1 -0
- package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
- package/dist/integrations/pi/components/history-editor-loader.js +5 -0
- package/dist/integrations/pi/components/index.d.ts +21 -0
- package/dist/integrations/pi/components/index.js +13 -0
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +1094 -0
- package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
- package/dist/integrations/pi/components/path-word-ranges.js +37 -0
- package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
- package/dist/integrations/pi/components/prompt-input-port.js +1 -0
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +167 -0
- package/dist/integrations/pi/components/resources/builtin-themes.js +168 -0
- package/dist/integrations/pi/components/shell-components.d.ts +7 -0
- package/dist/integrations/pi/components/shell-components.js +7 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +298 -0
- package/dist/integrations/pi/components/shell-extension-ui.d.ts +35 -0
- package/dist/integrations/pi/components/shell-extension-ui.js +280 -0
- package/dist/integrations/pi/components/shell-footer-status.d.ts +7 -0
- package/dist/integrations/pi/components/shell-footer-status.js +248 -0
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +114 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.js +433 -0
- package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +123 -0
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +242 -0
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +217 -0
- package/dist/integrations/pi/components/shell-shared-facade.js +92 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +17 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +49 -0
- package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
- package/dist/integrations/pi/components/tool-image-presentation.js +83 -0
- package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
- package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
- package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
- package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +445 -0
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +370 -0
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
- package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +13 -0
- package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +29 -0
- package/dist/integrations/pi/components/upstream/components/daxnuts.js +146 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.d.ts +4 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +48 -0
- package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +20 -0
- package/dist/integrations/pi/components/upstream/components/extension-editor.js +84 -0
- package/dist/integrations/pi/components/upstream/components/mermaid.js +81 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +46 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +187 -0
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +59 -0
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +346 -0
- package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +11 -0
- package/dist/integrations/pi/components/upstream/components/session-footer.js +123 -0
- package/dist/integrations/pi/components/upstream/components/session-selector-search.js +161 -0
- package/dist/integrations/pi/components/upstream/components/session-selector.d.ts +95 -0
- package/dist/integrations/pi/components/upstream/components/session-selector.js +893 -0
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +21 -0
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +46 -0
- package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +35 -0
- package/dist/integrations/pi/components/upstream/components/status-indicator.js +69 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +67 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +365 -0
- package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +101 -0
- package/dist/integrations/pi/components/upstream/components/tree-selector.js +1275 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +33 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.js +81 -0
- package/dist/integrations/pi/components/upstream/external-editor.js +43 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +289 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.js +2144 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +35 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +51 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.js +43 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +31 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +25 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +39 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +103 -0
- package/dist/integrations/pi/components/upstream/model-search.d.ts +18 -0
- package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +33 -0
- package/dist/integrations/pi/components/upstream/theme/theme-controller.js +114 -0
- package/dist/integrations/pi/components/upstream/theme/theme.d.ts +61 -0
- package/dist/integrations/pi/components/upstream/theme/theme.js +337 -0
- package/dist/integrations/pi/engine/adapter.d.ts +135 -0
- package/dist/integrations/pi/engine/adapter.js +648 -0
- package/dist/integrations/pi/engine/changelog.d.ts +2 -0
- package/dist/integrations/pi/engine/changelog.js +63 -0
- package/dist/integrations/pi/engine/command-dispatch.d.ts +41 -0
- package/dist/integrations/pi/engine/command-dispatch.js +125 -0
- package/dist/integrations/pi/engine/compaction-progress.d.ts +28 -0
- package/dist/integrations/pi/engine/compaction-progress.js +96 -0
- package/dist/integrations/pi/engine/conformance.d.ts +39 -0
- package/dist/integrations/pi/engine/conformance.js +140 -0
- package/dist/integrations/pi/engine/event-delivery.d.ts +100 -0
- package/dist/integrations/pi/engine/event-delivery.js +184 -0
- package/dist/integrations/pi/engine/extension-ui-binding.d.ts +35 -0
- package/dist/integrations/pi/engine/extension-ui-binding.js +81 -0
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/integrations/pi/engine/index.d.ts +18 -0
- package/dist/integrations/pi/engine/index.js +10 -0
- package/dist/integrations/pi/engine/message-values.d.ts +29 -0
- package/dist/integrations/pi/engine/message-values.js +168 -0
- package/dist/integrations/pi/engine/package-integration.d.ts +13 -0
- package/dist/integrations/pi/engine/package-integration.js +118 -0
- package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
- package/dist/integrations/pi/engine/pending-delivery.js +156 -0
- package/dist/integrations/pi/engine/pi-settings-metadata.json +385 -0
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
- package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
- package/dist/integrations/pi/engine/prompt-suggestions.d.ts +30 -0
- package/dist/integrations/pi/engine/prompt-suggestions.js +102 -0
- package/dist/integrations/pi/engine/provider-authentication.d.ts +34 -0
- package/dist/integrations/pi/engine/provider-authentication.js +209 -0
- package/dist/integrations/pi/engine/resource-catalog.d.ts +49 -0
- package/dist/integrations/pi/engine/resource-catalog.js +289 -0
- package/dist/integrations/pi/engine/resources/changelog.json +12 -0
- package/dist/integrations/pi/engine/runtime-integration.d.ts +53 -0
- package/dist/integrations/pi/engine/runtime-integration.js +118 -0
- package/dist/integrations/pi/engine/session-events.d.ts +48 -0
- package/dist/integrations/pi/engine/session-events.js +223 -0
- package/dist/integrations/pi/engine/session-integration.d.ts +67 -0
- package/dist/integrations/pi/engine/session-integration.js +195 -0
- package/dist/integrations/pi/engine/session-runtime.d.ts +84 -0
- package/dist/integrations/pi/engine/session-runtime.js +249 -0
- package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
- package/dist/integrations/pi/engine/session-selection.js +90 -0
- package/dist/integrations/pi/engine/settings-bridge.d.ts +121 -0
- package/dist/integrations/pi/engine/settings-bridge.js +514 -0
- package/dist/integrations/pi/engine/settings-metadata.d.ts +31 -0
- package/dist/integrations/pi/engine/settings-metadata.js +67 -0
- package/dist/integrations/pi/engine/settings-port.d.ts +42 -0
- package/dist/integrations/pi/engine/settings-port.js +353 -0
- package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
- package/dist/integrations/pi/engine/tool-rendering.js +145 -0
- package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
- package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
- package/dist/integrations/pi/engine/transcript-projection.d.ts +39 -0
- package/dist/integrations/pi/engine/transcript-projection.js +405 -0
- package/dist/integrations/pi/engine/usage-view.d.ts +4 -0
- package/dist/integrations/pi/engine/usage-view.js +56 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
- package/dist/integrations/pi/engine/workflow-contexts.d.ts +59 -0
- package/dist/integrations/pi/engine/workflow-contexts.js +316 -0
- package/dist/integrations/pi/engine/workflow-runner.d.ts +60 -0
- package/dist/integrations/pi/engine/workflow-runner.js +509 -0
- package/dist/integrations/pi/engine/workflow-support.d.ts +33 -0
- package/dist/integrations/pi/engine/workflow-support.js +352 -0
- package/dist/integrations/pi/engine/workflows.d.ts +251 -0
- package/dist/integrations/pi/engine/workflows.js +63 -0
- package/dist/integrations/pi/startup-public.d.ts +2 -0
- package/dist/integrations/pi/startup-public.js +2223 -0
- package/dist/integrations/pi/startup-public.manifest.json +12502 -0
- package/dist/integrations/pi/tui-runtime/adapter.d.ts +56 -0
- package/dist/integrations/pi/tui-runtime/adapter.js +783 -0
- package/dist/integrations/pi/tui-runtime/contracts.d.ts +156 -0
- package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +88 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +433 -0
- package/dist/integrations/pi/tui-runtime/index.d.ts +9 -0
- package/dist/integrations/pi/tui-runtime/index.js +5 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
- package/dist/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
- package/dist/integrations/pi/tui-runtime/mouse-report-input.js +57 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.js +158 -0
- package/dist/integrations/pi/tui-runtime/presentation-adapter.d.ts +4 -0
- package/dist/integrations/pi/tui-runtime/presentation-adapter.js +48 -0
- package/dist/native/darwin-arm64/manifest.json +4 -4
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +3 -3
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/product-identity.d.ts +37 -0
- package/dist/product-identity.js +119 -0
- package/dist/product-identity.json +85 -0
- package/dist/runtime-payload-inventory.json +127147 -0
- package/dist/ui/apps/contracts.d.ts +64 -0
- package/dist/ui/apps/host.d.ts +42 -0
- package/dist/ui/apps/host.js +156 -0
- package/dist/ui/apps/index.d.ts +5 -0
- package/dist/ui/apps/index.js +3 -0
- package/dist/ui/apps/registry.d.ts +12 -0
- package/dist/ui/apps/registry.js +33 -0
- package/dist/ui/components/dialog-panel.js +49 -0
- package/dist/ui/components/frame.d.ts +22 -0
- package/dist/ui/components/frame.js +55 -0
- package/dist/ui/components/index.d.ts +47 -0
- package/dist/ui/components/index.js +25 -0
- package/dist/ui/components/line-input.d.ts +68 -0
- package/dist/ui/components/line-input.js +224 -0
- package/dist/ui/components/list-view.d.ts +60 -0
- package/dist/ui/components/list-view.js +82 -0
- package/dist/ui/components/mouse.d.ts +25 -0
- package/dist/ui/components/mouse.js +70 -0
- package/dist/ui/components/progress-status.d.ts +2 -0
- package/dist/ui/components/progress-status.js +4 -0
- package/dist/ui/components/prompt-input.d.ts +32 -0
- package/dist/ui/components/prompt-input.js +51 -0
- package/dist/ui/components/scrollbar.d.ts +88 -0
- package/dist/ui/components/scrollbar.js +137 -0
- package/dist/ui/components/selection-copy.d.ts +24 -0
- package/dist/ui/components/selection-copy.js +39 -0
- package/dist/ui/components/shortcuts.d.ts +58 -0
- package/dist/ui/components/shortcuts.js +82 -0
- package/dist/ui/components/spans.d.ts +28 -0
- package/dist/ui/components/spans.js +266 -0
- package/dist/ui/components/submitted-prompt.d.ts +23 -0
- package/dist/ui/components/submitted-prompt.js +50 -0
- package/dist/ui/components/surface.d.ts +20 -0
- package/dist/ui/components/surface.js +44 -0
- package/dist/ui/components/text-selection.d.ts +62 -0
- package/dist/ui/components/text-selection.js +210 -0
- package/dist/ui/components/text.d.ts +38 -0
- package/dist/ui/components/text.js +185 -0
- package/dist/ui/components/transcript-viewport.d.ts +173 -0
- package/dist/ui/components/transcript-viewport.js +753 -0
- package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
- package/dist/ui/components/visible-hyperlinks.js +97 -0
- package/dist/ui/settings/declarations.d.ts +141 -0
- package/dist/ui/settings/declarations.js +135 -0
- package/dist/ui/settings/index.d.ts +10 -0
- package/dist/ui/settings/index.js +5 -0
- package/dist/ui/settings/manager.d.ts +54 -0
- package/dist/ui/settings/manager.js +256 -0
- package/dist/ui/settings/migrations.d.ts +13 -0
- package/dist/ui/settings/migrations.js +74 -0
- package/dist/ui/settings/sections.d.ts +52 -0
- package/dist/ui/settings/sections.js +112 -0
- package/docs/architecture/boundaries.md +17 -13
- package/docs/architecture/code-documentation.md +77 -0
- package/docs/architecture/history-editor-provenance.md +100 -0
- package/docs/architecture/internal-naming.md +91 -0
- package/docs/architecture/process-guardian-provenance.md +3 -1
- package/docs/architecture/project-structure.md +69 -30
- package/docs/architecture/prompt-suggestions.md +68 -0
- package/docs/architecture/resource-and-data-policy.md +28 -2
- package/docs/architecture/response-copy-delivery.md +85 -0
- package/docs/architecture/terminal-host-proof-gate.md +1 -1
- package/docs/architecture/terminal-host-spike-evidence.md +1 -1
- package/docs/architecture/tool-image-presentation.md +62 -0
- package/docs/architecture/toolchain.md +32 -10
- package/docs/architecture/ui-reference-provenance.md +60 -6
- package/docs/ci-release-runbook.md +256 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/features/modal-content-interaction.md +37 -0
- package/docs/features/prompt-history.md +149 -0
- package/docs/local-worktree-cleanup.md +212 -0
- package/docs/manual-code-streaming-cleanup.md +88 -0
- package/docs/manual-ghost-link-baseline.md +89 -0
- package/docs/manual-launch-instance-acceptance.md +12 -35
- package/docs/manual-owned-ui-checkpoint.md +79 -0
- package/docs/manual-pi-boundary-candidate.md +4 -5
- package/docs/manual-terminal-colour-check.md +4 -3
- package/docs/openspec-archive-automation.md +259 -0
- package/docs/repository-governance-live-acceptance.md +77 -0
- package/docs/validation.md +100 -0
- package/package.json +49 -34
- package/dist/src/cli/capabilities.d.ts +0 -15
- package/dist/src/cli/capabilities.js +0 -7
- package/dist/src/cli/dispatch.d.ts +0 -32
- package/dist/src/cli/dispatch.js +0 -142
- package/dist/src/cli/index.d.ts +0 -5
- package/dist/src/cli/index.js +0 -5
- package/dist/src/cli/packages.d.ts +0 -23
- package/dist/src/cli/packages.js +0 -84
- package/dist/src/cli/version-stats.d.ts +0 -16
- package/dist/src/cli/version-stats.js +0 -72
- package/dist/src/cli/version.d.ts +0 -2
- package/dist/src/cli/version.js +0 -23
- package/dist/src/composition/index.d.ts +0 -48
- package/dist/src/composition/index.js +0 -258
- package/dist/src/features/launch/development-launch.js +0 -28
- package/dist/src/features/launch/index.d.ts +0 -7
- package/dist/src/features/launch/index.js +0 -7
- package/dist/src/features/launch/intent.d.ts +0 -7
- package/dist/src/features/launch/intent.js +0 -4
- package/dist/src/features/launch/prepare-launch.d.ts +0 -13
- package/dist/src/features/launch/prepare-launch.js +0 -21
- package/dist/src/features/launch/profile-paths.d.ts +0 -15
- package/dist/src/features/launch/profile-paths.js +0 -31
- package/dist/src/features/launch/profiles.d.ts +0 -12
- package/dist/src/features/launch/profiles.js +0 -26
- package/dist/src/features/launch/runtime-selection.d.ts +0 -19
- package/dist/src/features/launch/runtime-selection.js +0 -13
- package/dist/src/features/owned-ui/customization.d.ts +0 -38
- package/dist/src/features/owned-ui/customization.js +0 -108
- package/dist/src/features/owned-ui/diagnostics.d.ts +0 -33
- package/dist/src/features/owned-ui/diagnostics.js +0 -94
- package/dist/src/features/owned-ui/index.d.ts +0 -4
- package/dist/src/features/owned-ui/index.js +0 -4
- package/dist/src/features/owned-ui/run.d.ts +0 -11
- package/dist/src/features/owned-ui/run.js +0 -15
- package/dist/src/features/owned-ui/settings-app.d.ts +0 -22
- package/dist/src/features/owned-ui/settings-app.js +0 -633
- package/dist/src/features/workspace/capabilities.d.ts +0 -31
- package/dist/src/features/workspace/capabilities.js +0 -75
- package/dist/src/features/workspace/index.d.ts +0 -6
- package/dist/src/features/workspace/index.js +0 -6
- package/dist/src/features/workspace/presentation.d.ts +0 -30
- package/dist/src/features/workspace/presentation.js +0 -70
- package/dist/src/features/workspace/reconciliation.d.ts +0 -15
- package/dist/src/features/workspace/reconciliation.js +0 -82
- package/dist/src/features/workspace/reducer.d.ts +0 -42
- package/dist/src/features/workspace/reducer.js +0 -213
- package/dist/src/features/workspace/router.d.ts +0 -31
- package/dist/src/features/workspace/router.js +0 -124
- package/dist/src/features/workspace/store.d.ts +0 -17
- package/dist/src/features/workspace/store.js +0 -54
- package/dist/src/foundation/agent-engine-contracts/capability-ports.d.ts +0 -95
- package/dist/src/foundation/agent-engine-contracts/domain-validation.js +0 -89
- package/dist/src/foundation/agent-engine-contracts/domain.d.ts +0 -116
- package/dist/src/foundation/agent-engine-contracts/index.d.ts +0 -8
- package/dist/src/foundation/agent-engine-contracts/index.js +0 -8
- package/dist/src/foundation/agent-engine-contracts/package-ports.d.ts +0 -54
- package/dist/src/foundation/launch-guardian/index.d.ts +0 -1
- package/dist/src/foundation/launch-guardian/index.js +0 -1
- package/dist/src/foundation/launch-guardian/main.d.ts +0 -31
- package/dist/src/foundation/launch-guardian/main.js +0 -165
- package/dist/src/foundation/lifecycle/index.d.ts +0 -4
- package/dist/src/foundation/lifecycle/index.js +0 -4
- package/dist/src/foundation/lifecycle/model.d.ts +0 -64
- package/dist/src/foundation/lifecycle/model.js +0 -40
- package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
- package/dist/src/foundation/lifecycle/paths.js +0 -42
- package/dist/src/foundation/native-host-protocol/codec.d.ts +0 -11
- package/dist/src/foundation/native-host-protocol/codec.js +0 -56
- package/dist/src/foundation/native-host-protocol/evidence.d.ts +0 -67
- package/dist/src/foundation/native-host-protocol/evidence.js +0 -141
- package/dist/src/foundation/native-host-protocol/index.d.ts +0 -4
- package/dist/src/foundation/native-host-protocol/index.js +0 -4
- package/dist/src/foundation/native-host-protocol/messages.d.ts +0 -56
- package/dist/src/foundation/native-host-protocol/messages.js +0 -149
- package/dist/src/foundation/native-host-protocol/proof-gate.d.ts +0 -13
- package/dist/src/foundation/native-host-protocol/proof-gate.js +0 -33
- package/dist/src/foundation/owned-ui-contracts/extension-ui.d.ts +0 -302
- package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
- package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
- package/dist/src/foundation/owned-ui-contracts/model.d.ts +0 -241
- package/dist/src/foundation/owned-ui-contracts/validation.d.ts +0 -11
- package/dist/src/foundation/owned-ui-contracts/validation.js +0 -395
- package/dist/src/foundation/owned-ui-settings/declarations.d.ts +0 -13
- package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
- package/dist/src/foundation/owned-ui-settings/index.d.ts +0 -6
- package/dist/src/foundation/owned-ui-settings/index.js +0 -6
- package/dist/src/foundation/owned-ui-settings/migrations.d.ts +0 -13
- package/dist/src/foundation/owned-ui-settings/migrations.js +0 -28
- package/dist/src/foundation/owned-ui-settings/sections.d.ts +0 -70
- package/dist/src/foundation/owned-ui-settings/sections.js +0 -93
- package/dist/src/foundation/owned-ui-settings/session.d.ts +0 -44
- package/dist/src/foundation/owned-ui-settings/session.js +0 -145
- package/dist/src/foundation/owned-ui-settings/store.d.ts +0 -28
- package/dist/src/foundation/owned-ui-settings/store.js +0 -90
- package/dist/src/foundation/pi-component-adapter/components.d.ts +0 -4
- package/dist/src/foundation/pi-component-adapter/components.js +0 -64
- package/dist/src/foundation/pi-component-adapter/conformance.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/conformance.js +0 -69
- package/dist/src/foundation/pi-component-adapter/index.d.ts +0 -13
- package/dist/src/foundation/pi-component-adapter/index.js +0 -13
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.d.ts +0 -165
- package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.js +0 -166
- package/dist/src/foundation/pi-component-adapter/shell-components.d.ts +0 -6
- package/dist/src/foundation/pi-component-adapter/shell-components.js +0 -6
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.d.ts +0 -35
- package/dist/src/foundation/pi-component-adapter/shell-extension-ui.js +0 -279
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.d.ts +0 -7
- package/dist/src/foundation/pi-component-adapter/shell-footer-status.js +0 -189
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.js +0 -429
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.d.ts +0 -113
- package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.js +0 -235
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.js +0 -87
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.d.ts +0 -422
- package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.js +0 -296
- package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.js +0 -51
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.d.ts +0 -22
- package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.js +0 -142
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.d.ts +0 -4
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.d.ts +0 -17
- package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.js +0 -81
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.d.ts +0 -24
- package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.js +0 -105
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.d.ts +0 -2
- package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.js +0 -18
- package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.js +0 -77
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.d.ts +0 -55
- package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.js +0 -342
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.js +0 -120
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.js +0 -159
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.d.ts +0 -95
- package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.js +0 -889
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.d.ts +0 -19
- package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.js +0 -44
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.d.ts +0 -30
- package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.js +0 -59
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.d.ts +0 -98
- package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.js +0 -1272
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.d.ts +0 -33
- package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.js +0 -76
- package/dist/src/foundation/pi-component-adapter/upstream/external-editor.js +0 -39
- package/dist/src/foundation/pi-component-adapter/upstream/model-search.d.ts +0 -15
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.d.ts +0 -25
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.js +0 -117
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.d.ts +0 -61
- package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.js +0 -326
- package/dist/src/foundation/pi-engine-adapter/adapter.d.ts +0 -164
- package/dist/src/foundation/pi-engine-adapter/adapter.js +0 -2367
- package/dist/src/foundation/pi-engine-adapter/conformance.d.ts +0 -37
- package/dist/src/foundation/pi-engine-adapter/conformance.js +0 -130
- package/dist/src/foundation/pi-engine-adapter/index.d.ts +0 -10
- package/dist/src/foundation/pi-engine-adapter/index.js +0 -10
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.d.ts +0 -30
- package/dist/src/foundation/pi-engine-adapter/model-auth-integration.js +0 -61
- package/dist/src/foundation/pi-engine-adapter/package-integration.d.ts +0 -13
- package/dist/src/foundation/pi-engine-adapter/package-integration.js +0 -112
- package/dist/src/foundation/pi-engine-adapter/pi-settings-metadata.json +0 -374
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.d.ts +0 -31
- package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.js +0 -80
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.d.ts +0 -35
- package/dist/src/foundation/pi-engine-adapter/runtime-integration.js +0 -67
- package/dist/src/foundation/pi-engine-adapter/session-integration.d.ts +0 -43
- package/dist/src/foundation/pi-engine-adapter/session-integration.js +0 -97
- package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
- package/dist/src/foundation/pi-engine-adapter/settings-integration.js +0 -233
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.d.ts +0 -20
- package/dist/src/foundation/pi-engine-adapter/workflow-controllers.js +0 -48
- package/dist/src/foundation/pi-engine-adapter/workflows.d.ts +0 -173
- package/dist/src/foundation/pi-engine-adapter/workflows.js +0 -60
- package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
- package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
- package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.js +0 -1518
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.d.ts +0 -39
- package/dist/src/foundation/pi-tui-runtime-adapter/adapter.js +0 -493
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.d.ts +0 -18
- package/dist/src/foundation/pi-tui-runtime-adapter/conformance.js +0 -145
- package/dist/src/foundation/pi-tui-runtime-adapter/contracts.d.ts +0 -120
- package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.js +0 -48
- package/dist/src/foundation/presentation-contracts/index.d.ts +0 -96
- package/dist/src/foundation/process-containment/index.d.ts +0 -5
- package/dist/src/foundation/process-containment/index.js +0 -5
- package/dist/src/foundation/process-containment/linux-process-inspector.d.ts +0 -6
- package/dist/src/foundation/process-containment/linux-process-inspector.js +0 -26
- package/dist/src/foundation/process-containment/native-guardian-containment.d.ts +0 -16
- package/dist/src/foundation/process-containment/native-guardian-containment.js +0 -139
- package/dist/src/foundation/process-containment/windows-process-inspector.d.ts +0 -17
- package/dist/src/foundation/process-containment/windows-process-inspector.js +0 -53
- package/dist/src/foundation/protocol/client.d.ts +0 -17
- package/dist/src/foundation/protocol/client.js +0 -129
- package/dist/src/foundation/protocol/index.d.ts +0 -2
- package/dist/src/foundation/protocol/index.js +0 -2
- package/dist/src/foundation/protocol/messages.d.ts +0 -89
- package/dist/src/foundation/protocol/messages.js +0 -99
- package/dist/src/foundation/release/bootstrap.d.ts +0 -29
- package/dist/src/foundation/release/bootstrap.js +0 -335
- package/dist/src/foundation/release/cohort-state.d.ts +0 -70
- package/dist/src/foundation/release/cohort-state.js +0 -202
- package/dist/src/foundation/release/index.d.ts +0 -10
- package/dist/src/foundation/release/index.js +0 -10
- package/dist/src/foundation/release/release-gc.d.ts +0 -5
- package/dist/src/foundation/release/release-gc.js +0 -16
- package/dist/src/foundation/release/release-store.d.ts +0 -43
- package/dist/src/foundation/release/release-store.js +0 -175
- package/dist/src/foundation/release/release.d.ts +0 -38
- package/dist/src/foundation/release/release.js +0 -204
- package/dist/src/foundation/release/update-transaction.d.ts +0 -31
- package/dist/src/foundation/release/update-transaction.js +0 -89
- package/dist/src/foundation/release/update.d.ts +0 -82
- package/dist/src/foundation/release/update.js +0 -529
- package/dist/src/foundation/storage/control-store.d.ts +0 -61
- package/dist/src/foundation/storage/control-store.js +0 -530
- package/dist/src/foundation/storage/index.d.ts +0 -1
- package/dist/src/foundation/storage/index.js +0 -1
- package/dist/src/foundation/structured-agent-runtime/backpressure.d.ts +0 -46
- package/dist/src/foundation/structured-agent-runtime/backpressure.js +0 -118
- package/dist/src/foundation/structured-agent-runtime/commands.d.ts +0 -52
- package/dist/src/foundation/structured-agent-runtime/commands.js +0 -164
- package/dist/src/foundation/structured-agent-runtime/handshake.d.ts +0 -41
- package/dist/src/foundation/structured-agent-runtime/handshake.js +0 -151
- package/dist/src/foundation/structured-agent-runtime/index.d.ts +0 -5
- package/dist/src/foundation/structured-agent-runtime/index.js +0 -5
- package/dist/src/foundation/structured-agent-runtime/reconnection.d.ts +0 -37
- package/dist/src/foundation/structured-agent-runtime/reconnection.js +0 -129
- package/dist/src/foundation/structured-agent-runtime/state.d.ts +0 -56
- package/dist/src/foundation/structured-agent-runtime/state.js +0 -118
- package/dist/src/foundation/supervision/index.d.ts +0 -3
- package/dist/src/foundation/supervision/index.js +0 -3
- package/dist/src/foundation/supervision/main.d.ts +0 -1
- package/dist/src/foundation/supervision/main.js +0 -41
- package/dist/src/foundation/supervision/paths.d.ts +0 -1
- package/dist/src/foundation/supervision/paths.js +0 -1
- package/dist/src/foundation/supervision/server.d.ts +0 -22
- package/dist/src/foundation/supervision/server.js +0 -451
- package/dist/src/foundation/ui-apps/contracts.d.ts +0 -42
- package/dist/src/foundation/ui-apps/host.d.ts +0 -42
- package/dist/src/foundation/ui-apps/host.js +0 -152
- package/dist/src/foundation/ui-apps/index.d.ts +0 -3
- package/dist/src/foundation/ui-apps/index.js +0 -3
- package/dist/src/foundation/ui-apps/registry.d.ts +0 -11
- package/dist/src/foundation/ui-apps/registry.js +0 -32
- package/dist/src/foundation/ui-components/dialog-panel.js +0 -47
- package/dist/src/foundation/ui-components/frame.d.ts +0 -21
- package/dist/src/foundation/ui-components/frame.js +0 -54
- package/dist/src/foundation/ui-components/index.d.ts +0 -18
- package/dist/src/foundation/ui-components/index.js +0 -18
- package/dist/src/foundation/ui-components/line-input.d.ts +0 -74
- package/dist/src/foundation/ui-components/line-input.js +0 -245
- package/dist/src/foundation/ui-components/list-view.d.ts +0 -66
- package/dist/src/foundation/ui-components/list-view.js +0 -76
- package/dist/src/foundation/ui-components/mouse.d.ts +0 -15
- package/dist/src/foundation/ui-components/mouse.js +0 -46
- package/dist/src/foundation/ui-components/scrollbar.d.ts +0 -62
- package/dist/src/foundation/ui-components/scrollbar.js +0 -102
- package/dist/src/foundation/ui-components/shortcuts.d.ts +0 -57
- package/dist/src/foundation/ui-components/shortcuts.js +0 -81
- package/dist/src/foundation/ui-components/spans.d.ts +0 -7
- package/dist/src/foundation/ui-components/spans.js +0 -59
- package/dist/src/foundation/ui-components/surface.d.ts +0 -20
- package/dist/src/foundation/ui-components/surface.js +0 -38
- package/dist/src/foundation/ui-components/text.d.ts +0 -24
- package/dist/src/foundation/ui-components/text.js +0 -123
- package/dist/src/foundation/workspace-contracts/index.d.ts +0 -2
- package/dist/src/foundation/workspace-contracts/index.js +0 -2
- package/dist/src/foundation/workspace-contracts/model.d.ts +0 -248
- package/dist/src/foundation/workspace-contracts/model.js +0 -2
- package/dist/src/foundation/workspace-contracts/validation.d.ts +0 -13
- package/dist/src/foundation/workspace-contracts/validation.js +0 -335
- package/dist/src/product-identity.d.ts +0 -37
- package/dist/src/product-identity.js +0 -150
- package/dist/src/product-identity.json +0 -99
- package/docs/manual-transparent-checkpoint.md +0 -53
- /package/dist/{src/foundation/agent-engine-contracts/domain.js → app/session-shell/paste-helper.d.ts} +0 -0
- /package/dist/{src/foundation/agent-engine-contracts/ports.js → app/session-shell/paste-text-worker.d.ts} +0 -0
- /package/dist/{src/foundation/lifecycle/commands.js → app/session-shell/paste-types.js} +0 -0
- /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → app/session-shell/response-copy-helper.d.ts} +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → contracts/agent-engine/domain.js} +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
- /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, lstat, mkdir, readFile, realpath, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, posix, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { mapWithConcurrency } from "./concurrency.js";
|
|
5
|
+
import { assertImmutableFileMode } from "./immutable-platform.js";
|
|
6
|
+
import { readDependencyCertification, writeDependencyCertification as writeLayerCertification } from "./dependency-certification.js";
|
|
7
|
+
export { dependencyLayerCertificationPath, legacyDependencyLayerCertificationPath } from "./dependency-certification.js";
|
|
8
|
+
import { digestManifestFiles, releaseFileIdentity, resolveWithin } from "./release.js";
|
|
9
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
10
|
+
const LAYER_IO_CONCURRENCY = 32;
|
|
11
|
+
export const DEPENDENCY_LAYER_SCHEMA = PRODUCT_IDENTITY.evidence.dependencyLayerSchema;
|
|
12
|
+
export const DEPENDENCY_LAYER_MANIFEST = "dependency-layer-manifest.json";
|
|
13
|
+
export const RUNTIME_PAYLOAD_INVENTORY = "dist/runtime-payload-inventory.json";
|
|
14
|
+
/** Consume topology-independent publication classifications, retaining unknown installed content. */
|
|
15
|
+
export async function selectPublishedDependencyRuntimePayload(packageRoot, paths) {
|
|
16
|
+
const inventoryPath = resolve(packageRoot, RUNTIME_PAYLOAD_INVENTORY);
|
|
17
|
+
const published = await readFile(inventoryPath, "utf8").then(source => JSON.parse(source)).catch(() => null);
|
|
18
|
+
if (published === null)
|
|
19
|
+
return await selectDependencyRuntimePayload(packageRoot, paths);
|
|
20
|
+
if (published.schema !== PRODUCT_IDENTITY.evidence.runtimePayloadSchema || !Array.isArray(published.paths)
|
|
21
|
+
|| !Array.isArray(published.entryPoints) || !Array.isArray(published.declaredAssets) || !Array.isArray(published.classifications)
|
|
22
|
+
|| !published.inventory || published.inventory.schema !== PRODUCT_IDENTITY.evidence.runtimePayloadSchema
|
|
23
|
+
|| published.classifications.some(classification => !validPublishedClassification(classification))) {
|
|
24
|
+
throw new Error("published runtime payload inventory is invalid");
|
|
25
|
+
}
|
|
26
|
+
const classificationByKey = new Map();
|
|
27
|
+
for (const classification of published.classifications) {
|
|
28
|
+
const key = classificationKey(classification.packageName, classification.packageVersion, classification.packagePath);
|
|
29
|
+
const existing = classificationByKey.get(key);
|
|
30
|
+
if (existing && (existing.disposition !== classification.disposition || existing.reason !== classification.reason)) {
|
|
31
|
+
throw new Error("published runtime payload inventory contains conflicting classifications");
|
|
32
|
+
}
|
|
33
|
+
classificationByKey.set(key, classification);
|
|
34
|
+
}
|
|
35
|
+
const descriptors = await dependencyPackageDescriptors(packageRoot, paths);
|
|
36
|
+
const selected = [];
|
|
37
|
+
const exclusions = [];
|
|
38
|
+
let includedBytes = 0;
|
|
39
|
+
let excludedBytes = 0;
|
|
40
|
+
let uncertaintyRetainedFiles = 0;
|
|
41
|
+
await mapWithConcurrency([...paths].sort(), LAYER_IO_CONCURRENCY, async (path) => {
|
|
42
|
+
const descriptor = descriptorForPath(path, descriptors);
|
|
43
|
+
const packagePath = descriptor === null ? null : path.slice(descriptor.root.length + 1);
|
|
44
|
+
const classification = descriptor === null || packagePath === null
|
|
45
|
+
? undefined
|
|
46
|
+
: classificationByKey.get(classificationKey(descriptor.name, descriptor.version, packagePath));
|
|
47
|
+
const bytes = (await lstat(resolveWithin(packageRoot, path))).size;
|
|
48
|
+
const intrinsicExclusion = /\.d\.(?:ts|mts|cts)$/.test(path) ? "type-declaration"
|
|
49
|
+
: /\.map$/.test(path) ? "source-map"
|
|
50
|
+
: null;
|
|
51
|
+
if (classification?.disposition === "exclude" || intrinsicExclusion !== null) {
|
|
52
|
+
exclusions.push({ path, reason: classification?.disposition === "exclude" ? classification.reason : intrinsicExclusion });
|
|
53
|
+
excludedBytes += bytes;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
selected.push(path);
|
|
57
|
+
includedBytes += bytes;
|
|
58
|
+
if (classification === undefined || !isKnownRuntimePath(path))
|
|
59
|
+
uncertaintyRetainedFiles += 1;
|
|
60
|
+
});
|
|
61
|
+
selected.sort();
|
|
62
|
+
exclusions.sort((left, right) => left.path.localeCompare(right.path));
|
|
63
|
+
return {
|
|
64
|
+
paths: selected,
|
|
65
|
+
inventory: {
|
|
66
|
+
schema: PRODUCT_IDENTITY.evidence.runtimePayloadSchema,
|
|
67
|
+
includedFiles: selected.length,
|
|
68
|
+
includedBytes,
|
|
69
|
+
excludedFiles: exclusions.length,
|
|
70
|
+
excludedBytes,
|
|
71
|
+
uncertaintyRetainedFiles,
|
|
72
|
+
exclusions,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Generate publication evidence from literal module reachability and declared runtime assets. */
|
|
77
|
+
export async function generateDependencyRuntimePayload(packageRoot, allPaths, productPaths) {
|
|
78
|
+
const available = new Set(allPaths);
|
|
79
|
+
const selected = new Set();
|
|
80
|
+
const queue = productPaths.filter(isJavaScriptModule);
|
|
81
|
+
for (const manifestPath of allPaths.filter(path => path.startsWith("node_modules/") && path.endsWith("/package.json"))) {
|
|
82
|
+
try {
|
|
83
|
+
const manifest = JSON.parse(await readFile(resolveWithin(packageRoot, manifestPath), "utf8"));
|
|
84
|
+
const packagePath = manifestPath.slice(0, -"/package.json".length);
|
|
85
|
+
const target = exportedTarget(manifest.exports, "")
|
|
86
|
+
?? (typeof manifest.module === "string" ? manifest.module : typeof manifest.main === "string" ? manifest.main : "index.js");
|
|
87
|
+
const entry = availableModule(relativePath(packagePath, target), available);
|
|
88
|
+
if (entry !== null && !selected.has(entry)) {
|
|
89
|
+
selected.add(entry);
|
|
90
|
+
if (isJavaScriptModule(entry))
|
|
91
|
+
queue.push(entry);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch { }
|
|
95
|
+
}
|
|
96
|
+
const visited = new Set();
|
|
97
|
+
while (queue.length > 0) {
|
|
98
|
+
const importer = queue.shift();
|
|
99
|
+
if (visited.has(importer))
|
|
100
|
+
continue;
|
|
101
|
+
visited.add(importer);
|
|
102
|
+
const source = await readFile(resolveWithin(packageRoot, importer), "utf8");
|
|
103
|
+
const specifiers = [...source.matchAll(/(?:\bimport\s*(?:[^"'`]*?\sfrom\s*)?|\bexport\s+[^"'`]*?\sfrom\s*|\bimport\s*\(|\brequire\s*\()\s*["'`]([^"'`]+)["'`]/g)]
|
|
104
|
+
.map(match => match[1])
|
|
105
|
+
.filter(specifier => !specifier.startsWith("node:"));
|
|
106
|
+
for (const specifier of specifiers) {
|
|
107
|
+
const resolved = await resolvePublishedSpecifier(packageRoot, importer, specifier, available);
|
|
108
|
+
if (resolved === null || !resolved.startsWith("node_modules/"))
|
|
109
|
+
continue;
|
|
110
|
+
if (!selected.has(resolved)) {
|
|
111
|
+
selected.add(resolved);
|
|
112
|
+
if (isJavaScriptModule(resolved))
|
|
113
|
+
queue.push(resolved);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (importer.startsWith("node_modules/") && /\b(?:import|require)\s*\(\s*(?!["'`])/.test(source)) {
|
|
117
|
+
const prefix = dependencyPackagePrefix(importer);
|
|
118
|
+
for (const path of allPaths)
|
|
119
|
+
if (path.startsWith(`${prefix}/`))
|
|
120
|
+
selected.add(path);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
for (const path of allPaths) {
|
|
124
|
+
if (!path.startsWith("node_modules/"))
|
|
125
|
+
continue;
|
|
126
|
+
if (path.endsWith("/package.json") || /(?:^|\/)LICENSE(?:\.|$)/i.test(path)
|
|
127
|
+
|| /\.(?:json|node|wasm|css|html|png|jpg|jpeg|gif|svg|md)$/.test(path))
|
|
128
|
+
selected.add(path);
|
|
129
|
+
}
|
|
130
|
+
const conservative = await selectDependencyRuntimePayload(packageRoot, allPaths.filter(path => path.startsWith("node_modules/")));
|
|
131
|
+
const paths = conservative.paths.filter(path => selected.has(path)).sort();
|
|
132
|
+
const exclusions = [];
|
|
133
|
+
let includedBytes = 0;
|
|
134
|
+
let excludedBytes = 0;
|
|
135
|
+
let uncertaintyRetainedFiles = 0;
|
|
136
|
+
const conservativeReasons = new Map(conservative.inventory.exclusions.map(item => [item.path, item.reason]));
|
|
137
|
+
for (const path of allPaths.filter(path => path.startsWith("node_modules/")).sort()) {
|
|
138
|
+
const bytes = (await lstat(resolveWithin(packageRoot, path))).size;
|
|
139
|
+
if (paths.includes(path)) {
|
|
140
|
+
includedBytes += bytes;
|
|
141
|
+
if (!isJavaScriptModule(path) && !/\.(?:json|node|wasm|css|html|png|jpg|jpeg|gif|svg)$/.test(path))
|
|
142
|
+
uncertaintyRetainedFiles += 1;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
excludedBytes += bytes;
|
|
146
|
+
exclusions.push({ path, reason: conservativeReasons.get(path) ?? "unreachable-development" });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const inventory = {
|
|
150
|
+
schema: PRODUCT_IDENTITY.evidence.runtimePayloadSchema,
|
|
151
|
+
includedFiles: paths.length,
|
|
152
|
+
includedBytes,
|
|
153
|
+
excludedFiles: exclusions.length,
|
|
154
|
+
excludedBytes,
|
|
155
|
+
uncertaintyRetainedFiles,
|
|
156
|
+
exclusions,
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
paths,
|
|
160
|
+
inventory,
|
|
161
|
+
classifications: await createPublishedClassifications(packageRoot, allPaths, new Set(paths), new Map(exclusions.map(item => [item.path, item.reason]))),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/** Conservatively omit only files Node never executes; uncertain assets remain selected. */
|
|
165
|
+
export async function selectDependencyRuntimePayload(packageRoot, paths) {
|
|
166
|
+
const included = [];
|
|
167
|
+
const exclusions = [];
|
|
168
|
+
let includedBytes = 0;
|
|
169
|
+
let excludedBytes = 0;
|
|
170
|
+
let uncertaintyRetainedFiles = 0;
|
|
171
|
+
await mapWithConcurrency([...paths].sort(), LAYER_IO_CONCURRENCY, async (path) => {
|
|
172
|
+
const metadata = await lstat(resolveWithin(packageRoot, path));
|
|
173
|
+
const reason = /\.d\.(?:ts|mts|cts)$/.test(path) ? "type-declaration"
|
|
174
|
+
: /\.map$/.test(path) ? "source-map"
|
|
175
|
+
: null;
|
|
176
|
+
if (reason !== null) {
|
|
177
|
+
exclusions.push({ path, reason });
|
|
178
|
+
excludedBytes += metadata.size;
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
included.push(path);
|
|
182
|
+
includedBytes += metadata.size;
|
|
183
|
+
if (!/\.(?:js|mjs|cjs|json|node|wasm|css|html|png|jpg|jpeg|gif|svg)$/.test(path) && !/(?:^|\/)LICENSE(?:\.|$)/i.test(path)) {
|
|
184
|
+
uncertaintyRetainedFiles += 1;
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
exclusions.sort((left, right) => left.path.localeCompare(right.path));
|
|
188
|
+
included.sort();
|
|
189
|
+
return {
|
|
190
|
+
paths: included,
|
|
191
|
+
inventory: {
|
|
192
|
+
schema: PRODUCT_IDENTITY.evidence.runtimePayloadSchema,
|
|
193
|
+
includedFiles: included.length,
|
|
194
|
+
includedBytes,
|
|
195
|
+
excludedFiles: exclusions.length,
|
|
196
|
+
excludedBytes,
|
|
197
|
+
uncertaintyRetainedFiles,
|
|
198
|
+
exclusions,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/** Materialize or reuse an exact immutable dependency layer after one source-content pass. */
|
|
203
|
+
export async function materializeDependencyLayer(packageRoot, dataDir, paths, options) {
|
|
204
|
+
if (paths.length === 0)
|
|
205
|
+
return null;
|
|
206
|
+
const sourceRoot = await realpath(packageRoot);
|
|
207
|
+
const selected = [...paths].sort();
|
|
208
|
+
const content = await mapWithConcurrency(selected, LAYER_IO_CONCURRENCY, async (path) => {
|
|
209
|
+
const source = resolveWithin(sourceRoot, path);
|
|
210
|
+
const metadata = await lstat(source);
|
|
211
|
+
if (!metadata.isFile() || metadata.isSymbolicLink())
|
|
212
|
+
throw new Error(`dependency-layer input is not a regular file: ${path}`);
|
|
213
|
+
const cached = options.cachedFiles?.get(path);
|
|
214
|
+
const bytes = cached ?? await readFile(source);
|
|
215
|
+
if (!cached)
|
|
216
|
+
options.onOperation?.({ operation: "source-read", path, bytes: bytes.length });
|
|
217
|
+
return { path, bytes, mode: (metadata.mode & 0o111) !== 0 ? 0o500 : 0o400, identity: releaseFileIdentity(path, bytes, (metadata.mode & 0o111) !== 0) };
|
|
218
|
+
});
|
|
219
|
+
const files = content.map(item => item.identity);
|
|
220
|
+
const contentDigest = digestManifestFiles(files);
|
|
221
|
+
const identity = {
|
|
222
|
+
schema: DEPENDENCY_LAYER_SCHEMA,
|
|
223
|
+
layerId: `dependencies-${contentDigest.slice(0, 32)}`,
|
|
224
|
+
contentDigest,
|
|
225
|
+
files,
|
|
226
|
+
inventory: options.inventory,
|
|
227
|
+
};
|
|
228
|
+
const layersRoot = resolve(dataDir, "dependency-layers");
|
|
229
|
+
await mkdir(layersRoot, { recursive: true, mode: 0o700 });
|
|
230
|
+
const layerRoot = resolveWithin(layersRoot, identity.layerId);
|
|
231
|
+
if (await lstat(layerRoot).catch(() => null)) {
|
|
232
|
+
const reused = await reuseDependencyLayer(dataDir, identity);
|
|
233
|
+
for (const file of reused.files)
|
|
234
|
+
options.onOperation?.({ operation: "layer-reuse", path: file.path, bytes: file.bytes });
|
|
235
|
+
return { ...reused, reused: true };
|
|
236
|
+
}
|
|
237
|
+
const candidate = resolveWithin(layersRoot, `.candidate-${randomUUID()}`);
|
|
238
|
+
await mkdir(candidate, { mode: 0o700 });
|
|
239
|
+
try {
|
|
240
|
+
const directories = [...new Set(content.map(item => dirname(resolveWithin(candidate, item.path))))];
|
|
241
|
+
await mapWithConcurrency(directories, LAYER_IO_CONCURRENCY, async (directory) => await mkdir(directory, { recursive: true, mode: 0o700 }));
|
|
242
|
+
await mapWithConcurrency(content, LAYER_IO_CONCURRENCY, async (item) => {
|
|
243
|
+
const destination = resolveWithin(candidate, item.path);
|
|
244
|
+
if (options.writeCandidateFile)
|
|
245
|
+
await options.writeCandidateFile(destination, item.bytes, item.mode);
|
|
246
|
+
else {
|
|
247
|
+
await writeFile(destination, item.bytes, { flag: "wx", mode: item.mode });
|
|
248
|
+
await chmod(destination, item.mode);
|
|
249
|
+
}
|
|
250
|
+
options.onOperation?.({ operation: "layer-write", path: item.path, bytes: item.bytes.length });
|
|
251
|
+
});
|
|
252
|
+
await writeFile(resolve(candidate, DEPENDENCY_LAYER_MANIFEST), JSON.stringify(identity, null, 2), { flag: "wx", mode: 0o400 });
|
|
253
|
+
try {
|
|
254
|
+
await rename(candidate, layerRoot);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
if (!await lstat(layerRoot).catch(() => null))
|
|
258
|
+
throw error;
|
|
259
|
+
await rm(candidate, { recursive: true, force: true });
|
|
260
|
+
const winner = await reuseDependencyLayer(dataDir, identity);
|
|
261
|
+
for (const file of winner.files)
|
|
262
|
+
options.onOperation?.({ operation: "layer-reuse", path: file.path, bytes: file.bytes });
|
|
263
|
+
return { ...winner, reused: true };
|
|
264
|
+
}
|
|
265
|
+
await writeLayerCertification(dataDir, identity);
|
|
266
|
+
return { ...identity, layerRoot: await realpath(layerRoot), reused: false };
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
await rm(candidate, { recursive: true, force: true });
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/** Read trusted layer certification and canonical metadata without rereading every payload byte. */
|
|
274
|
+
export async function readCertifiedDependencyLayer(dataDir, layerId, expected, options = {}) {
|
|
275
|
+
const layersRoot = await realpath(resolve(dataDir, "dependency-layers"));
|
|
276
|
+
const layerRoot = await realpath(resolveWithin(layersRoot, layerId));
|
|
277
|
+
assertDirectChild(layersRoot, layerRoot);
|
|
278
|
+
const metadata = await lstat(resolve(layersRoot, layerId));
|
|
279
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink())
|
|
280
|
+
throw new Error(`dependency layer is not a managed non-link directory: ${layerId}`);
|
|
281
|
+
const manifest = JSON.parse(await readFile(resolve(layerRoot, DEPENDENCY_LAYER_MANIFEST), "utf8"));
|
|
282
|
+
validateLayerManifest(manifest);
|
|
283
|
+
if (expected && (expected.layerId !== manifest.layerId || expected.contentDigest !== manifest.contentDigest)) {
|
|
284
|
+
throw new Error(`dependency layer identity mismatch: ${layerId}`);
|
|
285
|
+
}
|
|
286
|
+
if (manifest.layerId !== layerId)
|
|
287
|
+
throw new Error(`dependency layer identity mismatch: ${layerId}`);
|
|
288
|
+
await readDependencyCertification(dataDir, manifest, options);
|
|
289
|
+
return { ...manifest, layerRoot };
|
|
290
|
+
}
|
|
291
|
+
/** Fully verify a layer when certification is absent or explicit tamper evidence is required. */
|
|
292
|
+
export async function verifyDependencyLayer(dataDir, reference, onOperation) {
|
|
293
|
+
const layersRoot = await realpath(resolve(dataDir, "dependency-layers"));
|
|
294
|
+
const layerRoot = await realpath(resolveWithin(layersRoot, reference.layerId));
|
|
295
|
+
assertDirectChild(layersRoot, layerRoot);
|
|
296
|
+
const manifest = JSON.parse(await readFile(resolve(layerRoot, DEPENDENCY_LAYER_MANIFEST), "utf8"));
|
|
297
|
+
validateLayerManifest(manifest);
|
|
298
|
+
if (manifest.layerId !== reference.layerId || manifest.contentDigest !== reference.contentDigest)
|
|
299
|
+
throw new Error(`dependency layer reference mismatch: ${reference.layerId}`);
|
|
300
|
+
await mapWithConcurrency(manifest.files, LAYER_IO_CONCURRENCY, async (file) => {
|
|
301
|
+
const path = resolveWithin(layerRoot, file.path);
|
|
302
|
+
const metadata = await lstat(path);
|
|
303
|
+
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size !== file.bytes)
|
|
304
|
+
throw new Error(`dependency layer file mismatch: ${file.path}`);
|
|
305
|
+
assertImmutableFileMode(metadata, path);
|
|
306
|
+
const bytes = await readFile(path);
|
|
307
|
+
onOperation?.({ operation: "verification-read", path: file.path, bytes: bytes.length });
|
|
308
|
+
const actual = releaseFileIdentity(file.path, bytes, file.executable);
|
|
309
|
+
if (actual.sha256 !== file.sha256)
|
|
310
|
+
throw new Error(`dependency layer file digest mismatch: ${file.path}`);
|
|
311
|
+
});
|
|
312
|
+
if (digestManifestFiles(manifest.files) !== manifest.contentDigest)
|
|
313
|
+
throw new Error(`dependency layer content digest mismatch: ${manifest.layerId}`);
|
|
314
|
+
await writeLayerCertification(dataDir, manifest);
|
|
315
|
+
return { ...manifest, layerRoot };
|
|
316
|
+
}
|
|
317
|
+
export function dependencyReference(layer) {
|
|
318
|
+
return { layerId: layer.layerId, contentDigest: layer.contentDigest, binding: "node_modules" };
|
|
319
|
+
}
|
|
320
|
+
async function reuseDependencyLayer(dataDir, identity) {
|
|
321
|
+
try {
|
|
322
|
+
return await readCertifiedDependencyLayer(dataDir, identity.layerId, identity);
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
const verified = await verifyDependencyLayer(dataDir, dependencyReference({ ...identity, layerRoot: resolve(dataDir, "dependency-layers", identity.layerId), reused: true }));
|
|
326
|
+
if (verified.layerId !== identity.layerId || verified.contentDigest !== identity.contentDigest)
|
|
327
|
+
throw error;
|
|
328
|
+
return verified;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
function validateLayerManifest(value) {
|
|
332
|
+
if (value.schema !== DEPENDENCY_LAYER_SCHEMA || !/^dependencies-[a-f0-9]{32}$/.test(value.layerId)
|
|
333
|
+
|| !/^[a-f0-9]{64}$/.test(value.contentDigest) || !Array.isArray(value.files) || value.files.length === 0
|
|
334
|
+
|| value.files.some(file => !file.path.startsWith("node_modules/") || file.path.includes("..") || !/^[a-f0-9]{64}$/.test(file.sha256))) {
|
|
335
|
+
throw new Error("dependency layer manifest is invalid");
|
|
336
|
+
}
|
|
337
|
+
if (digestManifestFiles(value.files) !== value.contentDigest || value.layerId !== `dependencies-${value.contentDigest.slice(0, 32)}`) {
|
|
338
|
+
throw new Error(`dependency layer manifest identity is invalid: ${value.layerId}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
async function resolvePublishedSpecifier(packageRoot, importer, specifier, available) {
|
|
342
|
+
if (specifier.startsWith("."))
|
|
343
|
+
return availableModule(relativePath(dirname(importer), specifier), available);
|
|
344
|
+
if (specifier.startsWith("/") || specifier.startsWith("#"))
|
|
345
|
+
return null;
|
|
346
|
+
const parts = specifier.split("/");
|
|
347
|
+
const packageName = parts[0].startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
|
|
348
|
+
const subpath = parts.slice(packageName.startsWith("@") ? 2 : 1).join("/");
|
|
349
|
+
const suffix = `node_modules/${packageName}/package.json`;
|
|
350
|
+
const manifests = [...available].filter(path => path.endsWith(suffix));
|
|
351
|
+
manifests.sort((left, right) => commonPrefixLength(importer, right) - commonPrefixLength(importer, left));
|
|
352
|
+
for (const manifestPath of manifests) {
|
|
353
|
+
try {
|
|
354
|
+
const manifest = JSON.parse(await readFile(resolveWithin(packageRoot, manifestPath), "utf8"));
|
|
355
|
+
const packagePath = manifestPath.slice(0, -"/package.json".length);
|
|
356
|
+
const target = exportedTarget(manifest.exports, subpath) ?? (subpath.length > 0 ? subpath
|
|
357
|
+
: typeof manifest.module === "string" ? manifest.module
|
|
358
|
+
: typeof manifest.main === "string" ? manifest.main
|
|
359
|
+
: "index.js");
|
|
360
|
+
const resolved = availableModule(relativePath(packagePath, target), available);
|
|
361
|
+
if (resolved !== null)
|
|
362
|
+
return resolved;
|
|
363
|
+
}
|
|
364
|
+
catch { }
|
|
365
|
+
}
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
function exportedTarget(exportsValue, subpath) {
|
|
369
|
+
const select = (value) => {
|
|
370
|
+
if (typeof value === "string")
|
|
371
|
+
return value;
|
|
372
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
373
|
+
return null;
|
|
374
|
+
const record = value;
|
|
375
|
+
return select(record.import) ?? select(record.node) ?? select(record.default);
|
|
376
|
+
};
|
|
377
|
+
if (typeof exportsValue === "string")
|
|
378
|
+
return subpath.length === 0 ? exportsValue : null;
|
|
379
|
+
if (!exportsValue || typeof exportsValue !== "object" || Array.isArray(exportsValue))
|
|
380
|
+
return null;
|
|
381
|
+
const record = exportsValue;
|
|
382
|
+
return select(record[subpath.length === 0 ? "." : `./${subpath}`]) ?? (subpath.length === 0 ? select(exportsValue) : null);
|
|
383
|
+
}
|
|
384
|
+
function relativePath(root, target) {
|
|
385
|
+
return posix.normalize(posix.join(root.split(sep).join("/"), target));
|
|
386
|
+
}
|
|
387
|
+
function availableModule(path, available) {
|
|
388
|
+
const normalized = path.replace(/^\.\//, "");
|
|
389
|
+
for (const candidate of [normalized, `${normalized}.js`, `${normalized}.mjs`, `${normalized}.cjs`, `${normalized}.json`, `${normalized}/index.js`]) {
|
|
390
|
+
if (available.has(candidate))
|
|
391
|
+
return candidate;
|
|
392
|
+
}
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
function commonPrefixLength(left, right) {
|
|
396
|
+
const leftParts = left.split("/");
|
|
397
|
+
const rightParts = right.split("/");
|
|
398
|
+
let index = 0;
|
|
399
|
+
while (leftParts[index] === rightParts[index])
|
|
400
|
+
index += 1;
|
|
401
|
+
return index;
|
|
402
|
+
}
|
|
403
|
+
function dependencyPackagePrefix(path) {
|
|
404
|
+
const parts = path.split("/");
|
|
405
|
+
const nodeModules = parts.lastIndexOf("node_modules");
|
|
406
|
+
const packageParts = parts[nodeModules + 1]?.startsWith("@") ? 2 : 1;
|
|
407
|
+
return parts.slice(0, nodeModules + 1 + packageParts).join("/");
|
|
408
|
+
}
|
|
409
|
+
async function dependencyPackageDescriptors(packageRoot, paths) {
|
|
410
|
+
const descriptors = [];
|
|
411
|
+
for (const path of paths.filter(path => path.endsWith("/package.json")).sort()) {
|
|
412
|
+
try {
|
|
413
|
+
const manifest = JSON.parse(await readFile(resolveWithin(packageRoot, path), "utf8"));
|
|
414
|
+
if (typeof manifest.name !== "string" || manifest.name.length === 0 || typeof manifest.version !== "string" || manifest.version.length === 0)
|
|
415
|
+
continue;
|
|
416
|
+
descriptors.push({ root: path.slice(0, -"/package.json".length), name: manifest.name, version: manifest.version });
|
|
417
|
+
}
|
|
418
|
+
catch { }
|
|
419
|
+
}
|
|
420
|
+
return descriptors.sort((left, right) => right.root.length - left.root.length || left.root.localeCompare(right.root));
|
|
421
|
+
}
|
|
422
|
+
function descriptorForPath(path, descriptors) {
|
|
423
|
+
return descriptors.find(descriptor => path.startsWith(`${descriptor.root}/`)) ?? null;
|
|
424
|
+
}
|
|
425
|
+
async function createPublishedClassifications(packageRoot, paths, included, exclusionReasons) {
|
|
426
|
+
const descriptors = await dependencyPackageDescriptors(packageRoot, paths);
|
|
427
|
+
const classifications = new Map();
|
|
428
|
+
for (const path of paths.filter(path => path.startsWith("node_modules/")).sort()) {
|
|
429
|
+
const descriptor = descriptorForPath(path, descriptors);
|
|
430
|
+
if (descriptor === null)
|
|
431
|
+
continue;
|
|
432
|
+
const packagePath = path.slice(descriptor.root.length + 1);
|
|
433
|
+
const classification = included.has(path)
|
|
434
|
+
? { packageName: descriptor.name, packageVersion: descriptor.version, packagePath, disposition: "include" }
|
|
435
|
+
: { packageName: descriptor.name, packageVersion: descriptor.version, packagePath, disposition: "exclude", reason: exclusionReasons.get(path) ?? "unreachable-development" };
|
|
436
|
+
const key = classificationKey(classification.packageName, classification.packageVersion, classification.packagePath);
|
|
437
|
+
const existing = classifications.get(key);
|
|
438
|
+
if (existing?.disposition === "include")
|
|
439
|
+
continue;
|
|
440
|
+
if (classification.disposition === "include" || existing === undefined)
|
|
441
|
+
classifications.set(key, classification);
|
|
442
|
+
}
|
|
443
|
+
return [...classifications.values()].sort((left, right) => classificationKey(left.packageName, left.packageVersion, left.packagePath)
|
|
444
|
+
.localeCompare(classificationKey(right.packageName, right.packageVersion, right.packagePath)));
|
|
445
|
+
}
|
|
446
|
+
function validPublishedClassification(value) {
|
|
447
|
+
const validReason = value.reason === "type-declaration" || value.reason === "source-map" || value.reason === "unreachable-development";
|
|
448
|
+
return typeof value.packageName === "string" && value.packageName.length > 0
|
|
449
|
+
&& typeof value.packageVersion === "string" && value.packageVersion.length > 0
|
|
450
|
+
&& typeof value.packagePath === "string" && value.packagePath.length > 0
|
|
451
|
+
&& !value.packagePath.startsWith("/") && !value.packagePath.includes("\\")
|
|
452
|
+
&& !value.packagePath.split("/").includes("..")
|
|
453
|
+
&& (value.disposition === "include" ? value.reason === undefined : value.disposition === "exclude" && validReason);
|
|
454
|
+
}
|
|
455
|
+
function classificationKey(packageName, packageVersion, packagePath) {
|
|
456
|
+
return `${packageName}\0${packageVersion}\0${packagePath}`;
|
|
457
|
+
}
|
|
458
|
+
function isKnownRuntimePath(path) {
|
|
459
|
+
return /\.(?:js|mjs|cjs|json|node|wasm|css|html|png|jpg|jpeg|gif|svg)$/.test(path) || /(?:^|\/)LICENSE(?:\.|$)/i.test(path);
|
|
460
|
+
}
|
|
461
|
+
function isJavaScriptModule(path) { return /\.(?:js|mjs|cjs)$/.test(path); }
|
|
462
|
+
function assertDirectChild(parent, child) {
|
|
463
|
+
const path = relative(parent, child);
|
|
464
|
+
if (path.length === 0 || path === ".." || path.startsWith(`..${sep}`) || path.includes(sep))
|
|
465
|
+
throw new Error(`dependency layer escapes managed storage: ${child}`);
|
|
466
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { OwnershipProbe } from "./cohort-selection.js";
|
|
2
|
+
import type { SupervisorEndpointMetadata } from "./cohort-state.js";
|
|
3
|
+
import type { CohortEndpointPaths, ProductPaths } from "../lifecycle/index.js";
|
|
4
|
+
export interface RecordedEndpoint {
|
|
5
|
+
readonly metadata: SupervisorEndpointMetadata;
|
|
6
|
+
readonly paths: CohortEndpointPaths;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Every endpoint recorded under this runtime directory: one per cohort, plus the single
|
|
10
|
+
* endpoint published by releases that predate cohort-scoped identity. More than one can be
|
|
11
|
+
* live at a time, and each is validated on its own identity rather than by being the only one.
|
|
12
|
+
*/
|
|
13
|
+
export declare function listRecordedEndpoints(paths: ProductPaths): Promise<readonly RecordedEndpoint[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Removes the records of cohorts whose processes are gone. A record left by a cohort that
|
|
16
|
+
* exited without cleaning up is not evidence of ownership, and a later launch should not have
|
|
17
|
+
* to reason about it. Returns the release ids whose records were removed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function sweepDeadEndpoints(paths: ProductPaths): Promise<readonly string[]>;
|
|
20
|
+
/** The releases that an identity-verified live cohort runs from and that must be retained. */
|
|
21
|
+
export declare function liveReleaseIds(paths: ProductPaths): Promise<readonly string[]>;
|
|
22
|
+
export declare function readEndpointMetadata(path: string): Promise<SupervisorEndpointMetadata | null>;
|
|
23
|
+
export declare function probeOwnership(metadata: SupervisorEndpointMetadata): Promise<OwnershipProbe>;
|
|
24
|
+
export declare function removeEndpointArtifacts(metadataPath: string, endpoint: string): Promise<void>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
2
|
+
import { connect } from "node:net";
|
|
3
|
+
import { platform } from "node:os";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
6
|
+
import { encodeFrame, LineFrameDecoder } from "../protocol/index.js";
|
|
7
|
+
import { processIsAlive } from "./process-cleanup.js";
|
|
8
|
+
/**
|
|
9
|
+
* Every endpoint recorded under this runtime directory: one per cohort, plus the single
|
|
10
|
+
* endpoint published by releases that predate cohort-scoped identity. More than one can be
|
|
11
|
+
* live at a time, and each is validated on its own identity rather than by being the only one.
|
|
12
|
+
*/
|
|
13
|
+
export async function listRecordedEndpoints(paths) {
|
|
14
|
+
const recorded = [];
|
|
15
|
+
const legacy = await readEndpointMetadata(paths.endpointMetadataPath);
|
|
16
|
+
if (legacy) {
|
|
17
|
+
recorded.push({ metadata: legacy, paths: { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath } });
|
|
18
|
+
}
|
|
19
|
+
const names = await readdir(paths.endpointsDir).catch(() => []);
|
|
20
|
+
for (const name of names) {
|
|
21
|
+
if (!name.endsWith(".json"))
|
|
22
|
+
continue;
|
|
23
|
+
const endpointMetadataPath = resolve(paths.endpointsDir, name);
|
|
24
|
+
const metadata = await readEndpointMetadata(endpointMetadataPath);
|
|
25
|
+
if (metadata)
|
|
26
|
+
recorded.push({ metadata, paths: { endpoint: metadata.endpoint, endpointMetadataPath } });
|
|
27
|
+
}
|
|
28
|
+
return recorded;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Removes the records of cohorts whose processes are gone. A record left by a cohort that
|
|
32
|
+
* exited without cleaning up is not evidence of ownership, and a later launch should not have
|
|
33
|
+
* to reason about it. Returns the release ids whose records were removed.
|
|
34
|
+
*/
|
|
35
|
+
export async function sweepDeadEndpoints(paths) {
|
|
36
|
+
const swept = [];
|
|
37
|
+
for (const recorded of await listRecordedEndpoints(paths)) {
|
|
38
|
+
if (processIsAlive(recorded.metadata.pid))
|
|
39
|
+
continue;
|
|
40
|
+
await removeEndpointArtifacts(recorded.paths.endpointMetadataPath, recorded.paths.endpoint);
|
|
41
|
+
swept.push(recorded.metadata.releaseId);
|
|
42
|
+
}
|
|
43
|
+
return swept;
|
|
44
|
+
}
|
|
45
|
+
/** The releases that an identity-verified live cohort runs from and that must be retained. */
|
|
46
|
+
export async function liveReleaseIds(paths) {
|
|
47
|
+
const recorded = await listRecordedEndpoints(paths);
|
|
48
|
+
const ownership = await Promise.all(recorded.map(async (endpoint) => ({
|
|
49
|
+
releaseId: endpoint.metadata.releaseId,
|
|
50
|
+
probe: await probeOwnership(endpoint.metadata),
|
|
51
|
+
})));
|
|
52
|
+
return [...new Set(ownership.filter(item => item.probe === "live-verified").map(item => item.releaseId))].sort();
|
|
53
|
+
}
|
|
54
|
+
export async function readEndpointMetadata(path) {
|
|
55
|
+
try {
|
|
56
|
+
const value = JSON.parse(await readFile(path, "utf8"));
|
|
57
|
+
const ownership = value.ownership;
|
|
58
|
+
const liveInstanceIds = Array.isArray(ownership?.liveInstanceIds)
|
|
59
|
+
? ownership.liveInstanceIds
|
|
60
|
+
: Array.isArray(ownership?.liveGenerationIds) ? ownership.liveGenerationIds : null;
|
|
61
|
+
const nonResumableInstanceIds = Array.isArray(ownership?.nonResumableInstanceIds)
|
|
62
|
+
? ownership.nonResumableInstanceIds
|
|
63
|
+
: Array.isArray(ownership?.nonResumableGenerationIds) ? ownership.nonResumableGenerationIds : null;
|
|
64
|
+
const uncertainInstanceIds = Array.isArray(ownership?.uncertainInstanceIds) ? ownership.uncertainInstanceIds : [];
|
|
65
|
+
if (!value || value.schema !== PRODUCT_IDENTITY.protocol.supervisorSchema || typeof value.supervisorId !== "string" || typeof value.endpoint !== "string" || !Number.isSafeInteger(value.pid)
|
|
66
|
+
|| typeof value.pidStartIdentity !== "string" || typeof value.bootNonce !== "string" || typeof value.releaseId !== "string"
|
|
67
|
+
|| typeof value.releaseRoot !== "string" || typeof value.contentDigest !== "string" || !ownership
|
|
68
|
+
|| !isStringArray(liveInstanceIds) || !isStringArray(nonResumableInstanceIds) || !isStringArray(uncertainInstanceIds)) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
...value,
|
|
73
|
+
ownership: {
|
|
74
|
+
...ownership,
|
|
75
|
+
liveInstanceIds,
|
|
76
|
+
nonResumableInstanceIds,
|
|
77
|
+
uncertainInstanceIds,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export async function probeOwnership(metadata) {
|
|
86
|
+
if (!processIsAlive(metadata.pid))
|
|
87
|
+
return "dead";
|
|
88
|
+
const identity = await requestIdentity(metadata.endpoint, 500);
|
|
89
|
+
if (!identity)
|
|
90
|
+
return "unresponsive";
|
|
91
|
+
return identity.supervisorId === metadata.supervisorId
|
|
92
|
+
&& identity.bootNonce === metadata.bootNonce
|
|
93
|
+
&& identity.pidStartIdentity === metadata.pidStartIdentity
|
|
94
|
+
&& identity.releaseId === metadata.releaseId
|
|
95
|
+
? "live-verified"
|
|
96
|
+
: "identity-mismatch";
|
|
97
|
+
}
|
|
98
|
+
async function requestIdentity(endpoint, timeoutMs) {
|
|
99
|
+
return await new Promise(resolvePromise => {
|
|
100
|
+
const socket = connect(endpoint);
|
|
101
|
+
const decoder = new LineFrameDecoder();
|
|
102
|
+
let settled = false;
|
|
103
|
+
const finish = (value) => {
|
|
104
|
+
if (settled)
|
|
105
|
+
return;
|
|
106
|
+
settled = true;
|
|
107
|
+
socket.destroy();
|
|
108
|
+
resolvePromise(value);
|
|
109
|
+
};
|
|
110
|
+
socket.once("error", () => finish(null));
|
|
111
|
+
socket.once("connect", () => socket.write(encodeFrame({ type: "identity-probe" })));
|
|
112
|
+
socket.on("data", chunk => {
|
|
113
|
+
try {
|
|
114
|
+
const message = decoder.push(chunk)[0];
|
|
115
|
+
if (message?.type === "identity" && typeof message.supervisorId === "string" && typeof message.bootNonce === "string"
|
|
116
|
+
&& typeof message.pidStartIdentity === "string" && typeof message.releaseId === "string") {
|
|
117
|
+
finish({ supervisorId: message.supervisorId, bootNonce: message.bootNonce, pidStartIdentity: message.pidStartIdentity, releaseId: message.releaseId });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
finish(null);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
setTimeout(() => finish(null), timeoutMs).unref();
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function isStringArray(value) {
|
|
128
|
+
return Array.isArray(value) && value.every(item => typeof item === "string" && item.length > 0);
|
|
129
|
+
}
|
|
130
|
+
export async function removeEndpointArtifacts(metadataPath, endpoint) {
|
|
131
|
+
await rm(metadataPath, { force: true });
|
|
132
|
+
if (platform() !== "win32")
|
|
133
|
+
await rm(endpoint, { force: true });
|
|
134
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Stats } from "node:fs";
|
|
2
|
+
export type ImmutablePlatformPolicy = "windows-readonly-content-v1" | "posix-readonly-content-v1";
|
|
3
|
+
/** Name the platform protection established while complete payload verification owns every file. */
|
|
4
|
+
export declare function immutablePlatformPolicy(platform?: NodeJS.Platform): ImmutablePlatformPolicy | null;
|
|
5
|
+
/** Refuse certification when a payload file is writable after immutable materialization. */
|
|
6
|
+
export declare function assertImmutableFileMode(metadata: Pick<Stats, "mode">, path: string): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Name the platform protection established while complete payload verification owns every file. */
|
|
2
|
+
export function immutablePlatformPolicy(platform = process.platform) {
|
|
3
|
+
if (platform === "win32")
|
|
4
|
+
return "windows-readonly-content-v1";
|
|
5
|
+
if (platform === "linux" || platform === "darwin")
|
|
6
|
+
return "posix-readonly-content-v1";
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
/** Refuse certification when a payload file is writable after immutable materialization. */
|
|
10
|
+
export function assertImmutableFileMode(metadata, path) {
|
|
11
|
+
if ((metadata.mode & 0o222) !== 0)
|
|
12
|
+
throw new Error(`immutable payload file is writable: ${path}`);
|
|
13
|
+
}
|