@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
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { residentUtilityRoute } from "../foundation/resident-tabs/routes.js";
|
|
2
|
+
import { deriveResidentTabStatus } from "../features/resident-tab/status-deriver.js";
|
|
3
|
+
import { projectResidentTabShortcuts } from "../features/resident-tab/shortcut-projection.js";
|
|
4
|
+
import { readShortcutBindingsFile } from "../features/resident-tab/shortcut-bindings-file.js";
|
|
5
|
+
/**
|
|
6
|
+
* The keybindings the shells borrow. Inside a resident tab the host dispatches and labels the tab
|
|
7
|
+
* shortcuts this child projects from its effective declarations, so the projection is published now
|
|
8
|
+
* and again after every customization reload.
|
|
9
|
+
*/
|
|
10
|
+
export function residentTabKeybindings(tabBridge, agentDir, keybindingsHost) {
|
|
11
|
+
if (tabBridge === null)
|
|
12
|
+
return keybindingsHost;
|
|
13
|
+
const publish = () => tabBridge.shortcuts(projectResidentTabShortcuts({
|
|
14
|
+
configured: readShortcutBindingsFile(agentDir),
|
|
15
|
+
reserved: keybindingsHost.manager.getEffectiveConfig(),
|
|
16
|
+
}).assignments);
|
|
17
|
+
publish();
|
|
18
|
+
return { ...keybindingsHost, reload: () => { keybindingsHost.reload(); publish(); } };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* How owned screens are presented in a resident tab: a Settings or Changelog tab's screen is the tab, and the Plus menu entry opens
|
|
22
|
+
* the tab bar's own Plus Menu dialog while this tab's controlling client can show it.
|
|
23
|
+
*/
|
|
24
|
+
export function residentRouteHostOptions(tabBridge) {
|
|
25
|
+
return {
|
|
26
|
+
...(tabBridge === null ? {} : { tabRoute: residentUtilityRoute(tabBridge.tabId) }),
|
|
27
|
+
configurePlusMenu: () => {
|
|
28
|
+
if (tabBridge === null || !tabBridge.available || tabBridge.captureAttachment() === null)
|
|
29
|
+
return false;
|
|
30
|
+
void tabBridge.requestAction("configure-plus");
|
|
31
|
+
return true;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Closes a utility tab when its own screen closes. Invariant: a utility tab's screen is the tab. */
|
|
36
|
+
export function closeResidentUtilityRoute(tabBridge, route) {
|
|
37
|
+
if (residentUtilityRoute(tabBridge.tabId) === route)
|
|
38
|
+
void tabBridge.requestClose();
|
|
39
|
+
}
|
|
40
|
+
export async function bindResidentTabBridge(tabBridge, backend, recovery = null, options = {}) {
|
|
41
|
+
await tabBridge.start().catch(() => false);
|
|
42
|
+
tabBridge.status("starting");
|
|
43
|
+
const currentSessionFile = () => currentBackendSessionFile(backend);
|
|
44
|
+
let pendingAutoName = null;
|
|
45
|
+
// Invariant: while a generated name is being applied, the session name it produces is automatic
|
|
46
|
+
// even if the session normalizes it; reporting it as `user` would block the strip's title
|
|
47
|
+
// animation and every later automatic rename.
|
|
48
|
+
let applyingAutoName = false;
|
|
49
|
+
const isDefaultName = (name) => name == null || /^agent(?: \d+)?$/i.test(name);
|
|
50
|
+
const currentSessionName = () => backend.session.view().status.footer?.sessionName ?? null;
|
|
51
|
+
const announceSession = () => {
|
|
52
|
+
const name = currentSessionName();
|
|
53
|
+
// Invariant: the session may announce the applied name after the workflow resolves; the
|
|
54
|
+
// first non-default name announced for a pending auto-name is that automatic name.
|
|
55
|
+
if (applyingAutoName && !isDefaultName(name)) {
|
|
56
|
+
pendingAutoName = name;
|
|
57
|
+
applyingAutoName = false;
|
|
58
|
+
}
|
|
59
|
+
const automatic = name === pendingAutoName;
|
|
60
|
+
const nameSource = automatic ? "auto" : isDefaultName(name) ? "default" : "user";
|
|
61
|
+
tabBridge.session(currentSessionFile(), name, nameSource);
|
|
62
|
+
};
|
|
63
|
+
let working = false;
|
|
64
|
+
// Invariant: the last turn's settlement stays reported until the next turn starts.
|
|
65
|
+
let lastTurn;
|
|
66
|
+
let autoNameAttempted = false;
|
|
67
|
+
let autoNameArmed = false;
|
|
68
|
+
// Invariant: naming launches once per tab during an agent run, as soon as its prompt is projected,
|
|
69
|
+
// and runs beside the turn instead of waiting for it to settle.
|
|
70
|
+
const launchAutoName = () => {
|
|
71
|
+
if (!autoNameArmed || autoNameAttempted || options.autoName !== true || !isDefaultName(currentSessionName()))
|
|
72
|
+
return;
|
|
73
|
+
const prompt = backend.session.view().transcript.find(block => block.kind === "user")?.text.trim();
|
|
74
|
+
if (!prompt)
|
|
75
|
+
return;
|
|
76
|
+
autoNameAttempted = true;
|
|
77
|
+
void import("../features/resident-tab/index.js").then(({ generateAutoName }) => generateAutoName(prompt, request => backend.generateResidentTabName(request.prompt, request.maxTokens, request.signal))).then(async (name) => {
|
|
78
|
+
// Invariant: a manual rename made while generation was pending owns both the session and the tab.
|
|
79
|
+
if (!isDefaultName(currentSessionName()))
|
|
80
|
+
return;
|
|
81
|
+
pendingAutoName = name;
|
|
82
|
+
applyingAutoName = true;
|
|
83
|
+
const result = await backend.workflows.executeWorkflow({ command: "name", argument: name });
|
|
84
|
+
if (result.outcome !== "completed") {
|
|
85
|
+
applyingAutoName = false;
|
|
86
|
+
if (pendingAutoName === name)
|
|
87
|
+
pendingAutoName = null;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const current = currentSessionName();
|
|
91
|
+
if (current !== null && !isDefaultName(current)) {
|
|
92
|
+
// Invariant: The session already holds the applied name; report it as automatic now.
|
|
93
|
+
pendingAutoName = current;
|
|
94
|
+
applyingAutoName = false;
|
|
95
|
+
tabBridge.session(currentSessionFile(), current, "auto");
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Invariant: The session announces later; show the generated name meanwhile, still automatic.
|
|
99
|
+
tabBridge.session(currentSessionFile(), name, "auto");
|
|
100
|
+
}
|
|
101
|
+
}).catch(() => { pendingAutoName = null; applyingAutoName = false; });
|
|
102
|
+
};
|
|
103
|
+
const reportStatus = (lifecycle) => {
|
|
104
|
+
const view = backend.session.view();
|
|
105
|
+
const pendingRequests = view.dialog == null ? 0 : 1;
|
|
106
|
+
const queuedInput = view.editor?.queuedSubmissions.length ?? 0;
|
|
107
|
+
tabBridge.status(deriveResidentTabStatus({
|
|
108
|
+
lifecycle: lifecycle ?? view.lifecycle,
|
|
109
|
+
pendingRequests,
|
|
110
|
+
queuedInput,
|
|
111
|
+
...(lastTurn === undefined ? {} : { lastTurn }),
|
|
112
|
+
}), false, pendingRequests, queuedInput);
|
|
113
|
+
};
|
|
114
|
+
announceSession();
|
|
115
|
+
const unsubscribeCommands = typeof tabBridge.onCommand === "function" ? tabBridge.onCommand(command => {
|
|
116
|
+
// Invariant: visibility stays decoded for generation-1 peers but never pauses rendering; a hidden tab
|
|
117
|
+
// keeps its resident terminal current while the holder withholds only its client surfaces.
|
|
118
|
+
if (command.type === "rename") {
|
|
119
|
+
void backend.workflows.executeWorkflow({ command: "name", argument: command.name }).catch(() => { });
|
|
120
|
+
}
|
|
121
|
+
else if (command.type === "route") {
|
|
122
|
+
if (options.openRoute !== undefined)
|
|
123
|
+
options.openRoute(command.route);
|
|
124
|
+
else
|
|
125
|
+
void backend.workflows.executeWorkflow({ command: command.route, argument: "" }).catch(() => { });
|
|
126
|
+
}
|
|
127
|
+
else if (command.type === "stop") {
|
|
128
|
+
void backend.session.dispose().catch(() => { });
|
|
129
|
+
}
|
|
130
|
+
}) : () => { };
|
|
131
|
+
const unsubscribeEvents = backend.session.onEvent(event => {
|
|
132
|
+
if (event.type === "session-lifecycle") {
|
|
133
|
+
const wasWorking = working;
|
|
134
|
+
working = event.lifecycle === "busy";
|
|
135
|
+
if (working)
|
|
136
|
+
lastTurn = undefined;
|
|
137
|
+
reportStatus(event.lifecycle);
|
|
138
|
+
if (wasWorking && !working && recovery !== null) {
|
|
139
|
+
void recovery.settled(currentSessionFile()).catch(() => tabBridge.degraded(true));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (event.type === "agent-run-started") {
|
|
143
|
+
autoNameArmed = true;
|
|
144
|
+
launchAutoName();
|
|
145
|
+
}
|
|
146
|
+
// Rationale: Pi starts the run before it projects the user message, so the prompt may arrive later.
|
|
147
|
+
if (event.type === "transcript-block" || event.type === "session-view")
|
|
148
|
+
launchAutoName();
|
|
149
|
+
if (event.type === "agent-run-settled") {
|
|
150
|
+
launchAutoName();
|
|
151
|
+
autoNameArmed = false;
|
|
152
|
+
lastTurn = event.aborted ? "aborted" : event.successful ? "done" : "error";
|
|
153
|
+
tabBridge.prompt(event.aborted);
|
|
154
|
+
reportStatus();
|
|
155
|
+
}
|
|
156
|
+
if (event.type === "session-view") {
|
|
157
|
+
announceSession();
|
|
158
|
+
reportStatus();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
return () => {
|
|
162
|
+
unsubscribeCommands();
|
|
163
|
+
unsubscribeEvents();
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export async function correlateResidentTabSubmission(recovery, backend, submissionId, entryId) {
|
|
167
|
+
await recovery.correlated(submissionId, entryId);
|
|
168
|
+
// Concurrency: a normal prompt command can resolve after the ready transition already fired.
|
|
169
|
+
// Re-read lifecycle only after correlation is active; a concurrent ready observer and this path
|
|
170
|
+
// safely race because recovery consumes the active entry once and retirement is idempotent.
|
|
171
|
+
if (backend.session.view().lifecycle !== "busy")
|
|
172
|
+
await recovery.settled(currentBackendSessionFile(backend));
|
|
173
|
+
}
|
|
174
|
+
export function currentBackendSessionFile(backend) {
|
|
175
|
+
const direct = backend.identity.currentSessionFile?.();
|
|
176
|
+
if (direct !== undefined && direct !== null)
|
|
177
|
+
return direct;
|
|
178
|
+
const resume = backend.identity.currentSessionResumeMetadata();
|
|
179
|
+
return resume === null ? null : `${resume.sessionDir}/${resume.sessionId}`;
|
|
180
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AgentSettingsPort } from "../contracts/agent-engine/index.js";
|
|
2
|
+
import type { OwnedUiPromptSuggestionGeneratorPort, UiAccentColor } from "../contracts/owned-ui/index.js";
|
|
3
|
+
import type { PiEngineSessionRequest } from "../integrations/pi/engine/host.js";
|
|
4
|
+
import type { PiSessionPresenterBackend } from "../integrations/pi/session-presenters/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* The session backend composition wires: the owned-UI port, the prompt-suggestion generator, and
|
|
7
|
+
* the agent settings port. `settingsPort` stays outside the owned-UI contract because its type
|
|
8
|
+
* belongs to the agent-engine contracts, which the owned-UI contract may not import.
|
|
9
|
+
*/
|
|
10
|
+
export interface ComposedSessionBackend extends PiSessionPresenterBackend, OwnedUiPromptSuggestionGeneratorPort {
|
|
11
|
+
settingsPort(): AgentSettingsPort | null;
|
|
12
|
+
generateResidentTabName(instruction: string, maxTokens: number, signal: AbortSignal): Promise<string | null>;
|
|
13
|
+
}
|
|
14
|
+
/** The process-level engine host as composition drives it: sessions, the live accent, and disposal. */
|
|
15
|
+
export interface ComposedEngineHost {
|
|
16
|
+
create(request: PiEngineSessionRequest): Promise<ComposedSessionBackend>;
|
|
17
|
+
setAccentColor(color: UiAccentColor): void;
|
|
18
|
+
dispose(): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NativeProcessIdentity } from "../foundation/lifecycle/model.js";
|
|
2
|
+
export interface SessionRuntimeRegistryOptions {
|
|
3
|
+
/** This runtime's id from the environment; absent outside a runtime that claims worktrees. */
|
|
4
|
+
readonly runtimeId: string | undefined;
|
|
5
|
+
/** Exact native process inspection; absent SDK seams publish no claims. */
|
|
6
|
+
readonly inspectProcess: ((pid: number) => Promise<NativeProcessIdentity | null>) | undefined;
|
|
7
|
+
readonly refreshMs?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The live worktree claims this runtime's agents hold: each agent's session identity, the heartbeat
|
|
11
|
+
* that keeps the claims fresh, and their release when the runtime is disposed.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SessionRuntimeRegistry {
|
|
14
|
+
#private;
|
|
15
|
+
constructor(options: SessionRuntimeRegistryOptions);
|
|
16
|
+
/** The repository context reader for one agent; undefined names the primary agent. */
|
|
17
|
+
readerFor(agentId: string | undefined): (sessionId: string, sessionFile: string, signal: AbortSignal) => Promise<import("../foundation/lifecycle/session-repository-context.js").SessionRepositoryContext | null>;
|
|
18
|
+
/** Stops the heartbeat, waits for an in-flight refresh, and releases every claim this runtime holds. */
|
|
19
|
+
dispose(): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const SESSION_RUNTIME_REFRESH_MS = 30_000;
|
|
2
|
+
/**
|
|
3
|
+
* The live worktree claims this runtime's agents hold: each agent's session identity, the heartbeat
|
|
4
|
+
* that keeps the claims fresh, and their release when the runtime is disposed.
|
|
5
|
+
*/
|
|
6
|
+
export class SessionRuntimeRegistry {
|
|
7
|
+
#options;
|
|
8
|
+
// Invariant: one entry per agent of this runtime; each agent holds its own claim, and the runtime's exit releases all.
|
|
9
|
+
#identities = new Map();
|
|
10
|
+
#owner = null;
|
|
11
|
+
#timer = null;
|
|
12
|
+
#refresh = Promise.resolve();
|
|
13
|
+
#disposed = false;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.#options = options;
|
|
16
|
+
}
|
|
17
|
+
/** The repository context reader for one agent; undefined names the primary agent. */
|
|
18
|
+
readerFor(agentId) {
|
|
19
|
+
return async (sessionId, sessionFile, signal) => {
|
|
20
|
+
const { runtimeId, inspectProcess } = this.#options;
|
|
21
|
+
const owner = await this.#ownerIdentity();
|
|
22
|
+
if (owner === null || runtimeId === undefined || inspectProcess === undefined)
|
|
23
|
+
return null;
|
|
24
|
+
const identity = { sessionId, sessionFile };
|
|
25
|
+
this.#identities.set(agentId, identity);
|
|
26
|
+
const { activateSessionRepositoryContext } = await import("../foundation/lifecycle/session-repository-context.js");
|
|
27
|
+
const context = await activateSessionRepositoryContext(identity, runtimeId, owner, {
|
|
28
|
+
signal,
|
|
29
|
+
inspectProcess,
|
|
30
|
+
...(agentId === undefined ? {} : { agentId }),
|
|
31
|
+
});
|
|
32
|
+
this.#arm();
|
|
33
|
+
return context;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Stops the heartbeat, waits for an in-flight refresh, and releases every claim this runtime holds. */
|
|
37
|
+
async dispose() {
|
|
38
|
+
this.#disposed = true;
|
|
39
|
+
if (this.#timer !== null)
|
|
40
|
+
clearInterval(this.#timer);
|
|
41
|
+
this.#timer = null;
|
|
42
|
+
await this.#refresh;
|
|
43
|
+
const { runtimeId } = this.#options;
|
|
44
|
+
const owner = await this.#ownerIdentity();
|
|
45
|
+
if (runtimeId === undefined || owner === null)
|
|
46
|
+
return;
|
|
47
|
+
await import("../foundation/lifecycle/session-repository-context.js")
|
|
48
|
+
.then(module => module.releaseSessionRepositoryRuntime(runtimeId, owner))
|
|
49
|
+
.catch(() => undefined);
|
|
50
|
+
}
|
|
51
|
+
async #ownerIdentity() {
|
|
52
|
+
const { runtimeId, inspectProcess } = this.#options;
|
|
53
|
+
if (runtimeId === undefined || inspectProcess === undefined)
|
|
54
|
+
return null;
|
|
55
|
+
this.#owner ??= inspectProcess(process.pid).catch(() => null);
|
|
56
|
+
return await this.#owner;
|
|
57
|
+
}
|
|
58
|
+
#arm() {
|
|
59
|
+
if (this.#timer !== null)
|
|
60
|
+
return;
|
|
61
|
+
this.#timer = setInterval(() => this.#queueRefresh(), this.#options.refreshMs ?? SESSION_RUNTIME_REFRESH_MS);
|
|
62
|
+
this.#timer.unref();
|
|
63
|
+
}
|
|
64
|
+
#queueRefresh() {
|
|
65
|
+
const { runtimeId, inspectProcess } = this.#options;
|
|
66
|
+
if (this.#disposed || this.#identities.size === 0 || runtimeId === undefined || inspectProcess === undefined)
|
|
67
|
+
return;
|
|
68
|
+
this.#refresh = this.#refresh.then(async () => {
|
|
69
|
+
if (this.#disposed)
|
|
70
|
+
return;
|
|
71
|
+
const owner = await this.#ownerIdentity();
|
|
72
|
+
if (owner === null)
|
|
73
|
+
return;
|
|
74
|
+
const { registerSessionRepositoryRuntime } = await import("../foundation/lifecycle/session-repository-context.js");
|
|
75
|
+
for (const [agentId, identity] of this.#identities) {
|
|
76
|
+
if (this.#disposed)
|
|
77
|
+
return;
|
|
78
|
+
await registerSessionRepositoryRuntime(identity, runtimeId, owner, {
|
|
79
|
+
inspectProcess,
|
|
80
|
+
...(agentId === undefined ? {} : { agentId }),
|
|
81
|
+
}).catch(() => undefined);
|
|
82
|
+
}
|
|
83
|
+
}).catch(() => undefined);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReferenceDocumentProvider } from "../features/owned-ui/reference-screen-app.js";
|
|
2
2
|
import type { OwnedSettingsManager } from "../ui/settings/manager.js";
|
|
3
3
|
import type { UiRouteHost, UiRouteInput } from "../ui/apps/contracts.js";
|
|
4
|
+
import type { PiKeybindingsHost } from "../integrations/pi/components/shell-shared-facade.js";
|
|
4
5
|
/** Styled document rows for one content width. */
|
|
5
6
|
export type OwnedReferenceRows = NonNullable<ReferenceDocumentProvider["rows"]>;
|
|
6
7
|
/** Documents supplied by composition so the route host never reads shell data itself. */
|
|
@@ -9,5 +10,19 @@ export interface OwnedReferenceProviders {
|
|
|
9
10
|
hotkeys(): Promise<ReferenceDocumentProvider>;
|
|
10
11
|
session(): Promise<ReferenceDocumentProvider>;
|
|
11
12
|
}
|
|
13
|
+
/** How the settings route is presented. */
|
|
14
|
+
export interface OwnedRouteHostOptions {
|
|
15
|
+
/**
|
|
16
|
+
* The route whose screen is this resident utility tab. That screen is the tab, so it offers no
|
|
17
|
+
* screen-level close: neither Esc nor one Ctrl+C dismisses it, and it shows no close hint.
|
|
18
|
+
*/
|
|
19
|
+
readonly tabRoute?: string | null;
|
|
20
|
+
/** Opens the tab bar's own Plus Menu dialog; false when no tab bar can show it. */
|
|
21
|
+
readonly configurePlusMenu?: () => boolean;
|
|
22
|
+
readonly keybindings?: PiKeybindingsHost;
|
|
23
|
+
readonly agentDir?: string;
|
|
24
|
+
readonly cwd?: string;
|
|
25
|
+
readonly copyText?: (text: string) => void;
|
|
26
|
+
}
|
|
12
27
|
/** Declares settings and lazy document routes. */
|
|
13
|
-
export declare function createOwnedRouteHost(settings: OwnedSettingsManager, references?: OwnedReferenceProviders): UiRouteHost;
|
|
28
|
+
export declare function createOwnedRouteHost(settings: OwnedSettingsManager, references?: OwnedReferenceProviders, options?: OwnedRouteHostOptions): UiRouteHost;
|
|
@@ -3,7 +3,7 @@ import { SETTINGS_APP_ID, SETTINGS_ROUTE } from "../features/owned-ui/settings-r
|
|
|
3
3
|
import { piTheme, renderPiAccentPreview } from "../integrations/pi/components/upstream/theme/theme.js";
|
|
4
4
|
import { faint } from "../ui/components/text.js";
|
|
5
5
|
/** Declares settings and lazy document routes. */
|
|
6
|
-
export function createOwnedRouteHost(settings, references) {
|
|
6
|
+
export function createOwnedRouteHost(settings, references, options = {}) {
|
|
7
7
|
const routes = new Set([SETTINGS_ROUTE, ...(references === undefined ? [] : [CHANGELOG_ROUTE, HOTKEYS_ROUTE, "session"])]);
|
|
8
8
|
return {
|
|
9
9
|
claims: route => routes.has(route),
|
|
@@ -11,13 +11,14 @@ export function createOwnedRouteHost(settings, references) {
|
|
|
11
11
|
if (!routes.has(route))
|
|
12
12
|
return null;
|
|
13
13
|
if (route === SETTINGS_ROUTE) {
|
|
14
|
-
return deferredSurface(SETTINGS_APP_ID, "settings", () => loadSettingsSurface(settings));
|
|
14
|
+
return deferredSurface(SETTINGS_APP_ID, "settings", () => loadSettingsSurface(settings, options));
|
|
15
15
|
}
|
|
16
16
|
const changelog = route === CHANGELOG_ROUTE;
|
|
17
17
|
const session = route === "session";
|
|
18
18
|
const title = session ? "Session Info" : changelog ? input ? "What's New" : "Changelog" : HOTKEYS_TITLE;
|
|
19
19
|
const document = session ? references.session() : changelog ? references.changelog(input) : references.hotkeys();
|
|
20
|
-
|
|
20
|
+
const pinned = options.tabRoute === route;
|
|
21
|
+
return deferredSurface(route, title, () => loadReferenceSurface(settings, route, title, document, pinned));
|
|
21
22
|
},
|
|
22
23
|
};
|
|
23
24
|
}
|
|
@@ -61,11 +62,27 @@ function deferredSurface(id, label, load) {
|
|
|
61
62
|
onExitRequested: listener => { onExit = listener; },
|
|
62
63
|
};
|
|
63
64
|
}
|
|
64
|
-
async function loadSettingsSurface(settings) {
|
|
65
|
-
const { SettingsApp } = await
|
|
66
|
-
|
|
65
|
+
async function loadSettingsSurface(settings, options) {
|
|
66
|
+
const [{ SettingsApp }, { createSettingsSearchInputFactory }] = await Promise.all([
|
|
67
|
+
import("../features/owned-ui/settings-app.js"),
|
|
68
|
+
import("./settings-search-input.js"),
|
|
69
|
+
]);
|
|
70
|
+
const pinned = options.tabRoute === SETTINGS_ROUTE;
|
|
71
|
+
const searchInputFactory = createSettingsSearchInputFactory({
|
|
72
|
+
...(options.keybindings === undefined ? {} : { keybindings: options.keybindings }),
|
|
73
|
+
...(options.agentDir === undefined ? {} : { agentDir: options.agentDir }),
|
|
74
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
75
|
+
});
|
|
76
|
+
// Invariant: a pinned Settings tab closes as a tab; neither Esc nor one unclaimed Ctrl+C dismisses its screen.
|
|
77
|
+
return hostApp(SETTINGS_APP_ID, SETTINGS_ROUTE, () => new SettingsApp(settings, {
|
|
78
|
+
pinned,
|
|
79
|
+
searchInputFactory,
|
|
80
|
+
configurePlusMenu: options.configurePlusMenu ?? null,
|
|
81
|
+
...(options.copyText === undefined ? {} : { copyText: options.copyText }),
|
|
82
|
+
}), !pinned, true);
|
|
67
83
|
}
|
|
68
|
-
async function loadReferenceSurface(settings,
|
|
84
|
+
async function loadReferenceSurface(settings, route, title, document, pinned) {
|
|
85
|
+
const id = route;
|
|
69
86
|
// Rationale: the app module and the document load together, so a document that fails
|
|
70
87
|
// to render is reported by the placeholder rather than by a screen that never fills.
|
|
71
88
|
const [{ ReferenceScreenApp }, content] = await Promise.all([import("../features/owned-ui/reference-screen-app.js"), document]);
|
|
@@ -78,9 +95,10 @@ async function loadReferenceSurface(settings, id, route, title, document) {
|
|
|
78
95
|
scrollbarStyle: settings.value("scrollbarStyle"),
|
|
79
96
|
scrollbarSpeed: settings.value("scrollbarSpeed"),
|
|
80
97
|
}),
|
|
81
|
-
|
|
98
|
+
pinned,
|
|
99
|
+
}), !pinned);
|
|
82
100
|
}
|
|
83
|
-
async function hostApp(id, route, create) {
|
|
101
|
+
async function hostApp(id, route, create, closeOnInterrupt = true, appInputBeforeInterrupt = false) {
|
|
84
102
|
const [{ UiAppHost }, { UiAppRegistry }] = await Promise.all([
|
|
85
103
|
import("../ui/apps/host.js"),
|
|
86
104
|
import("../ui/apps/registry.js"),
|
|
@@ -94,7 +112,8 @@ async function hostApp(id, route, create) {
|
|
|
94
112
|
let onExit = () => undefined;
|
|
95
113
|
const host = new UiAppHost({
|
|
96
114
|
registry,
|
|
97
|
-
closeOnInterrupt
|
|
115
|
+
closeOnInterrupt,
|
|
116
|
+
appInputBeforeInterrupt,
|
|
98
117
|
theme: pinnedTheme(),
|
|
99
118
|
surface: {
|
|
100
119
|
size: () => size,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SettingsSearchInputFactory } from "../features/owned-ui/settings-search-input.js";
|
|
2
|
+
import { type PiKeybindingsHost } from "../integrations/pi/components/shell-shared-facade.js";
|
|
3
|
+
export interface SettingsSearchInputFactoryOptions {
|
|
4
|
+
readonly keybindings?: PiKeybindingsHost;
|
|
5
|
+
readonly agentDir?: string;
|
|
6
|
+
readonly cwd?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Builds Settings search from the same configurable owned editor used by the agent prompt. */
|
|
9
|
+
export declare function createSettingsSearchInputFactory(options?: SettingsSearchInputFactoryOptions): SettingsSearchInputFactory;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { editorInsertedText } from "../integrations/pi/components/owned-editor-ux.js";
|
|
2
|
+
import { createPiShellEditor } from "../integrations/pi/components/shell-editor-autocomplete.js";
|
|
3
|
+
import { piShellTruncateToWidth, piShellVisibleWidth, } from "../integrations/pi/components/shell-shared-facade.js";
|
|
4
|
+
import { backgroundSgrSpan } from "../ui/components/spans.js";
|
|
5
|
+
import { caretCell } from "../ui/components/line-input.js";
|
|
6
|
+
import { PromptInput } from "../ui/components/prompt-input.js";
|
|
7
|
+
/** Builds Settings search from the same configurable owned editor used by the agent prompt. */
|
|
8
|
+
export function createSettingsSearchInputFactory(options = {}) {
|
|
9
|
+
return {
|
|
10
|
+
isTextInput: data => {
|
|
11
|
+
const text = editorInsertedText(data);
|
|
12
|
+
return text !== undefined && /[^\p{Cc}]/u.test(text);
|
|
13
|
+
},
|
|
14
|
+
create: surface => createSettingsSearchInput(surface, options),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createSettingsSearchInput(surface, options) {
|
|
18
|
+
let columns = 80;
|
|
19
|
+
const editor = createPiShellEditor({
|
|
20
|
+
keybindingProfile: "a1",
|
|
21
|
+
inputCapabilities: {
|
|
22
|
+
singleLine: true,
|
|
23
|
+
paste: false,
|
|
24
|
+
autocomplete: false,
|
|
25
|
+
placeholder: "Search settings",
|
|
26
|
+
},
|
|
27
|
+
...(options.keybindings === undefined ? {} : { keybindings: options.keybindings }),
|
|
28
|
+
...(options.agentDir === undefined ? {} : { agentDir: options.agentDir }),
|
|
29
|
+
cwd: options.cwd ?? process.cwd(),
|
|
30
|
+
getColumns: () => columns,
|
|
31
|
+
getRows: surface.getRows,
|
|
32
|
+
requestRender: surface.requestRender,
|
|
33
|
+
onSubmit: () => { },
|
|
34
|
+
onCopyText: text => surface.copyText(text),
|
|
35
|
+
paintEditorSelection: (line, from, to, atomic) => backgroundSgrSpan(line, from, to, atomic ? "\u001b[7m" : "\u001b[27m\u001b[48;2;38;79;120m", atomic ? "\u001b[27m" : "\u001b[49m", piShellVisibleWidth),
|
|
36
|
+
promptPresentation: {
|
|
37
|
+
input: new PromptInput({ fg: (token, text) => surface.theme.fg(token, text) }, {
|
|
38
|
+
measure: piShellVisibleWidth,
|
|
39
|
+
truncate: piShellTruncateToWidth,
|
|
40
|
+
}),
|
|
41
|
+
styleSuggestion: text => surface.theme.fg("dim", text),
|
|
42
|
+
styleSuggestionCaret: caretCell,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
editor.setFocused?.(true);
|
|
46
|
+
return {
|
|
47
|
+
render(width) {
|
|
48
|
+
columns = width;
|
|
49
|
+
return editor.render(width);
|
|
50
|
+
},
|
|
51
|
+
handleInput: (data) => editor.handleInput?.(data),
|
|
52
|
+
handlePointer: (event) => editor.handlePointer(event),
|
|
53
|
+
getText: () => editor.getText(),
|
|
54
|
+
hasSelection: () => editor.hasSelection(),
|
|
55
|
+
ownsPointer: () => editor.ownsPointer(),
|
|
56
|
+
setFocused: (focused) => editor.setFocused?.(focused),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { OwnedUiShellEngineOptions } from "../app/session-shell/index.js";
|
|
2
|
+
import type { ReleaseNoteCatalog } from "../features/owned-ui/release-notes.js";
|
|
3
|
+
type StartupRoute = NonNullable<OwnedUiShellEngineOptions["startupRoute"]>;
|
|
4
|
+
export interface StartupReleaseNoteOptions {
|
|
5
|
+
readonly ownedSurfaces: boolean;
|
|
6
|
+
/** Deterministic catalog and version seams for composition tests. */
|
|
7
|
+
readonly releaseNotes?: ReleaseNoteCatalog;
|
|
8
|
+
readonly packageVersion?: string;
|
|
9
|
+
/** Without a profile there is nowhere to remember the note as seen, so it is never shown on startup. */
|
|
10
|
+
readonly profileId?: string;
|
|
11
|
+
readonly configDir: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function readPackageVersion(): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* The release notes bare A1 ships and the one note this version shows once per profile on startup:
|
|
16
|
+
* the packaged catalog (or why it could not be read), the running version, and the claim that
|
|
17
|
+
* marks the note seen after its route closes.
|
|
18
|
+
*/
|
|
19
|
+
export declare class StartupReleaseNote {
|
|
20
|
+
#private;
|
|
21
|
+
readonly catalog: ReleaseNoteCatalog | null;
|
|
22
|
+
readonly failure: unknown;
|
|
23
|
+
readonly packageVersion: string | null;
|
|
24
|
+
static load(options: StartupReleaseNoteOptions): Promise<StartupReleaseNote>;
|
|
25
|
+
private constructor();
|
|
26
|
+
/** The changelog route to present after the first frame, or undefined when there is no unseen note to show. */
|
|
27
|
+
get startupRoute(): StartupRoute | undefined;
|
|
28
|
+
/** Waits for a pending acknowledgement; a failed one stays unseen and is never reported. */
|
|
29
|
+
settleAcknowledgement(): Promise<void>;
|
|
30
|
+
releaseClaim(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
export async function readPackageVersion() {
|
|
3
|
+
const manifest = JSON.parse(await readFile(new URL("../../package.json", import.meta.url), "utf8"));
|
|
4
|
+
const version = manifest?.version;
|
|
5
|
+
if (typeof version !== "string")
|
|
6
|
+
throw new Error("A1 package version is unavailable");
|
|
7
|
+
return version;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The release notes bare A1 ships and the one note this version shows once per profile on startup:
|
|
11
|
+
* the packaged catalog (or why it could not be read), the running version, and the claim that
|
|
12
|
+
* marks the note seen after its route closes.
|
|
13
|
+
*/
|
|
14
|
+
export class StartupReleaseNote {
|
|
15
|
+
catalog;
|
|
16
|
+
failure;
|
|
17
|
+
packageVersion;
|
|
18
|
+
#current;
|
|
19
|
+
#claim;
|
|
20
|
+
#acknowledgement = null;
|
|
21
|
+
static async load(options) {
|
|
22
|
+
let catalog = null;
|
|
23
|
+
let failure;
|
|
24
|
+
if (options.ownedSurfaces) {
|
|
25
|
+
try {
|
|
26
|
+
catalog = options.releaseNotes
|
|
27
|
+
?? await import("../features/owned-ui/release-notes.js").then(module => module.readPackagedReleaseNotes());
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
failure = error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const packageVersion = options.ownedSurfaces ? options.packageVersion ?? await readPackageVersion() : null;
|
|
34
|
+
const current = packageVersion === null ? null : catalog?.current(packageVersion) ?? null;
|
|
35
|
+
const profileId = options.profileId;
|
|
36
|
+
const claim = current === null || profileId === undefined
|
|
37
|
+
? null
|
|
38
|
+
: await import("../features/owned-ui/release-note-state.js").then(module => module.claimReleaseNote({
|
|
39
|
+
configDir: options.configDir, profileId, version: current.version,
|
|
40
|
+
}));
|
|
41
|
+
return new StartupReleaseNote(catalog, failure, packageVersion, current, claim);
|
|
42
|
+
}
|
|
43
|
+
constructor(catalog, failure, packageVersion, current, claim) {
|
|
44
|
+
this.catalog = catalog;
|
|
45
|
+
this.failure = failure;
|
|
46
|
+
this.packageVersion = packageVersion;
|
|
47
|
+
this.#current = current;
|
|
48
|
+
this.#claim = claim;
|
|
49
|
+
}
|
|
50
|
+
/** The changelog route to present after the first frame, or undefined when there is no unseen note to show. */
|
|
51
|
+
get startupRoute() {
|
|
52
|
+
const current = this.#current;
|
|
53
|
+
const claim = this.#claim;
|
|
54
|
+
if (current === null || claim === null)
|
|
55
|
+
return undefined;
|
|
56
|
+
return {
|
|
57
|
+
route: "changelog",
|
|
58
|
+
input: { document: current.markdown },
|
|
59
|
+
onClosed: () => {
|
|
60
|
+
this.#acknowledgement ??= claim.acknowledge();
|
|
61
|
+
return this.#acknowledgement;
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Waits for a pending acknowledgement; a failed one stays unseen and is never reported. */
|
|
66
|
+
async settleAcknowledgement() {
|
|
67
|
+
await this.#acknowledgement?.catch(() => undefined);
|
|
68
|
+
}
|
|
69
|
+
async releaseClaim() {
|
|
70
|
+
await this.#claim?.release();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { OwnedUiApplicationPort, PresentationTerminalPort } from "../contracts/presentation/index.js";
|
|
2
|
+
import type { TabBridgeClient } from "../foundation/resident-tabs/bridge-client.js";
|
|
3
|
+
import type { ResidentTabRoute } from "../foundation/resident-tabs/routes.js";
|
|
4
|
+
import type { ReleaseNoteCatalog } from "../features/owned-ui/release-notes.js";
|
|
5
|
+
import type { UiRouteHost } from "../ui/apps/contracts.js";
|
|
6
|
+
import type { OwnedSettingsManager } from "../ui/settings/manager.js";
|
|
7
|
+
import { terminateOwnedUiProcess } from "../features/owned-ui/run.js";
|
|
8
|
+
export { terminateOwnedUiProcess };
|
|
9
|
+
export interface UtilityTabOptions {
|
|
10
|
+
readonly route: ResidentTabRoute;
|
|
11
|
+
readonly bridge: TabBridgeClient;
|
|
12
|
+
readonly cwd?: string;
|
|
13
|
+
readonly profileId?: string;
|
|
14
|
+
readonly terminal?: PresentationTerminalPort;
|
|
15
|
+
readonly agentDir?: string;
|
|
16
|
+
readonly settings?: OwnedSettingsManager;
|
|
17
|
+
readonly routeHost?: UiRouteHost;
|
|
18
|
+
readonly releaseNotes?: ReleaseNoteCatalog;
|
|
19
|
+
readonly onApplication?: (application: OwnedUiApplicationPort) => void;
|
|
20
|
+
}
|
|
21
|
+
export interface UtilityTabComposition {
|
|
22
|
+
readonly application: OwnedUiApplicationPort;
|
|
23
|
+
readonly settings: OwnedSettingsManager;
|
|
24
|
+
}
|
|
25
|
+
/** Runs one pinned Settings or Changelog screen without constructing an Agent engine or session. */
|
|
26
|
+
export declare function runUtilityTab(options: UtilityTabOptions): Promise<number>;
|
|
27
|
+
export declare function composeUtilityTab(options: UtilityTabOptions): Promise<UtilityTabComposition>;
|
|
28
|
+
export declare function utilityAgentDir(environment?: NodeJS.ProcessEnv): string;
|