@timurproko/a1 0.2.6 → 0.2.7-dev.1222
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 +41 -3
- package/bin/automatic-update.js +7 -0
- package/bin/cli.js +4 -0
- package/bin/guardian.js +5 -0
- package/bin/tab-launch-context.d.ts +27 -0
- package/bin/tab-launch-context.js +94 -0
- package/bin/ui.js +107 -59
- package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
- package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
- package/dist/app/session-shell/dialog-coordinator.js +133 -0
- package/dist/app/session-shell/dock-chrome.d.ts +34 -0
- package/dist/app/session-shell/dock-chrome.js +109 -0
- package/dist/app/session-shell/exit-notice.d.ts +1 -1
- package/dist/app/session-shell/exit-notice.js +1 -1
- package/dist/app/session-shell/extension-surface.d.ts +30 -0
- package/dist/app/session-shell/extension-surface.js +105 -0
- package/dist/app/session-shell/helper-pool.d.ts +3 -5
- package/dist/app/session-shell/helper-pool.js +3 -5
- package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
- package/dist/app/session-shell/input-surface-switch.js +85 -0
- package/dist/app/session-shell/login-interaction.d.ts +27 -0
- package/dist/app/session-shell/login-interaction.js +91 -0
- package/dist/app/session-shell/prompt-submission.d.ts +48 -0
- package/dist/app/session-shell/prompt-submission.js +276 -0
- package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
- package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
- package/dist/app/session-shell/response-copy-helper.js +21 -6
- package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
- package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
- package/dist/app/session-shell/response-copy-transport.js +69 -17
- package/dist/app/session-shell/session-concern.d.ts +22 -0
- package/dist/app/session-shell/session-concern.js +29 -0
- package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
- package/dist/app/session-shell/session-lifecycle.js +49 -0
- package/dist/app/session-shell/session-shell-root.d.ts +42 -6
- package/dist/app/session-shell/session-shell-root.js +197 -908
- package/dist/app/session-shell/session-shell.d.ts +3 -8
- package/dist/app/session-shell/session-shell.js +327 -835
- package/dist/app/session-shell/session-viewport-controller.d.ts +2 -1
- package/dist/app/session-shell/session-viewport-controller.js +41 -38
- package/dist/app/session-shell/settings-bindings.d.ts +17 -0
- package/dist/app/session-shell/settings-bindings.js +91 -0
- package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
- package/dist/app/session-shell/shell-editor-factory.js +105 -0
- package/dist/app/session-shell/shell-host.d.ts +6 -0
- package/dist/app/session-shell/shell-host.js +34 -7
- package/dist/app/session-shell/shell-layout.d.ts +64 -0
- package/dist/app/session-shell/shell-layout.js +18 -0
- package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
- package/dist/app/session-shell/suggestion-surface.js +63 -0
- package/dist/app/session-shell/transcript-document.d.ts +78 -0
- package/dist/app/session-shell/transcript-document.js +365 -0
- package/dist/app/session-shell/viewport-layout.d.ts +31 -0
- package/dist/app/session-shell/viewport-layout.js +160 -0
- package/dist/app/session-shell/workflow-output.d.ts +33 -0
- package/dist/app/session-shell/workflow-output.js +174 -0
- package/dist/app/session-shell/workflow-router.d.ts +25 -0
- package/dist/app/session-shell/workflow-router.js +39 -0
- package/dist/cli/dispatch.d.ts +11 -1
- package/dist/cli/dispatch.js +79 -5
- package/dist/cli/tabs-request.d.ts +7 -0
- package/dist/cli/tabs-request.js +1 -0
- package/dist/cli/tabs.d.ts +14 -0
- package/dist/cli/tabs.js +151 -0
- package/dist/cli/version-stats.js +38 -3
- package/dist/composition/owned-settings.d.ts +12 -0
- package/dist/composition/owned-settings.js +36 -0
- package/dist/composition/owned-ui.d.ts +27 -28
- package/dist/composition/owned-ui.js +207 -153
- package/dist/composition/reference-selection-options.d.ts +3 -0
- package/dist/composition/reference-selection-options.js +16 -0
- package/dist/composition/resident-tab-bridge.d.ts +25 -0
- package/dist/composition/resident-tab-bridge.js +180 -0
- package/dist/composition/session-backend.d.ts +19 -0
- package/dist/composition/session-backend.js +1 -0
- package/dist/composition/session-runtime-registry.d.ts +20 -0
- package/dist/composition/session-runtime-registry.js +85 -0
- package/dist/composition/settings-route-host.d.ts +16 -2
- package/dist/composition/settings-route-host.js +42 -17
- package/dist/composition/settings-search-input.d.ts +9 -0
- package/dist/composition/settings-search-input.js +61 -0
- package/dist/composition/startup-route.d.ts +32 -0
- package/dist/composition/startup-route.js +72 -0
- package/dist/composition/utility-tab.d.ts +28 -0
- package/dist/composition/utility-tab.js +244 -0
- package/dist/contracts/owned-ui/index.d.ts +1 -1
- package/dist/contracts/owned-ui/model.d.ts +3 -0
- package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
- package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
- package/dist/contracts/presentation/index.d.ts +11 -0
- package/dist/contracts/presentation/index.js +12 -0
- package/dist/features/launch/development-launch.js +6 -0
- package/dist/features/launch/index.d.ts +1 -1
- package/dist/features/launch/intent.d.ts +3 -1
- package/dist/features/launch/intent.js +7 -4
- package/dist/features/launch/profile-paths.js +4 -0
- package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
- package/dist/features/owned-ui/plus-menu-dialog.js +84 -0
- package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
- package/dist/features/owned-ui/project-trust-dialog.js +6 -8
- package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
- package/dist/features/owned-ui/project-trust-prompt.js +7 -3
- package/dist/features/owned-ui/reference-document-selection.d.ts +30 -0
- package/dist/features/owned-ui/reference-document-selection.js +179 -0
- package/dist/features/owned-ui/reference-screen-app.d.ts +6 -1
- package/dist/features/owned-ui/reference-screen-app.js +51 -10
- package/dist/features/owned-ui/settings-app.d.ts +13 -2
- package/dist/features/owned-ui/settings-app.js +136 -97
- package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
- package/dist/features/owned-ui/settings-search-input.js +1 -0
- package/dist/features/prompt-history/index.d.ts +1 -1
- package/dist/features/prompt-history/paths.d.ts +2 -1
- package/dist/features/prompt-history/paths.js +10 -2
- package/dist/features/prompt-history/service.d.ts +5 -0
- package/dist/features/prompt-history/service.js +1 -1
- package/dist/features/resident-tab/auto-name.d.ts +11 -0
- package/dist/features/resident-tab/auto-name.js +44 -0
- package/dist/features/resident-tab/index.d.ts +5 -0
- package/dist/features/resident-tab/index.js +7 -0
- package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
- package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
- package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
- package/dist/features/resident-tab/shortcut-declarations.js +26 -0
- package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
- package/dist/features/resident-tab/shortcut-projection.js +64 -0
- package/dist/features/resident-tab/status-deriver.d.ts +10 -0
- package/dist/features/resident-tab/status-deriver.js +12 -0
- package/dist/foundation/launch-context/index.d.ts +12 -0
- package/dist/foundation/launch-context/index.js +26 -0
- package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
- package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
- package/dist/foundation/launch-guardian/main.d.ts +7 -1
- package/dist/foundation/launch-guardian/main.js +60 -7
- package/dist/foundation/lifecycle/session-repository-context.js +16 -2
- package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
- package/dist/foundation/process-containment/addon-containment.js +139 -0
- package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
- package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
- package/dist/foundation/process-containment/addon.d.ts +42 -0
- package/dist/foundation/process-containment/addon.js +57 -0
- package/dist/foundation/process-containment/artifact.d.ts +1 -1
- package/dist/foundation/process-containment/artifact.js +6 -5
- package/dist/foundation/process-containment/contracts.d.ts +2 -0
- package/dist/foundation/process-containment/index.d.ts +4 -4
- package/dist/foundation/process-containment/index.js +3 -3
- package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
- package/dist/foundation/process-containment/native-process-inspector.js +10 -10
- package/dist/foundation/release/automatic-update.d.ts +37 -0
- package/dist/foundation/release/automatic-update.js +265 -0
- package/dist/foundation/release/bootstrap.d.ts +7 -9
- package/dist/foundation/release/bootstrap.js +107 -24
- package/dist/foundation/release/cohort-state.d.ts +1 -1
- package/dist/foundation/release/cohort-state.js +1 -1
- package/dist/foundation/release/dependency-certification.js +54 -19
- package/dist/foundation/release/early-accent.d.ts +12 -0
- package/dist/foundation/release/early-accent.js +59 -0
- package/dist/foundation/release/index.d.ts +2 -2
- package/dist/foundation/release/index.js +2 -2
- package/dist/foundation/release/latest-release.d.ts +24 -2
- package/dist/foundation/release/latest-release.js +51 -1
- package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
- package/dist/foundation/release/progress-palette.generated.js +137 -3
- package/dist/foundation/release/release-gc.d.ts +3 -0
- package/dist/foundation/release/release-gc.js +59 -8
- package/dist/foundation/release/release-store.d.ts +12 -0
- package/dist/foundation/release/release-store.js +124 -2
- package/dist/foundation/release/update-execution-lease.d.ts +48 -0
- package/dist/foundation/release/update-execution-lease.js +161 -0
- package/dist/foundation/release/update.d.ts +12 -7
- package/dist/foundation/release/update.js +281 -196
- package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
- package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
- package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
- package/dist/foundation/resident-tabs/bridge-client.js +321 -0
- package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
- package/dist/foundation/resident-tabs/doctor.js +166 -0
- package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
- package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
- package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
- package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
- package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
- package/dist/foundation/resident-tabs/fault-injection.js +26 -0
- package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
- package/dist/foundation/resident-tabs/fixture-control.js +35 -0
- package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
- package/dist/foundation/resident-tabs/host-entry.js +17 -0
- package/dist/foundation/resident-tabs/index.d.ts +12 -0
- package/dist/foundation/resident-tabs/index.js +6 -0
- package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
- package/dist/foundation/resident-tabs/maintenance.js +75 -0
- package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
- package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
- package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
- package/dist/foundation/resident-tabs/progress-observation.js +150 -0
- package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
- package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
- package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
- package/dist/foundation/resident-tabs/protocol.js +195 -0
- package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
- package/dist/foundation/resident-tabs/recovery.js +205 -0
- package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
- package/dist/foundation/resident-tabs/release-holds.js +75 -0
- package/dist/foundation/resident-tabs/routes.d.ts +5 -0
- package/dist/foundation/resident-tabs/routes.js +5 -0
- package/dist/foundation/resident-tabs/routing.d.ts +11 -0
- package/dist/foundation/resident-tabs/routing.js +10 -0
- package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
- package/dist/foundation/resident-tabs/session-sync.js +37 -0
- package/dist/foundation/resident-tabs/settings.d.ts +12 -0
- package/dist/foundation/resident-tabs/settings.js +58 -0
- package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
- package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
- package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
- package/dist/foundation/resident-tabs/zip-archive.js +56 -0
- package/dist/foundation/session-writer-lock/index.d.ts +30 -0
- package/dist/foundation/session-writer-lock/index.js +203 -0
- package/dist/foundation/startup/startup-descriptor.js +2 -2
- package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
- package/dist/foundation/terminal-cleanup/index.js +1 -1
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
- package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
- package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
- package/dist/integrations/pi/components/modal-frame.js +48 -9
- package/dist/integrations/pi/components/models-dialog.js +4 -52
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
- package/dist/integrations/pi/components/owned-editor-ux.js +138 -11
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
- package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
- package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
- package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
- package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
- package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
- package/dist/integrations/pi/components/shell-footer-status.js +21 -5
- package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
- package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
- package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
- package/dist/integrations/pi/components/skills-dialog.js +2 -2
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
- package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
- package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
- package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
- package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
- package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
- package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
- package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
- package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
- package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
- package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
- package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
- package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
- package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
- package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
- package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
- package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
- package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
- package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
- package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
- package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
- package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
- package/dist/integrations/pi/engine/adapter.d.ts +5 -77
- package/dist/integrations/pi/engine/adapter.js +95 -394
- package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
- package/dist/integrations/pi/engine/command-dispatch.js +57 -0
- package/dist/integrations/pi/engine/host.js +2 -2
- package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
- package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
- package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
- package/dist/integrations/pi/engine/ports.d.ts +56 -0
- package/dist/integrations/pi/engine/ports.js +93 -0
- package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
- package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
- package/dist/integrations/pi/engine/resources/changelog.json +4 -4
- package/dist/integrations/pi/engine/runtime-integration.js +102 -29
- package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
- package/dist/integrations/pi/engine/session-runtime.js +13 -5
- package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
- package/dist/integrations/pi/engine/session-selection.js +45 -9
- package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
- package/dist/integrations/pi/engine/settings-bridge.js +15 -0
- package/dist/integrations/pi/engine/settings-port.js +11 -15
- package/dist/integrations/pi/engine/view-state.d.ts +42 -0
- package/dist/integrations/pi/engine/view-state.js +126 -0
- package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
- package/dist/integrations/pi/engine/workflow-runner.js +74 -5
- package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
- package/dist/integrations/pi/engine/workflow-support.js +36 -0
- package/dist/integrations/pi/engine/workflows.d.ts +3 -1
- package/dist/integrations/pi/engine/workflows.js +1 -0
- package/dist/integrations/pi/startup-public.js +257 -310
- package/dist/integrations/pi/startup-public.manifest.json +564 -440
- package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
- package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
- package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
- package/dist/native/darwin-arm64/manifest.json +10 -7
- package/dist/native/darwin-arm64/process-guardian.node +0 -0
- package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
- package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
- package/dist/native/darwin-arm64/terminal-host.node +0 -0
- package/dist/native/darwin-x64/manifest.json +23 -0
- package/dist/native/darwin-x64/process-guardian.node +0 -0
- package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
- package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
- package/dist/native/darwin-x64/terminal-host.node +0 -0
- package/dist/native/linux-x64/manifest.json +10 -7
- package/dist/native/linux-x64/process-guardian.node +0 -0
- package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
- package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
- package/dist/native/linux-x64/terminal-host.node +0 -0
- package/dist/native/win32-x64/manifest.json +10 -7
- package/dist/native/win32-x64/process-guardian.node +0 -0
- package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
- package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
- package/dist/native/win32-x64/terminal-host.node +0 -0
- package/dist/product-identity.d.ts +3 -3
- package/dist/product-identity.js +4 -4
- package/dist/product-identity.json +16 -2
- package/dist/runtime-payload-inventory.json +6330 -6677
- package/dist/ui/apps/host.d.ts +2 -0
- package/dist/ui/apps/host.js +7 -1
- package/dist/ui/components/dialog-panel.d.ts +17 -8
- package/dist/ui/components/dialog-panel.js +117 -41
- package/dist/ui/components/index.d.ts +5 -5
- package/dist/ui/components/index.js +4 -4
- package/dist/ui/components/line-input.d.ts +4 -1
- package/dist/ui/components/line-input.js +3 -1
- package/dist/ui/components/prompt-input.d.ts +11 -8
- package/dist/ui/components/prompt-input.js +15 -13
- package/dist/ui/components/scrollbar.d.ts +1 -1
- package/dist/ui/components/scrollbar.js +1 -1
- package/dist/ui/components/selection-copy.d.ts +3 -3
- package/dist/ui/components/selection-copy.js +16 -1
- package/dist/ui/components/spans.js +2 -2
- package/dist/ui/components/submitted-prompt.d.ts +9 -6
- package/dist/ui/components/submitted-prompt.js +20 -12
- package/dist/ui/components/surface.js +4 -2
- package/dist/ui/components/text-selection.d.ts +1 -2
- package/dist/ui/components/text-selection.js +5 -2
- package/dist/ui/components/text.d.ts +3 -6
- package/dist/ui/components/text.js +6 -8
- package/dist/ui/components/transcript-viewport.d.ts +9 -2
- package/dist/ui/components/transcript-viewport.js +179 -58
- package/dist/ui/settings/declarations.d.ts +90 -16
- package/dist/ui/settings/declarations.js +67 -14
- package/dist/ui/settings/early-accent.d.ts +81 -0
- package/dist/ui/settings/early-accent.js +50 -0
- package/dist/ui/settings/index.d.ts +4 -2
- package/dist/ui/settings/index.js +2 -1
- package/dist/ui/settings/manager.d.ts +16 -3
- package/dist/ui/settings/manager.js +122 -33
- package/dist/ui/settings/migrations.d.ts +6 -0
- package/dist/ui/settings/migrations.js +73 -0
- package/dist/ui/settings/profile-document.d.ts +26 -0
- package/dist/ui/settings/profile-document.js +164 -0
- package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
- package/dist/ui/settings/progress-palette.generated.js +139 -0
- package/dist/ui/settings/sections.d.ts +4 -0
- package/dist/ui/settings/sections.js +9 -3
- package/docs/architecture/boundaries.md +24 -9
- package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
- package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
- package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
- package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
- package/docs/architecture/internal-naming.md +3 -1
- package/docs/architecture/process-guardian-provenance.md +18 -10
- package/docs/architecture/project-structure.md +8 -0
- package/docs/architecture/resident-tabs-requirements.md +18 -0
- package/docs/architecture/resident-tabs.md +649 -0
- package/docs/architecture/response-copy-delivery.md +1 -1
- package/docs/architecture/terminal-host-proof-gate.md +2 -0
- package/docs/architecture/terminal-host-provenance.md +16 -4
- package/docs/architecture/tool-image-presentation.md +2 -1
- package/docs/architecture/toolchain.md +11 -9
- package/docs/ci-release-runbook.md +14 -7
- package/docs/features/launch-profiles.md +11 -8
- package/docs/features/prompt-history.md +41 -20
- package/docs/manual-resident-tabs-acceptance.md +51 -0
- package/docs/openspec-archive-automation.md +49 -22
- package/docs/validation.md +49 -9
- package/package.json +19 -6
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
- package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
- package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
- package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
- package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/process-guardian.exe +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DIALOG_BACK_SHORTCUT_HINT, DIALOG_CLOSE_SHORTCUT_HINT } from "../../contracts/presentation/index.js";
|
|
2
|
-
import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, numericValues, RAIL_COLUMNS, renderDialogPanel, renderSteppedDialogPanel, renderEmptyState, renderGroupHeader,
|
|
2
|
+
import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, numericValues, RAIL_COLUMNS, renderCenteredDialogOverlay, renderDialogPanel, renderSteppedDialogPanel, renderEmptyState, renderGroupHeader, renderListRow, renderNote, renderShortcutHintsWithClose, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, truncateToWidth, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, formatLocalTime, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, layoutList, moveSelection, rowKey, scrollForSelection, scrollForTrackPage, scrollbarGeometry, scrollbarPresentation, ScrollbarRails, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
|
|
3
|
+
import { PLUS_MENU_SETTING_ID, PlusMenuDialog } from "./plus-menu-dialog.js";
|
|
3
4
|
import { SETTINGS_APP_ID } from "./settings-route.js";
|
|
4
5
|
export { SETTINGS_APP_ID, SETTINGS_ROUTE } from "./settings-route.js";
|
|
5
6
|
const SCOPE = SETTINGS_APP_ID;
|
|
@@ -19,11 +20,10 @@ const RAIL_KEY = "settings";
|
|
|
19
20
|
// Compatibility: the transcript rail stays lit this long after a scroll, and repaints just after.
|
|
20
21
|
const SCROLL_LINGER_MS = 900;
|
|
21
22
|
const SCROLL_LINGER_REPAINT_MS = 925;
|
|
22
|
-
const SEARCH_PLACEHOLDER = "search settings";
|
|
23
23
|
/** What a structured value offers instead of printing itself. */
|
|
24
24
|
const CONFIGURE = "configure";
|
|
25
25
|
export const SETTINGS_SHORTCUTS = new ShortcutRegistry();
|
|
26
|
-
SETTINGS_SHORTCUTS.declare({ key: "
|
|
26
|
+
SETTINGS_SHORTCUTS.declare({ key: "edit", scope: SCOPE, description: "Search settings", section: "Change", hint: { keys: "Type", does: "search" } }, "edit-filter");
|
|
27
27
|
SETTINGS_SHORTCUTS.declare({ key: "up", scope: SCOPE, description: "Previous setting", section: "Navigate", hint: { keys: "↑↓", does: "navigate" } }, "move-up");
|
|
28
28
|
SETTINGS_SHORTCUTS.declare({ key: "down", scope: SCOPE, description: "Next setting", section: "Navigate", hint: { keys: "↑↓", does: "navigate" } }, "move-down");
|
|
29
29
|
SETTINGS_SHORTCUTS.declare({ key: "shift+up", scope: SCOPE, description: "Previous section", section: "Navigate", hint: { keys: "Shift+↑↓", does: "jump" } }, "block-up");
|
|
@@ -78,7 +78,6 @@ const KEYS = {
|
|
|
78
78
|
"\r": "enter",
|
|
79
79
|
"\n": "enter",
|
|
80
80
|
" ": "space",
|
|
81
|
-
"/": "/",
|
|
82
81
|
"\u001a": "ctrl+z",
|
|
83
82
|
};
|
|
84
83
|
/**
|
|
@@ -94,12 +93,9 @@ export class SettingsApp {
|
|
|
94
93
|
// Invariant: keyboard navigation requests visibility once; pointer scrolling then stays free.
|
|
95
94
|
#selectionNeedsReveal = true;
|
|
96
95
|
#reveal;
|
|
97
|
-
#
|
|
98
|
-
#filter = null;
|
|
99
|
-
#scrollBeforeFilter = null;
|
|
96
|
+
#search;
|
|
100
97
|
#menu = null;
|
|
101
98
|
#structured = null;
|
|
102
|
-
#interruptArmed = false;
|
|
103
99
|
// Invariant: pending values remain visible until the source reflects them.
|
|
104
100
|
#pending = new Map();
|
|
105
101
|
#undoHistory = [];
|
|
@@ -122,8 +118,24 @@ export class SettingsApp {
|
|
|
122
118
|
#activeUntil = 0;
|
|
123
119
|
#activityTimer;
|
|
124
120
|
#renderedScroll;
|
|
125
|
-
|
|
121
|
+
#options;
|
|
122
|
+
/**
|
|
123
|
+
* `pinned` presents the screen as a resident Settings tab, which offers no screen-level close;
|
|
124
|
+
* `configurePlusMenu` opens the tab bar's Plus Menu dialog in place of this screen's own.
|
|
125
|
+
*/
|
|
126
|
+
constructor(session, options) {
|
|
126
127
|
this.#session = session;
|
|
128
|
+
this.#options = {
|
|
129
|
+
pinned: options.pinned === true,
|
|
130
|
+
configurePlusMenu: options.configurePlusMenu ?? null,
|
|
131
|
+
dialogPanel: options.dialogPanel ?? null,
|
|
132
|
+
};
|
|
133
|
+
this.#search = {
|
|
134
|
+
input: null,
|
|
135
|
+
scrollBefore: null,
|
|
136
|
+
factory: options.searchInputFactory,
|
|
137
|
+
copyText: options.copyText ?? (() => { }),
|
|
138
|
+
};
|
|
127
139
|
}
|
|
128
140
|
onActivate(host) {
|
|
129
141
|
this.#closed = false;
|
|
@@ -133,18 +145,18 @@ export class SettingsApp {
|
|
|
133
145
|
this.#closed = true;
|
|
134
146
|
this.#undoHistory.length = 0;
|
|
135
147
|
this.#undoRequests = 0;
|
|
148
|
+
this.#search.input?.setFocused(false);
|
|
149
|
+
this.#search.input = null;
|
|
136
150
|
this.#clearActivityTimer();
|
|
137
151
|
this.#rails.clear();
|
|
138
152
|
}
|
|
139
153
|
render(rect, host) {
|
|
140
154
|
const theme = host.theme ?? PLAIN_THEME;
|
|
141
|
-
this.#
|
|
142
|
-
const rows = this.#rows();
|
|
143
|
-
const selected = indexOfKey(rows, this.#selectedKey);
|
|
155
|
+
const rows = this.#rows(), selected = indexOfKey(rows, this.#selectedKey);
|
|
144
156
|
const footer = this.#footerLines(rect.width, theme);
|
|
145
|
-
// Invariant:
|
|
146
|
-
//
|
|
147
|
-
const dividerRows = this.#
|
|
157
|
+
// Invariant: search owns its ruled footer. Configure dialogs float over the complete ordinary
|
|
158
|
+
// Settings frame, so the standing divider and guidance remain visible in the dimmed backdrop.
|
|
159
|
+
const dividerRows = this.#search.input === null ? SETTINGS_FOOTER_DIVIDER_ROWS : 0;
|
|
148
160
|
const topRows = Math.min(SETTINGS_TOP_RULE_ROWS, rect.height);
|
|
149
161
|
const contentHeight = Math.max(0, rect.height - topRows - dividerRows - footer.length);
|
|
150
162
|
let titleRows = this.#scroll <= 0 ? Math.min(SETTINGS_TITLE_ROWS, contentHeight) : 0;
|
|
@@ -205,7 +217,7 @@ export class SettingsApp {
|
|
|
205
217
|
const body = [];
|
|
206
218
|
this.#frameRows = [];
|
|
207
219
|
if (rows.length === 0) {
|
|
208
|
-
body.push(...renderEmptyState("No settings found
|
|
220
|
+
body.push(...renderEmptyState("No settings found", "👀", bodyHeight, contentWidth, theme));
|
|
209
221
|
}
|
|
210
222
|
else {
|
|
211
223
|
if (layout.topPadding > 0)
|
|
@@ -237,30 +249,36 @@ export class SettingsApp {
|
|
|
237
249
|
});
|
|
238
250
|
const rule = theme.fg("border", "─".repeat(Math.max(0, rect.width)));
|
|
239
251
|
const frame = this.#withMenu([rule, ...withRail, ...(dividerRows === 0 ? [] : [rule]), ...footer], selected, layout, valueColumn, theme, rect, reservesRail ? RAIL_COLUMNS : 0);
|
|
240
|
-
|
|
252
|
+
const complete = frame.slice(0, rect.height).concat(Array(Math.max(0, rect.height - frame.length)).fill("")), open = this.#structured, dialogTheme = this.#options.dialogPanel === null ? theme : { ...theme, panel: this.#options.dialogPanel };
|
|
253
|
+
return open === null ? complete : renderCenteredDialogOverlay(complete, this.#dialogLines(open, configureDialogWidth(rect.width), rect.height, dialogTheme), rect, dialogTheme);
|
|
241
254
|
}
|
|
242
255
|
onInput(data, host) {
|
|
256
|
+
if (data === "\u0003" && this.#search.input === null)
|
|
257
|
+
return { consumed: false };
|
|
243
258
|
if (this.#structured !== null)
|
|
244
259
|
return this.#structuredKey(data);
|
|
245
260
|
if (this.#menu !== null)
|
|
246
261
|
return this.#menuKey(data);
|
|
247
|
-
if (this.#
|
|
262
|
+
if (this.#search.input !== null)
|
|
248
263
|
return this.#filterKey(data);
|
|
249
|
-
const key = KEYS[data]
|
|
250
|
-
const action = SETTINGS_SHORTCUTS.resolve(key, SCOPE);
|
|
251
|
-
if (action === null)
|
|
252
|
-
|
|
264
|
+
const key = KEYS[data];
|
|
265
|
+
const action = key === undefined ? null : SETTINGS_SHORTCUTS.resolve(key, SCOPE);
|
|
266
|
+
if (action === null) {
|
|
267
|
+
if (!this.#search.factory.isTextInput(data))
|
|
268
|
+
return { consumed: false };
|
|
269
|
+
openSettingsSearch(this.#search, host, data, this.#scroll);
|
|
270
|
+
this.#scroll = 0;
|
|
271
|
+
return { consumed: true };
|
|
272
|
+
}
|
|
253
273
|
const rows = this.#rows();
|
|
254
274
|
const selected = indexOfKey(rows, this.#selectedKey);
|
|
255
275
|
switch (action) {
|
|
256
276
|
case "close":
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
case "open-filter":
|
|
260
|
-
this.#scrollBeforeFilter = this.#scroll;
|
|
261
|
-
this.#filter = new LineInput("");
|
|
262
|
-
this.#notice = null;
|
|
277
|
+
if (!this.#options.pinned)
|
|
278
|
+
host.close();
|
|
263
279
|
return { consumed: true };
|
|
280
|
+
case "edit-filter":
|
|
281
|
+
return { consumed: false };
|
|
264
282
|
case "activate": {
|
|
265
283
|
const row = rows[selected];
|
|
266
284
|
if (row?.kind === "element" && row.value.structured)
|
|
@@ -310,6 +328,9 @@ export class SettingsApp {
|
|
|
310
328
|
}
|
|
311
329
|
}
|
|
312
330
|
onMouse(event, _host) {
|
|
331
|
+
const searchPointer = handleSettingsSearchPointer(this.#search, event, this.#panelTopForFrame);
|
|
332
|
+
if (searchPointer !== null)
|
|
333
|
+
return searchPointer;
|
|
313
334
|
const menu = this.#menu;
|
|
314
335
|
const frame = this.#menuFrame;
|
|
315
336
|
if (menu !== null && frame !== null) {
|
|
@@ -349,13 +370,13 @@ export class SettingsApp {
|
|
|
349
370
|
// Invariant: the whole list pane owns wheel scrolling, including blank space beside
|
|
350
371
|
// short labels. A fixed structured dialog keeps that content interaction available.
|
|
351
372
|
const screenRow = event.row - 1;
|
|
352
|
-
const wheelBottom = this.#
|
|
373
|
+
const wheelBottom = this.#search.input === null
|
|
353
374
|
? this.#bodyTopForFrame + this.#bodyHeightForFrame
|
|
354
375
|
: this.#panelTopForFrame + SETTINGS_SEARCH_INPUT_ROWS + SETTINGS_STATUS_ROWS;
|
|
355
376
|
if (screenRow >= 0 && screenRow < wheelBottom) {
|
|
356
377
|
const distance = scrollbarWheelRows(this.#scrollbarSpeed());
|
|
357
|
-
if (this.#
|
|
358
|
-
this.#
|
|
378
|
+
if (this.#search.input !== null)
|
|
379
|
+
this.#search.scrollBefore = null;
|
|
359
380
|
this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? distance : -distance));
|
|
360
381
|
return { consumed: true };
|
|
361
382
|
}
|
|
@@ -385,7 +406,6 @@ export class SettingsApp {
|
|
|
385
406
|
const index = rows.findIndex(candidate => rowKey(candidate) === row.key);
|
|
386
407
|
if (index >= 0) {
|
|
387
408
|
// Rationale: the pointer acts where it points; the arrow belongs to the keyboard.
|
|
388
|
-
this.#notice = null;
|
|
389
409
|
if (this.#hoverRegion === "minus")
|
|
390
410
|
this.#cycle(rows, index, -1);
|
|
391
411
|
else if (this.#hoverRegion === "plus")
|
|
@@ -458,10 +478,8 @@ export class SettingsApp {
|
|
|
458
478
|
// and pointing at it is not a request for anything else.
|
|
459
479
|
if (typeof shown === "number")
|
|
460
480
|
return;
|
|
461
|
-
if (!entry.editable || entry.choices === null || entry.choices.length === 0)
|
|
462
|
-
this.#notice = `${labelOf(entry)} cannot be changed here`;
|
|
481
|
+
if (!entry.editable || entry.choices === null || entry.choices.length === 0)
|
|
463
482
|
return;
|
|
464
|
-
}
|
|
465
483
|
const current = shown === null ? 0 : Math.max(0, entry.choices.indexOf(shown));
|
|
466
484
|
const anchorKey = `${entry.backend}:${entry.id}`;
|
|
467
485
|
// Compatibility: pointer opening already brightens the source value. Enter borrows that
|
|
@@ -492,10 +510,11 @@ export class SettingsApp {
|
|
|
492
510
|
#openStructured(entry) {
|
|
493
511
|
// Invariant: the flags come from the declaration, not from the stored value: an unset
|
|
494
512
|
// flag still has a row, showing the default the source would apply.
|
|
495
|
-
if (entry.flags.length === 0)
|
|
496
|
-
|
|
513
|
+
if (entry.flags.length === 0)
|
|
514
|
+
return;
|
|
515
|
+
// Rationale: beside a tab bar, its own Plus Menu dialog configures `+`, so both ways look the same.
|
|
516
|
+
if (entry.backend === "a1" && entry.id === PLUS_MENU_SETTING_ID && this.#options.configurePlusMenu?.() === true)
|
|
497
517
|
return;
|
|
498
|
-
}
|
|
499
518
|
const stored = typeof entry.rawValue === "object" && entry.rawValue !== null && !Array.isArray(entry.rawValue)
|
|
500
519
|
? entry.rawValue
|
|
501
520
|
: {};
|
|
@@ -516,6 +535,7 @@ export class SettingsApp {
|
|
|
516
535
|
entry,
|
|
517
536
|
flags: entry.flags.map(flag => flag.key),
|
|
518
537
|
modelDialog,
|
|
538
|
+
plusMenu: entry.backend === "a1" && entry.id === PLUS_MENU_SETTING_ID ? new PlusMenuDialog(entry.flags) : null,
|
|
519
539
|
filter: modelDialog ? new LineInput("") : null,
|
|
520
540
|
step: "model",
|
|
521
541
|
modelKey: null,
|
|
@@ -530,6 +550,12 @@ export class SettingsApp {
|
|
|
530
550
|
return { consumed: false };
|
|
531
551
|
if (open.modelDialog)
|
|
532
552
|
return this.#modelDialogKey(open, data);
|
|
553
|
+
if (open.plusMenu !== null) {
|
|
554
|
+
const outcome = open.plusMenu.handle(KEYS[data] ?? data, data, key => this.#toggleFlag(open.flags.indexOf(key)));
|
|
555
|
+
if (outcome === "close")
|
|
556
|
+
this.#structured = null;
|
|
557
|
+
return { consumed: true };
|
|
558
|
+
}
|
|
533
559
|
switch (SETTINGS_SHORTCUTS.resolve(KEYS[data] ?? data, DIALOG_SCOPE)) {
|
|
534
560
|
case "close":
|
|
535
561
|
this.#structured = null;
|
|
@@ -648,13 +674,11 @@ export class SettingsApp {
|
|
|
648
674
|
const failure = changeFailure(outcome);
|
|
649
675
|
if (failure === null) {
|
|
650
676
|
this.#recordUndo({ kind: "structured", sequence, entry: open.entry, previous, forward });
|
|
651
|
-
this.#notice = null;
|
|
652
677
|
return;
|
|
653
678
|
}
|
|
654
679
|
// Concurrency: only roll back the dialog if no later press has moved the record on.
|
|
655
680
|
if (this.#structured === open && sameRecord(open.record, forward))
|
|
656
681
|
replaceRecord(open.record, previous);
|
|
657
|
-
this.#notice = `Could not save ${labelOf(open.entry)}: ${failure}`;
|
|
658
682
|
});
|
|
659
683
|
}
|
|
660
684
|
#menuKey(data) {
|
|
@@ -686,18 +710,18 @@ export class SettingsApp {
|
|
|
686
710
|
return { consumed: true };
|
|
687
711
|
}
|
|
688
712
|
#filterKey(data) {
|
|
689
|
-
const input = this.#
|
|
713
|
+
const input = this.#search.input;
|
|
690
714
|
if (input === null)
|
|
691
715
|
return { consumed: false };
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
this.#undo();
|
|
716
|
+
if (data === "\u001b" || (data === "\u0003" && !input.hasSelection())) {
|
|
717
|
+
this.#scroll = closeSettingsSearch(this.#search) ?? this.#scroll;
|
|
695
718
|
return { consumed: true };
|
|
696
719
|
}
|
|
720
|
+
const key = KEYS[data];
|
|
697
721
|
// Rationale: the boundary chords jump through the results; plain Home and End stay with
|
|
698
|
-
// the search cursor, which the shared
|
|
722
|
+
// the search cursor, which the shared interactive input moves below.
|
|
699
723
|
if (key === "ctrl+home" || key === "ctrl+end") {
|
|
700
|
-
this.#
|
|
724
|
+
this.#search.scrollBefore = null;
|
|
701
725
|
const rows = this.#rows();
|
|
702
726
|
const selectable = selectableIndexes(rows);
|
|
703
727
|
const target = key === "ctrl+end" ? selectable.at(-1) : selectable[0];
|
|
@@ -709,7 +733,7 @@ export class SettingsApp {
|
|
|
709
733
|
return { consumed: true };
|
|
710
734
|
}
|
|
711
735
|
if (key === "up" || key === "down" || key === "shift+up" || key === "shift+down") {
|
|
712
|
-
this.#
|
|
736
|
+
this.#search.scrollBefore = null;
|
|
713
737
|
const rows = this.#rows();
|
|
714
738
|
// Rationale: nothing found means nothing to move through; the key is still swallowed
|
|
715
739
|
// rather than typed into the search.
|
|
@@ -726,15 +750,10 @@ export class SettingsApp {
|
|
|
726
750
|
this.#select(rows, moveSelection(rows, selected, forward ? 1 : -1));
|
|
727
751
|
return { consumed: true };
|
|
728
752
|
}
|
|
729
|
-
const
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
this.#scroll = this.#scrollBeforeFilter;
|
|
734
|
-
this.#scrollBeforeFilter = null;
|
|
735
|
-
}
|
|
736
|
-
else {
|
|
737
|
-
this.#scrollBeforeFilter = null;
|
|
753
|
+
const before = input.getText();
|
|
754
|
+
input.handleInput(data);
|
|
755
|
+
if (input.getText() !== before) {
|
|
756
|
+
this.#search.scrollBefore = null;
|
|
738
757
|
this.#scroll = 0;
|
|
739
758
|
}
|
|
740
759
|
return { consumed: true };
|
|
@@ -744,10 +763,8 @@ export class SettingsApp {
|
|
|
744
763
|
if (row === undefined || row.kind !== "element")
|
|
745
764
|
return;
|
|
746
765
|
const entry = row.value;
|
|
747
|
-
if (!entry.editable)
|
|
748
|
-
this.#notice = `${labelOf(entry)} cannot be changed here`;
|
|
766
|
+
if (!entry.editable)
|
|
749
767
|
return;
|
|
750
|
-
}
|
|
751
768
|
const shown = this.#shownValue(entry);
|
|
752
769
|
if (typeof shown === "number") {
|
|
753
770
|
// Rationale: at the end of the range there is nothing to say: the arrow already reads
|
|
@@ -758,10 +775,8 @@ export class SettingsApp {
|
|
|
758
775
|
return;
|
|
759
776
|
}
|
|
760
777
|
const choices = entry.choices;
|
|
761
|
-
if (choices === null || choices.length === 0)
|
|
762
|
-
this.#notice = `${labelOf(entry)} cannot be changed here`;
|
|
778
|
+
if (choices === null || choices.length === 0)
|
|
763
779
|
return;
|
|
764
|
-
}
|
|
765
780
|
const current = shown === null ? -1 : choices.indexOf(shown);
|
|
766
781
|
const next = choices[current < 0
|
|
767
782
|
? (delta > 0 ? 0 : choices.length - 1)
|
|
@@ -781,7 +796,6 @@ export class SettingsApp {
|
|
|
781
796
|
if (failure !== null) {
|
|
782
797
|
if (this.#pending.get(key) === value)
|
|
783
798
|
this.#pending.delete(key);
|
|
784
|
-
this.#notice = `Could not save ${labelOf(entry)}: ${failure}`;
|
|
785
799
|
return;
|
|
786
800
|
}
|
|
787
801
|
if (previous !== null && previous !== value)
|
|
@@ -789,7 +803,6 @@ export class SettingsApp {
|
|
|
789
803
|
// Concurrency: a later press may have moved on; only the last request clears itself.
|
|
790
804
|
if (this.#pending.get(key) === value)
|
|
791
805
|
this.#pending.delete(key);
|
|
792
|
-
this.#notice = null;
|
|
793
806
|
});
|
|
794
807
|
}
|
|
795
808
|
#shownValue(entry) {
|
|
@@ -841,13 +854,8 @@ export class SettingsApp {
|
|
|
841
854
|
}
|
|
842
855
|
#finishUndo(record, outcome) {
|
|
843
856
|
const failure = changeFailure(outcome);
|
|
844
|
-
if (failure !== null)
|
|
857
|
+
if (failure !== null)
|
|
845
858
|
this.#recordUndo(record);
|
|
846
|
-
this.#notice = `Could not restore ${labelOf(record.entry)}: ${failure}`;
|
|
847
|
-
}
|
|
848
|
-
else {
|
|
849
|
-
this.#notice = null;
|
|
850
|
-
}
|
|
851
859
|
this.#undoActive = false;
|
|
852
860
|
this.#drainUndo();
|
|
853
861
|
}
|
|
@@ -878,10 +886,9 @@ export class SettingsApp {
|
|
|
878
886
|
return;
|
|
879
887
|
this.#selectedKey = rowKey(rows[index]);
|
|
880
888
|
this.#selectionNeedsReveal = true;
|
|
881
|
-
this.#notice = null;
|
|
882
889
|
}
|
|
883
890
|
#rows() {
|
|
884
|
-
const needle = this.#
|
|
891
|
+
const needle = this.#search.input?.getText().trim().toLowerCase() ?? "";
|
|
885
892
|
const matches = (entry) => needle.length === 0
|
|
886
893
|
|| entry.id.toLowerCase().includes(needle)
|
|
887
894
|
|| labelOf(entry).toLowerCase().includes(needle);
|
|
@@ -944,7 +951,7 @@ export class SettingsApp {
|
|
|
944
951
|
? CONFIGURE
|
|
945
952
|
: shown === null
|
|
946
953
|
? describeRaw(entry.rawValue)
|
|
947
|
-
:
|
|
954
|
+
: displaySettingValue(entry, shown);
|
|
948
955
|
const range = rangeOf(entry);
|
|
949
956
|
return {
|
|
950
957
|
key,
|
|
@@ -961,11 +968,11 @@ export class SettingsApp {
|
|
|
961
968
|
return lines;
|
|
962
969
|
}
|
|
963
970
|
const state = {
|
|
964
|
-
choices: menu.choices.map(choice =>
|
|
971
|
+
choices: menu.choices.map(choice => displaySettingValue(menu.entry, choice)),
|
|
965
972
|
...(menu.entry.id === "accentColor" ? {
|
|
966
973
|
previews: menu.choices.map(choice => theme.accentPreview?.(String(choice), "■") ?? ""),
|
|
967
974
|
} : {}),
|
|
968
|
-
current: this.#shownValue(menu.entry) === null ? null :
|
|
975
|
+
current: this.#shownValue(menu.entry) === null ? null : displaySettingValue(menu.entry, this.#shownValue(menu.entry)),
|
|
969
976
|
index: menu.index,
|
|
970
977
|
};
|
|
971
978
|
const frame = valueMenuFrame(state, {
|
|
@@ -980,9 +987,11 @@ export class SettingsApp {
|
|
|
980
987
|
this.#menuFrame = frame;
|
|
981
988
|
return renderValueMenu(lines, state, frame, theme);
|
|
982
989
|
}
|
|
983
|
-
#dialogLines(open, width, theme) {
|
|
990
|
+
#dialogLines(open, width, height, theme) {
|
|
984
991
|
if (open.modelDialog)
|
|
985
|
-
return this.#modelDialogLines(open, width, theme);
|
|
992
|
+
return this.#modelDialogLines(open, width, height, theme);
|
|
993
|
+
if (open.plusMenu !== null)
|
|
994
|
+
return open.plusMenu.lines(open.record, width, theme);
|
|
986
995
|
const rows = open.flags.map(key => {
|
|
987
996
|
const declared = open.entry.flags.find(flag => flag.key === key);
|
|
988
997
|
return {
|
|
@@ -992,9 +1001,10 @@ export class SettingsApp {
|
|
|
992
1001
|
...(declared?.description === undefined ? {} : { description: declared.description }),
|
|
993
1002
|
};
|
|
994
1003
|
});
|
|
995
|
-
|
|
1004
|
+
const visible = dialogWindow(rows, open.index, configureDialogChoiceCapacity(height, false, configureDialogTextRows(rows[open.index]?.description ?? "", width)));
|
|
1005
|
+
return renderDialogPanel({ title: labelOf(open.entry), rows: visible.rows, index: visible.index, hint: SETTINGS_SHORTCUTS.hintEntries(DIALOG_SCOPE) }, width, theme);
|
|
996
1006
|
}
|
|
997
|
-
#modelDialogLines(open, width, theme) {
|
|
1007
|
+
#modelDialogLines(open, width, height, theme) {
|
|
998
1008
|
if (open.step === "model") {
|
|
999
1009
|
const flags = this.#filteredModelFlags(open);
|
|
1000
1010
|
const stored = structuredValue(open.entry, open.record);
|
|
@@ -1004,12 +1014,13 @@ export class SettingsApp {
|
|
|
1004
1014
|
...modelLabelParts(flag.label ?? humanizeLabel(flag.key)),
|
|
1005
1015
|
value: stored[flag.key] === undefined ? "" : String(stored[flag.key]),
|
|
1006
1016
|
}));
|
|
1007
|
-
const
|
|
1017
|
+
const description = "Select a model to configure";
|
|
1018
|
+
const visible = dialogWindow(allRows, open.index, configureDialogChoiceCapacity(height, true, configureDialogTextRows(description, width)));
|
|
1008
1019
|
return renderSteppedDialogPanel({
|
|
1009
1020
|
title: "Thinking Level",
|
|
1010
1021
|
step: 1,
|
|
1011
1022
|
steps: 2,
|
|
1012
|
-
description
|
|
1023
|
+
description,
|
|
1013
1024
|
...(open.filter === null ? {} : { input: open.filter }),
|
|
1014
1025
|
rows: visible.rows,
|
|
1015
1026
|
index: visible.index,
|
|
@@ -1022,34 +1033,59 @@ export class SettingsApp {
|
|
|
1022
1033
|
label: choice.value === current ? `✓ ${choice.label}` : choice.label,
|
|
1023
1034
|
value: choice.description,
|
|
1024
1035
|
}));
|
|
1025
|
-
const
|
|
1036
|
+
const description = `Select default thinking level for ${selected?.label ?? open.modelKey ?? "model"}`;
|
|
1037
|
+
const visible = dialogWindow(allRows, open.index, configureDialogChoiceCapacity(height, false, configureDialogTextRows(description, width)));
|
|
1026
1038
|
return renderSteppedDialogPanel({
|
|
1027
1039
|
title: "Thinking Level",
|
|
1028
1040
|
step: 2,
|
|
1029
1041
|
steps: 2,
|
|
1030
|
-
description
|
|
1042
|
+
description,
|
|
1031
1043
|
rows: visible.rows,
|
|
1032
1044
|
index: visible.index,
|
|
1033
1045
|
hint: MODEL_SHORTCUTS.hintEntries(MODEL_LEVEL_SCOPE),
|
|
1034
1046
|
}, width, theme);
|
|
1035
1047
|
}
|
|
1036
1048
|
#footerLines(width, theme) {
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
const
|
|
1042
|
-
|
|
1043
|
-
: this.#interruptArmed ? "press ctrl+c again to exit a1" : null;
|
|
1044
|
-
const status = plainStatus === null
|
|
1045
|
-
? renderShortcutHintsWithClose(SETTINGS_SHORTCUTS.hintEntries(SCOPE), theme, width, width > 0 ? 1 : 0)
|
|
1046
|
-
: truncateToWidth(`${width > 0 ? " " : ""}${theme.fg("dim", plainStatus)}`, width);
|
|
1047
|
-
const input = this.#filter;
|
|
1049
|
+
// Rationale: standing guidance is more useful than transient feedback; failures still
|
|
1050
|
+
// roll back without displacing the Settings interaction contract.
|
|
1051
|
+
const entries = SETTINGS_SHORTCUTS.hintEntries(SCOPE).filter(entry => !this.#options.pinned
|
|
1052
|
+
|| entry.key !== DIALOG_CLOSE_SHORTCUT_HINT.key || entry.action !== DIALOG_CLOSE_SHORTCUT_HINT.action);
|
|
1053
|
+
const status = renderShortcutHintsWithClose(entries, theme, width, width > 0 ? 1 : 0);
|
|
1054
|
+
const input = this.#search.input;
|
|
1048
1055
|
if (input === null)
|
|
1049
1056
|
return [status];
|
|
1050
|
-
return [...
|
|
1057
|
+
return [...input.render(width), status];
|
|
1051
1058
|
}
|
|
1052
1059
|
}
|
|
1060
|
+
function openSettingsSearch(state, host, initial, scroll) {
|
|
1061
|
+
state.scrollBefore = scroll;
|
|
1062
|
+
state.input = state.factory.create({
|
|
1063
|
+
theme: host.theme ?? PLAIN_THEME,
|
|
1064
|
+
getRows: () => host.getSize().height,
|
|
1065
|
+
requestRender: () => host.requestRender(),
|
|
1066
|
+
copyText: state.copyText,
|
|
1067
|
+
});
|
|
1068
|
+
state.input.setFocused(true);
|
|
1069
|
+
state.input.handleInput(initial);
|
|
1070
|
+
}
|
|
1071
|
+
function closeSettingsSearch(state) {
|
|
1072
|
+
state.input?.setFocused(false);
|
|
1073
|
+
state.input = null;
|
|
1074
|
+
const scroll = state.scrollBefore;
|
|
1075
|
+
state.scrollBefore = null;
|
|
1076
|
+
return scroll;
|
|
1077
|
+
}
|
|
1078
|
+
function handleSettingsSearchPointer(state, event, panelTop) {
|
|
1079
|
+
const input = state.input;
|
|
1080
|
+
if (input === null || event.kind === "wheel-up" || event.kind === "wheel-down")
|
|
1081
|
+
return null;
|
|
1082
|
+
const row = event.row - panelTop;
|
|
1083
|
+
const overInput = row >= 1 && row <= SETTINGS_SEARCH_INPUT_ROWS;
|
|
1084
|
+
if (!overInput && !input.ownsPointer())
|
|
1085
|
+
return null;
|
|
1086
|
+
const handled = input.handlePointer({ kind: event.kind, button: event.button, column: event.column, row });
|
|
1087
|
+
return { consumed: handled || overInput, render: handled };
|
|
1088
|
+
}
|
|
1053
1089
|
function modelLabelParts(label) {
|
|
1054
1090
|
const match = /^(.*?)(\s+\[[^\]]+\])$/u.exec(label);
|
|
1055
1091
|
return match === null ? { label } : { label: match[1] ?? label, labelSuffix: match[2] ?? "" };
|
|
@@ -1111,8 +1147,11 @@ function labelOf(entry) {
|
|
|
1111
1147
|
function rangeOf(entry) {
|
|
1112
1148
|
return { minimum: entry.minimum, maximum: entry.maximum, values: numericValues(entry.choices) };
|
|
1113
1149
|
}
|
|
1114
|
-
/** Booleans read as yes and no;
|
|
1115
|
-
function
|
|
1150
|
+
/** Booleans read as yes and no; time-format choices preview the current local time. */
|
|
1151
|
+
function displaySettingValue(entry, value) {
|
|
1152
|
+
if (entry.backend === "a1" && entry.id === "timeFormat" && (value === "20:00" || value === "8:00 PM")) {
|
|
1153
|
+
return formatLocalTime(new Date(), value) ?? value;
|
|
1154
|
+
}
|
|
1116
1155
|
if (typeof value === "boolean")
|
|
1117
1156
|
return value ? "yes" : "no";
|
|
1118
1157
|
return String(value);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { UiTheme } from "../../ui/components/index.js";
|
|
2
|
+
export interface SettingsSearchPointerEvent {
|
|
3
|
+
readonly kind: "press" | "motion" | "release";
|
|
4
|
+
readonly button: number;
|
|
5
|
+
readonly column: number;
|
|
6
|
+
/** One-based row relative to the search input's top rule. */
|
|
7
|
+
readonly row: number;
|
|
8
|
+
}
|
|
9
|
+
/** The shared interactive input as consumed by the Settings surface. */
|
|
10
|
+
export interface SettingsSearchInput {
|
|
11
|
+
render(width: number): readonly string[];
|
|
12
|
+
handleInput(data: string): void;
|
|
13
|
+
handlePointer(event: SettingsSearchPointerEvent): boolean;
|
|
14
|
+
getText(): string;
|
|
15
|
+
hasSelection(): boolean;
|
|
16
|
+
ownsPointer(): boolean;
|
|
17
|
+
setFocused(focused: boolean): void;
|
|
18
|
+
}
|
|
19
|
+
export interface SettingsSearchInputOptions {
|
|
20
|
+
readonly theme: UiTheme;
|
|
21
|
+
readonly getRows: () => number;
|
|
22
|
+
readonly requestRender: () => void;
|
|
23
|
+
readonly copyText: (text: string) => void;
|
|
24
|
+
}
|
|
25
|
+
/** Composition supplies the same configurable editor component used by the agent prompt. */
|
|
26
|
+
export interface SettingsSearchInputFactory {
|
|
27
|
+
create(options: SettingsSearchInputOptions): SettingsSearchInput;
|
|
28
|
+
isTextInput(data: string): boolean;
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { PromptHistoryService } from "./service.js";
|
|
2
|
-
export { resolvePromptHistoryPath } from "./paths.js";
|
|
2
|
+
export { resolvePromptHistoryPath, type PromptHistoryScope } from "./paths.js";
|
|
3
3
|
export { PromptImageSidecar, collectImageChipIdentifiers } from "./image-sidecar.js";
|
|
4
4
|
export type { PromptImageSidecarRecord, PromptImageSidecarAttachment } from "./image-sidecar.js";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type PromptHistoryScope = "unique" | "shared";
|
|
2
|
+
export declare function resolvePromptHistoryPath(dataDir: string, profileRoot: string, platform?: NodeJS.Platform, scope?: PromptHistoryScope, sessionId?: string): {
|
|
2
3
|
path: string;
|
|
3
4
|
profileId: string;
|
|
4
5
|
imagesDir: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { posix, win32 } from "node:path";
|
|
3
3
|
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
4
|
-
export function resolvePromptHistoryPath(dataDir, profileRoot, platform = process.platform) {
|
|
4
|
+
export function resolvePromptHistoryPath(dataDir, profileRoot, platform = process.platform, scope = "shared", sessionId) {
|
|
5
5
|
const paths = platform === "win32" ? win32 : posix;
|
|
6
6
|
if (!paths.isAbsolute(dataDir) || !paths.isAbsolute(profileRoot) || dataDir.includes("\0") || profileRoot.includes("\0"))
|
|
7
7
|
throw new TypeError("History requires absolute roots");
|
|
@@ -11,7 +11,15 @@ export function resolvePromptHistoryPath(dataDir, profileRoot, platform = proces
|
|
|
11
11
|
if (platform === "win32")
|
|
12
12
|
normalized = normalized.replaceAll("\\", "/").toLowerCase();
|
|
13
13
|
const digest = createHash("sha256").update(JSON.stringify([1, PRODUCT_IDENTITY.commandName, normalized])).digest("hex");
|
|
14
|
-
|
|
14
|
+
if (scope !== "unique" && scope !== "shared")
|
|
15
|
+
throw new TypeError("Invalid history scope");
|
|
16
|
+
if (scope === "unique" && (typeof sessionId !== "string" || sessionId.length === 0 || sessionId.length > 256 || sessionId.includes("\0"))) {
|
|
17
|
+
throw new TypeError("Unique history requires a valid session ID");
|
|
18
|
+
}
|
|
19
|
+
// Compatibility: preserve the former Shared identity; a separate domain prevents
|
|
20
|
+
// collisions with per-session databases and image sidecars.
|
|
21
|
+
const profileId = scope === "shared" ? `${PRODUCT_IDENTITY.filesystem.temporaryPrefix}${digest}`
|
|
22
|
+
: `${PRODUCT_IDENTITY.filesystem.temporaryPrefix}${createHash("sha256").update(JSON.stringify([2, PRODUCT_IDENTITY.commandName, normalized, sessionId])).digest("hex")}`;
|
|
15
23
|
const historyDir = paths.join(dataDir, "history");
|
|
16
24
|
return { path: paths.join(historyDir, `${profileId}.sqlite3`), profileId, imagesDir: paths.join(historyDir, `${profileId}-images`) };
|
|
17
25
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Worker } from "node:worker_threads";
|
|
2
2
|
import { type PromptHistoryFailure, type PromptHistoryPort, type PromptHistoryResult, type PromptHistorySnapshot, type PromptHistorySubmission } from "../../contracts/owned-ui/index.js";
|
|
3
|
+
import { type PromptHistoryScope } from "./paths.js";
|
|
3
4
|
export type HistoryRecoveryState = "starting" | "ready" | "recovering" | "blocked-storage" | "closing" | "closed";
|
|
4
5
|
export interface HistoryClock {
|
|
5
6
|
now(): number;
|
|
@@ -13,6 +14,8 @@ export declare class PromptHistoryService implements PromptHistoryPort {
|
|
|
13
14
|
dataDir: string;
|
|
14
15
|
profileRoot: string;
|
|
15
16
|
limit: number;
|
|
17
|
+
scope?: PromptHistoryScope;
|
|
18
|
+
sessionId?: string;
|
|
16
19
|
createWorker?: () => Worker;
|
|
17
20
|
clock?: HistoryClock;
|
|
18
21
|
random?: () => number;
|
|
@@ -21,6 +24,8 @@ export declare class PromptHistoryService implements PromptHistoryPort {
|
|
|
21
24
|
dataDir: string;
|
|
22
25
|
profileRoot: string;
|
|
23
26
|
limit: number;
|
|
27
|
+
scope?: PromptHistoryScope;
|
|
28
|
+
sessionId?: string;
|
|
24
29
|
createWorker?: () => Worker;
|
|
25
30
|
clock?: HistoryClock;
|
|
26
31
|
random?: () => number;
|
|
@@ -129,7 +129,7 @@ export class PromptHistoryService {
|
|
|
129
129
|
const { Worker } = await import("node:worker_threads");
|
|
130
130
|
if (this.#isClosed() || generation !== this.#generation)
|
|
131
131
|
return;
|
|
132
|
-
const location = resolvePromptHistoryPath(this.options.dataDir, this.options.profileRoot);
|
|
132
|
+
const location = resolvePromptHistoryPath(this.options.dataDir, this.options.profileRoot, process.platform, this.options.scope, this.options.sessionId);
|
|
133
133
|
const source = import.meta.url.endsWith(".ts");
|
|
134
134
|
const entry = new URL(source ? "./worker.ts" : "./worker.js", import.meta.url);
|
|
135
135
|
const options = { workerData: { ...location, limit: this.options.limit }, stdout: true, stderr: true };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const AUTO_NAME_MAX_LENGTH = 16;
|
|
2
|
+
export declare const AUTO_NAME_TIMEOUT_MS = 30000;
|
|
3
|
+
export declare const AUTO_NAME_TOKEN_BUDGETS: readonly [4096, 32768];
|
|
4
|
+
export declare function normalizeAutoName(value: string): string | null;
|
|
5
|
+
export declare function fallbackAutoName(prompt: string): string;
|
|
6
|
+
export interface AutoNameCompletion {
|
|
7
|
+
readonly prompt: string;
|
|
8
|
+
readonly maxTokens: number;
|
|
9
|
+
readonly signal: AbortSignal;
|
|
10
|
+
}
|
|
11
|
+
export declare function generateAutoName(firstPrompt: string, complete: (request: AutoNameCompletion) => Promise<string | null>, timeoutMs?: number): Promise<string>;
|