@timurproko/a1 0.2.6 → 0.2.7-dev.1221
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 +196 -908
- package/dist/app/session-shell/session-shell.d.ts +3 -8
- package/dist/app/session-shell/session-shell.js +324 -835
- package/dist/app/session-shell/session-viewport-controller.d.ts +2 -2
- package/dist/app/session-shell/session-viewport-controller.js +29 -15
- 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 +102 -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 +205 -153
- 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 -1
- package/dist/composition/settings-route-host.js +29 -10
- package/dist/composition/settings-search-input.d.ts +9 -0
- package/dist/composition/settings-search-input.js +58 -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 +242 -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 +76 -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-screen-app.d.ts +2 -0
- package/dist/features/owned-ui/reference-screen-app.js +12 -2
- package/dist/features/owned-ui/settings-app.d.ts +12 -2
- package/dist/features/owned-ui/settings-app.js +116 -81
- 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 +90 -6
- 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 +73 -4
- 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.js +35 -30
- package/dist/ui/components/index.d.ts +2 -2
- package/dist/ui/components/index.js +1 -1
- 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/selection-copy.d.ts +2 -0
- package/dist/ui/components/selection-copy.js +13 -0
- 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.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 +176 -55
- 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 +648 -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,8 +1,18 @@
|
|
|
1
|
+
import { dialogFrameGeometry, insetDialogContent } from "../../contracts/presentation/index.js";
|
|
1
2
|
import { LineInput, renderInputRow } from "./line-input.js";
|
|
2
|
-
import {
|
|
3
|
+
import { renderShortcutHintsWithClose } from "./shortcut-hints.js";
|
|
3
4
|
import { displayWidth, truncateToWidth } from "./text.js";
|
|
4
5
|
const LABEL_COLUMN_CAP = 30;
|
|
5
6
|
const STEPPED_LABEL_COLUMN_CAP = 46;
|
|
7
|
+
/** One frame path for every semantic row, regardless of which dialog supplies the content. */
|
|
8
|
+
function dialogPanelLayout(width, theme) {
|
|
9
|
+
const geometry = dialogFrameGeometry(width);
|
|
10
|
+
return {
|
|
11
|
+
rule: theme.fg("border", "─".repeat(geometry.frameWidth)),
|
|
12
|
+
contentWidth: geometry.contentWidth,
|
|
13
|
+
contentRow: (painted, raw = painted) => insetDialogContent(pad(truncateToWidth(painted, geometry.contentWidth), geometry.contentWidth, raw), geometry),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
6
16
|
/** The column values start at: past the widest label, capped so one long name cannot push them off. */
|
|
7
17
|
export function dialogValueColumn(rows) {
|
|
8
18
|
const widest = Math.min(LABEL_COLUMN_CAP, Math.max(0, ...rows.map(row => displayWidth(row.label))));
|
|
@@ -14,11 +24,7 @@ export function dialogValueColumn(rows) {
|
|
|
14
24
|
*/
|
|
15
25
|
export function renderDialogPanel(state, width, theme) {
|
|
16
26
|
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)}`;
|
|
27
|
+
const layout = dialogPanelLayout(width, theme);
|
|
22
28
|
const rows = state.rows.map((row, index) => {
|
|
23
29
|
const selected = index === state.index;
|
|
24
30
|
const padded = `${row.label}${" ".repeat(Math.max(0, labelColumn - displayWidth(row.label)))}`;
|
|
@@ -28,31 +34,27 @@ export function renderDialogPanel(state, width, theme) {
|
|
|
28
34
|
? `${theme.fg("accent", cursor)}${theme.fg("text", padded)} ${theme.fg("muted", row.value)}`
|
|
29
35
|
: `${cursor}${padded} ${theme.fg("muted", row.value)}`;
|
|
30
36
|
const painted = selected ? theme.highlight(content) : content;
|
|
31
|
-
return contentRow(painted, raw);
|
|
37
|
+
return layout.contentRow(painted, raw);
|
|
32
38
|
});
|
|
33
39
|
const description = state.rows[state.index]?.description ?? "";
|
|
34
40
|
const hint = typeof state.hint === "string"
|
|
35
41
|
? theme.fg("dim", state.hint)
|
|
36
|
-
: renderShortcutHintsWithClose(state.hint, theme, contentWidth, 0);
|
|
42
|
+
: renderShortcutHintsWithClose(state.hint, theme, layout.contentWidth, 0);
|
|
37
43
|
const plainHint = typeof state.hint === "string" ? state.hint : " ".repeat(displayWidth(hint));
|
|
38
44
|
return [
|
|
39
|
-
rule,
|
|
40
|
-
contentRow(theme.bold(theme.fg("accent", state.title)), state.title),
|
|
41
|
-
contentRow(theme.fg("dim", description), description),
|
|
45
|
+
layout.rule,
|
|
46
|
+
layout.contentRow(theme.bold(theme.fg("accent", state.title)), state.title),
|
|
47
|
+
layout.contentRow(theme.fg("dim", description), description),
|
|
42
48
|
"",
|
|
43
49
|
...rows,
|
|
44
50
|
"",
|
|
45
|
-
contentRow(hint, plainHint),
|
|
46
|
-
rule,
|
|
51
|
+
layout.contentRow(hint, plainHint),
|
|
52
|
+
layout.rule,
|
|
47
53
|
];
|
|
48
54
|
}
|
|
49
55
|
/** Owned stepped-selector composition for structured settings with nested choices. */
|
|
50
56
|
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)}`;
|
|
57
|
+
const layout = dialogPanelLayout(width, theme);
|
|
56
58
|
const labelColumn = Math.min(STEPPED_LABEL_COLUMN_CAP, Math.max(0, ...state.rows.map(row => displayWidth(`${row.label}${row.labelSuffix ?? ""}`))));
|
|
57
59
|
const rows = state.rows.map((row, index) => {
|
|
58
60
|
const selected = index === state.index;
|
|
@@ -65,31 +67,34 @@ export function renderSteppedDialogPanel(state, width, theme) {
|
|
|
65
67
|
const content = selected
|
|
66
68
|
? `${theme.fg("accent", cursor)}${label}${theme.fg("muted", suffix)}`
|
|
67
69
|
: `${cursor}${label}${theme.fg("muted", suffix)}`;
|
|
68
|
-
return contentRow(selected ? theme.highlight(content) : content, raw);
|
|
70
|
+
return layout.contentRow(selected ? theme.highlight(content) : content, raw);
|
|
69
71
|
});
|
|
70
72
|
const input = state.input === undefined
|
|
71
73
|
? []
|
|
72
|
-
: [
|
|
74
|
+
: [
|
|
75
|
+
...renderInputRow(state.input, layout.contentWidth, {
|
|
76
|
+
ruled: false,
|
|
77
|
+
promptGlyph: "> ",
|
|
78
|
+
promptRole: "accent",
|
|
79
|
+
theme,
|
|
80
|
+
}).lines.map(row => layout.contentRow(row)),
|
|
81
|
+
"",
|
|
82
|
+
];
|
|
73
83
|
const step = `(step ${state.step}/${state.steps})`;
|
|
74
84
|
const title = `${state.title} ${step}`;
|
|
75
85
|
const paintedTitle = `${theme.bold(theme.fg("accent", state.title))} ${theme.fg("dim", step)}`;
|
|
76
86
|
return [
|
|
77
|
-
rule,
|
|
78
|
-
contentRow(paintedTitle, title),
|
|
79
|
-
contentRow(theme.fg("dim", state.description), state.description),
|
|
87
|
+
layout.rule,
|
|
88
|
+
layout.contentRow(paintedTitle, title),
|
|
89
|
+
layout.contentRow(theme.fg("dim", state.description), state.description),
|
|
80
90
|
"",
|
|
81
91
|
...input,
|
|
82
92
|
...rows,
|
|
83
93
|
"",
|
|
84
|
-
|
|
85
|
-
rule,
|
|
94
|
+
layout.contentRow(renderShortcutHintsWithClose(state.hint, theme, layout.contentWidth)),
|
|
95
|
+
layout.rule,
|
|
86
96
|
];
|
|
87
97
|
}
|
|
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
98
|
/** The row a pointer report lands on, or null when it is not on one. */
|
|
94
99
|
export function dialogRowAt(frame, row, column, valueWidth) {
|
|
95
100
|
const at = row - frame.firstRow;
|
|
@@ -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";
|
|
@@ -16,7 +16,7 @@ export { GLOBAL_SCOPE, ShortcutRegistry, assembleShortcuts, assertNoShortcutConf
|
|
|
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";
|
|
@@ -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,
|
|
@@ -20,5 +20,7 @@ export interface SelectionCopySnapshot {
|
|
|
20
20
|
}
|
|
21
21
|
/** Shares the viewport's semantic chrome exclusions with isolated copy preparation. */
|
|
22
22
|
export declare function selectionCopyLineContent(text: string, prompt: SelectionCopyPrompt): TextSelectionLineContent;
|
|
23
|
+
/** Builds an immutable exact-text snapshot without changing editor-owned selection state. */
|
|
24
|
+
export declare function literalSelectionCopySnapshot(text: string, revision?: number): SelectionCopySnapshot | null;
|
|
23
25
|
/** Extracts one snapshot row with the existing grapheme/newline policy; run expensive rows off-thread. */
|
|
24
26
|
export declare function selectionCopyRowText(snapshot: Pick<SelectionCopySnapshot, "selection" | "literal">, row: SelectionCopyRow, index: number): string;
|
|
@@ -19,6 +19,19 @@ export function selectionCopyLineContent(text, prompt) {
|
|
|
19
19
|
return { from, to: from + 1 };
|
|
20
20
|
return usefulTextLineContent(plain, from);
|
|
21
21
|
}
|
|
22
|
+
/** Builds an immutable exact-text snapshot without changing editor-owned selection state. */
|
|
23
|
+
export function literalSelectionCopySnapshot(text, revision = 0) {
|
|
24
|
+
if (text.trim().length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
const selection = {
|
|
27
|
+
start: { line: 0, column: 0 },
|
|
28
|
+
end: { line: 0, column: Number.MAX_SAFE_INTEGER },
|
|
29
|
+
};
|
|
30
|
+
if (text.length > MAX_COPY_SOURCE_UNITS) {
|
|
31
|
+
return { literal: true, selection, revision, rows: [], sourceUnits: 0, rejected: "size" };
|
|
32
|
+
}
|
|
33
|
+
return { literal: true, selection, revision, rows: [{ text }], sourceUnits: text.length };
|
|
34
|
+
}
|
|
22
35
|
/** Extracts one snapshot row with the existing grapheme/newline policy; run expensive rows off-thread. */
|
|
23
36
|
export function selectionCopyRowText(snapshot, row, index) {
|
|
24
37
|
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[];
|
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
import { displayWidth, truncateToWidth } from "./text.js";
|
|
2
|
-
/**
|
|
3
|
-
export
|
|
4
|
-
const TIMESTAMP_MARGIN = 3;
|
|
5
|
-
const MIN_USEFUL_CONTENT_WIDTH = 8;
|
|
6
|
-
/** Formats transcript metadata, never render time, as local 24-hour HH:mm. */
|
|
7
|
-
export function formatSubmittedPromptTime(source) {
|
|
2
|
+
/** Deterministic local hour/minute presentation shared by A1-owned time labels. */
|
|
3
|
+
export function formatLocalTime(source, format = "8:00 PM") {
|
|
8
4
|
const date = source instanceof Date ? source : new Date(source);
|
|
9
5
|
if (!Number.isFinite(date.getTime()))
|
|
10
6
|
return null;
|
|
11
|
-
|
|
7
|
+
const hour = date.getHours();
|
|
8
|
+
const minute = String(date.getMinutes()).padStart(2, "0");
|
|
9
|
+
if (format === "20:00")
|
|
10
|
+
return `${String(hour).padStart(2, "0")}:${minute}`;
|
|
11
|
+
return `${hour % 12 || 12}:${minute} ${hour < 12 ? "AM" : "PM"}`;
|
|
12
|
+
}
|
|
13
|
+
/** Visible width of the submitted-prompt prefix (` ❯ `). */
|
|
14
|
+
export const SUBMITTED_PROMPT_PREFIX_WIDTH = 3;
|
|
15
|
+
const TIMESTAMP_MARGIN = 3;
|
|
16
|
+
const MIN_USEFUL_CONTENT_WIDTH = 8;
|
|
17
|
+
/** Formats transcript metadata, never render time, in the active A1 time format. */
|
|
18
|
+
export function formatSubmittedPromptTime(source, format = "8:00 PM") {
|
|
19
|
+
return formatLocalTime(source, format);
|
|
12
20
|
}
|
|
13
21
|
/**
|
|
14
22
|
* Computes the width at which the prompt's Markdown body must be rendered.
|
|
15
23
|
* The timestamp is omitted rather than allowing it to crowd useful content.
|
|
16
24
|
*/
|
|
17
|
-
export function submittedPromptLayout(width, source) {
|
|
25
|
+
export function submittedPromptLayout(width, source, format = "8:00 PM") {
|
|
18
26
|
const boundedWidth = Math.max(1, width);
|
|
19
|
-
const timestamp = source === undefined || source === null ? null : formatSubmittedPromptTime(source);
|
|
27
|
+
const timestamp = source === undefined || source === null ? null : formatSubmittedPromptTime(source, format);
|
|
20
28
|
const timestampReserve = timestamp === null ? 0 : displayWidth(timestamp) + TIMESTAMP_MARGIN;
|
|
21
29
|
const canShowTimestamp = timestamp !== null
|
|
22
30
|
&& boundedWidth - SUBMITTED_PROMPT_PREFIX_WIDTH - timestampReserve >= MIN_USEFUL_CONTENT_WIDTH;
|
|
@@ -30,11 +38,11 @@ export function submittedPromptLayout(width, source) {
|
|
|
30
38
|
* Continuations align below the content, not below the prefix, and no row can
|
|
31
39
|
* exceed the supplied terminal width even when the content renderer misbehaves.
|
|
32
40
|
*/
|
|
33
|
-
export function composeSubmittedPromptRows(contentRows, width, source, style = {}) {
|
|
41
|
+
export function composeSubmittedPromptRows(contentRows, width, source, style = {}, format = "8:00 PM") {
|
|
34
42
|
if (width <= 0)
|
|
35
43
|
return [];
|
|
36
|
-
const layout = submittedPromptLayout(width, source);
|
|
37
|
-
const prefix = (style.prefix ?? identity)("❯ ");
|
|
44
|
+
const layout = submittedPromptLayout(width, source, format);
|
|
45
|
+
const prefix = (style.prefix ?? identity)(" ❯ ");
|
|
38
46
|
const rows = (contentRows.length === 0 ? [""] : contentRows).map((row, index) => {
|
|
39
47
|
const content = truncateToWidth(row, layout.contentWidth);
|
|
40
48
|
return `${index === 0 ? prefix : " ".repeat(SUBMITTED_PROMPT_PREFIX_WIDTH)}${content}`;
|
|
@@ -29,10 +29,12 @@ export function withScrollbarRail(lines, geometry, contentWidth, theme, options
|
|
|
29
29
|
*/
|
|
30
30
|
export function renderEmptyState(message, mark, height, width, theme) {
|
|
31
31
|
const middle = Math.floor(height / 2);
|
|
32
|
+
const messageRow = Math.min(Math.max(0, height - 1), middle + 1);
|
|
33
|
+
const markRow = messageRow - 1;
|
|
32
34
|
return Array.from({ length: Math.max(0, height) }, (_line, index) => {
|
|
33
|
-
if (index ===
|
|
35
|
+
if (index === markRow)
|
|
34
36
|
return centre(theme.fg("muted", mark), mark, width);
|
|
35
|
-
return index ===
|
|
37
|
+
return index === messageRow ? centre(theme.fg("muted", message), message, width) : "";
|
|
36
38
|
});
|
|
37
39
|
}
|
|
38
40
|
function centre(painted, raw, width) {
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Display-width text handling. Terminals lay out by column, not by code unit,
|
|
3
|
-
* so measuring with `String.length` mis-sizes CJK, emoji, and combining marks,
|
|
4
|
-
* and counting styling escapes as visible width breaks every layout that uses
|
|
5
|
-
* colour.
|
|
6
|
-
*/
|
|
1
|
+
/** Terminal-column geometry: preserve graphemes, Unicode cell widths and ANSI styling. */
|
|
7
2
|
/** Removes styling sequences so only visible characters remain. */
|
|
8
3
|
export declare function stripAnsi(text: string): string;
|
|
4
|
+
/** Width of one grapheme cluster: two for emoji, else the widest code point it contains. */
|
|
5
|
+
export declare function graphemeWidth(grapheme: string): number;
|
|
9
6
|
export interface DisplayColumnRange {
|
|
10
7
|
readonly from: number;
|
|
11
8
|
readonly to: number;
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Display-width text handling. Terminals lay out by column, not by code unit,
|
|
3
|
-
* so measuring with `String.length` mis-sizes CJK, emoji, and combining marks,
|
|
4
|
-
* and counting styling escapes as visible width breaks every layout that uses
|
|
5
|
-
* colour.
|
|
6
|
-
*/
|
|
1
|
+
/** Terminal-column geometry: preserve graphemes, Unicode cell widths and ANSI styling. */
|
|
7
2
|
const ANSI_PATTERN = /\[[0-9;:?]*[ -/]*[@-~]|[\]_][^]*(?:|\\)|[@-Z\\-_]/g;
|
|
8
3
|
const SEGMENTER = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
9
4
|
const WORD_SEGMENTER = new Intl.Segmenter(undefined, { granularity: "word" });
|
|
@@ -76,7 +71,7 @@ function couldBeEmoji(grapheme) {
|
|
|
76
71
|
grapheme.length > 1);
|
|
77
72
|
}
|
|
78
73
|
/** Width of one grapheme cluster: two for emoji, else the widest code point it contains. */
|
|
79
|
-
function graphemeWidth(grapheme) {
|
|
74
|
+
export function graphemeWidth(grapheme) {
|
|
80
75
|
if (couldBeEmoji(grapheme) && RGI_EMOJI_PATTERN.test(grapheme))
|
|
81
76
|
return 2;
|
|
82
77
|
let width = 0;
|
|
@@ -126,8 +121,11 @@ export function displayColumnSlice(text, requestedFrom, requestedTo) {
|
|
|
126
121
|
}
|
|
127
122
|
/** Columns this text occupies once styling is removed. */
|
|
128
123
|
export function displayWidth(text) {
|
|
124
|
+
const plain = stripAnsi(text);
|
|
125
|
+
if (!/[^\x20-\x7e]/u.test(plain))
|
|
126
|
+
return plain.length;
|
|
129
127
|
let width = 0;
|
|
130
|
-
for (const { segment } of SEGMENTER.segment(
|
|
128
|
+
for (const { segment } of SEGMENTER.segment(plain))
|
|
131
129
|
width += graphemeWidth(segment);
|
|
132
130
|
return width;
|
|
133
131
|
}
|
|
@@ -6,6 +6,8 @@ export interface TranscriptPromptAnchor {
|
|
|
6
6
|
readonly lastRow: number;
|
|
7
7
|
/** The source first row, including its submitted-prompt styling and timestamp. */
|
|
8
8
|
readonly sourceRow: string;
|
|
9
|
+
/** Right-edge metadata cells omitted from semantic prompt copies. */
|
|
10
|
+
readonly copySuffixWidth?: number;
|
|
9
11
|
/** Optional source-styled row used only while prominent and not hovered. */
|
|
10
12
|
readonly prominentSourceRow?: string;
|
|
11
13
|
}
|
|
@@ -36,6 +38,11 @@ export interface TranscriptViewportFrameInput {
|
|
|
36
38
|
/** Final transient rows to bottom-align with unused viewport space while content fits. */
|
|
37
39
|
readonly bottomAlignedTailRowCount?: number;
|
|
38
40
|
readonly dockRows: readonly string[];
|
|
41
|
+
/** Zero-based dock rows admitted to frame copying, classified before dock composition. */
|
|
42
|
+
readonly copyableDockRows?: readonly {
|
|
43
|
+
readonly row: number;
|
|
44
|
+
readonly prompt?: "first" | "continuation";
|
|
45
|
+
}[];
|
|
39
46
|
readonly promptAnchors: readonly TranscriptPromptAnchor[];
|
|
40
47
|
readonly width: number;
|
|
41
48
|
readonly height: number;
|
|
@@ -171,7 +178,7 @@ export declare class TranscriptViewport {
|
|
|
171
178
|
releaseSelection(): boolean;
|
|
172
179
|
clearSelection(): boolean;
|
|
173
180
|
selectedText(): string | null;
|
|
174
|
-
/** Captures
|
|
181
|
+
/** Captures selected text, including document rows of a visible selection scrolled off-screen. */
|
|
175
182
|
captureSelectedText(): SelectionCopySnapshot | null;
|
|
176
183
|
scrollBy(lines: number, now?: number): boolean;
|
|
177
184
|
scrollTo(position: number, now?: number): boolean;
|
|
@@ -184,6 +191,6 @@ export declare class TranscriptViewport {
|
|
|
184
191
|
clearTransient(): void;
|
|
185
192
|
compose(input: TranscriptViewportFrameInput): TranscriptViewportFrame;
|
|
186
193
|
/** Reuses an established transcript frame when only same-height dock rows changed. */
|
|
187
|
-
composeDockOnly(dockRows: readonly string[], width: number, height: number): TranscriptViewportFrame | null;
|
|
194
|
+
composeDockOnly(dockRows: readonly string[], width: number, height: number, copyableDockRows?: TranscriptViewportFrameInput["copyableDockRows"]): TranscriptViewportFrame | null;
|
|
188
195
|
}
|
|
189
196
|
export declare function assertTranscriptViewportFrameDescriptor(descriptor: TranscriptViewportFrameDescriptor): void;
|