@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
|
@@ -39,6 +39,14 @@ export class OwnedEditorUxInterception {
|
|
|
39
39
|
hasSelection() {
|
|
40
40
|
return this.interceptors.some(interceptor => interceptor.hasSelection?.() === true);
|
|
41
41
|
}
|
|
42
|
+
selectedText() {
|
|
43
|
+
for (const interceptor of this.interceptors) {
|
|
44
|
+
const selected = interceptor.selectedText?.();
|
|
45
|
+
if (selected !== undefined)
|
|
46
|
+
return selected;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
42
50
|
ownsPointer() {
|
|
43
51
|
return this.interceptors.some(interceptor => interceptor.ownsPointer?.() === true);
|
|
44
52
|
}
|
|
@@ -59,7 +67,7 @@ class PromptSelectionInterceptor {
|
|
|
59
67
|
#lastClick;
|
|
60
68
|
#redoStack = [];
|
|
61
69
|
#selectionRevision = 0;
|
|
62
|
-
#
|
|
70
|
+
#pasteState = { generation: 0, preview: undefined };
|
|
63
71
|
#terminalPaste;
|
|
64
72
|
#wordDirection;
|
|
65
73
|
#geometry;
|
|
@@ -73,7 +81,8 @@ class PromptSelectionInterceptor {
|
|
|
73
81
|
installAtomicSegmentation(editor, options.atomicRanges, () => this.#wordDirection);
|
|
74
82
|
}
|
|
75
83
|
handleInput(data, next) {
|
|
76
|
-
|
|
84
|
+
this.#pasteState.preview = undefined;
|
|
85
|
+
if (this.options.pasteEnabled === false ? discardTerminalPaste(this, data, value => this.handleInput(value, next)) : this.#handleTerminalPaste(data, next))
|
|
77
86
|
return;
|
|
78
87
|
if (this.keybindings.matches(data, "owned.editor.selectAll")) {
|
|
79
88
|
this.#selectAll();
|
|
@@ -88,18 +97,19 @@ class PromptSelectionInterceptor {
|
|
|
88
97
|
return;
|
|
89
98
|
}
|
|
90
99
|
if (this.keybindings.matches(data, "tui.input.copy") && this.hasSelection()) {
|
|
91
|
-
this.options.copyText(this.options.expandCopiedText(this.#selectedText()));
|
|
100
|
+
this.options.copyText(this.options.expandCopiedText(this.#selectedText()), false);
|
|
92
101
|
this.#collapseCopiedSelection();
|
|
93
102
|
return;
|
|
94
103
|
}
|
|
95
104
|
if (this.keybindings.matches(data, "owned.editor.cut") && this.hasSelection()) {
|
|
96
|
-
this.options.copyText(this.options.expandCopiedText(this.#selectedText()));
|
|
105
|
+
this.options.copyText(this.options.expandCopiedText(this.#selectedText()), true);
|
|
97
106
|
if (!this.#deleteSelection())
|
|
98
107
|
this.#deleteAtomicFocus();
|
|
99
108
|
return;
|
|
100
109
|
}
|
|
101
110
|
if (this.keybindings.matches(data, "owned.editor.paste")) {
|
|
102
|
-
this.
|
|
111
|
+
if (this.options.pasteEnabled !== false)
|
|
112
|
+
this.pasteClipboard();
|
|
103
113
|
return;
|
|
104
114
|
}
|
|
105
115
|
if (this.keybindings.matches(data, "owned.editor.redo")) {
|
|
@@ -124,7 +134,7 @@ class PromptSelectionInterceptor {
|
|
|
124
134
|
this.#deleteSelection();
|
|
125
135
|
return;
|
|
126
136
|
}
|
|
127
|
-
const inserted =
|
|
137
|
+
const inserted = editorInsertedText(data);
|
|
128
138
|
if (inserted !== undefined) {
|
|
129
139
|
this.#replaceSelection(inserted);
|
|
130
140
|
return;
|
|
@@ -186,7 +196,26 @@ class PromptSelectionInterceptor {
|
|
|
186
196
|
this.#redoStack = [];
|
|
187
197
|
}
|
|
188
198
|
render(width, next) {
|
|
199
|
+
const preview = this.#pasteState.preview;
|
|
189
200
|
const state = editorState(this.editor);
|
|
201
|
+
if (preview !== undefined && this.editor.getText() === preview.reservedText
|
|
202
|
+
&& this.#selectionRevision === preview.revision
|
|
203
|
+
&& samePosition(this.#cursor(), preview.reservedCursor)
|
|
204
|
+
&& this.#selection === undefined) {
|
|
205
|
+
// Invariant: painting does not commit the reserved edit.
|
|
206
|
+
const original = { lines: [...state.lines], cursor: this.#cursor(), selection: this.#selection };
|
|
207
|
+
this.#pasteState.preview = undefined;
|
|
208
|
+
try {
|
|
209
|
+
this.#setRenderState(preview.lines, preview.cursor);
|
|
210
|
+
this.#selection = preview.selection;
|
|
211
|
+
return this.render(width, next);
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
this.#setRenderState(original.lines, original.cursor);
|
|
215
|
+
this.#selection = original.selection;
|
|
216
|
+
this.#pasteState.preview = preview;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
190
219
|
const hidden = state.lines.map(line => this.options.hiddenRanges?.(line) ?? []);
|
|
191
220
|
if (!hidden.some(ranges => ranges.length > 0))
|
|
192
221
|
return this.#renderVisible(width, next);
|
|
@@ -268,20 +297,31 @@ class PromptSelectionInterceptor {
|
|
|
268
297
|
return rows.map((row, index) => this.options.decorateRow(row, width, index));
|
|
269
298
|
}
|
|
270
299
|
reset() {
|
|
300
|
+
this.#pasteState.preview = undefined;
|
|
271
301
|
this.#selection = undefined;
|
|
272
302
|
this.#pointerSelecting = false;
|
|
273
303
|
this.#lastClick = undefined;
|
|
274
304
|
this.#redoStack = [];
|
|
305
|
+
DISABLED_TERMINAL_PASTES.delete(this);
|
|
275
306
|
this.#selectionRevision += 1;
|
|
276
307
|
}
|
|
277
308
|
cancelPendingPastes() {
|
|
278
|
-
this.#
|
|
309
|
+
this.#pasteState.generation += 1;
|
|
310
|
+
this.#pasteState.preview = undefined;
|
|
279
311
|
this.#terminalPaste = undefined;
|
|
312
|
+
DISABLED_TERMINAL_PASTES.delete(this);
|
|
280
313
|
}
|
|
281
314
|
hasSelection() {
|
|
282
315
|
return this.#activeRange() !== undefined;
|
|
283
316
|
}
|
|
317
|
+
selectedText() {
|
|
318
|
+
return this.#activeRange() === undefined
|
|
319
|
+
? undefined
|
|
320
|
+
: this.options.expandCopiedText(this.#selectedText());
|
|
321
|
+
}
|
|
284
322
|
pasteClipboard() {
|
|
323
|
+
if (this.options.pasteEnabled === false)
|
|
324
|
+
return false;
|
|
285
325
|
this.#pasteFromClipboard();
|
|
286
326
|
return true;
|
|
287
327
|
}
|
|
@@ -291,6 +331,14 @@ class PromptSelectionInterceptor {
|
|
|
291
331
|
handlePointer(event) {
|
|
292
332
|
if (event.button !== 0)
|
|
293
333
|
return false;
|
|
334
|
+
if (this.#pasteState.preview !== undefined) {
|
|
335
|
+
this.#pasteState.preview = undefined;
|
|
336
|
+
// Invariant: preview coordinates cannot address a hidden marker.
|
|
337
|
+
this.#geometry = undefined;
|
|
338
|
+
this.#pointerSelecting = event.kind === "press";
|
|
339
|
+
this.#requestRender();
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
294
342
|
if (event.kind === "press")
|
|
295
343
|
return this.#pointerPress(event.column, event.row);
|
|
296
344
|
if (event.kind === "motion") {
|
|
@@ -521,17 +569,30 @@ class PromptSelectionInterceptor {
|
|
|
521
569
|
const begin = source === undefined ? this.options.beginClipboardPaste
|
|
522
570
|
: this.options.beginTextPaste === undefined ? undefined : () => this.options.beginTextPaste(source);
|
|
523
571
|
if (begin !== undefined) {
|
|
524
|
-
const generation = this.#
|
|
572
|
+
const generation = this.#pasteState.generation;
|
|
525
573
|
const restore = this.#orderedSelection() === undefined ? "" : this.#selectedText();
|
|
526
574
|
const paste = begin();
|
|
527
575
|
this.#redoStack = [];
|
|
528
|
-
|
|
576
|
+
const selected = this.#orderedSelection();
|
|
577
|
+
if (selected !== undefined) {
|
|
578
|
+
const lines = [...editorState(this.editor).lines];
|
|
579
|
+
const cursor = this.#cursor();
|
|
580
|
+
const selection = this.#selection;
|
|
581
|
+
const current = this.editor.getText();
|
|
582
|
+
const from = positionOffset(lines, selected.start);
|
|
583
|
+
const to = positionOffset(lines, selected.end);
|
|
584
|
+
const reservedText = current.slice(0, from) + normalizeInsertedText(paste.marker) + current.slice(to);
|
|
529
585
|
this.#replaceSelection(paste.marker);
|
|
586
|
+
this.#pasteState.preview = { marker: paste.marker, reservedText, lines, cursor, selection,
|
|
587
|
+
reservedCursor: this.#cursor(), revision: this.#selectionRevision };
|
|
588
|
+
}
|
|
530
589
|
else
|
|
531
590
|
this.editor.insertTextAtCursor(paste.marker);
|
|
532
591
|
this.#requestRender();
|
|
533
592
|
const replace = (text) => {
|
|
534
|
-
if (
|
|
593
|
+
if (this.#pasteState.preview?.marker === paste.marker)
|
|
594
|
+
this.#pasteState.preview = undefined;
|
|
595
|
+
if (generation === this.#pasteState.generation)
|
|
535
596
|
this.#replacePasteMarker(paste.marker, paste.isCurrent?.() === false ? restore : text || restore);
|
|
536
597
|
paste.complete?.();
|
|
537
598
|
};
|
|
@@ -920,7 +981,73 @@ function isEditorSegment(value) {
|
|
|
920
981
|
const input = Reflect.get(value, "input");
|
|
921
982
|
return typeof segment === "string" && typeof index === "number" && typeof input === "string";
|
|
922
983
|
}
|
|
923
|
-
|
|
984
|
+
const DISABLED_TERMINAL_PASTES = new WeakMap();
|
|
985
|
+
function discardTerminalPaste(owner, data, forward) {
|
|
986
|
+
const startMarker = "\x1b[200~";
|
|
987
|
+
const endMarker = "\x1b[201~";
|
|
988
|
+
const state = DISABLED_TERMINAL_PASTES.get(owner) ?? { startTail: "", bodyTail: null };
|
|
989
|
+
if (state.bodyTail !== null) {
|
|
990
|
+
const framed = state.bodyTail + data;
|
|
991
|
+
const end = framed.indexOf(endMarker);
|
|
992
|
+
if (end < 0) {
|
|
993
|
+
state.bodyTail = delimiterTail(framed, endMarker);
|
|
994
|
+
DISABLED_TERMINAL_PASTES.set(owner, state);
|
|
995
|
+
return true;
|
|
996
|
+
}
|
|
997
|
+
DISABLED_TERMINAL_PASTES.delete(owner);
|
|
998
|
+
const remaining = framed.slice(end + endMarker.length);
|
|
999
|
+
if (remaining.length > 0)
|
|
1000
|
+
forward(remaining);
|
|
1001
|
+
return true;
|
|
1002
|
+
}
|
|
1003
|
+
const hadStartTail = state.startTail.length > 0;
|
|
1004
|
+
const candidate = state.startTail + data;
|
|
1005
|
+
state.startTail = "";
|
|
1006
|
+
const start = candidate.indexOf(startMarker);
|
|
1007
|
+
if (start >= 0) {
|
|
1008
|
+
if (start > 0)
|
|
1009
|
+
forward(candidate.slice(0, start));
|
|
1010
|
+
const framed = candidate.slice(start + startMarker.length);
|
|
1011
|
+
const end = framed.indexOf(endMarker);
|
|
1012
|
+
if (end < 0) {
|
|
1013
|
+
state.bodyTail = delimiterTail(framed, endMarker);
|
|
1014
|
+
DISABLED_TERMINAL_PASTES.set(owner, state);
|
|
1015
|
+
}
|
|
1016
|
+
else {
|
|
1017
|
+
DISABLED_TERMINAL_PASTES.delete(owner);
|
|
1018
|
+
const remaining = framed.slice(end + endMarker.length);
|
|
1019
|
+
if (remaining.length > 0)
|
|
1020
|
+
forward(remaining);
|
|
1021
|
+
}
|
|
1022
|
+
return true;
|
|
1023
|
+
}
|
|
1024
|
+
const partial = delimiterTail(candidate, startMarker);
|
|
1025
|
+
// Compatibility: standalone Escape still cancels; marker fragments stay pending.
|
|
1026
|
+
if (partial.length > 1) {
|
|
1027
|
+
const before = candidate.slice(0, candidate.length - partial.length);
|
|
1028
|
+
if (before.length > 0)
|
|
1029
|
+
forward(before);
|
|
1030
|
+
state.startTail = partial;
|
|
1031
|
+
DISABLED_TERMINAL_PASTES.set(owner, state);
|
|
1032
|
+
return true;
|
|
1033
|
+
}
|
|
1034
|
+
DISABLED_TERMINAL_PASTES.delete(owner);
|
|
1035
|
+
if (hadStartTail) {
|
|
1036
|
+
forward(candidate);
|
|
1037
|
+
return true;
|
|
1038
|
+
}
|
|
1039
|
+
return false;
|
|
1040
|
+
}
|
|
1041
|
+
function delimiterTail(text, delimiter) {
|
|
1042
|
+
const limit = Math.min(text.length, delimiter.length - 1);
|
|
1043
|
+
for (let length = limit; length > 0; length -= 1) {
|
|
1044
|
+
const suffix = text.slice(text.length - length);
|
|
1045
|
+
if (delimiter.startsWith(suffix))
|
|
1046
|
+
return suffix;
|
|
1047
|
+
}
|
|
1048
|
+
return "";
|
|
1049
|
+
}
|
|
1050
|
+
export function editorInsertedText(data) {
|
|
924
1051
|
if (!data || data.includes("\u001b[200~"))
|
|
925
1052
|
return undefined;
|
|
926
1053
|
const kitty = decodeKittyPrintable(data);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Attributed owned theme resources adapted from @earendil-works/pi-coding-agent 1.
|
|
3
|
-
* commit
|
|
4
|
-
* Upstream dark.json SHA-256:
|
|
5
|
-
* Upstream light.json SHA-256:
|
|
2
|
+
* Attributed owned theme resources adapted from @earendil-works/pi-coding-agent 1.4.0 (MIT),
|
|
3
|
+
* commit 4a080252f06caf63a525d7873c5d94d3c23887e0.
|
|
4
|
+
* Upstream dark.json SHA-256: e1f96982f8cb7d2a48eca7db03c9cb282cb1e14a243680cd855638ecd6a251b6
|
|
5
|
+
* Upstream light.json SHA-256: 2dee6a4be7f765e7fd7728166b7ebf8c29e4ce313f8ec6b38ae50699e3abc2f3
|
|
6
6
|
* Modifications: removed upstream schema/export metadata; runtime color data is unchanged.
|
|
7
7
|
*/
|
|
8
8
|
export declare const BUILTIN_THEME_RESOURCES: Readonly<{
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Attributed owned theme resources adapted from @earendil-works/pi-coding-agent 1.
|
|
3
|
-
* commit
|
|
4
|
-
* Upstream dark.json SHA-256:
|
|
5
|
-
* Upstream light.json SHA-256:
|
|
2
|
+
* Attributed owned theme resources adapted from @earendil-works/pi-coding-agent 1.4.0 (MIT),
|
|
3
|
+
* commit 4a080252f06caf63a525d7873c5d94d3c23887e0.
|
|
4
|
+
* Upstream dark.json SHA-256: e1f96982f8cb7d2a48eca7db03c9cb282cb1e14a243680cd855638ecd6a251b6
|
|
5
|
+
* Upstream light.json SHA-256: 2dee6a4be7f765e7fd7728166b7ebf8c29e4ce313f8ec6b38ae50699e3abc2f3
|
|
6
6
|
* Modifications: removed upstream schema/export metadata; runtime color data is unchanged.
|
|
7
7
|
*/
|
|
8
8
|
export const BUILTIN_THEME_RESOURCES = Object.freeze({
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type PiShellComponentPort, type PiShellEditorOptions } from "./shell-shared-facade.js";
|
|
2
2
|
export interface PiShellOperationLoaderPort extends PiShellComponentPort {
|
|
3
3
|
readonly signal: AbortSignal;
|
|
4
|
+
/** Relabels the running operation; the pinned comparison loader keeps its first label. */
|
|
5
|
+
readonly setMessage?: (message: string) => void;
|
|
4
6
|
}
|
|
5
7
|
export declare function createPiShellShareOperationDialog(runtime: Pick<PiShellEditorOptions, "getColumns" | "getRows" | "requestRender">, message: string): PiShellOperationLoaderPort;
|
|
6
8
|
export declare function createPiShellOperationLoader(runtime: Pick<PiShellEditorOptions, "getColumns" | "getRows" | "requestRender">, message: string): PiShellOperationLoaderPort;
|
|
@@ -18,6 +18,7 @@ class ShareOperationDialog {
|
|
|
18
18
|
], new DynamicBorder(paintPiBorder));
|
|
19
19
|
}
|
|
20
20
|
get signal() { return this.#loader.signal; }
|
|
21
|
+
setMessage(message) { this.#loader.setMessage(message); }
|
|
21
22
|
invalidate() { this.#frame.invalidate(); }
|
|
22
23
|
render(width) { return this.#frame.render(width); }
|
|
23
24
|
handleInput(data) { this.#loader.handleInput(data); }
|
|
@@ -26,7 +27,7 @@ class ShareOperationDialog {
|
|
|
26
27
|
export function createPiShellShareOperationDialog(runtime, message) {
|
|
27
28
|
ensureTheme();
|
|
28
29
|
const dialog = new ShareOperationDialog(runtime, message);
|
|
29
|
-
return { ...componentPort(dialog), signal: dialog.signal };
|
|
30
|
+
return { ...componentPort(dialog), signal: dialog.signal, setMessage: message => dialog.setMessage(message) };
|
|
30
31
|
}
|
|
31
32
|
export function createPiShellOperationLoader(runtime, message) {
|
|
32
33
|
ensureTheme();
|
|
@@ -5,6 +5,8 @@ import { OwnedEditorUxInterception, createPromptSelectionInterceptor, editorVisu
|
|
|
5
5
|
import { PINNED_PI_LAYOUT, getPiSelectListTheme, piTheme, renderPiListSelection, } from "./theme.js";
|
|
6
6
|
import { createPiKeybindingsHost, createTuiFacade, ensureTheme, isAutocompleteProvider, } from "./shell-shared-facade.js";
|
|
7
7
|
import { SKILLS_COMMAND_NAME, collapseSkillCommands, createSkillsTunnelProvider, } from "./skills-command.js";
|
|
8
|
+
/** The built-in commands resident A1 serves from its tab bar instead: utility tabs, and the tab rename for `/name`. */
|
|
9
|
+
const RESIDENT_UTILITY_TAB_COMMANDS = new Set(["settings", "changelog", "name"]);
|
|
8
10
|
/** A selected autocomplete row: its arrow/primary column, then the aligned description. */
|
|
9
11
|
const SELECTED_DESCRIBED_ROW = /^(→ .*?\S)(\s{2,}.*)$/u;
|
|
10
12
|
const INPUT_COUNTER_INSET = 3;
|
|
@@ -62,6 +64,8 @@ export function createPiShellEditor(options) {
|
|
|
62
64
|
ensureTheme();
|
|
63
65
|
const tui = createTuiFacade(options);
|
|
64
66
|
const inputPresentation = options.keybindingProfile === "a1" ? options.promptPresentation?.input : undefined;
|
|
67
|
+
const inputCapabilities = options.inputCapabilities ?? {};
|
|
68
|
+
const autocompleteEnabled = inputCapabilities.autocomplete !== false;
|
|
65
69
|
// Invariant: the process shares one manager; a standalone editor gets its own host for its profile.
|
|
66
70
|
const host = options.keybindings ?? createPiKeybindingsHost({
|
|
67
71
|
profile: options.keybindingProfile ?? "pi",
|
|
@@ -74,7 +78,7 @@ export function createPiShellEditor(options) {
|
|
|
74
78
|
}
|
|
75
79
|
const scrollInfo = { emitted: false, counter: undefined };
|
|
76
80
|
const selectListTheme = getPiSelectListTheme();
|
|
77
|
-
|
|
81
|
+
const autocomplete = { provider: emptyAutocompleteProvider(), skills: [] };
|
|
78
82
|
const EditorClass = options.keybindingProfile === "a1" && options.persistentHistory === true ? options.historyEditor : OwnedEditor;
|
|
79
83
|
const editor = new EditorClass(tui, {
|
|
80
84
|
borderColor: (value) => inputPresentation === undefined ? piTheme().fg("borderMuted", value) : inputPresentation.styleRule(value),
|
|
@@ -100,13 +104,14 @@ export function createPiShellEditor(options) {
|
|
|
100
104
|
...(options.keybindingProfile === "a1" ? {
|
|
101
105
|
terminalRows: options.getRows,
|
|
102
106
|
getVisualLineCount: (width) => editorVisualLineCount(editor, width),
|
|
103
|
-
clearCommandSearchOnEscape:
|
|
104
|
-
commandTunnels: () =>
|
|
107
|
+
clearCommandSearchOnEscape: autocompleteEnabled,
|
|
108
|
+
commandTunnels: () => !autocompleteEnabled || autocomplete.skills.length === 0 ? [] : [SKILLS_COMMAND_NAME],
|
|
105
109
|
} : {}),
|
|
106
110
|
...(options.keybindingProfile === "a1" && options.promptPresentation !== undefined ? {
|
|
107
111
|
...(inputPresentation === undefined ? {} : { inputPresentation }),
|
|
108
112
|
styleSuggestion: options.promptPresentation.styleSuggestion,
|
|
109
113
|
styleSuggestionCaret: options.promptPresentation.styleSuggestionCaret,
|
|
114
|
+
...(inputCapabilities.placeholder === undefined ? {} : { placeholder: inputCapabilities.placeholder }),
|
|
110
115
|
} : {}),
|
|
111
116
|
});
|
|
112
117
|
const editorUx = options.keybindingProfile === "a1"
|
|
@@ -117,6 +122,7 @@ export function createPiShellEditor(options) {
|
|
|
117
122
|
...(options.beginClipboardPaste === undefined ? {} : { beginClipboardPaste: options.beginClipboardPaste }),
|
|
118
123
|
...(options.beginTextPaste === undefined ? {} : { beginTextPaste: options.beginTextPaste }),
|
|
119
124
|
...(options.deferTextPaste === undefined ? {} : { deferTextPaste: options.deferTextPaste }),
|
|
125
|
+
pasteEnabled: inputCapabilities.paste !== false,
|
|
120
126
|
...(options.onPasteRejected === undefined ? {} : { onPasteRejected: options.onPasteRejected }),
|
|
121
127
|
...(options.onPasteInput === undefined ? {} : { onPasteInput: options.onPasteInput }),
|
|
122
128
|
transformPastedContent: options.transformPastedContent ?? (content => content.kind === "text" ? content.text : ""),
|
|
@@ -142,36 +148,7 @@ export function createPiShellEditor(options) {
|
|
|
142
148
|
: isBashMode ? piTheme().getBashModeBorderColor() : piTheme().getThinkingBorderColor(thinkingLevel);
|
|
143
149
|
tui.requestRender();
|
|
144
150
|
};
|
|
145
|
-
|
|
146
|
-
const builtInCatalog = options.keybindingProfile === "a1" ? OWNED_BUILTIN_SLASH_COMMANDS : PINNED_PI_BUILTIN_SLASH_COMMANDS;
|
|
147
|
-
const setAutocompleteCommands = (installed) => {
|
|
148
|
-
// Invariant: collapse is a bare-A1 presentation; the comparison profile installs the pinned list.
|
|
149
|
-
const collapsed = options.keybindingProfile === "a1" && options.skillsPresentation?.() === "collapse"
|
|
150
|
-
? collapseSkillCommands(installed)
|
|
151
|
-
: { commands: installed, skills: [] };
|
|
152
|
-
tunnelSkills = collapsed.skills;
|
|
153
|
-
const commands = collapsed.commands;
|
|
154
|
-
const additions = new Map(commands.map(command => [command.name, command]));
|
|
155
|
-
const builtInNames = new Set(builtInCatalog.map(command => command.name));
|
|
156
|
-
const builtIns = builtInCatalog.flatMap(command => [
|
|
157
|
-
autocompleteCommand(command, additions.get(command.name)),
|
|
158
|
-
// Rationale: the collapsed browser is a primary bare-A1 command, not a resource after quit.
|
|
159
|
-
...(command.name === "settings" && collapsed.collapsedCommand !== undefined
|
|
160
|
-
? [autocompleteCommand(collapsed.collapsedCommand)]
|
|
161
|
-
: []),
|
|
162
|
-
]);
|
|
163
|
-
// Invariant: built-in additions and the promoted collapsed browser never reappear as resources.
|
|
164
|
-
const resources = commands
|
|
165
|
-
.filter(command => command.name !== collapsed.collapsedCommand?.name && command.source !== "builtin" && !builtInNames.has(command.name))
|
|
166
|
-
.map(command => autocompleteCommand(command));
|
|
167
|
-
const catalog = [...builtIns, ...resources];
|
|
168
|
-
const combined = new CombinedAutocompleteProvider(catalog, options.cwd ?? process.cwd());
|
|
169
|
-
const tunnelAware = tunnelSkills.length === 0 ? combined : createSkillsTunnelProvider(combined, tunnelSkills);
|
|
170
|
-
autocompleteProvider = options.keybindingProfile === "a1"
|
|
171
|
-
? createDelimiterReadyCommandProvider(tunnelAware, catalog)
|
|
172
|
-
: tunnelAware;
|
|
173
|
-
editor.setAutocompleteProvider(autocompleteProvider);
|
|
174
|
-
};
|
|
151
|
+
const setAutocompleteCommands = autocompleteCommandSetter(options, editor, autocomplete, autocompleteEnabled);
|
|
175
152
|
setAutocompleteCommands(options.autocompleteCommands ?? []);
|
|
176
153
|
let submitHandler = options.onSubmit;
|
|
177
154
|
let interruptHandler = options.onInterrupt ?? (() => { });
|
|
@@ -258,6 +235,9 @@ export function createPiShellEditor(options) {
|
|
|
258
235
|
reloadKeybindings: () => host.reload(),
|
|
259
236
|
matchesTerminalKey: (data, key) => matchesKey(data, key),
|
|
260
237
|
handleInput: data => {
|
|
238
|
+
if (inputCapabilities.singleLine === true
|
|
239
|
+
&& (keybindings.matches(data, "tui.input.newLine") || keybindings.matches(data, "tui.input.submit")))
|
|
240
|
+
return;
|
|
261
241
|
// Compatibility: an unassigned reverse Tab must not clear selection or reach autocomplete fallback.
|
|
262
242
|
if (editorUx !== undefined && matchesKey(data, "shift+tab")
|
|
263
243
|
&& !Object.values(keybindings.getEffectiveConfig()).some(keys => (Array.isArray(keys) ? keys : [keys]).some(key => key !== undefined && matchesKey(data, key))))
|
|
@@ -315,13 +295,15 @@ export function createPiShellEditor(options) {
|
|
|
315
295
|
tui.requestRender();
|
|
316
296
|
},
|
|
317
297
|
addAutocompleteProvider(factory) {
|
|
298
|
+
if (!autocompleteEnabled)
|
|
299
|
+
return;
|
|
318
300
|
if (typeof factory !== "function")
|
|
319
301
|
throw new TypeError("extension autocomplete factory must be a function");
|
|
320
|
-
const candidate = Reflect.apply(factory, undefined, [
|
|
302
|
+
const candidate = Reflect.apply(factory, undefined, [autocomplete.provider]);
|
|
321
303
|
if (!isAutocompleteProvider(candidate))
|
|
322
304
|
throw new TypeError("extension autocomplete factory returned a malformed provider");
|
|
323
|
-
|
|
324
|
-
editor.setAutocompleteProvider(
|
|
305
|
+
autocomplete.provider = candidate;
|
|
306
|
+
editor.setAutocompleteProvider(autocomplete.provider);
|
|
325
307
|
},
|
|
326
308
|
setThinkingLevel(level) {
|
|
327
309
|
if (thinkingLevel === level)
|
|
@@ -346,12 +328,52 @@ export function createPiShellEditor(options) {
|
|
|
346
328
|
return editor.canPresentPromptSuggestion() ? null : "prompt-mode";
|
|
347
329
|
},
|
|
348
330
|
hasSelection: () => editorUx?.hasSelection() ?? false,
|
|
331
|
+
selectedText: () => editorUx?.selectedText(),
|
|
349
332
|
ownsPointer: () => editorUx?.ownsPointer() ?? false,
|
|
350
333
|
handlePointer: event => editorUx?.handlePointer(event) ?? false,
|
|
351
334
|
pasteClipboard: () => editorUx?.pasteClipboard() ?? false,
|
|
352
335
|
cancelPendingPastes: () => editorUx?.cancelPendingPastes(),
|
|
353
336
|
};
|
|
354
337
|
}
|
|
338
|
+
function autocompleteCommandSetter(options, editor, state, enabled) {
|
|
339
|
+
const builtInCatalog = (options.keybindingProfile === "a1" ? OWNED_BUILTIN_SLASH_COMMANDS : PINNED_PI_BUILTIN_SLASH_COMMANDS)
|
|
340
|
+
.filter(command => !options.hideUtilityTabCommands || !RESIDENT_UTILITY_TAB_COMMANDS.has(command.name));
|
|
341
|
+
return installed => {
|
|
342
|
+
if (!enabled) {
|
|
343
|
+
state.provider = emptyAutocompleteProvider();
|
|
344
|
+
editor.setAutocompleteProvider(state.provider);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
// Invariant: collapse is a bare-A1 presentation; the comparison profile installs the pinned list.
|
|
348
|
+
const collapsed = options.keybindingProfile === "a1" && options.skillsPresentation?.() === "collapse"
|
|
349
|
+
? collapseSkillCommands(installed)
|
|
350
|
+
: { commands: installed, skills: [] };
|
|
351
|
+
state.skills = collapsed.skills;
|
|
352
|
+
const additions = new Map(collapsed.commands.map(command => [command.name, command]));
|
|
353
|
+
const builtInNames = new Set(builtInCatalog.map(command => command.name));
|
|
354
|
+
const builtIns = builtInCatalog.flatMap(command => [
|
|
355
|
+
autocompleteCommand(command, additions.get(command.name)),
|
|
356
|
+
// Rationale: the collapsed browser is a primary bare-A1 command, not a resource after quit.
|
|
357
|
+
...(command.name === "settings" && collapsed.collapsedCommand !== undefined
|
|
358
|
+
? [autocompleteCommand(collapsed.collapsedCommand)] : []),
|
|
359
|
+
]);
|
|
360
|
+
const resources = collapsed.commands
|
|
361
|
+
.filter(command => command.name !== collapsed.collapsedCommand?.name && command.source !== "builtin" && !builtInNames.has(command.name))
|
|
362
|
+
.map(command => autocompleteCommand(command));
|
|
363
|
+
const catalog = [...builtIns, ...resources];
|
|
364
|
+
const combined = new CombinedAutocompleteProvider(catalog, options.cwd ?? process.cwd());
|
|
365
|
+
const tunnelAware = state.skills.length === 0 ? combined : createSkillsTunnelProvider(combined, state.skills);
|
|
366
|
+
state.provider = options.keybindingProfile === "a1" ? createDelimiterReadyCommandProvider(tunnelAware, catalog) : tunnelAware;
|
|
367
|
+
editor.setAutocompleteProvider(state.provider);
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function emptyAutocompleteProvider() {
|
|
371
|
+
return {
|
|
372
|
+
getSuggestions: async () => null,
|
|
373
|
+
applyCompletion: (lines, cursorLine, cursorCol) => ({ lines, cursorLine, cursorCol }),
|
|
374
|
+
shouldTriggerFileCompletion: () => false,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
355
377
|
/** Bare A1 leaves an applied catalog command ready for `:`, a user-entered space, or submission. */
|
|
356
378
|
function createDelimiterReadyCommandProvider(base, commands) {
|
|
357
379
|
const commandNames = new Set(commands.map(command => command.name));
|