@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
package/dist/ui/apps/host.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export interface AppHostOptions {
|
|
|
20
20
|
readonly closeOnInterrupt: boolean;
|
|
21
21
|
/** Colours handed to every presented app. Absent renders plain text. */
|
|
22
22
|
readonly theme?: UiTheme;
|
|
23
|
+
/** Lets a focused app claim the first interrupt for an editor selection before host close/exit policy. */
|
|
24
|
+
readonly appInputBeforeInterrupt?: boolean;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* Presents at most one app. An opted-in interrupt closes at the host boundary;
|
package/dist/ui/apps/host.js
CHANGED
|
@@ -15,6 +15,7 @@ export class UiAppHost {
|
|
|
15
15
|
#surface;
|
|
16
16
|
#closeOnInterrupt;
|
|
17
17
|
#theme;
|
|
18
|
+
#appInputBeforeInterrupt;
|
|
18
19
|
// Invariant: the first interrupt timestamp is null whenever the chord is disarmed.
|
|
19
20
|
#interruptArmedAt = null;
|
|
20
21
|
#renderedInterruptArmed;
|
|
@@ -25,6 +26,7 @@ export class UiAppHost {
|
|
|
25
26
|
this.#surface = options.surface;
|
|
26
27
|
this.#closeOnInterrupt = options.closeOnInterrupt;
|
|
27
28
|
this.#theme = options.theme;
|
|
29
|
+
this.#appInputBeforeInterrupt = options.appInputBeforeInterrupt === true;
|
|
28
30
|
}
|
|
29
31
|
get presented() {
|
|
30
32
|
return this.#app;
|
|
@@ -71,7 +73,7 @@ export class UiAppHost {
|
|
|
71
73
|
const app = this.#app;
|
|
72
74
|
if (app === null)
|
|
73
75
|
return { consumed: false };
|
|
74
|
-
if (data === INTERRUPT && this.#closeOnInterrupt) {
|
|
76
|
+
if (data === INTERRUPT && this.#closeOnInterrupt && !this.#appInputBeforeInterrupt) {
|
|
75
77
|
this.close();
|
|
76
78
|
return { consumed: true, render: true };
|
|
77
79
|
}
|
|
@@ -83,6 +85,10 @@ export class UiAppHost {
|
|
|
83
85
|
this.render();
|
|
84
86
|
return result;
|
|
85
87
|
}
|
|
88
|
+
if (data === INTERRUPT && this.#closeOnInterrupt) {
|
|
89
|
+
this.close();
|
|
90
|
+
return { consumed: true, render: true };
|
|
91
|
+
}
|
|
86
92
|
if (data === INTERRUPT)
|
|
87
93
|
return this.#interrupt();
|
|
88
94
|
return { consumed: false };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import type { PaneRect } from "./frame.js";
|
|
1
2
|
import { LineInput } from "./line-input.js";
|
|
2
3
|
import { type ShortcutHintEntry } from "./shortcut-hints.js";
|
|
3
4
|
import type { UiTheme } from "./theme.js";
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* marks the one in hand, says what that part does, and says how to change it.
|
|
6
|
+
* Semantic content and overlay composition for Settings configure dialogs. The setting supplies
|
|
7
|
+
* rows and behavior; this component owns compact geometry, backdrop dimming, and panel placement.
|
|
8
8
|
*/
|
|
9
9
|
export interface DialogRow {
|
|
10
10
|
readonly label: string;
|
|
@@ -39,14 +39,23 @@ export interface SteppedDialogPanelState {
|
|
|
39
39
|
readonly index: number;
|
|
40
40
|
readonly hint: readonly ShortcutHintEntry[];
|
|
41
41
|
}
|
|
42
|
+
/** Canonical native-matching background for every owned floating dialog surface. */
|
|
43
|
+
export declare function renderFloatingDialogSurface(text: string, mode: "truecolor" | "256color"): string;
|
|
44
|
+
/** Existing raised-menu background, centralized beside the darker dialog surface. */
|
|
45
|
+
export declare function renderFloatingMenuSurface(text: string, mode: "truecolor" | "256color"): string;
|
|
46
|
+
/** The shared compact width used by Settings configure dialogs and native tab dialogs. */
|
|
47
|
+
export declare function configureDialogWidth(width: number): number;
|
|
48
|
+
/** Rows available to a selector after retaining its title, description, control, and guidance. */
|
|
49
|
+
export declare function configureDialogChoiceCapacity(height: number, hasInput: boolean, descriptionRows?: number): number;
|
|
50
|
+
/** Number of modal rows a plain description occupies at the shared content width. */
|
|
51
|
+
export declare function configureDialogTextRows(text: string, width: number): number;
|
|
52
|
+
/** Dims a completed screen and overlays one full-intensity panel without disturbing ANSI tails. */
|
|
53
|
+
export declare function renderCenteredDialogOverlay(frame: readonly string[], dialogRows: readonly string[], rect: PaneRect, theme: UiTheme): readonly string[];
|
|
42
54
|
/** The column values start at: past the widest label, capped so one long name cannot push them off. */
|
|
43
55
|
export declare function dialogValueColumn(rows: readonly DialogRow[]): number;
|
|
44
|
-
/**
|
|
45
|
-
* The panel's lines. The first line is its rule, so the row at index N is drawn
|
|
46
|
-
* one line below the panel's top.
|
|
47
|
-
*/
|
|
56
|
+
/** The semantic rows for one generic configure modal. */
|
|
48
57
|
export declare function renderDialogPanel(state: DialogPanelState, width: number, theme: UiTheme): readonly string[];
|
|
49
|
-
/** Owned stepped-selector
|
|
58
|
+
/** Owned stepped-selector content for structured settings with nested choices. */
|
|
50
59
|
export declare function renderSteppedDialogPanel(state: SteppedDialogPanelState, width: number, theme: UiTheme): readonly string[];
|
|
51
60
|
/** The row a pointer report lands on, or null when it is not on one. */
|
|
52
61
|
export declare function dialogRowAt(frame: DialogPanelFrame, row: number, column: number, valueWidth: number): number | null;
|
|
@@ -1,24 +1,77 @@
|
|
|
1
1
|
import { LineInput, renderInputRow } from "./line-input.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { renderShortcutHintsWithClose } from "./shortcut-hints.js";
|
|
3
|
+
import { overlaySpan } from "./spans.js";
|
|
4
|
+
import { displayWidth, padToWidth, truncateToWidth } from "./text.js";
|
|
4
5
|
const LABEL_COLUMN_CAP = 30;
|
|
5
6
|
const STEPPED_LABEL_COLUMN_CAP = 46;
|
|
7
|
+
const CONFIGURE_MODAL_MAX_WIDTH = 60;
|
|
8
|
+
const CONFIGURE_MODAL_PADDING_X = 2;
|
|
9
|
+
const SGR = /\u001b\[[0-9;]*m/gu;
|
|
10
|
+
/** Canonical native-matching background for every owned floating dialog surface. */
|
|
11
|
+
export function renderFloatingDialogSurface(text, mode) {
|
|
12
|
+
const background = mode === "truecolor" ? "\u001b[48;2;38;38;38m" : "\u001b[48;5;235m";
|
|
13
|
+
return `${background}${text}\u001b[49m`;
|
|
14
|
+
}
|
|
15
|
+
/** Existing raised-menu background, centralized beside the darker dialog surface. */
|
|
16
|
+
export function renderFloatingMenuSurface(text, mode) {
|
|
17
|
+
const background = mode === "truecolor" ? "\u001b[48;2;55;55;55m" : "\u001b[48;5;237m";
|
|
18
|
+
return `${background}${text}\u001b[49m`;
|
|
19
|
+
}
|
|
20
|
+
/** The shared compact width used by Settings configure dialogs and native tab dialogs. */
|
|
21
|
+
export function configureDialogWidth(width) {
|
|
22
|
+
return Math.min(CONFIGURE_MODAL_MAX_WIDTH, Math.max(0, width));
|
|
23
|
+
}
|
|
24
|
+
/** Rows available to a selector after retaining its title, description, control, and guidance. */
|
|
25
|
+
export function configureDialogChoiceCapacity(height, hasInput, descriptionRows = 1) {
|
|
26
|
+
const wrappedDescriptionRows = Math.max(1, descriptionRows);
|
|
27
|
+
return Math.max(1, Math.max(0, height) - (hasInput ? 9 : 7) - (wrappedDescriptionRows - 1));
|
|
28
|
+
}
|
|
29
|
+
/** Number of modal rows a plain description occupies at the shared content width. */
|
|
30
|
+
export function configureDialogTextRows(text, width) {
|
|
31
|
+
return wrapText(text, Math.max(0, configureDialogWidth(width) - CONFIGURE_MODAL_PADDING_X * 2)).length;
|
|
32
|
+
}
|
|
33
|
+
/** One frame path for every semantic row, regardless of which configure dialog supplies content. */
|
|
34
|
+
function dialogPanelLayout(width, theme) {
|
|
35
|
+
const frameWidth = Math.max(0, width);
|
|
36
|
+
const left = Math.min(CONFIGURE_MODAL_PADDING_X, frameWidth);
|
|
37
|
+
const right = Math.min(CONFIGURE_MODAL_PADDING_X, frameWidth - left);
|
|
38
|
+
const contentWidth = Math.max(0, frameWidth - left - right);
|
|
39
|
+
return {
|
|
40
|
+
blank: " ".repeat(frameWidth),
|
|
41
|
+
contentWidth,
|
|
42
|
+
contentRow: (painted, raw = painted, selected = false) => {
|
|
43
|
+
const content = pad(truncateToWidth(painted, contentWidth), contentWidth, raw);
|
|
44
|
+
const rightPadding = " ".repeat(right);
|
|
45
|
+
return `${" ".repeat(left)}${selected ? theme.highlight(content) : content}${selected ? theme.panel(rightPadding) : rightPadding}`;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Dims a completed screen and overlays one full-intensity panel without disturbing ANSI tails. */
|
|
50
|
+
export function renderCenteredDialogOverlay(frame, dialogRows, rect, theme) {
|
|
51
|
+
const width = Math.max(0, rect.width);
|
|
52
|
+
const height = Math.max(0, rect.height);
|
|
53
|
+
const panelWidth = configureDialogWidth(width);
|
|
54
|
+
const visibleDialog = dialogRows.slice(0, height);
|
|
55
|
+
const top = Math.max(0, Math.floor((height - visibleDialog.length) / 2));
|
|
56
|
+
const left = Math.max(0, Math.floor((width - panelWidth) / 2));
|
|
57
|
+
return Array.from({ length: height }, (_, row) => {
|
|
58
|
+
const backdrop = dimStyledLine(frame[row] ?? "", width);
|
|
59
|
+
const dialogRow = visibleDialog[row - top];
|
|
60
|
+
if (dialogRow === undefined || panelWidth === 0)
|
|
61
|
+
return backdrop;
|
|
62
|
+
const panel = `\u001b[22;39;49m${theme.panel(padToWidth(dialogRow, panelWidth))}`;
|
|
63
|
+
return overlaySpan(backdrop, left, left + panelWidth, panel);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
6
66
|
/** The column values start at: past the widest label, capped so one long name cannot push them off. */
|
|
7
67
|
export function dialogValueColumn(rows) {
|
|
8
68
|
const widest = Math.min(LABEL_COLUMN_CAP, Math.max(0, ...rows.map(row => displayWidth(row.label))));
|
|
9
69
|
return 2 + widest + 2;
|
|
10
70
|
}
|
|
11
|
-
/**
|
|
12
|
-
* The panel's lines. The first line is its rule, so the row at index N is drawn
|
|
13
|
-
* one line below the panel's top.
|
|
14
|
-
*/
|
|
71
|
+
/** The semantic rows for one generic configure modal. */
|
|
15
72
|
export function renderDialogPanel(state, width, theme) {
|
|
16
73
|
const labelColumn = Math.min(LABEL_COLUMN_CAP, Math.max(0, ...state.rows.map(row => displayWidth(row.label))));
|
|
17
|
-
const
|
|
18
|
-
const contentPadding = Math.min(1, Math.max(0, width));
|
|
19
|
-
const contentWidth = Math.max(0, width - contentPadding);
|
|
20
|
-
const inset = " ".repeat(contentPadding);
|
|
21
|
-
const contentRow = (painted, raw) => `${inset}${pad(truncateToWidth(painted, contentWidth), contentWidth, raw)}`;
|
|
74
|
+
const layout = dialogPanelLayout(width, theme);
|
|
22
75
|
const rows = state.rows.map((row, index) => {
|
|
23
76
|
const selected = index === state.index;
|
|
24
77
|
const padded = `${row.label}${" ".repeat(Math.max(0, labelColumn - displayWidth(row.label)))}`;
|
|
@@ -27,32 +80,28 @@ export function renderDialogPanel(state, width, theme) {
|
|
|
27
80
|
const content = selected
|
|
28
81
|
? `${theme.fg("accent", cursor)}${theme.fg("text", padded)} ${theme.fg("muted", row.value)}`
|
|
29
82
|
: `${cursor}${padded} ${theme.fg("muted", row.value)}`;
|
|
30
|
-
|
|
31
|
-
return contentRow(painted, raw);
|
|
83
|
+
return layout.contentRow(content, raw, selected);
|
|
32
84
|
});
|
|
33
85
|
const description = state.rows[state.index]?.description ?? "";
|
|
86
|
+
const descriptionRows = wrapText(description, layout.contentWidth);
|
|
34
87
|
const hint = typeof state.hint === "string"
|
|
35
88
|
? theme.fg("dim", state.hint)
|
|
36
|
-
: renderShortcutHintsWithClose(state.hint, theme, contentWidth, 0);
|
|
89
|
+
: renderShortcutHintsWithClose(state.hint, theme, layout.contentWidth, 0);
|
|
37
90
|
const plainHint = typeof state.hint === "string" ? state.hint : " ".repeat(displayWidth(hint));
|
|
38
91
|
return [
|
|
39
|
-
|
|
40
|
-
contentRow(theme.bold(theme.fg("accent", state.title)), state.title),
|
|
41
|
-
contentRow(theme.fg("dim",
|
|
42
|
-
|
|
92
|
+
layout.blank,
|
|
93
|
+
layout.contentRow(theme.bold(theme.fg("accent", state.title)), state.title),
|
|
94
|
+
...descriptionRows.map(line => layout.contentRow(theme.fg("dim", line), line)),
|
|
95
|
+
layout.blank,
|
|
43
96
|
...rows,
|
|
44
|
-
|
|
45
|
-
contentRow(hint, plainHint),
|
|
46
|
-
|
|
97
|
+
layout.blank,
|
|
98
|
+
layout.contentRow(hint, plainHint),
|
|
99
|
+
layout.blank,
|
|
47
100
|
];
|
|
48
101
|
}
|
|
49
|
-
/** Owned stepped-selector
|
|
102
|
+
/** Owned stepped-selector content for structured settings with nested choices. */
|
|
50
103
|
export function renderSteppedDialogPanel(state, width, theme) {
|
|
51
|
-
const
|
|
52
|
-
const contentPadding = Math.min(1, Math.max(0, width));
|
|
53
|
-
const contentWidth = Math.max(0, width - contentPadding);
|
|
54
|
-
const inset = " ".repeat(contentPadding);
|
|
55
|
-
const contentRow = (painted, raw) => `${inset}${pad(truncateToWidth(painted, contentWidth), contentWidth, raw)}`;
|
|
104
|
+
const layout = dialogPanelLayout(width, theme);
|
|
56
105
|
const labelColumn = Math.min(STEPPED_LABEL_COLUMN_CAP, Math.max(0, ...state.rows.map(row => displayWidth(`${row.label}${row.labelSuffix ?? ""}`))));
|
|
57
106
|
const rows = state.rows.map((row, index) => {
|
|
58
107
|
const selected = index === state.index;
|
|
@@ -65,31 +114,35 @@ export function renderSteppedDialogPanel(state, width, theme) {
|
|
|
65
114
|
const content = selected
|
|
66
115
|
? `${theme.fg("accent", cursor)}${label}${theme.fg("muted", suffix)}`
|
|
67
116
|
: `${cursor}${label}${theme.fg("muted", suffix)}`;
|
|
68
|
-
return contentRow(
|
|
117
|
+
return layout.contentRow(content, raw, selected);
|
|
69
118
|
});
|
|
70
119
|
const input = state.input === undefined
|
|
71
120
|
? []
|
|
72
|
-
: [
|
|
121
|
+
: [
|
|
122
|
+
...renderInputRow(state.input, layout.contentWidth, {
|
|
123
|
+
ruled: false,
|
|
124
|
+
promptGlyph: "> ",
|
|
125
|
+
promptRole: "accent",
|
|
126
|
+
theme,
|
|
127
|
+
}).lines.map(row => layout.contentRow(row)),
|
|
128
|
+
layout.blank,
|
|
129
|
+
];
|
|
130
|
+
const descriptionRows = wrapText(state.description, layout.contentWidth);
|
|
73
131
|
const step = `(step ${state.step}/${state.steps})`;
|
|
74
132
|
const title = `${state.title} ${step}`;
|
|
75
133
|
const paintedTitle = `${theme.bold(theme.fg("accent", state.title))} ${theme.fg("dim", step)}`;
|
|
76
134
|
return [
|
|
77
|
-
|
|
78
|
-
contentRow(paintedTitle, title),
|
|
79
|
-
contentRow(theme.fg("dim",
|
|
80
|
-
|
|
135
|
+
layout.blank,
|
|
136
|
+
layout.contentRow(paintedTitle, title),
|
|
137
|
+
...descriptionRows.map(line => layout.contentRow(theme.fg("dim", line), line)),
|
|
138
|
+
layout.blank,
|
|
81
139
|
...input,
|
|
82
140
|
...rows,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
141
|
+
layout.blank,
|
|
142
|
+
layout.contentRow(renderShortcutHintsWithClose(state.hint, theme, layout.contentWidth)),
|
|
143
|
+
layout.blank,
|
|
86
144
|
];
|
|
87
145
|
}
|
|
88
|
-
function renderSteppedHint(entries, width, theme) {
|
|
89
|
-
const raw = shortcutHintsText(entries, 1, " · ");
|
|
90
|
-
const painted = renderShortcutHints(entries, theme, 1, theme.fg("dim", " · "));
|
|
91
|
-
return `${truncateToWidth(painted, width)}${" ".repeat(Math.max(0, width - displayWidth(raw)))}`;
|
|
92
|
-
}
|
|
93
146
|
/** The row a pointer report lands on, or null when it is not on one. */
|
|
94
147
|
export function dialogRowAt(frame, row, column, valueWidth) {
|
|
95
148
|
const at = row - frame.firstRow;
|
|
@@ -102,3 +155,26 @@ function pad(line, width, raw) {
|
|
|
102
155
|
const visible = displayWidth(raw);
|
|
103
156
|
return visible >= width ? line : line + " ".repeat(width - visible);
|
|
104
157
|
}
|
|
158
|
+
function dimStyledLine(line, width) {
|
|
159
|
+
const padded = padToWidth(line, width);
|
|
160
|
+
return `\u001b[2m${padded.replace(SGR, sequence => `${sequence}\u001b[2m`)}\u001b[22m`;
|
|
161
|
+
}
|
|
162
|
+
function wrapText(text, width) {
|
|
163
|
+
if (text.length === 0 || width <= 0)
|
|
164
|
+
return [""];
|
|
165
|
+
const lines = [];
|
|
166
|
+
let line = "";
|
|
167
|
+
for (const word of text.split(/\s+/u)) {
|
|
168
|
+
const candidate = `${line}${line.length === 0 ? "" : " "}${word}`;
|
|
169
|
+
if (line.length > 0 && displayWidth(candidate) > width) {
|
|
170
|
+
lines.push(line);
|
|
171
|
+
line = word;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
line = candidate;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (line.length > 0)
|
|
178
|
+
lines.push(truncateToWidth(line, width));
|
|
179
|
+
return lines.length === 0 ? [""] : lines;
|
|
180
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { dialogRowAt, dialogValueColumn, renderDialogPanel, renderSteppedDialogPanel } from "./dialog-panel.js";
|
|
1
|
+
export { configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, dialogRowAt, dialogValueColumn, renderCenteredDialogOverlay, renderDialogPanel, renderSteppedDialogPanel, } from "./dialog-panel.js";
|
|
2
2
|
export type { DialogPanelFrame, DialogPanelState, DialogRow, SteppedDialogPanelState } from "./dialog-panel.js";
|
|
3
3
|
export { FrameContractError, assertPaneRect, finalizeFrame, validateFrame } from "./frame.js";
|
|
4
4
|
export type { PaneRect } from "./frame.js";
|
|
@@ -19,7 +19,7 @@ export { progressStatusFrame, progressStatusText } from "./progress-status.js";
|
|
|
19
19
|
export type { ProgressStatusFrameStyles, ProgressStatusMarker } from "./progress-status.js";
|
|
20
20
|
export { FrameCache, RENDER_REVISION_KINDS, RenderRevisionTracker, ZERO_REVISIONS, normalizeRevisions, revisionsEqual } from "./revision.js";
|
|
21
21
|
export type { RenderCacheContract, RenderRevisionKind, RenderRevisions } from "./revision.js";
|
|
22
|
-
export { MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
|
|
22
|
+
export { COPY_ACKNOWLEDGEMENT_DURATION_MS, MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, copyAcknowledgementText, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
|
|
23
23
|
export type { SelectionCopyPrompt, SelectionCopyRow, SelectionCopySnapshot } from "./selection-copy.js";
|
|
24
24
|
export { ScrollbarRails, isThumbRow, scrollForThumbRow, scrollForTrackPage, scrollbarGeometry, scrollbarPresentation, scrollbarReservesSpace, scrollbarSelectionRows, scrollbarWheelRows, } from "./scrollbar.js";
|
|
25
25
|
export type { RailPointer, RailPosition, ScrollbarAppearance, ScrollbarGeometry, ScrollbarInput, ScrollbarPresentation, ScrollbarPresentationInput, ScrollbarSpeed, ScrollbarStyle, } from "./scrollbar.js";
|
|
@@ -32,8 +32,8 @@ export { readVisibleHyperlinks } from "./visible-hyperlinks.js";
|
|
|
32
32
|
export type { VisibleHyperlinkRange, VisibleHyperlinkRow } from "./visible-hyperlinks.js";
|
|
33
33
|
export { renderStatusLine, statusText } from "./status-line.js";
|
|
34
34
|
export type { StatusLineInput } from "./status-line.js";
|
|
35
|
-
export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
|
|
36
|
-
export type { SubmittedPromptLayout, SubmittedPromptStyle } from "./submitted-prompt.js";
|
|
35
|
+
export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatLocalTime, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
|
|
36
|
+
export type { SubmittedPromptLayout, SubmittedPromptStyle, UiTimeFormat } from "./submitted-prompt.js";
|
|
37
37
|
export { numericValues, steppedValue, stepperEnds } from "./stepper.js";
|
|
38
38
|
export type { NumericRange } from "./stepper.js";
|
|
39
39
|
export { TranscriptViewport, assertTranscriptViewportFrameDescriptor } from "./transcript-viewport.js";
|
|
@@ -42,7 +42,7 @@ export { RAIL_COLUMNS, renderEmptyState, withScrollbarRail } from "./surface.js"
|
|
|
42
42
|
export type { RailOptions } from "./surface.js";
|
|
43
43
|
export { displayColumnSlice, displayWidth, displayWordColumnRange, faint, padToWidth, stripAnsi, truncateToWidth } from "./text.js";
|
|
44
44
|
export type { DisplayColumnRange, DisplayColumnSlice } from "./text.js";
|
|
45
|
-
export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
|
|
45
|
+
export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, paintTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
|
|
46
46
|
export type { OrderedTextSelection, TextSelection, TextSelectionClick, TextSelectionLineContent, TextSelectionPoint, TextSelectionPressInput, } from "./text-selection.js";
|
|
47
47
|
export { PLAIN_THEME } from "./theme.js";
|
|
48
48
|
export type { UiTheme, UiThemeToken } from "./theme.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { dialogRowAt, dialogValueColumn, renderDialogPanel, renderSteppedDialogPanel } from "./dialog-panel.js";
|
|
1
|
+
export { configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, dialogRowAt, dialogValueColumn, renderCenteredDialogOverlay, renderDialogPanel, renderSteppedDialogPanel, } from "./dialog-panel.js";
|
|
2
2
|
export { FrameContractError, assertPaneRect, finalizeFrame, validateFrame } from "./frame.js";
|
|
3
3
|
export { humanizeLabel, humanizeTitle } from "./label.js";
|
|
4
4
|
export { LineInput, caretCell, handleLineInputKey, renderInputRow, wordLeft, wordRight } from "./line-input.js";
|
|
@@ -9,18 +9,18 @@ export { MOUSE_TRACKING_OFF, MOUSE_TRACKING_ON, parseMouseInput, routeMouseInput
|
|
|
9
9
|
export { isInsidePane, toPaneLocalMouse } from "./pane.js";
|
|
10
10
|
export { progressStatusFrame, progressStatusText } from "./progress-status.js";
|
|
11
11
|
export { FrameCache, RENDER_REVISION_KINDS, RenderRevisionTracker, ZERO_REVISIONS, normalizeRevisions, revisionsEqual } from "./revision.js";
|
|
12
|
-
export { MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
|
|
12
|
+
export { COPY_ACKNOWLEDGEMENT_DURATION_MS, MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, copyAcknowledgementText, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
|
|
13
13
|
export { ScrollbarRails, isThumbRow, scrollForThumbRow, scrollForTrackPage, scrollbarGeometry, scrollbarPresentation, scrollbarReservesSpace, scrollbarSelectionRows, scrollbarWheelRows, } from "./scrollbar.js";
|
|
14
14
|
export { assertOwnedShortcutHintConventions, renderShortcutHints, renderShortcutHintsWithClose, shortcutHintsText } from "./shortcut-hints.js";
|
|
15
15
|
export { GLOBAL_SCOPE, ShortcutRegistry, assembleShortcuts, assertNoShortcutConflicts } from "./shortcuts.js";
|
|
16
16
|
export { backgroundSgrSpan, heldNativeHyperlinkStyle, hyperlinkSgrSpan, hyperlinkTargetAtColumn, nativeHyperlinkStyle, overlaySpan } from "./spans.js";
|
|
17
17
|
export { readVisibleHyperlinks } from "./visible-hyperlinks.js";
|
|
18
18
|
export { renderStatusLine, statusText } from "./status-line.js";
|
|
19
|
-
export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
|
|
19
|
+
export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatLocalTime, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
|
|
20
20
|
export { numericValues, steppedValue, stepperEnds } from "./stepper.js";
|
|
21
21
|
export { TranscriptViewport, assertTranscriptViewportFrameDescriptor } from "./transcript-viewport.js";
|
|
22
22
|
export { RAIL_COLUMNS, renderEmptyState, withScrollbarRail } from "./surface.js";
|
|
23
23
|
export { displayColumnSlice, displayWidth, displayWordColumnRange, faint, padToWidth, stripAnsi, truncateToWidth } from "./text.js";
|
|
24
|
-
export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
|
|
24
|
+
export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, paintTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
|
|
25
25
|
export { PLAIN_THEME } from "./theme.js";
|
|
26
26
|
export { menuRowAt, renderValueMenu, valueMenuFrame } from "./value-menu.js";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type PromptMarkerRole } from "./prompt-input.js";
|
|
1
2
|
import type { UiTheme } from "./theme.js";
|
|
2
3
|
export type LineInputOutcome = {
|
|
3
4
|
readonly kind: "editing";
|
|
@@ -56,10 +57,12 @@ export declare function caretCell(text: string): string;
|
|
|
56
57
|
export interface InputRowOptions {
|
|
57
58
|
/** Shown quietly while nothing has been typed, with the caret on its first cell. */
|
|
58
59
|
readonly placeholder?: string;
|
|
59
|
-
/**
|
|
60
|
+
/** Theme-border rules. */
|
|
60
61
|
readonly ruled?: boolean;
|
|
61
62
|
/** Prompt marker including any following spacing. Defaults to the shared prompt glyph. */
|
|
62
63
|
readonly promptGlyph?: string;
|
|
64
|
+
/** Semantic foreground for a configured prompt marker. */
|
|
65
|
+
readonly promptRole?: PromptMarkerRole;
|
|
63
66
|
readonly theme?: Pick<UiTheme, "fg">;
|
|
64
67
|
}
|
|
65
68
|
export interface InputRow {
|
|
@@ -220,5 +220,7 @@ export function renderInputRow(input, width, options = {}) {
|
|
|
220
220
|
const body = empty
|
|
221
221
|
? `${caretCell(placeholder.slice(0, 1))}${faint(placeholder.slice(1))}`
|
|
222
222
|
: `${before}${caretCell(under)}${after}`;
|
|
223
|
-
return {
|
|
223
|
+
return {
|
|
224
|
+
lines: presentation.render(width, () => ({ rows: [body] }), options.ruled, 0, options.promptGlyph, options.promptRole),
|
|
225
|
+
};
|
|
224
226
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { type UiTheme } from "./theme.js";
|
|
2
|
-
export declare const PROMPT_GLYPH = "
|
|
3
|
-
export declare const PROMPT_PREFIX_WIDTH =
|
|
4
|
-
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
2
|
+
export declare const PROMPT_GLYPH = "";
|
|
3
|
+
export declare const PROMPT_PREFIX_WIDTH = 0;
|
|
4
|
+
type RuleTheme = Pick<UiTheme, "fg">;
|
|
5
|
+
export declare function promptRuleText(text: string, theme: RuleTheme): string;
|
|
6
|
+
export declare function promptRule(width: number, theme: RuleTheme): string;
|
|
7
|
+
export type PromptMarkerRole = "muted" | "accent";
|
|
8
|
+
export declare function promptArrow(text: string, theme: RuleTheme, role?: PromptMarkerRole): string;
|
|
7
9
|
export interface PromptInputBody {
|
|
8
10
|
readonly rows: readonly string[];
|
|
9
11
|
/** Semantic border fragments retain editor history and scroll annotations. */
|
|
@@ -19,9 +21,9 @@ export interface PromptInputMetrics {
|
|
|
19
21
|
}
|
|
20
22
|
/** Composes shared input chrome around controller-owned body rows without owning editing state. */
|
|
21
23
|
export declare class PromptInput {
|
|
22
|
-
readonly theme:
|
|
24
|
+
readonly theme: RuleTheme;
|
|
23
25
|
readonly metrics: PromptInputMetrics;
|
|
24
|
-
constructor(theme?:
|
|
26
|
+
constructor(theme?: RuleTheme, metrics?: PromptInputMetrics);
|
|
25
27
|
styleRule(text: string): string;
|
|
26
28
|
geometry(width: number, padding?: number, promptGlyph?: string): {
|
|
27
29
|
prefixWidth: number;
|
|
@@ -30,5 +32,6 @@ export declare class PromptInput {
|
|
|
30
32
|
contentWidth: number;
|
|
31
33
|
layoutWidth: number;
|
|
32
34
|
};
|
|
33
|
-
render(width: number, renderBody: (innerWidth: number) => PromptInputBody, ruled?: boolean, padding?: number, promptGlyph?: string): string[];
|
|
35
|
+
render(width: number, renderBody: (innerWidth: number) => PromptInputBody, ruled?: boolean, padding?: number, promptGlyph?: string, promptRole?: PromptMarkerRole): string[];
|
|
34
36
|
}
|
|
37
|
+
export {};
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import { displayWidth, truncateToWidth } from "./text.js";
|
|
2
2
|
import { PLAIN_THEME } from "./theme.js";
|
|
3
|
-
export const PROMPT_GLYPH = "
|
|
4
|
-
export const PROMPT_PREFIX_WIDTH =
|
|
5
|
-
export function promptRuleText(text) {
|
|
6
|
-
return
|
|
3
|
+
export const PROMPT_GLYPH = "";
|
|
4
|
+
export const PROMPT_PREFIX_WIDTH = 0;
|
|
5
|
+
export function promptRuleText(text, theme) {
|
|
6
|
+
return theme.fg("border", text);
|
|
7
7
|
}
|
|
8
|
-
export function promptRule(width) {
|
|
9
|
-
return promptRuleText("─".repeat(Math.max(0, width)));
|
|
8
|
+
export function promptRule(width, theme) {
|
|
9
|
+
return promptRuleText("─".repeat(Math.max(0, width)), theme);
|
|
10
10
|
}
|
|
11
|
-
export function promptArrow(text, theme) {
|
|
12
|
-
|
|
11
|
+
export function promptArrow(text, theme, role = "muted") {
|
|
12
|
+
if (role === "accent" && text.startsWith(">"))
|
|
13
|
+
return `${theme.fg(role, ">")}${text.slice(1)}`;
|
|
14
|
+
return theme.fg(role, text);
|
|
13
15
|
}
|
|
14
16
|
/** Composes shared input chrome around controller-owned body rows without owning editing state. */
|
|
15
17
|
export class PromptInput {
|
|
16
18
|
theme;
|
|
17
19
|
metrics;
|
|
18
20
|
constructor(theme = PLAIN_THEME, metrics = { measure: displayWidth, truncate: truncateToWidth }) { this.theme = theme; this.metrics = metrics; }
|
|
19
|
-
styleRule(text) { return promptRuleText(text); }
|
|
21
|
+
styleRule(text) { return promptRuleText(text, this.theme); }
|
|
20
22
|
geometry(width, padding = 0, promptGlyph = PROMPT_GLYPH) {
|
|
21
23
|
const prefixWidth = Math.min(this.metrics.measure(promptGlyph), Math.max(0, width));
|
|
22
24
|
// Compatibility: editor wrapping needs room for a two-cell grapheme plus its cursor cell.
|
|
@@ -26,7 +28,7 @@ export class PromptInput {
|
|
|
26
28
|
const contentWidth = Math.max(1, innerWidth - paddingX * 2);
|
|
27
29
|
return { prefixWidth, innerWidth, paddingX, contentWidth, layoutWidth: Math.max(1, contentWidth - (paddingX ? 0 : 1)) };
|
|
28
30
|
}
|
|
29
|
-
render(width, renderBody, ruled = true, padding = 0, promptGlyph = PROMPT_GLYPH) {
|
|
31
|
+
render(width, renderBody, ruled = true, padding = 0, promptGlyph = PROMPT_GLYPH, promptRole = "muted") {
|
|
30
32
|
if (width <= 0)
|
|
31
33
|
return [];
|
|
32
34
|
const { prefixWidth, innerWidth } = this.geometry(width, padding, promptGlyph);
|
|
@@ -40,11 +42,11 @@ export class PromptInput {
|
|
|
40
42
|
return clipped + " ".repeat(Math.max(0, width - this.metrics.measure(clipped)));
|
|
41
43
|
};
|
|
42
44
|
const rows = body.rows.map((row, index) => fit(`${index === 0
|
|
43
|
-
? promptArrow(promptGlyph, this.theme)
|
|
45
|
+
? promptArrow(promptGlyph, this.theme, promptRole)
|
|
44
46
|
: " ".repeat(prefixWidth)}${row}`));
|
|
45
47
|
const rule = (fragment) => fragment === undefined
|
|
46
|
-
? promptRule(width)
|
|
47
|
-
: fit(fragment + promptRule(Math.max(0, width - this.metrics.measure(fragment))));
|
|
48
|
+
? promptRule(width, this.theme)
|
|
49
|
+
: fit(fragment + promptRule(Math.max(0, width - this.metrics.measure(fragment)), this.theme));
|
|
48
50
|
return [
|
|
49
51
|
...(ruled ? [rule(body.topRule)] : []),
|
|
50
52
|
...rows,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
export interface ScrollbarGeometry {
|
|
7
7
|
/** Rows in the track. */
|
|
8
8
|
readonly trackHeight: number;
|
|
9
|
-
/** Thumb height in rows, at least
|
|
9
|
+
/** Thumb height in rows, at least two when the track permits. */
|
|
10
10
|
readonly thumbHeight: number;
|
|
11
11
|
/** Zero-based row of the thumb's top within the track. */
|
|
12
12
|
readonly thumbTop: number;
|
|
@@ -39,7 +39,7 @@ export function scrollbarGeometry(input) {
|
|
|
39
39
|
return null;
|
|
40
40
|
const maxScroll = contentLength - viewportHeight;
|
|
41
41
|
const scroll = Math.min(Math.max(input.scroll, 0), maxScroll);
|
|
42
|
-
const thumbHeight = Math.
|
|
42
|
+
const thumbHeight = Math.min(trackHeight, Math.max(2, Math.round(trackHeight * viewportHeight / contentLength)));
|
|
43
43
|
const travel = trackHeight - thumbHeight;
|
|
44
44
|
const thumbTop = maxScroll === 0 ? 0 : Math.min(travel, Math.round(travel * scroll / maxScroll));
|
|
45
45
|
return { trackHeight, thumbHeight, thumbTop, maxScroll };
|
|
@@ -2,23 +2,23 @@ import { type OrderedTextSelection, type TextSelectionLineContent } from "./text
|
|
|
2
2
|
/** Bound selected-source retention independently of history length and encoded payload size. */
|
|
3
3
|
export declare const MAX_COPY_SOURCE_UNITS: number;
|
|
4
4
|
export declare const MAX_COPY_ROWS = 65536;
|
|
5
|
+
export declare const COPY_ACKNOWLEDGEMENT_DURATION_MS = 1000;
|
|
6
|
+
export declare function copyAcknowledgementText(characters: number): string;
|
|
5
7
|
export type SelectionCopyPrompt = "first" | "continuation" | undefined;
|
|
6
8
|
export interface SelectionCopyRow {
|
|
7
9
|
readonly text: string;
|
|
8
10
|
readonly prompt?: "first" | "continuation";
|
|
9
11
|
}
|
|
10
|
-
/** Immutable selected rows only; safe to transfer to an isolated text preparer. */
|
|
11
12
|
export interface SelectionCopySnapshot {
|
|
12
13
|
readonly selection: OrderedTextSelection;
|
|
13
14
|
readonly revision: number;
|
|
14
|
-
/** Prompt copy/cut already supplies exact expanded text; do not apply transcript chrome stripping. */
|
|
15
15
|
readonly literal?: boolean;
|
|
16
16
|
readonly rows: readonly SelectionCopyRow[];
|
|
17
17
|
readonly sourceUnits: number;
|
|
18
18
|
readonly captureMs?: number;
|
|
19
19
|
readonly rejected?: "size";
|
|
20
20
|
}
|
|
21
|
-
/** Shares the viewport's semantic chrome exclusions with isolated copy preparation. */
|
|
22
21
|
export declare function selectionCopyLineContent(text: string, prompt: SelectionCopyPrompt): TextSelectionLineContent;
|
|
22
|
+
export declare function literalSelectionCopySnapshot(text: string, revision?: number): SelectionCopySnapshot | null;
|
|
23
23
|
/** Extracts one snapshot row with the existing grapheme/newline policy; run expensive rows off-thread. */
|
|
24
24
|
export declare function selectionCopyRowText(snapshot: Pick<SelectionCopySnapshot, "selection" | "literal">, row: SelectionCopyRow, index: number): string;
|
|
@@ -3,7 +3,10 @@ import { stripAnsi } from "./text.js";
|
|
|
3
3
|
/** Bound selected-source retention independently of history length and encoded payload size. */
|
|
4
4
|
export const MAX_COPY_SOURCE_UNITS = 32 * 1024 * 1024;
|
|
5
5
|
export const MAX_COPY_ROWS = 65_536;
|
|
6
|
-
|
|
6
|
+
export const COPY_ACKNOWLEDGEMENT_DURATION_MS = 1_000;
|
|
7
|
+
export function copyAcknowledgementText(characters) {
|
|
8
|
+
return `copied ${characters} chars to clipboard`;
|
|
9
|
+
}
|
|
7
10
|
export function selectionCopyLineContent(text, prompt) {
|
|
8
11
|
const plain = stripAnsi(text);
|
|
9
12
|
if (prompt !== undefined) {
|
|
@@ -19,6 +22,18 @@ export function selectionCopyLineContent(text, prompt) {
|
|
|
19
22
|
return { from, to: from + 1 };
|
|
20
23
|
return usefulTextLineContent(plain, from);
|
|
21
24
|
}
|
|
25
|
+
export function literalSelectionCopySnapshot(text, revision = 0) {
|
|
26
|
+
if (text.trim().length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
const selection = {
|
|
29
|
+
start: { line: 0, column: 0 },
|
|
30
|
+
end: { line: 0, column: Number.MAX_SAFE_INTEGER },
|
|
31
|
+
};
|
|
32
|
+
if (text.length > MAX_COPY_SOURCE_UNITS) {
|
|
33
|
+
return { literal: true, selection, revision, rows: [], sourceUnits: 0, rejected: "size" };
|
|
34
|
+
}
|
|
35
|
+
return { literal: true, selection, revision, rows: [{ text }], sourceUnits: text.length };
|
|
36
|
+
}
|
|
22
37
|
/** Extracts one snapshot row with the existing grapheme/newline policy; run expensive rows off-thread. */
|
|
23
38
|
export function selectionCopyRowText(snapshot, row, index) {
|
|
24
39
|
if (snapshot.literal)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { displayWidth } from "./text.js";
|
|
1
|
+
import { displayWidth, graphemeWidth } from "./text.js";
|
|
2
2
|
/**
|
|
3
3
|
* Ported from the A1 UI reference implementation (`core/presentation/spans.ts`).
|
|
4
4
|
* Writing over part of a rendered row is not string slicing: the row carries
|
|
@@ -53,7 +53,7 @@ export function overlaySpan(line, from, to, span, options = {}) {
|
|
|
53
53
|
continue;
|
|
54
54
|
}
|
|
55
55
|
for (const { segment } of GRAPHEMES.segment(token)) {
|
|
56
|
-
const width =
|
|
56
|
+
const width = graphemeWidth(segment);
|
|
57
57
|
if (column + width <= from)
|
|
58
58
|
head += segment;
|
|
59
59
|
else if (column >= to)
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export type UiTimeFormat = "20:00" | "8:00 PM";
|
|
2
|
+
/** Deterministic local hour/minute presentation shared by A1-owned time labels. */
|
|
3
|
+
export declare function formatLocalTime(source: Date | number, format?: UiTimeFormat): string | null;
|
|
4
|
+
/** Visible width of the submitted-prompt prefix (` ❯ `). */
|
|
5
|
+
export declare const SUBMITTED_PROMPT_PREFIX_WIDTH = 3;
|
|
3
6
|
export interface SubmittedPromptStyle {
|
|
4
7
|
readonly prefix?: (text: string) => string;
|
|
5
8
|
readonly timestamp?: (text: string) => string;
|
|
@@ -8,16 +11,16 @@ export interface SubmittedPromptLayout {
|
|
|
8
11
|
readonly contentWidth: number;
|
|
9
12
|
readonly timestamp: string | null;
|
|
10
13
|
}
|
|
11
|
-
/** Formats transcript metadata, never render time,
|
|
12
|
-
export declare function formatSubmittedPromptTime(source: Date | number): string | null;
|
|
14
|
+
/** Formats transcript metadata, never render time, in the active A1 time format. */
|
|
15
|
+
export declare function formatSubmittedPromptTime(source: Date | number, format?: UiTimeFormat): string | null;
|
|
13
16
|
/**
|
|
14
17
|
* Computes the width at which the prompt's Markdown body must be rendered.
|
|
15
18
|
* The timestamp is omitted rather than allowing it to crowd useful content.
|
|
16
19
|
*/
|
|
17
|
-
export declare function submittedPromptLayout(width: number, source?: Date | number | null): SubmittedPromptLayout;
|
|
20
|
+
export declare function submittedPromptLayout(width: number, source?: Date | number | null, format?: UiTimeFormat): SubmittedPromptLayout;
|
|
18
21
|
/**
|
|
19
22
|
* Composes already-rendered prompt content into the compact submitted bar.
|
|
20
23
|
* Continuations align below the content, not below the prefix, and no row can
|
|
21
24
|
* exceed the supplied terminal width even when the content renderer misbehaves.
|
|
22
25
|
*/
|
|
23
|
-
export declare function composeSubmittedPromptRows(contentRows: readonly string[], width: number, source?: Date | number | null, style?: SubmittedPromptStyle): readonly string[];
|
|
26
|
+
export declare function composeSubmittedPromptRows(contentRows: readonly string[], width: number, source?: Date | number | null, style?: SubmittedPromptStyle, format?: UiTimeFormat): readonly string[];
|