@timurproko/a1 0.1.8-dev.3b54f21 → 0.1.8-dev.407
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +159 -65
- package/bin/cli.js +28 -10
- package/bin/guardian.js +12 -6
- package/bin/module-identity.js +69 -35
- package/bin/pi-tui.d.ts +6 -0
- package/bin/pi-tui.js +28 -0
- package/bin/release-cleanup.js +8 -0
- package/bin/supervisor.js +2 -2
- package/bin/sync-pi-tui-proxy.js +97 -0
- package/bin/ui.js +62 -21
- package/bin/update-recovery.js +274 -0
- package/bin/warmup.js +27 -0
- package/dist/cli/capabilities.d.ts +6 -0
- package/dist/{src/cli → cli}/capabilities.js +1 -1
- package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
- package/dist/cli/dispatch.js +261 -0
- package/dist/cli/package-messages.d.ts +26 -0
- package/dist/cli/package-messages.js +71 -0
- package/dist/{src/cli → cli}/packages.d.ts +11 -2
- package/dist/{src/cli → cli}/packages.js +24 -27
- package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
- package/dist/cli/version-stats.js +112 -0
- package/dist/composition/agent-engine-bridge.d.ts +3 -0
- package/dist/composition/agent-engine-bridge.js +108 -0
- package/dist/composition/index.d.ts +3 -0
- package/dist/composition/index.js +3 -0
- package/dist/composition/owned-ui.d.ts +35 -0
- package/dist/composition/owned-ui.js +118 -0
- package/dist/composition/process.d.ts +16 -0
- package/dist/composition/process.js +45 -0
- package/dist/composition/settings-route-host.d.ts +8 -0
- package/dist/composition/settings-route-host.js +75 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
- package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
- package/dist/contracts/owned-ui/image-attachments.js +67 -0
- package/dist/contracts/owned-ui/index.d.ts +8 -0
- package/dist/contracts/owned-ui/index.js +8 -0
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +123 -0
- package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
- package/dist/contracts/owned-ui/prompt-history.js +23 -0
- package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
- package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
- package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
- package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +5 -1
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +129 -4
- package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +8 -0
- package/dist/{src/features → features}/launch/development-launch.js +11 -3
- package/dist/{src/features → features}/launch/index.d.ts +0 -1
- package/dist/{src/features → features}/launch/index.js +0 -1
- package/dist/features/launch/intent.d.ts +10 -0
- package/dist/features/launch/intent.js +8 -0
- package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
- package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
- package/dist/{src/features → features}/launch/profile-paths.d.ts +3 -2
- package/dist/{src/features → features}/launch/profile-paths.js +13 -8
- package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
- package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
- package/dist/{src/features → features}/owned-ui/customization.js +3 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
- package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
- package/dist/{src/features → features}/owned-ui/index.js +2 -0
- package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
- package/dist/features/owned-ui/project-trust-prompt.js +149 -0
- package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
- package/dist/features/owned-ui/run.js +32 -0
- package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
- package/dist/features/owned-ui/session-fork-prompt.js +34 -0
- package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
- package/dist/{src/features → features}/owned-ui/settings-app.js +105 -56
- package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
- package/dist/features/prompt-history/image-sidecar.js +130 -0
- package/dist/features/prompt-history/index.d.ts +4 -0
- package/dist/features/prompt-history/index.js +3 -0
- package/dist/features/prompt-history/paths.d.ts +5 -0
- package/dist/features/prompt-history/paths.js +17 -0
- package/dist/features/prompt-history/service.d.ts +54 -0
- package/dist/features/prompt-history/service.js +425 -0
- package/dist/features/prompt-history/store.d.ts +16 -0
- package/dist/features/prompt-history/store.js +223 -0
- package/dist/features/prompt-history/worker.d.ts +9 -0
- package/dist/features/prompt-history/worker.js +45 -0
- package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
- package/dist/features/prompt-suggestions/diagnostics.js +82 -0
- package/dist/features/prompt-suggestions/index.d.ts +1 -0
- package/dist/features/prompt-suggestions/index.js +1 -0
- package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
- package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
- package/dist/{src/features → features}/workspace/reducer.js +2 -1
- package/dist/{src/features → features}/workspace/router.d.ts +2 -1
- package/dist/{src/features → features}/workspace/router.js +1 -0
- package/dist/{src/features → features}/workspace/store.d.ts +2 -1
- package/dist/{src/features → features}/workspace/store.js +1 -0
- package/dist/foundation/launch-context/index.d.ts +59 -0
- package/dist/foundation/launch-context/index.js +136 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.js +23 -8
- package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
- package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
- package/dist/foundation/lifecycle/paths.d.ts +30 -0
- package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
- package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
- package/dist/foundation/lifecycle/session-selection.js +39 -0
- package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
- package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
- package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
- package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
- package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
- package/dist/foundation/release/bootstrap.d.ts +55 -0
- package/dist/{src/foundation → foundation}/release/bootstrap.js +219 -46
- package/dist/foundation/release/cohort-state.d.ts +157 -0
- package/dist/foundation/release/cohort-state.js +472 -0
- package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
- package/dist/foundation/release/dependency-certification-retention.js +88 -0
- package/dist/foundation/release/dependency-certification.d.ts +24 -0
- package/dist/foundation/release/dependency-certification.js +266 -0
- package/dist/foundation/release/dependency-layer.d.ts +81 -0
- package/dist/foundation/release/dependency-layer.js +466 -0
- package/dist/foundation/release/endpoints.d.ts +20 -0
- package/dist/foundation/release/endpoints.js +50 -0
- package/dist/foundation/release/immutable-platform.d.ts +6 -0
- package/dist/foundation/release/immutable-platform.js +13 -0
- package/dist/{src/foundation → foundation}/release/index.d.ts +6 -0
- package/dist/{src/foundation → foundation}/release/index.js +6 -0
- package/dist/foundation/release/release-gc.d.ts +71 -0
- package/dist/foundation/release/release-gc.js +764 -0
- package/dist/{src/foundation → foundation}/release/release-store.d.ts +9 -3
- package/dist/{src/foundation → foundation}/release/release-store.js +74 -14
- package/dist/{src/foundation → foundation}/release/release.d.ts +6 -1
- package/dist/{src/foundation → foundation}/release/release.js +15 -4
- package/dist/foundation/release/restart-certification.d.ts +68 -0
- package/dist/foundation/release/restart-certification.js +227 -0
- package/dist/foundation/release/update-launch.d.ts +6 -0
- package/dist/foundation/release/update-launch.js +17 -0
- package/dist/foundation/release/update-recovery.d.ts +76 -0
- package/dist/foundation/release/update-recovery.js +356 -0
- package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +11 -0
- package/dist/{src/foundation → foundation}/release/update-transaction.js +13 -1
- package/dist/{src/foundation → foundation}/release/update.d.ts +40 -4
- package/dist/{src/foundation → foundation}/release/update.js +196 -78
- package/dist/foundation/release/warmup.d.ts +3 -0
- package/dist/foundation/release/warmup.js +47 -0
- package/dist/foundation/startup/index.d.ts +1 -0
- package/dist/foundation/startup/index.js +1 -0
- package/dist/foundation/startup/startup-runtime.d.ts +36 -0
- package/dist/foundation/startup/startup-runtime.js +142 -0
- package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
- package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
- package/dist/foundation/supervision/index.d.ts +3 -0
- package/dist/foundation/supervision/index.js +3 -0
- package/dist/foundation/supervision/main.d.ts +1 -0
- package/dist/foundation/supervision/main.js +84 -0
- package/dist/foundation/supervision/paths.d.ts +1 -0
- package/dist/foundation/supervision/paths.js +1 -0
- package/dist/foundation/supervision/server.d.ts +51 -0
- package/dist/{src/foundation → foundation}/supervision/server.js +142 -20
- package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.js +85 -0
- package/dist/foundation/terminal-cleanup/index.d.ts +2 -0
- package/dist/foundation/terminal-cleanup/index.js +2 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
- package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
- package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
- package/dist/integrations/pi/components/history-editor-loader.js +5 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +2 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +2 -1
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +1093 -0
- package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
- package/dist/integrations/pi/components/path-word-ranges.js +37 -0
- package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +297 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +4 -4
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +58 -23
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +114 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +174 -170
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +8 -4
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +10 -6
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +213 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +5 -2
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +15 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +43 -0
- package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
- package/dist/integrations/pi/components/tool-image-presentation.js +86 -0
- package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
- package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
- package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
- package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +11 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +41 -3
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +42 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +40 -0
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +166 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +3 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +3 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +12 -7
- package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +61 -0
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +344 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +280 -0
- package/dist/integrations/pi/components/upstream/history/editor-core.js +2062 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +32 -0
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +48 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
- package/dist/integrations/pi/components/upstream/history/printable-key.js +40 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +28 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +22 -0
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +36 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +100 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +74 -6
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +1340 -228
- package/dist/integrations/pi/engine/changelog.d.ts +2 -0
- package/dist/integrations/pi/engine/changelog.js +63 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +4 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +15 -5
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
- package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
- package/dist/integrations/pi/engine/pending-delivery.js +158 -0
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
- package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
- package/dist/integrations/pi/engine/resources/changelog.json +12 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +56 -5
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
- package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
- package/dist/integrations/pi/engine/session-selection.js +90 -0
- package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
- package/dist/integrations/pi/engine/settings-effects.js +249 -0
- package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
- package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
- package/dist/integrations/pi/engine/tool-rendering.js +145 -0
- package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
- package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
- package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +19 -2
- package/dist/integrations/pi/session-ui/clipboard-diagnostics.d.ts +16 -0
- package/dist/integrations/pi/session-ui/clipboard-diagnostics.js +65 -0
- package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
- package/dist/integrations/pi/session-ui/clipboard-image.js +38 -0
- package/dist/integrations/pi/session-ui/editor-hyperlink-budget.d.ts +9 -0
- package/dist/integrations/pi/session-ui/editor-hyperlink-budget.js +23 -0
- package/dist/integrations/pi/session-ui/image-preparation-client.d.ts +20 -0
- package/dist/integrations/pi/session-ui/image-preparation-client.js +145 -0
- package/dist/integrations/pi/session-ui/image-preparation.d.ts +18 -0
- package/dist/integrations/pi/session-ui/image-preparation.js +126 -0
- package/dist/integrations/pi/session-ui/image-source.d.ts +13 -0
- package/dist/integrations/pi/session-ui/image-source.js +171 -0
- package/dist/integrations/pi/session-ui/image-worker.d.ts +17 -0
- package/dist/integrations/pi/session-ui/image-worker.js +23 -0
- package/dist/integrations/pi/session-ui/index.d.ts +5 -0
- package/dist/integrations/pi/session-ui/index.js +5 -0
- package/dist/integrations/pi/session-ui/paste-executor.d.ts +10 -0
- package/dist/integrations/pi/session-ui/paste-executor.js +232 -0
- package/dist/integrations/pi/session-ui/paste-helper.d.ts +1 -0
- package/dist/integrations/pi/session-ui/paste-helper.js +173 -0
- package/dist/integrations/pi/session-ui/paste-preparation-client.d.ts +16 -0
- package/dist/integrations/pi/session-ui/paste-preparation-client.js +159 -0
- package/dist/integrations/pi/session-ui/paste-protocol.d.ts +78 -0
- package/dist/integrations/pi/session-ui/paste-protocol.js +18 -0
- package/dist/integrations/pi/session-ui/paste-text-preparation.d.ts +20 -0
- package/dist/integrations/pi/session-ui/paste-text-preparation.js +134 -0
- package/dist/integrations/pi/session-ui/paste-text-worker.d.ts +1 -0
- package/dist/integrations/pi/session-ui/paste-text-worker.js +12 -0
- package/dist/integrations/pi/session-ui/path-chip-presentation.d.ts +7 -0
- package/dist/integrations/pi/session-ui/path-chip-presentation.js +24 -0
- package/dist/integrations/pi/session-ui/prompt-chips.d.ts +72 -0
- package/dist/integrations/pi/session-ui/prompt-chips.js +503 -0
- package/dist/integrations/pi/session-ui/prompt-history-controller.d.ts +36 -0
- package/dist/integrations/pi/session-ui/prompt-history-controller.js +170 -0
- package/dist/integrations/pi/session-ui/prompt-suggestion-controller.d.ts +35 -0
- package/dist/integrations/pi/session-ui/prompt-suggestion-controller.js +207 -0
- package/dist/integrations/pi/session-ui/response-copy-coordinator.d.ts +27 -0
- package/dist/integrations/pi/session-ui/response-copy-coordinator.js +189 -0
- package/dist/integrations/pi/session-ui/response-copy-helper.d.ts +1 -0
- package/dist/integrations/pi/session-ui/response-copy-helper.js +122 -0
- package/dist/integrations/pi/session-ui/response-copy-protocol.d.ts +56 -0
- package/dist/integrations/pi/session-ui/response-copy-protocol.js +5 -0
- package/dist/integrations/pi/session-ui/response-copy-transport.d.ts +31 -0
- package/dist/integrations/pi/session-ui/response-copy-transport.js +187 -0
- package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
- package/dist/integrations/pi/session-ui/route-host.js +1 -0
- package/dist/integrations/pi/session-ui/session-shell-root.d.ts +221 -0
- package/dist/integrations/pi/session-ui/session-shell-root.js +1305 -0
- package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
- package/dist/integrations/pi/session-ui/session-shell.js +1792 -0
- package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +56 -0
- package/dist/integrations/pi/session-ui/session-viewport-controller.js +569 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
- package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
- package/dist/integrations/pi/session-ui/system-clipboard.js +156 -0
- package/dist/integrations/pi/session-ui/text-paste.d.ts +5 -0
- package/dist/integrations/pi/session-ui/text-paste.js +16 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +10 -1
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +255 -11
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +32 -6
- package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +81 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +424 -0
- package/dist/integrations/pi/tui-runtime/index.d.ts +7 -0
- package/dist/integrations/pi/tui-runtime/index.js +7 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
- package/dist/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
- package/dist/integrations/pi/tui-runtime/mouse-report-input.js +59 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
- package/dist/integrations/pi/tui-runtime/overlay-geometry.js +159 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
- package/dist/native/darwin-arm64/manifest.json +4 -4
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +3 -3
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/{src/product-identity.d.ts → product-identity.d.ts} +4 -4
- package/dist/{src/product-identity.js → product-identity.js} +7 -38
- package/dist/{src/product-identity.json → product-identity.json} +13 -27
- package/dist/runtime-payload-inventory.json +122333 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
- package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +7 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.js +7 -0
- package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +2 -8
- package/dist/{src/foundation/ui-components → ui/components}/line-input.js +7 -28
- package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
- package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
- package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
- package/dist/{src/foundation/ui-components → ui/components}/mouse.js +24 -0
- package/dist/ui/components/progress-status.d.ts +2 -0
- package/dist/ui/components/progress-status.js +4 -0
- package/dist/ui/components/prompt-input.d.ts +32 -0
- package/dist/ui/components/prompt-input.js +54 -0
- package/dist/ui/components/prompt-row.d.ts +14 -0
- package/dist/ui/components/prompt-row.js +20 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
- package/dist/ui/components/selection-copy.d.ts +24 -0
- package/dist/ui/components/selection-copy.js +39 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
- package/dist/ui/components/spans.d.ts +28 -0
- package/dist/ui/components/spans.js +266 -0
- package/dist/ui/components/submitted-prompt.d.ts +23 -0
- package/dist/ui/components/submitted-prompt.js +50 -0
- package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
- package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
- package/dist/ui/components/text-selection.d.ts +62 -0
- package/dist/ui/components/text-selection.js +210 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.js +67 -5
- package/dist/ui/components/transcript-viewport.d.ts +173 -0
- package/dist/ui/components/transcript-viewport.js +753 -0
- package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
- package/dist/ui/components/visible-hyperlinks.js +97 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
- package/dist/ui/settings/declarations.js +94 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +28 -2
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +41 -22
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
- package/dist/ui/settings/session.js +164 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
- package/docs/architecture/boundaries.md +14 -10
- package/docs/architecture/code-documentation.md +77 -0
- package/docs/architecture/history-editor-provenance.md +100 -0
- package/docs/architecture/internal-naming.md +91 -0
- package/docs/architecture/process-guardian-provenance.md +3 -1
- package/docs/architecture/project-structure.md +69 -30
- package/docs/architecture/prompt-suggestions.md +68 -0
- package/docs/architecture/resource-and-data-policy.md +28 -2
- package/docs/architecture/response-copy-delivery.md +83 -0
- package/docs/architecture/tool-image-presentation.md +62 -0
- package/docs/architecture/toolchain.md +24 -10
- package/docs/architecture/ui-reference-provenance.md +59 -5
- package/docs/ci-release-runbook.md +236 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/features/modal-content-interaction.md +37 -0
- package/docs/features/prompt-history.md +149 -0
- package/docs/local-worktree-cleanup.md +128 -0
- package/docs/manual-code-streaming-cleanup.md +88 -0
- package/docs/manual-ghost-link-baseline.md +89 -0
- package/docs/manual-launch-instance-acceptance.md +12 -35
- package/docs/manual-owned-ui-checkpoint.md +78 -0
- package/docs/manual-pi-boundary-candidate.md +4 -5
- package/docs/manual-terminal-colour-check.md +4 -3
- package/docs/openspec-archive-automation.md +128 -0
- package/docs/repository-governance-live-acceptance.md +77 -0
- package/package.json +45 -28
- package/dist/src/cli/capabilities.d.ts +0 -15
- package/dist/src/cli/dispatch.js +0 -142
- package/dist/src/cli/version-stats.js +0 -72
- package/dist/src/composition/index.d.ts +0 -48
- package/dist/src/composition/index.js +0 -258
- package/dist/src/features/launch/intent.d.ts +0 -7
- package/dist/src/features/launch/intent.js +0 -4
- package/dist/src/features/launch/profiles.d.ts +0 -12
- package/dist/src/features/launch/profiles.js +0 -26
- package/dist/src/features/owned-ui/run.js +0 -15
- package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
- package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
- package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
- package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
- package/dist/src/foundation/owned-ui-settings/session.js +0 -145
- package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
- package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
- package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
- package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
- package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
- package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
- package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
- package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.js +0 -1518
- package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
- package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
- package/dist/src/foundation/release/bootstrap.d.ts +0 -29
- package/dist/src/foundation/release/cohort-state.d.ts +0 -70
- package/dist/src/foundation/release/cohort-state.js +0 -202
- package/dist/src/foundation/release/release-gc.d.ts +0 -5
- package/dist/src/foundation/release/release-gc.js +0 -16
- package/dist/src/foundation/supervision/index.d.ts +0 -3
- package/dist/src/foundation/supervision/index.js +0 -3
- package/dist/src/foundation/supervision/main.d.ts +0 -1
- package/dist/src/foundation/supervision/main.js +0 -41
- package/dist/src/foundation/supervision/paths.d.ts +0 -1
- package/dist/src/foundation/supervision/paths.js +0 -1
- package/dist/src/foundation/supervision/server.d.ts +0 -22
- package/dist/src/foundation/ui-components/spans.d.ts +0 -7
- package/dist/src/foundation/ui-components/spans.js +0 -59
- package/docs/manual-transparent-checkpoint.md +0 -53
- /package/dist/{src/cli → cli}/index.d.ts +0 -0
- /package/dist/{src/cli → cli}/index.js +0 -0
- /package/dist/{src/cli → cli}/version.d.ts +0 -0
- /package/dist/{src/cli → cli}/version.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
- /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
- /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
- /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
- /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/index.js +0 -0
- /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/presentation.js +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
- /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → integrations/pi/components/editor-interaction.js} +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → integrations/pi/components/prompt-input-port.js} +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry,
|
|
1
|
+
import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, dialogValueColumn, numericValues, RAIL_COLUMNS, renderDialogPanel, renderEmptyState, renderGroupHeader, renderInputRow, renderListRow, renderNote, renderStatusLine, dialogRowAt, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, isThumbRow, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
|
|
2
2
|
export const SETTINGS_APP_ID = "settings";
|
|
3
3
|
export const SETTINGS_ROUTE = "settings";
|
|
4
4
|
const SCOPE = SETTINGS_APP_ID;
|
|
@@ -29,6 +29,7 @@ SETTINGS_SHORTCUTS.declare({ key: "left", scope: DIALOG_SCOPE, description: "Cha
|
|
|
29
29
|
SETTINGS_SHORTCUTS.declare({ key: "right", scope: DIALOG_SCOPE, description: "Change this part", section: "Parts" }, "part-change");
|
|
30
30
|
SETTINGS_SHORTCUTS.declare({ key: "up", scope: DIALOG_SCOPE, description: "Previous part", section: "Parts" }, "part-previous");
|
|
31
31
|
SETTINGS_SHORTCUTS.declare({ key: "down", scope: DIALOG_SCOPE, description: "Next part", section: "Parts" }, "part-next");
|
|
32
|
+
assertNoShortcutConflicts(SETTINGS_SHORTCUTS.assemble());
|
|
32
33
|
const KEYS = {
|
|
33
34
|
"\u001b[A": "up",
|
|
34
35
|
"\u001b[B": "down",
|
|
@@ -56,6 +57,8 @@ export class SettingsApp {
|
|
|
56
57
|
#session;
|
|
57
58
|
#selectedKey;
|
|
58
59
|
#scroll = 0;
|
|
60
|
+
// Invariant: keyboard navigation requests visibility once; pointer scrolling then stays free.
|
|
61
|
+
#selectionNeedsReveal = true;
|
|
59
62
|
#reveal;
|
|
60
63
|
#notice = null;
|
|
61
64
|
#filter = null;
|
|
@@ -63,19 +66,15 @@ export class SettingsApp {
|
|
|
63
66
|
#structured = null;
|
|
64
67
|
#loading = true;
|
|
65
68
|
#interruptArmed = false;
|
|
66
|
-
|
|
69
|
+
// Invariant: pending values remain visible until the source reflects them.
|
|
67
70
|
#pending = new Map();
|
|
68
71
|
#footerHeight = 1;
|
|
69
|
-
/** Column the dialog's values start at, so a label stays a label. */
|
|
70
72
|
#dialogValueColumn = 0;
|
|
71
|
-
/** Screen row the dialog panel starts on, for pointer hits. */
|
|
72
73
|
#panelTop = 0;
|
|
73
74
|
#panelTopForFrame = 0;
|
|
74
|
-
/** Row key under the pointer, and where each row was drawn last frame. */
|
|
75
75
|
#hoverKey = null;
|
|
76
76
|
#hoverRegion = "label";
|
|
77
77
|
#frameRows = [];
|
|
78
|
-
/** Where the value menu was drawn last frame, for hit testing. */
|
|
79
78
|
#menuFrame = null;
|
|
80
79
|
constructor(session) {
|
|
81
80
|
this.#session = session;
|
|
@@ -90,15 +89,19 @@ export class SettingsApp {
|
|
|
90
89
|
const theme = host.theme ?? PLAIN_THEME;
|
|
91
90
|
this.#interruptArmed = host.interruptArmed;
|
|
92
91
|
const rows = this.#rows();
|
|
92
|
+
const selected = indexOfKey(rows, this.#selectedKey);
|
|
93
93
|
const footer = this.#footerLines(rect.width, theme);
|
|
94
94
|
this.#footerHeight = footer.length;
|
|
95
95
|
this.#panelTopForFrame = Math.max(0, rect.height - footer.length);
|
|
96
96
|
this.#panelTop = this.#panelTopForFrame;
|
|
97
97
|
const bodyHeight = Math.max(0, rect.height - footer.length);
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
if (this.#selectionNeedsReveal) {
|
|
99
|
+
this.#scroll = scrollForSelection(rows, bodyHeight, this.#scroll, selected, this.#reveal);
|
|
100
|
+
this.#selectionNeedsReveal = false;
|
|
101
|
+
}
|
|
100
102
|
this.#reveal = undefined;
|
|
101
103
|
const layout = layoutList(rows, bodyHeight, this.#scroll);
|
|
104
|
+
this.#scroll = layout.scroll;
|
|
102
105
|
const contentWidth = Math.max(0, rect.width - RAIL_COLUMNS);
|
|
103
106
|
const valueColumn = this.#valueColumn(rows);
|
|
104
107
|
const geometry = scrollbarGeometry({
|
|
@@ -121,14 +124,13 @@ export class SettingsApp {
|
|
|
121
124
|
for (const index of layout.rowIndexes) {
|
|
122
125
|
const row = rows[index];
|
|
123
126
|
if (row !== undefined && row.kind === "element") {
|
|
127
|
+
const view = this.#viewRow(row.value);
|
|
124
128
|
this.#frameRows.push({
|
|
125
|
-
key:
|
|
129
|
+
key: view.key,
|
|
126
130
|
screenRow: body.length,
|
|
127
131
|
valueColumn,
|
|
128
|
-
valueWidth:
|
|
129
|
-
|
|
130
|
-
: row.value.value === null ? 0 : displayWidth(displayValue(row.value.value)),
|
|
131
|
-
stepper: isStepper(row.value),
|
|
132
|
+
valueWidth: displayWidth(view.value),
|
|
133
|
+
stepper: view.stepper !== undefined,
|
|
132
134
|
});
|
|
133
135
|
}
|
|
134
136
|
body.push(this.#renderRow(row, index === selected, contentWidth, valueColumn, theme));
|
|
@@ -148,7 +150,8 @@ export class SettingsApp {
|
|
|
148
150
|
return this.#menuKey(data);
|
|
149
151
|
if (this.#filter !== null)
|
|
150
152
|
return this.#filterKey(data);
|
|
151
|
-
const
|
|
153
|
+
const key = KEYS[data] ?? data;
|
|
154
|
+
const action = SETTINGS_SHORTCUTS.resolve(key, SCOPE);
|
|
152
155
|
if (action === null)
|
|
153
156
|
return { consumed: false };
|
|
154
157
|
const rows = this.#rows();
|
|
@@ -186,11 +189,14 @@ export class SettingsApp {
|
|
|
186
189
|
}
|
|
187
190
|
case "first":
|
|
188
191
|
case "last": {
|
|
189
|
-
// End lands on the very last setting, not on the head of its section.
|
|
192
|
+
// Invariant: End lands on the very last setting, not on the head of its section.
|
|
190
193
|
const selectable = selectableIndexes(rows);
|
|
191
194
|
const target = action === "last" ? selectable.at(-1) : selectable[0];
|
|
192
|
-
if (target !== undefined)
|
|
193
|
-
this.#
|
|
195
|
+
if (target !== undefined) {
|
|
196
|
+
this.#select(rows, target);
|
|
197
|
+
if (action === "first")
|
|
198
|
+
this.#scroll = 0;
|
|
199
|
+
}
|
|
194
200
|
return { consumed: true };
|
|
195
201
|
}
|
|
196
202
|
case "previous-value":
|
|
@@ -208,7 +214,7 @@ export class SettingsApp {
|
|
|
208
214
|
const overRow = menuRowAt(frame, event.row - 1, event.column);
|
|
209
215
|
const overMenu = overRow !== null;
|
|
210
216
|
if (event.kind === "motion") {
|
|
211
|
-
//
|
|
217
|
+
// Invariant: the menu owns the pointer, but the row it came from is still the thing
|
|
212
218
|
// being changed, so its value keeps reading as the one under the pointer.
|
|
213
219
|
// Only a dialog that takes the screen puts that out.
|
|
214
220
|
const hadHover = this.#hoverKey !== menu.anchorKey || this.#hoverRegion !== "value";
|
|
@@ -227,7 +233,7 @@ export class SettingsApp {
|
|
|
227
233
|
if (event.kind !== "press")
|
|
228
234
|
return { consumed: true, render: false };
|
|
229
235
|
if (overRow === null) {
|
|
230
|
-
//
|
|
236
|
+
// Invariant: a press anywhere else dismisses the menu rather than acting through it.
|
|
231
237
|
this.#menu = null;
|
|
232
238
|
return { consumed: true };
|
|
233
239
|
}
|
|
@@ -239,7 +245,7 @@ export class SettingsApp {
|
|
|
239
245
|
}
|
|
240
246
|
const open = this.#structured;
|
|
241
247
|
if (open !== null) {
|
|
242
|
-
//
|
|
248
|
+
// Invariant: the panel owns the pointer while it is open; its flag rows are the targets.
|
|
243
249
|
// The panel's rows begin one line below its rule.
|
|
244
250
|
const panel = { firstRow: this.#panelTop + 1, rows: open.flags.length, valueColumn: this.#dialogValueColumn };
|
|
245
251
|
const row = event.row - 1 - panel.firstRow;
|
|
@@ -253,7 +259,7 @@ export class SettingsApp {
|
|
|
253
259
|
}
|
|
254
260
|
if (event.kind === "press") {
|
|
255
261
|
open.index = row;
|
|
256
|
-
//
|
|
262
|
+
// Rationale: pointing at the label picks the row; the value is what changes it,
|
|
257
263
|
// exactly as in the list behind the dialog.
|
|
258
264
|
const key = open.flags[row] ?? "";
|
|
259
265
|
const width = displayWidth((open.record[key] ?? false) ? "true" : "false");
|
|
@@ -263,6 +269,15 @@ export class SettingsApp {
|
|
|
263
269
|
}
|
|
264
270
|
return { consumed: true, render: false };
|
|
265
271
|
}
|
|
272
|
+
if (event.kind === "wheel-up" || event.kind === "wheel-down") {
|
|
273
|
+
// Invariant: the whole list pane owns wheel scrolling, including blank space beside
|
|
274
|
+
// short labels. It must not depend on finding an item under the pointer.
|
|
275
|
+
if (event.row < 1 || event.row > this.#panelTopForFrame)
|
|
276
|
+
return { consumed: false };
|
|
277
|
+
const distance = scrollbarWheelRows(this.#scrollbarSpeed());
|
|
278
|
+
this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? distance : -distance));
|
|
279
|
+
return { consumed: true };
|
|
280
|
+
}
|
|
266
281
|
const row = this.#frameRows.find(candidate => candidate.screenRow === event.row - 1);
|
|
267
282
|
const previousKey = this.#hoverKey;
|
|
268
283
|
const previousRegion = this.#hoverRegion;
|
|
@@ -277,7 +292,7 @@ export class SettingsApp {
|
|
|
277
292
|
const rows = this.#rows();
|
|
278
293
|
const index = rows.findIndex(candidate => rowKey(candidate) === row.key);
|
|
279
294
|
if (index >= 0) {
|
|
280
|
-
//
|
|
295
|
+
// Rationale: the pointer acts where it points; the arrow belongs to the keyboard.
|
|
281
296
|
this.#notice = null;
|
|
282
297
|
if (this.#hoverRegion === "minus")
|
|
283
298
|
this.#cycle(rows, index, -1);
|
|
@@ -288,10 +303,6 @@ export class SettingsApp {
|
|
|
288
303
|
}
|
|
289
304
|
return { consumed: true };
|
|
290
305
|
}
|
|
291
|
-
if (event.kind === "wheel-up" || event.kind === "wheel-down") {
|
|
292
|
-
this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? 3 : -3));
|
|
293
|
-
return { consumed: true };
|
|
294
|
-
}
|
|
295
306
|
const changed = previousKey !== this.#hoverKey || previousRegion !== this.#hoverRegion;
|
|
296
307
|
return { consumed: event.kind !== "motion", render: changed };
|
|
297
308
|
}
|
|
@@ -305,7 +316,7 @@ export class SettingsApp {
|
|
|
305
316
|
return;
|
|
306
317
|
}
|
|
307
318
|
const shown = this.#shownValue(entry);
|
|
308
|
-
//
|
|
319
|
+
// Rationale: a number is stepped, not picked from a list: it has its own two controls,
|
|
309
320
|
// and pointing at it is not a request for anything else.
|
|
310
321
|
if (typeof shown === "number")
|
|
311
322
|
return;
|
|
@@ -314,16 +325,12 @@ export class SettingsApp {
|
|
|
314
325
|
return;
|
|
315
326
|
}
|
|
316
327
|
const current = shown === null ? 0 : Math.max(0, entry.choices.indexOf(shown));
|
|
317
|
-
//
|
|
318
|
-
|
|
319
|
-
this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: -1 };
|
|
328
|
+
// Compatibility: pinned SelectList opens on the value currently in effect.
|
|
329
|
+
this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: current };
|
|
320
330
|
}
|
|
321
|
-
|
|
322
|
-
* A structured setting is a set of flags, so it opens as its own list rather
|
|
323
|
-
* than as a value menu: each row names one flag and toggles it in place.
|
|
324
|
-
*/
|
|
331
|
+
// Rationale: a structured setting opens as its own flag list rather than a value menu.
|
|
325
332
|
#openStructured(entry) {
|
|
326
|
-
//
|
|
333
|
+
// Invariant: the flags come from the declaration, not from the stored value: an unset
|
|
327
334
|
// flag still has a row, showing the default the source would apply.
|
|
328
335
|
if (entry.flags.length === 0) {
|
|
329
336
|
this.#notice = `${labelOf(entry)} has nothing to configure`;
|
|
@@ -337,7 +344,7 @@ export class SettingsApp {
|
|
|
337
344
|
const value = stored[flag.key];
|
|
338
345
|
record[flag.key] = typeof value === "boolean" ? value : flag.fallback;
|
|
339
346
|
}
|
|
340
|
-
//
|
|
347
|
+
// Invariant: the dialog takes the screen: the row it was opened from stops being the
|
|
341
348
|
// thing under the pointer, so it stops looking like it.
|
|
342
349
|
this.#hoverKey = null;
|
|
343
350
|
this.#hoverRegion = "label";
|
|
@@ -385,7 +392,7 @@ export class SettingsApp {
|
|
|
385
392
|
return { consumed: true };
|
|
386
393
|
}
|
|
387
394
|
if (key === "up" || key === "down") {
|
|
388
|
-
//
|
|
395
|
+
// Compatibility: the keyboard starts from the value in effect rather than from the top.
|
|
389
396
|
menu.index = menu.index < 0
|
|
390
397
|
? menu.current
|
|
391
398
|
: Math.min(menu.choices.length - 1, Math.max(0, menu.index + (key === "down" ? 1 : -1)));
|
|
@@ -403,9 +410,20 @@ export class SettingsApp {
|
|
|
403
410
|
if (input === null)
|
|
404
411
|
return { consumed: false };
|
|
405
412
|
const key = KEYS[data];
|
|
413
|
+
if (key === "home" || key === "end") {
|
|
414
|
+
const rows = this.#rows();
|
|
415
|
+
const selectable = selectableIndexes(rows);
|
|
416
|
+
const target = key === "end" ? selectable.at(-1) : selectable[0];
|
|
417
|
+
if (target !== undefined) {
|
|
418
|
+
this.#select(rows, target);
|
|
419
|
+
if (key === "home")
|
|
420
|
+
this.#scroll = 0;
|
|
421
|
+
}
|
|
422
|
+
return { consumed: true };
|
|
423
|
+
}
|
|
406
424
|
if (key === "up" || key === "down" || key === "shift+up" || key === "shift+down") {
|
|
407
425
|
const rows = this.#rows();
|
|
408
|
-
//
|
|
426
|
+
// Rationale: nothing found means nothing to move through; the key is still swallowed
|
|
409
427
|
// rather than typed into the search.
|
|
410
428
|
if (selectableIndexes(rows).length === 0)
|
|
411
429
|
return { consumed: true, render: false };
|
|
@@ -437,7 +455,7 @@ export class SettingsApp {
|
|
|
437
455
|
}
|
|
438
456
|
const shown = this.#shownValue(entry);
|
|
439
457
|
if (typeof shown === "number") {
|
|
440
|
-
//
|
|
458
|
+
// Rationale: at the end of the range there is nothing to say: the arrow already reads
|
|
441
459
|
// as unavailable, so a message would only repeat it.
|
|
442
460
|
const next = steppedValue(rangeOf(entry), shown, delta);
|
|
443
461
|
if (next !== null)
|
|
@@ -458,25 +476,38 @@ export class SettingsApp {
|
|
|
458
476
|
}
|
|
459
477
|
#apply(entry, value) {
|
|
460
478
|
const key = `${entry.backend}:${entry.id}`;
|
|
461
|
-
//
|
|
479
|
+
// Invariant: shown immediately so the row never lags a keypress, and so the next press
|
|
462
480
|
// steps from here rather than from a value the source has not caught up to.
|
|
463
481
|
this.#pending.set(key, value);
|
|
464
482
|
void this.#session.change(entry.backend, entry.id, value).then(outcome => {
|
|
465
|
-
if (outcome.failure !== null) {
|
|
483
|
+
if (outcome.failure !== null || outcome.status === "failed") {
|
|
466
484
|
this.#pending.delete(key);
|
|
467
|
-
this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure}`;
|
|
485
|
+
this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure ?? "the effect failed"}`;
|
|
468
486
|
return;
|
|
469
487
|
}
|
|
470
|
-
|
|
488
|
+
if (outcome.status === "unavailable" || outcome.limitationReason !== null) {
|
|
489
|
+
this.#pending.delete(key);
|
|
490
|
+
this.#notice = outcome.limitationReason ?? `${labelOf(entry)} is unavailable`;
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
// Concurrency: a later press may have moved on; only the last request clears itself.
|
|
471
494
|
if (this.#pending.get(key) === value)
|
|
472
495
|
this.#pending.delete(key);
|
|
473
|
-
this.#notice = outcome.
|
|
496
|
+
this.#notice = outcome.status === "deferred" && outcome.application !== null
|
|
497
|
+
? `${labelOf(entry)} is stored and applies ${applicationLabel(outcome.application)}`
|
|
498
|
+
: null;
|
|
474
499
|
});
|
|
475
500
|
}
|
|
476
|
-
/** What the row shows: the value asked for if one is outstanding, else the source's. */
|
|
477
501
|
#shownValue(entry) {
|
|
478
502
|
return this.#pending.get(`${entry.backend}:${entry.id}`) ?? entry.value;
|
|
479
503
|
}
|
|
504
|
+
#scrollbarSpeed() {
|
|
505
|
+
const entry = this.#session.sections()
|
|
506
|
+
.flatMap(section => section.entries)
|
|
507
|
+
.find(candidate => candidate.backend === "a1" && candidate.id === "scrollbarSpeed");
|
|
508
|
+
const value = entry === undefined ? this.#session.value("scrollbarSpeed") : this.#shownValue(entry);
|
|
509
|
+
return isScrollbarSpeed(value) ? value : "normal";
|
|
510
|
+
}
|
|
480
511
|
#jump(rows, target) {
|
|
481
512
|
this.#select(rows, target);
|
|
482
513
|
this.#reveal = blockRowSpan(rows, target);
|
|
@@ -485,6 +516,7 @@ export class SettingsApp {
|
|
|
485
516
|
if (index < 0)
|
|
486
517
|
return;
|
|
487
518
|
this.#selectedKey = rowKey(rows[index]);
|
|
519
|
+
this.#selectionNeedsReveal = true;
|
|
488
520
|
this.#notice = null;
|
|
489
521
|
}
|
|
490
522
|
#rows() {
|
|
@@ -494,7 +526,7 @@ export class SettingsApp {
|
|
|
494
526
|
|| labelOf(entry).toLowerCase().includes(needle);
|
|
495
527
|
const rows = [];
|
|
496
528
|
for (const section of this.#session.sections()) {
|
|
497
|
-
//
|
|
529
|
+
// Rationale: a section named by the search is what the reader asked for, so it arrives
|
|
498
530
|
// whole rather than narrowed to the entries that happen to repeat its name.
|
|
499
531
|
const named = needle.length > 0 && section.title.toLowerCase().includes(needle);
|
|
500
532
|
const entries = named ? section.entries : section.entries.filter(matches);
|
|
@@ -510,7 +542,7 @@ export class SettingsApp {
|
|
|
510
542
|
if (section.readOnlyReason !== null && (needle.length === 0 || named)) {
|
|
511
543
|
rows.push({ kind: "note", group: section.id, text: section.readOnlyReason });
|
|
512
544
|
}
|
|
513
|
-
//
|
|
545
|
+
// Invariant: presented in the order the source reports, which is the order the
|
|
514
546
|
// pinned engine shows and is neither declaration order nor alphabetical.
|
|
515
547
|
for (const entry of entries) {
|
|
516
548
|
rows.push({
|
|
@@ -543,18 +575,18 @@ export class SettingsApp {
|
|
|
543
575
|
const hovered = this.#hoverKey === key;
|
|
544
576
|
return renderListRow(this.#viewRow(entry), { selected, hovered, region: this.#hoverRegion }, valueColumn, width, theme);
|
|
545
577
|
}
|
|
546
|
-
/** What the list view needs to draw a setting: its words, and where it can go. */
|
|
547
578
|
#viewRow(entry) {
|
|
548
579
|
const shown = this.#shownValue(entry);
|
|
549
580
|
const value = entry.structured
|
|
550
581
|
? CONFIGURE
|
|
551
|
-
: shown === null
|
|
582
|
+
: shown === null
|
|
583
|
+
? describeRaw(entry.rawValue)
|
|
584
|
+
: effectiveDisplay(entry, shown);
|
|
552
585
|
const range = rangeOf(entry);
|
|
553
586
|
return {
|
|
554
587
|
key: `${entry.backend}:${entry.id}`,
|
|
555
588
|
label: labelOf(entry),
|
|
556
589
|
value,
|
|
557
|
-
...(entry.origin === "default" ? { suffix: "(default)" } : {}),
|
|
558
590
|
...(typeof shown === "number" && entry.editable ? { stepper: stepperEnds(range, shown) } : {}),
|
|
559
591
|
};
|
|
560
592
|
}
|
|
@@ -578,13 +610,12 @@ export class SettingsApp {
|
|
|
578
610
|
this.#menuFrame = frame;
|
|
579
611
|
return renderValueMenu(lines, state, frame, theme);
|
|
580
612
|
}
|
|
581
|
-
/** What the panel needs to present a structured setting's parts. */
|
|
582
613
|
#dialogLines(open, width, theme) {
|
|
583
614
|
const rows = open.flags.map(key => {
|
|
584
615
|
const declared = open.entry.flags.find(flag => flag.key === key);
|
|
585
616
|
return {
|
|
586
617
|
label: declared?.label ?? humanizeLabel(key),
|
|
587
|
-
//
|
|
618
|
+
// Protocol: the engine writes these as the booleans they are rather than as yes/no.
|
|
588
619
|
value: (open.record[key] ?? false) ? "true" : "false",
|
|
589
620
|
...(declared?.description === undefined ? {} : { description: declared.description }),
|
|
590
621
|
};
|
|
@@ -597,14 +628,12 @@ export class SettingsApp {
|
|
|
597
628
|
const open = this.#structured;
|
|
598
629
|
if (open !== null)
|
|
599
630
|
return this.#dialogLines(open, width, theme);
|
|
600
|
-
|
|
601
|
-
// to something else.
|
|
602
|
-
const hint = this.#interruptArmed ? "press ctrl+c again to exit A1" : SETTINGS_SHORTCUTS.hint(SCOPE);
|
|
631
|
+
const hint = this.#interruptArmed ? "press ctrl+c again to exit a1" : SETTINGS_SHORTCUTS.hint(SCOPE);
|
|
603
632
|
const status = renderStatusLine({ hint, report: this.#notice }, width, theme);
|
|
604
633
|
const input = this.#filter;
|
|
605
634
|
if (input === null)
|
|
606
635
|
return [status];
|
|
607
|
-
return [...renderInputRow(input, width, { placeholder: SEARCH_PLACEHOLDER }).lines, status];
|
|
636
|
+
return [...renderInputRow(input, width, { placeholder: SEARCH_PLACEHOLDER, theme }).lines, status];
|
|
608
637
|
}
|
|
609
638
|
}
|
|
610
639
|
/** The source's own wording when it has one, otherwise the id made readable. */
|
|
@@ -624,6 +653,23 @@ function displayValue(value) {
|
|
|
624
653
|
return value ? "yes" : "no";
|
|
625
654
|
return String(value);
|
|
626
655
|
}
|
|
656
|
+
function effectiveDisplay(entry, stored) {
|
|
657
|
+
const effective = entry.effectiveValue;
|
|
658
|
+
if (effective === stored)
|
|
659
|
+
return displayValue(stored);
|
|
660
|
+
const shownEffective = typeof effective === "string" || typeof effective === "number" || typeof effective === "boolean"
|
|
661
|
+
? displayValue(effective)
|
|
662
|
+
: describeRaw(effective);
|
|
663
|
+
return `${displayValue(stored)} (effective ${shownEffective}; ${applicationLabel(entry.application)})`;
|
|
664
|
+
}
|
|
665
|
+
function applicationLabel(application) {
|
|
666
|
+
switch (application) {
|
|
667
|
+
case "live": return "live";
|
|
668
|
+
case "next-session": return "in the next session";
|
|
669
|
+
case "next-start": return "on the next start";
|
|
670
|
+
case "current-exit": return "when the current session exits";
|
|
671
|
+
}
|
|
672
|
+
}
|
|
627
673
|
function describeRaw(value) {
|
|
628
674
|
if (value === null || value === undefined)
|
|
629
675
|
return "unset";
|
|
@@ -631,3 +677,6 @@ function describeRaw(value) {
|
|
|
631
677
|
return Array.isArray(value) ? `${value.length} items` : "structured value";
|
|
632
678
|
return String(value);
|
|
633
679
|
}
|
|
680
|
+
function isScrollbarSpeed(value) {
|
|
681
|
+
return value === "normal" || value === "fast" || value === "high";
|
|
682
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface PromptImageSidecarAttachment {
|
|
2
|
+
readonly type: "image";
|
|
3
|
+
readonly data: string;
|
|
4
|
+
readonly mimeType: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PromptImageSidecarRecord {
|
|
7
|
+
readonly tag: string;
|
|
8
|
+
readonly data: string;
|
|
9
|
+
readonly mimeType: string;
|
|
10
|
+
readonly savedAt: string;
|
|
11
|
+
}
|
|
12
|
+
/** Extract every image chip identifier referenced by a recall text; identifiers are the hex bytes
|
|
13
|
+
* embedded in the tag by `PromptChipStore`. Ordering is left-to-right; duplicates are dropped. */
|
|
14
|
+
export declare function collectImageChipIdentifiers(text: string): string[];
|
|
15
|
+
/** Per-profile filesystem sidecar owning image chip payloads that survive a process restart.
|
|
16
|
+
* Writes are idempotent, reads are validated, and unlinks tolerate missing files. Callers must
|
|
17
|
+
* treat every failure as "the sidecar is unavailable"; that maps to the silent-strip contract. */
|
|
18
|
+
export declare class PromptImageSidecar {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(directory: string);
|
|
21
|
+
get directory(): string;
|
|
22
|
+
write(id: string, record: PromptImageSidecarRecord): void;
|
|
23
|
+
read(id: string): PromptImageSidecarRecord | null;
|
|
24
|
+
readAttachment(id: string): PromptImageSidecarAttachment | null;
|
|
25
|
+
/** Enumerate every sidecar identifier that currently has a file on disk. Ignores unrelated
|
|
26
|
+
* files silently; corrupt payloads are still listed so a caller sweep can reclaim them. */
|
|
27
|
+
list(): string[];
|
|
28
|
+
unlink(id: string): void;
|
|
29
|
+
/** Delete sidecars whose identifier is not present in `keep`. Used both by retention pruning
|
|
30
|
+
* of a specific row and by the store-open orphan sweep against every surviving row. */
|
|
31
|
+
sweep(keep: Iterable<string>): void;
|
|
32
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { chmodSync, mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, lstatSync } from "node:fs";
|
|
2
|
+
import { posix, win32 } from "node:path";
|
|
3
|
+
const IMAGE_TAG_PATTERN = /\[📷 screenshot-([a-f0-9]+)(?:-resized)?\]/gu;
|
|
4
|
+
const IMAGE_FILENAME_PATTERN = /^([a-f0-9]+)\.json$/u;
|
|
5
|
+
const MAX_SIDECAR_BYTES = 12 * 1024 * 1024;
|
|
6
|
+
/** Extract every image chip identifier referenced by a recall text; identifiers are the hex bytes
|
|
7
|
+
* embedded in the tag by `PromptChipStore`. Ordering is left-to-right; duplicates are dropped. */
|
|
8
|
+
export function collectImageChipIdentifiers(text) {
|
|
9
|
+
const seen = new Set();
|
|
10
|
+
IMAGE_TAG_PATTERN.lastIndex = 0;
|
|
11
|
+
for (;;) {
|
|
12
|
+
const match = IMAGE_TAG_PATTERN.exec(text);
|
|
13
|
+
if (match === null)
|
|
14
|
+
break;
|
|
15
|
+
seen.add(match[1]);
|
|
16
|
+
}
|
|
17
|
+
return [...seen];
|
|
18
|
+
}
|
|
19
|
+
/** Per-profile filesystem sidecar owning image chip payloads that survive a process restart.
|
|
20
|
+
* Writes are idempotent, reads are validated, and unlinks tolerate missing files. Callers must
|
|
21
|
+
* treat every failure as "the sidecar is unavailable"; that maps to the silent-strip contract. */
|
|
22
|
+
export class PromptImageSidecar {
|
|
23
|
+
#directory;
|
|
24
|
+
constructor(directory) {
|
|
25
|
+
this.#directory = directory;
|
|
26
|
+
}
|
|
27
|
+
get directory() { return this.#directory; }
|
|
28
|
+
write(id, record) {
|
|
29
|
+
if (!isValidId(id))
|
|
30
|
+
return;
|
|
31
|
+
this.#ensureDirectory();
|
|
32
|
+
const target = this.#pathFor(id);
|
|
33
|
+
try {
|
|
34
|
+
// Concurrency: another process may have written the same id; a subsequent overwrite is
|
|
35
|
+
// idempotent because sidecar payloads are keyed to a chip tag whose id already collided.
|
|
36
|
+
const temporary = `${target}.tmp`;
|
|
37
|
+
writeFileSync(temporary, JSON.stringify(record), { encoding: "utf8", mode: 0o600, flag: "w" });
|
|
38
|
+
try {
|
|
39
|
+
if (process.platform !== "win32")
|
|
40
|
+
chmodSync(temporary, 0o600);
|
|
41
|
+
}
|
|
42
|
+
catch { /* Compatibility: chmod is best-effort where the platform ignores it. */ }
|
|
43
|
+
renameSync(temporary, target);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Security: sidecar write failures never propagate into shell diagnostics or history rows.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
read(id) {
|
|
50
|
+
if (!isValidId(id))
|
|
51
|
+
return null;
|
|
52
|
+
try {
|
|
53
|
+
const target = this.#pathFor(id);
|
|
54
|
+
const status = lstatSync(target);
|
|
55
|
+
if (status.isSymbolicLink() || !status.isFile() || status.size > MAX_SIDECAR_BYTES)
|
|
56
|
+
return null;
|
|
57
|
+
const parsed = JSON.parse(readFileSync(target, "utf8"));
|
|
58
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
59
|
+
return null;
|
|
60
|
+
const record = parsed;
|
|
61
|
+
if (typeof record.tag !== "string" || typeof record.data !== "string"
|
|
62
|
+
|| typeof record.mimeType !== "string" || typeof record.savedAt !== "string"
|
|
63
|
+
|| record.data.length === 0 || record.tag.length === 0 || record.mimeType.length === 0)
|
|
64
|
+
return null;
|
|
65
|
+
return { tag: record.tag, data: record.data, mimeType: record.mimeType, savedAt: record.savedAt };
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
readAttachment(id) {
|
|
72
|
+
const record = this.read(id);
|
|
73
|
+
if (record === null)
|
|
74
|
+
return null;
|
|
75
|
+
return Object.freeze({ type: "image", data: record.data, mimeType: record.mimeType });
|
|
76
|
+
}
|
|
77
|
+
/** Enumerate every sidecar identifier that currently has a file on disk. Ignores unrelated
|
|
78
|
+
* files silently; corrupt payloads are still listed so a caller sweep can reclaim them. */
|
|
79
|
+
list() {
|
|
80
|
+
try {
|
|
81
|
+
const entries = readdirSync(this.#directory, { withFileTypes: true });
|
|
82
|
+
const ids = [];
|
|
83
|
+
for (const entry of entries) {
|
|
84
|
+
if (!entry.isFile())
|
|
85
|
+
continue;
|
|
86
|
+
const match = IMAGE_FILENAME_PATTERN.exec(entry.name);
|
|
87
|
+
if (match !== null)
|
|
88
|
+
ids.push(match[1]);
|
|
89
|
+
}
|
|
90
|
+
return ids;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
unlink(id) {
|
|
97
|
+
if (!isValidId(id))
|
|
98
|
+
return;
|
|
99
|
+
try {
|
|
100
|
+
unlinkSync(this.#pathFor(id));
|
|
101
|
+
}
|
|
102
|
+
catch { /* Compatibility: ENOENT / EBUSY is indistinguishable from an already-reaped sidecar. */ }
|
|
103
|
+
}
|
|
104
|
+
/** Delete sidecars whose identifier is not present in `keep`. Used both by retention pruning
|
|
105
|
+
* of a specific row and by the store-open orphan sweep against every surviving row. */
|
|
106
|
+
sweep(keep) {
|
|
107
|
+
const survivors = new Set(keep);
|
|
108
|
+
for (const id of this.list()) {
|
|
109
|
+
if (!survivors.has(id))
|
|
110
|
+
this.unlink(id);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
#ensureDirectory() {
|
|
114
|
+
try {
|
|
115
|
+
mkdirSync(this.#directory, { recursive: true, mode: 0o700 });
|
|
116
|
+
if (process.platform !== "win32")
|
|
117
|
+
chmodSync(this.#directory, 0o700);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Compatibility: the directory may already exist with a different mode we cannot change.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
#pathFor(id) {
|
|
124
|
+
const paths = process.platform === "win32" ? win32 : posix;
|
|
125
|
+
return paths.join(this.#directory, `${id}.json`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function isValidId(value) {
|
|
129
|
+
return typeof value === "string" && value.length > 0 && value.length <= 64 && /^[a-f0-9]+$/u.test(value);
|
|
130
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { PromptHistoryService } from "./service.js";
|
|
2
|
+
export { resolvePromptHistoryPath } from "./paths.js";
|
|
3
|
+
export { PromptImageSidecar, collectImageChipIdentifiers } from "./image-sidecar.js";
|
|
4
|
+
export type { PromptImageSidecarRecord, PromptImageSidecarAttachment } from "./image-sidecar.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { posix, win32 } from "node:path";
|
|
3
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
4
|
+
export function resolvePromptHistoryPath(dataDir, profileRoot, platform = process.platform) {
|
|
5
|
+
const paths = platform === "win32" ? win32 : posix;
|
|
6
|
+
if (!paths.isAbsolute(dataDir) || !paths.isAbsolute(profileRoot) || dataDir.includes("\0") || profileRoot.includes("\0"))
|
|
7
|
+
throw new TypeError("History requires absolute roots");
|
|
8
|
+
let normalized = paths.normalize(profileRoot);
|
|
9
|
+
if (normalized.length > paths.parse(normalized).root.length)
|
|
10
|
+
normalized = normalized.replace(/[\\/]+$/, "");
|
|
11
|
+
if (platform === "win32")
|
|
12
|
+
normalized = normalized.replaceAll("\\", "/").toLowerCase();
|
|
13
|
+
const digest = createHash("sha256").update(JSON.stringify([1, PRODUCT_IDENTITY.commandName, normalized])).digest("hex");
|
|
14
|
+
const profileId = `${PRODUCT_IDENTITY.filesystem.temporaryPrefix}${digest}`;
|
|
15
|
+
const historyDir = paths.join(dataDir, "history");
|
|
16
|
+
return { path: paths.join(historyDir, `${profileId}.sqlite3`), profileId, imagesDir: paths.join(historyDir, `${profileId}-images`) };
|
|
17
|
+
}
|