@timurproko/a1 0.2.6-dev.736 → 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/resources/release-notes.json +4 -0
- package/dist/features/owned-ui/settings-app.d.ts +12 -2
- package/dist/features/owned-ui/settings-app.js +119 -84
- 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 +6 -3
- 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/components/value-menu.d.ts +6 -3
- package/dist/ui/components/value-menu.js +6 -5
- 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 +25 -10
- 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/evidence/terminal-host-spike/manual-one-pane-terminal-host.md +70 -0
- package/docs/architecture/evidence/terminal-host-spike/manual-two-by-two-basic-terminal-host.md +32 -0
- package/docs/architecture/evidence/terminal-host-spike/milestone-baseline.json +115 -0
- package/docs/architecture/evidence/terminal-host-spike/owned-ui-foundation-prerequisite.json +48 -0
- package/docs/architecture/evidence/terminal-host-spike/terminal-host-provenance.json +125 -0
- package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-1.json +56 -0
- package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-3.json +174 -0
- package/docs/architecture/evidence/terminal-host-spike/terminal-spike-acceptance-record.json +18 -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 +3 -1
- package/docs/architecture/terminal-host-provenance.md +16 -4
- package/docs/architecture/terminal-host-spike-evidence.md +1 -1
- 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/releases/0.2.6.md +44 -0
- package/docs/validation.md +49 -9
- package/package.json +19 -6
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
- package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
- package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
- package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
- package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/process-guardian.exe +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { SuggestionDiagnosticCapture } from "../features/prompt-suggestions/diagnostics.js";
|
|
3
2
|
import { PRODUCT_IDENTITY } from "../product-identity.js";
|
|
4
3
|
import { PromptHistoryService } from "../features/prompt-history/service.js";
|
|
@@ -6,93 +5,62 @@ import { PromptImageSidecar } from "../features/prompt-history/image-sidecar.js"
|
|
|
6
5
|
import { resolvePromptHistoryPath } from "../features/prompt-history/paths.js";
|
|
7
6
|
import { resolvePromptHistoryDataDir } from "../features/launch/profile-paths.js";
|
|
8
7
|
import { resolveProductPaths } from "../foundation/lifecycle/paths.js";
|
|
8
|
+
import { MAX_CLIPBOARD_TEXT_BYTES } from "../contracts/owned-ui/index.js";
|
|
9
9
|
import { applyConfiguredPiTheme, getAvailablePiThemes, setPiAccentColor, setPiPackageBorderProjectionEnabled } from "../integrations/pi/components/upstream/theme/theme.js";
|
|
10
10
|
import { createPiEngineHost } from "../integrations/pi/engine/host.js";
|
|
11
11
|
import { createPiSessionPresenters } from "../integrations/pi/session-presenters/index.js";
|
|
12
12
|
import { ClipboardDiagnosticCapture } from "../app/session-shell/clipboard-diagnostics.js";
|
|
13
13
|
import { createOwnedUiClipboardServices } from "../app/session-shell/clipboard-services.js";
|
|
14
|
+
import { writeSystemClipboardText } from "../app/session-shell/system-clipboard.js";
|
|
14
15
|
import { createPiKeybindingsHost } from "../integrations/pi/components/shell-shared-facade.js";
|
|
15
16
|
import { OwnedUiSessionPresenter, OwnedUiTerminalHost, sessionTerminalHostOptions, } from "../app/session-shell/session-shell.js";
|
|
16
|
-
import { OwnedSettingsManager } from "../ui/settings/manager.js";
|
|
17
17
|
import { createPiTerminalBridge } from "../integrations/pi/tui-runtime/presentation-adapter.js";
|
|
18
18
|
import { createOwnedRouteHost } from "./settings-route-host.js";
|
|
19
19
|
import { renderPiShellChangelogLines } from "../integrations/pi/components/shell-presenters-info.js";
|
|
20
20
|
import { nativeHyperlinkStyle } from "../ui/components/spans.js";
|
|
21
|
-
|
|
21
|
+
import { ResidentTabRecovery } from "../foundation/resident-tabs/recovery.js";
|
|
22
|
+
import { bindResidentTabBridge, closeResidentUtilityRoute, correlateResidentTabSubmission, currentBackendSessionFile, residentRouteHostOptions, residentTabKeybindings } from "./resident-tab-bridge.js";
|
|
23
|
+
import { SessionRuntimeRegistry } from "./session-runtime-registry.js";
|
|
24
|
+
import { readPackageVersion, StartupReleaseNote } from "./startup-route.js";
|
|
25
|
+
import { createOwnedSettingsManager, watchSharedSettings } from "./owned-settings.js";
|
|
26
|
+
export { bindResidentTabBridge, correlateResidentTabSubmission } from "./resident-tab-bridge.js";
|
|
27
|
+
export function residentStartupPresentation(resident, fallbackNotice) {
|
|
28
|
+
if (resident)
|
|
29
|
+
return { startup: { quiet: true } };
|
|
30
|
+
return fallbackNotice === undefined ? {} : { startup: { notices: [{ kind: "warning", message: fallbackNotice }] } };
|
|
31
|
+
}
|
|
22
32
|
export async function composeOwnedUiApplication(options = {}) {
|
|
23
33
|
return (await composeOwnedUi(options)).application;
|
|
24
34
|
}
|
|
25
35
|
export async function composeOwnedUi(options = {}) {
|
|
26
36
|
const cwd = options.cwd ?? process.cwd();
|
|
27
37
|
const ownedSurfaces = options.ownedSurfaces !== "off";
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const activeSessionIdentities = new Map();
|
|
33
|
-
let sessionRuntimeRefreshTimer = null;
|
|
34
|
-
let sessionRuntimeRefresh = Promise.resolve();
|
|
35
|
-
let sessionRuntimeDisposed = false;
|
|
36
|
-
const runtimeIdentity = async () => {
|
|
37
|
-
if (sessionRuntimeId === undefined || inspectSessionProcess === undefined)
|
|
38
|
-
return null;
|
|
39
|
-
sessionRuntimeIdentity ??= inspectSessionProcess(process.pid).catch(() => null);
|
|
40
|
-
return await sessionRuntimeIdentity;
|
|
41
|
-
};
|
|
42
|
-
const queueSessionRuntimeRefresh = () => {
|
|
43
|
-
if (sessionRuntimeDisposed || activeSessionIdentities.size === 0 || sessionRuntimeId === undefined || inspectSessionProcess === undefined)
|
|
44
|
-
return;
|
|
45
|
-
sessionRuntimeRefresh = sessionRuntimeRefresh.then(async () => {
|
|
46
|
-
if (sessionRuntimeDisposed)
|
|
47
|
-
return;
|
|
48
|
-
const owner = await runtimeIdentity();
|
|
49
|
-
if (owner === null)
|
|
50
|
-
return;
|
|
51
|
-
const { registerSessionRepositoryRuntime } = await import("../foundation/lifecycle/session-repository-context.js");
|
|
52
|
-
for (const [agentId, identity] of activeSessionIdentities) {
|
|
53
|
-
if (sessionRuntimeDisposed)
|
|
54
|
-
return;
|
|
55
|
-
await registerSessionRepositoryRuntime(identity, sessionRuntimeId, owner, {
|
|
56
|
-
inspectProcess: inspectSessionProcess,
|
|
57
|
-
...(agentId === undefined ? {} : { agentId }),
|
|
58
|
-
}).catch(() => undefined);
|
|
59
|
-
}
|
|
60
|
-
}).catch(() => undefined);
|
|
61
|
-
};
|
|
62
|
-
/** The repository context reader for one agent; undefined names the primary agent, the only one composed today. */
|
|
63
|
-
const repositoryContextReaderFor = (agentId) => async (sessionId, sessionFile, signal) => {
|
|
64
|
-
const owner = await runtimeIdentity();
|
|
65
|
-
if (owner === null || sessionRuntimeId === undefined || inspectSessionProcess === undefined)
|
|
66
|
-
return null;
|
|
67
|
-
const identity = { sessionId, sessionFile };
|
|
68
|
-
activeSessionIdentities.set(agentId, identity);
|
|
69
|
-
const { activateSessionRepositoryContext } = await import("../foundation/lifecycle/session-repository-context.js");
|
|
70
|
-
const context = await activateSessionRepositoryContext(identity, sessionRuntimeId, owner, {
|
|
71
|
-
signal,
|
|
72
|
-
inspectProcess: inspectSessionProcess,
|
|
73
|
-
...(agentId === undefined ? {} : { agentId }),
|
|
74
|
-
});
|
|
75
|
-
armSessionRuntimeRefresh();
|
|
76
|
-
return context;
|
|
77
|
-
};
|
|
78
|
-
const armSessionRuntimeRefresh = () => {
|
|
79
|
-
if (sessionRuntimeRefreshTimer !== null)
|
|
80
|
-
return;
|
|
81
|
-
sessionRuntimeRefreshTimer = setInterval(queueSessionRuntimeRefresh, SESSION_RUNTIME_REFRESH_MS);
|
|
82
|
-
sessionRuntimeRefreshTimer.unref();
|
|
83
|
-
};
|
|
38
|
+
const sessionRuntimes = new SessionRuntimeRegistry({
|
|
39
|
+
runtimeId: ownedSurfaces ? process.env[PRODUCT_IDENTITY.environment.sessionRuntimeId] : undefined,
|
|
40
|
+
inspectProcess: options.inspectProcess,
|
|
41
|
+
});
|
|
84
42
|
const productPaths = resolveProductPaths();
|
|
85
43
|
// Rationale: the manager reads the engine's settings port lazily, after the session exists.
|
|
86
44
|
let backend;
|
|
87
45
|
const settings = options.profileId === undefined
|
|
88
46
|
? null
|
|
89
|
-
:
|
|
90
|
-
configDir: resolveProductPaths().configDir,
|
|
47
|
+
: createOwnedSettingsManager({
|
|
91
48
|
profileId: options.profileId,
|
|
92
49
|
agentProvider: () => backend.settingsPort(),
|
|
93
|
-
|
|
94
|
-
agentSettingLabelOverrides: { fullscreenCopyOnSelect: "Copy on select" },
|
|
50
|
+
...(options.hideTabSettings ? { hideTabSettings: true } : {}),
|
|
95
51
|
});
|
|
52
|
+
const tabBridge = options.tab?.bridge ?? null;
|
|
53
|
+
if (tabBridge !== null)
|
|
54
|
+
await tabBridge.start().catch(() => false);
|
|
55
|
+
const projectTrustPrompt = options.projectTrustPrompt === undefined ? undefined : async (request) => {
|
|
56
|
+
tabBridge?.status("needs-input", false, 1, 0);
|
|
57
|
+
try {
|
|
58
|
+
return await options.projectTrustPrompt(request);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
tabBridge?.status("starting");
|
|
62
|
+
}
|
|
63
|
+
};
|
|
96
64
|
// Invariant: process-wide engine state has one owner. The host installs the HTTP dispatcher, applies
|
|
97
65
|
// the theme singletons, and announces startup notices once; every session is created through it.
|
|
98
66
|
const host = await (options.createEngineHost ?? (async (hostOptions) => createPiEngineHost(hostOptions)))({
|
|
@@ -105,50 +73,73 @@ export async function composeOwnedUi(options = {}) {
|
|
|
105
73
|
packageBorderProjection: ownedSurfaces,
|
|
106
74
|
apply: { base: applyConfiguredPiTheme, accentColor: setPiAccentColor, packageBorderProjection: setPiPackageBorderProjectionEnabled },
|
|
107
75
|
},
|
|
108
|
-
...(
|
|
76
|
+
...(projectTrustPrompt === undefined ? {} : { projectTrustPrompt }),
|
|
109
77
|
});
|
|
78
|
+
const sessionForkPrompt = options.sessionForkPrompt === undefined ? undefined : async (request) => {
|
|
79
|
+
tabBridge?.status("needs-input", false, 1, 0);
|
|
80
|
+
try {
|
|
81
|
+
return await options.sessionForkPrompt(request);
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
tabBridge?.status("starting");
|
|
85
|
+
}
|
|
86
|
+
};
|
|
110
87
|
try {
|
|
111
88
|
backend = await host.create({
|
|
112
89
|
cwd,
|
|
113
|
-
...(ownedSurfaces ? { repositoryContextReader:
|
|
90
|
+
...(ownedSurfaces ? { repositoryContextReader: sessionRuntimes.readerFor(undefined) } : {}),
|
|
114
91
|
...(options.sessionPath === undefined ? {} : { sessionPath: options.sessionPath }),
|
|
115
92
|
...(options.sessionSelection === undefined ? {} : { sessionSelection: options.sessionSelection }),
|
|
116
|
-
...(
|
|
93
|
+
...(sessionForkPrompt === undefined ? {} : { sessionForkPrompt }),
|
|
117
94
|
});
|
|
118
95
|
}
|
|
119
96
|
catch (error) {
|
|
120
97
|
await host.dispose();
|
|
121
98
|
throw error;
|
|
122
99
|
}
|
|
123
|
-
let
|
|
124
|
-
let
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
:
|
|
141
|
-
|
|
142
|
-
})
|
|
143
|
-
|
|
100
|
+
let recoveryDegraded = false;
|
|
101
|
+
let presentRecoveryDegraded = (_degraded) => { };
|
|
102
|
+
const tabRecovery = options.tab === undefined ? null : new ResidentTabRecovery(options.tab.dataDir, {
|
|
103
|
+
onDegraded: degraded => {
|
|
104
|
+
recoveryDegraded = degraded;
|
|
105
|
+
options.tab.bridge.degraded(degraded);
|
|
106
|
+
presentRecoveryDegraded(degraded);
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
const recoveredTabInput = await tabRecovery?.initialize(currentBackendSessionFile(backend), backend.identity.sessionId);
|
|
110
|
+
if (tabBridge !== null && settings !== null && ownedSurfaces)
|
|
111
|
+
tabBridge.accent(settings.value("accentColor"));
|
|
112
|
+
let removeControllerBoundaryInput = () => { };
|
|
113
|
+
let unsubscribeTabBridge = () => { };
|
|
114
|
+
const releaseNote = await StartupReleaseNote.load({
|
|
115
|
+
ownedSurfaces,
|
|
116
|
+
configDir: productPaths.configDir,
|
|
117
|
+
...(options.releaseNotes === undefined ? {} : { releaseNotes: options.releaseNotes }),
|
|
118
|
+
...(options.packageVersion === undefined ? {} : { packageVersion: options.packageVersion }),
|
|
119
|
+
...(options.profileId === undefined ? {} : { profileId: options.profileId }),
|
|
120
|
+
});
|
|
121
|
+
const unsubscribeAccentChange = settings === null || !ownedSurfaces
|
|
144
122
|
? () => { }
|
|
145
|
-
: settings.onChange(current =>
|
|
123
|
+
: settings.onChange(current => {
|
|
124
|
+
const accent = current.value("accentColor");
|
|
125
|
+
host.setAccentColor(accent);
|
|
126
|
+
tabBridge?.accent(accent);
|
|
127
|
+
});
|
|
128
|
+
// Rationale: resident tabs and separate solo agents share a settings document; a live scope
|
|
129
|
+
// change saved in either reaches the others only by rereading that document.
|
|
130
|
+
const unwatchSharedSettings = settings === null || !ownedSurfaces
|
|
131
|
+
? () => { }
|
|
132
|
+
: watchSharedSettings(settings);
|
|
133
|
+
const unsubscribeAccent = () => { unwatchSharedSettings(); unsubscribeAccentChange(); };
|
|
134
|
+
// Invariant: the Settings search and agent prompt borrow the same resolved Pi keybindings.
|
|
135
|
+
const keybindingsHost = createPiKeybindingsHost({ profile: ownedSurfaces ? "a1" : "pi", agentDir: backend.identity.agentDir });
|
|
136
|
+
const keybindings = residentTabKeybindings(tabBridge, backend.identity.agentDir, keybindingsHost);
|
|
146
137
|
// Rationale: Routes open only after shell construction.
|
|
147
138
|
const references = {
|
|
148
139
|
changelog: async (input) => {
|
|
149
|
-
if (input?.document === undefined &&
|
|
150
|
-
throw
|
|
151
|
-
const markdown = input?.document ??
|
|
140
|
+
if (input?.document === undefined && releaseNote.failure !== undefined)
|
|
141
|
+
throw releaseNote.failure;
|
|
142
|
+
const markdown = input?.document ?? releaseNote.catalog?.completeMarkdown ?? "No A1 release notes found.";
|
|
152
143
|
return { rows: width => renderPiShellChangelogLines(markdown, width).map(row => nativeHyperlinkStyle(row)) };
|
|
153
144
|
},
|
|
154
145
|
hotkeys: async () => {
|
|
@@ -158,7 +149,8 @@ export async function composeOwnedUi(options = {}) {
|
|
|
158
149
|
},
|
|
159
150
|
session: () => import("./session-info-reference.js").then(m => m.loadSessionInfoReference(backend)),
|
|
160
151
|
};
|
|
161
|
-
const routeHost = settings === null || !ownedSurfaces ? null
|
|
152
|
+
const routeHost = settings === null || !ownedSurfaces ? null
|
|
153
|
+
: createOwnedRouteHost(settings, references, settingsRouteOptions(tabBridge, keybindings, backend.identity.agentDir, cwd));
|
|
162
154
|
const viewportSettings = settings === null || !ownedSurfaces ? null : {
|
|
163
155
|
snapshot: () => viewportSettingsSnapshot(settings),
|
|
164
156
|
onChange: listener => settings.onChange(() => listener(viewportSettingsSnapshot(settings))),
|
|
@@ -186,30 +178,15 @@ export async function composeOwnedUi(options = {}) {
|
|
|
186
178
|
// Rationale: one listener covers both the A1 presentation choice and the engine skill-command toggle.
|
|
187
179
|
onChange: (listener) => settings.onChange(() => listener()),
|
|
188
180
|
};
|
|
189
|
-
const
|
|
190
|
-
const historyProfileLocation = settings === null || !ownedSurfaces || !settings.value("promptHistoryEnabled")
|
|
191
|
-
? null
|
|
192
|
-
: resolvePromptHistoryPath(resolvePromptHistoryDataDir(), backend.identity.agentDir);
|
|
193
|
-
const promptHistory = historyProfileLocation === null ? null : {
|
|
194
|
-
limit: typeof historyLimit === "number" ? historyLimit : 100,
|
|
195
|
-
store: new PromptHistoryService({
|
|
196
|
-
dataDir: resolvePromptHistoryDataDir(),
|
|
197
|
-
profileRoot: backend.identity.agentDir,
|
|
198
|
-
limit: typeof historyLimit === "number" ? historyLimit : 100,
|
|
199
|
-
}),
|
|
200
|
-
imageSidecar: new PromptImageSidecar(historyProfileLocation.imagesDir),
|
|
201
|
-
};
|
|
181
|
+
const promptHistory = createPromptHistoryConfiguration(settings, backend, ownedSurfaces);
|
|
202
182
|
const clipboardDestination = options.clipboardDiagnosticsPath ?? process.env[PRODUCT_IDENTITY.environment.clipboardDiagnostics];
|
|
203
183
|
const clipboardDiagnostics = settings !== null && ownedSurfaces && clipboardDestination?.trim()
|
|
204
184
|
? new ClipboardDiagnosticCapture(clipboardDestination) : null;
|
|
205
|
-
// Invariant: process-wide services are created once here and borrowed by every session shell.
|
|
206
|
-
// keybinding registry is applied before any presenter is built, so none of them reads Pi's defaults.
|
|
207
|
-
const keybindings = createPiKeybindingsHost({ profile: ownedSurfaces ? "a1" : "pi", agentDir: backend.identity.agentDir });
|
|
185
|
+
// Invariant: process-wide services are created once here and borrowed by every session shell.
|
|
208
186
|
const clipboardServices = ownedSurfaces ? createOwnedUiClipboardServices() : null;
|
|
209
187
|
let createdTerminalHost;
|
|
210
188
|
let terminalHost;
|
|
211
189
|
let presenter;
|
|
212
|
-
let releaseNoteAcknowledgement = null;
|
|
213
190
|
try {
|
|
214
191
|
const presenterOptions = {
|
|
215
192
|
presenters: createPiSessionPresenters(backend),
|
|
@@ -217,24 +194,27 @@ export async function composeOwnedUi(options = {}) {
|
|
|
217
194
|
backend,
|
|
218
195
|
cwd: backend.identity.cwd,
|
|
219
196
|
...(routeHost === null ? {} : { routeHost }),
|
|
220
|
-
...(
|
|
221
|
-
startupRoute: {
|
|
222
|
-
route: "changelog",
|
|
223
|
-
input: { document: currentReleaseNote.markdown },
|
|
224
|
-
onClosed: () => {
|
|
225
|
-
releaseNoteAcknowledgement ??= releaseNoteClaim.acknowledge();
|
|
226
|
-
return releaseNoteAcknowledgement;
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
}),
|
|
197
|
+
...(releaseNote.startupRoute === undefined ? {} : { startupRoute: releaseNote.startupRoute }),
|
|
230
198
|
...(ownedSurfaces ? { sessionLayout: "custom-viewport" } : {}),
|
|
199
|
+
...(tabBridge === null || tabRecovery === null ? {} : { residentTab: {
|
|
200
|
+
requestDetach: () => tabBridge.requestDetach(),
|
|
201
|
+
closeOwnedRoute: route => closeResidentUtilityRoute(tabBridge, route),
|
|
202
|
+
reportStatus: status => tabBridge.status(status),
|
|
203
|
+
admit: input => tabRecovery.admit({ ...input, incarnation: options.tab.incarnation }),
|
|
204
|
+
dispatched: () => tabRecovery.dispatched(),
|
|
205
|
+
correlated: (submissionId, entryId) => correlateResidentTabSubmission(tabRecovery, backend, submissionId, entryId),
|
|
206
|
+
checkpoint: text => tabRecovery.checkpoint(text),
|
|
207
|
+
gracefulStop: sessionFile => tabRecovery.gracefulStop(sessionFile),
|
|
208
|
+
...(recoveredTabInput === undefined ? {} : { recovered: recoveredTabInput }),
|
|
209
|
+
} }),
|
|
231
210
|
},
|
|
232
211
|
presentation: {
|
|
233
212
|
...(options.terminal === undefined ? {} : { terminal: createPiTerminalBridge(options.terminal) }),
|
|
213
|
+
...residentStartupPresentation(tabBridge !== null, options.residentFallbackNotice),
|
|
234
214
|
...(clipboardDiagnostics === null ? {} : { input: { onEvent: event => clipboardDiagnostics.runtime(event) } }),
|
|
235
215
|
...(viewportSettings === null ? {} : { viewportSettings }),
|
|
236
216
|
...(backgroundSettings === null ? {} : { backgroundSettings }),
|
|
237
|
-
...(settings === null || !ownedSurfaces ? {} : {
|
|
217
|
+
...(settings === null || !ownedSurfaces || tabBridge !== null ? {} : {
|
|
238
218
|
quitOutro: { snapshot: () => quitOutroSettingsSnapshot(settings), interactive: process.stdout.isTTY === true },
|
|
239
219
|
}),
|
|
240
220
|
},
|
|
@@ -254,13 +234,32 @@ export async function composeOwnedUi(options = {}) {
|
|
|
254
234
|
// Invariant: one terminal host owns the process terminal; the session presenter reaches it only through
|
|
255
235
|
// the host and paints once attached.
|
|
256
236
|
terminalHost = createdTerminalHost = new OwnedUiTerminalHost(sessionTerminalHostOptions(presenterOptions));
|
|
237
|
+
if (tabBridge !== null) {
|
|
238
|
+
removeControllerBoundaryInput = terminalHost.runtime.addPreInputListener(data => ({
|
|
239
|
+
data: tabBridge.consumeControllerBoundaryInput(data),
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
257
242
|
presenter = new OwnedUiSessionPresenter(terminalHost, presenterOptions);
|
|
243
|
+
presentRecoveryDegraded = degraded => {
|
|
244
|
+
if (!degraded)
|
|
245
|
+
return;
|
|
246
|
+
presenter.root.appendWorkflowStatus("draft recovery degraded");
|
|
247
|
+
terminalHost.runtime.requestRender();
|
|
248
|
+
};
|
|
249
|
+
if (recoveryDegraded)
|
|
250
|
+
presentRecoveryDegraded(true);
|
|
258
251
|
terminalHost.attach(presenter);
|
|
252
|
+
if (tabBridge !== null) {
|
|
253
|
+
unsubscribeTabBridge = await bindResidentTabBridge(tabBridge, backend, tabRecovery, {
|
|
254
|
+
autoName: settings?.value("tabsAutoName") ?? true,
|
|
255
|
+
openRoute: route => presenter.openOwnedRoute(route),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
259
258
|
}
|
|
260
259
|
catch (error) {
|
|
261
260
|
await createdTerminalHost?.dispose().catch(() => undefined);
|
|
262
261
|
unsubscribeAccent();
|
|
263
|
-
await
|
|
262
|
+
await releaseNote.releaseClaim();
|
|
264
263
|
clipboardDiagnostics?.dispose();
|
|
265
264
|
suggestionDiagnostics?.dispose();
|
|
266
265
|
clipboardServices?.dispose();
|
|
@@ -270,18 +269,13 @@ export async function composeOwnedUi(options = {}) {
|
|
|
270
269
|
// Rationale: pinned Pi's version check is unreachable because the owned shell never runs its
|
|
271
270
|
// InteractiveMode, so A1 checks its own channel. The result is never awaited on the startup path;
|
|
272
271
|
// settings are read here because the runner resolves them only just before start.
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
...(settings === null || !ownedSurfaces ? {} : { settingEnabled: settings.value("updateCheck") }),
|
|
281
|
-
});
|
|
282
|
-
if (release !== null)
|
|
283
|
-
backend.extensions.announceReleaseUpdate(release);
|
|
284
|
-
};
|
|
272
|
+
const releaseUpdates = createStartupReleaseUpdateObservation({
|
|
273
|
+
backend,
|
|
274
|
+
configDir: productPaths.configDir,
|
|
275
|
+
mode: settings === null || !ownedSurfaces ? "auto" : settings.value("updateCheck"),
|
|
276
|
+
packageVersion: releaseNote.packageVersion, notificationVersion: options.notificationVersion,
|
|
277
|
+
checkForNewerRelease: options.checkForNewerRelease,
|
|
278
|
+
});
|
|
285
279
|
const exitNoticePath = process.env[PRODUCT_IDENTITY.environment.exitNoticePath];
|
|
286
280
|
// Security: tools the agent runs must never see, or rewrite, this instance's notice.
|
|
287
281
|
delete process.env[PRODUCT_IDENTITY.environment.exitNoticePath];
|
|
@@ -294,35 +288,29 @@ export async function composeOwnedUi(options = {}) {
|
|
|
294
288
|
exitNotice = import("../app/session-shell/exit-notice.js")
|
|
295
289
|
.then(module => module.armExitNotice(backend, exitNoticePath), () => null);
|
|
296
290
|
presenter.start();
|
|
297
|
-
|
|
291
|
+
releaseUpdates.start();
|
|
298
292
|
},
|
|
299
293
|
flush: () => backend.session.flushEvents(),
|
|
300
294
|
waitUntilStopped: () => presenter.waitUntilStopped(),
|
|
301
295
|
dispose: async () => {
|
|
296
|
+
releaseUpdates.stop();
|
|
302
297
|
try {
|
|
303
298
|
await terminalHost.dispose();
|
|
304
299
|
// Invariant: cleared only once the terminal is restored; a failed dispose leaves it armed.
|
|
305
300
|
(await exitNotice)?.clear();
|
|
306
|
-
await
|
|
301
|
+
await releaseNote.settleAcknowledgement();
|
|
307
302
|
}
|
|
308
303
|
finally {
|
|
309
304
|
// Invariant: the shared spares outlive every shell and stop only after the last one is disposed.
|
|
310
305
|
clipboardServices?.dispose();
|
|
306
|
+
removeControllerBoundaryInput();
|
|
311
307
|
unsubscribeAccent();
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
clearInterval(sessionRuntimeRefreshTimer);
|
|
315
|
-
sessionRuntimeRefreshTimer = null;
|
|
316
|
-
await sessionRuntimeRefresh;
|
|
317
|
-
const owner = await runtimeIdentity();
|
|
318
|
-
if (sessionRuntimeId !== undefined && owner !== null) {
|
|
319
|
-
await import("../foundation/lifecycle/session-repository-context.js")
|
|
320
|
-
.then(module => module.releaseSessionRepositoryRuntime(sessionRuntimeId, owner))
|
|
321
|
-
.catch(() => undefined);
|
|
322
|
-
}
|
|
323
|
-
await releaseNoteClaim?.release();
|
|
308
|
+
await sessionRuntimes.dispose();
|
|
309
|
+
await releaseNote.releaseClaim();
|
|
324
310
|
suggestionDiagnostics?.dispose();
|
|
325
311
|
clipboardDiagnostics?.dispose();
|
|
312
|
+
unsubscribeTabBridge();
|
|
313
|
+
tabBridge?.close();
|
|
326
314
|
// Invariant: the host outlives the application; disposing it cancels host-level probes last.
|
|
327
315
|
await host.dispose();
|
|
328
316
|
}
|
|
@@ -330,12 +318,75 @@ export async function composeOwnedUi(options = {}) {
|
|
|
330
318
|
};
|
|
331
319
|
return { application, settings };
|
|
332
320
|
}
|
|
333
|
-
|
|
334
|
-
const
|
|
335
|
-
const
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
321
|
+
function createPromptHistoryConfiguration(settings, backend, ownedSurfaces) {
|
|
322
|
+
const limit = settings?.value("promptHistoryMaxItems") ?? 100;
|
|
323
|
+
const scope = settings?.value("promptHistoryScope") ?? "unique";
|
|
324
|
+
const enabled = settings !== null && ownedSurfaces && settings.value("promptHistoryEnabled");
|
|
325
|
+
const sessionId = enabled ? backend.identity.currentHistorySessionId() : null;
|
|
326
|
+
if (settings === null || !enabled || (scope === "unique" && sessionId === null))
|
|
327
|
+
return null;
|
|
328
|
+
const dataDir = resolvePromptHistoryDataDir();
|
|
329
|
+
const forScope = (selected, id) => {
|
|
330
|
+
if (selected === "unique" && id === null)
|
|
331
|
+
return null;
|
|
332
|
+
const location = resolvePromptHistoryPath(dataDir, backend.identity.agentDir, process.platform, selected, id ?? "");
|
|
333
|
+
return {
|
|
334
|
+
store: new PromptHistoryService({ dataDir, profileRoot: backend.identity.agentDir, limit, scope: selected, sessionId: id ?? "" }),
|
|
335
|
+
imageSidecar: new PromptImageSidecar(location.imagesDir),
|
|
336
|
+
};
|
|
337
|
+
};
|
|
338
|
+
return {
|
|
339
|
+
limit, scope,
|
|
340
|
+
...(sessionId === null ? {} : { sessionId }),
|
|
341
|
+
forScope,
|
|
342
|
+
onScopeChange: (listener) => settings.onChange(() => listener(settings.value("promptHistoryScope"))),
|
|
343
|
+
...forScope(scope, sessionId),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function createStartupReleaseUpdateObservation(input) {
|
|
347
|
+
const controller = new AbortController();
|
|
348
|
+
const observe = async () => {
|
|
349
|
+
const check = input.checkForNewerRelease
|
|
350
|
+
?? (await import("../foundation/release/latest-release.js")).checkForNewerRelease;
|
|
351
|
+
const runningVersion = input.packageVersion ?? await readPackageVersion();
|
|
352
|
+
const discoveryVersion = input.mode === "notify" ? input.notificationVersion ?? runningVersion : runningVersion;
|
|
353
|
+
const release = await check({
|
|
354
|
+
runningVersion: discoveryVersion,
|
|
355
|
+
configDir: input.configDir,
|
|
356
|
+
interactive: process.stdout.isTTY === true,
|
|
357
|
+
settingMode: input.mode,
|
|
358
|
+
});
|
|
359
|
+
if (release === null || controller.signal.aborted)
|
|
360
|
+
return;
|
|
361
|
+
if (input.mode === "notify") {
|
|
362
|
+
input.backend.extensions.announceReleaseUpdate(release);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
if (input.mode === "auto") {
|
|
366
|
+
const installed = await import("../foundation/release/automatic-update.js")
|
|
367
|
+
.then(module => module.requestAutomaticUpdate({ release, runningVersion, signal: controller.signal }));
|
|
368
|
+
if (installed !== null && !controller.signal.aborted) {
|
|
369
|
+
input.backend.extensions.announceReleaseUpdate({ status: "installed", version: installed });
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
return {
|
|
374
|
+
start() { void observe().catch(() => undefined); },
|
|
375
|
+
stop() { controller.abort(); },
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
export { watchSharedSettings } from "./owned-settings.js";
|
|
379
|
+
function settingsRouteOptions(tabBridge, keybindings, agentDir, cwd) {
|
|
380
|
+
return {
|
|
381
|
+
...residentRouteHostOptions(tabBridge),
|
|
382
|
+
keybindings,
|
|
383
|
+
agentDir,
|
|
384
|
+
cwd,
|
|
385
|
+
copyText: text => {
|
|
386
|
+
if (Buffer.byteLength(text) <= MAX_CLIPBOARD_TEXT_BYTES)
|
|
387
|
+
void writeSystemClipboardText(text).catch(() => { });
|
|
388
|
+
},
|
|
389
|
+
};
|
|
339
390
|
}
|
|
340
391
|
function quitOutroSettingsSnapshot(settings) {
|
|
341
392
|
return {
|
|
@@ -344,6 +395,7 @@ function quitOutroSettingsSnapshot(settings) {
|
|
|
344
395
|
}
|
|
345
396
|
function viewportSettingsSnapshot(settings) {
|
|
346
397
|
return {
|
|
398
|
+
timeFormat: settings.value("timeFormat"),
|
|
347
399
|
scrollbarAppearance: settings.value("scrollbarAppearance"),
|
|
348
400
|
scrollbarStyle: settings.value("scrollbarStyle"),
|
|
349
401
|
scrollbarSpeed: settings.value("scrollbarSpeed"),
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TabBridgeClient } from "../foundation/resident-tabs/bridge-client.js";
|
|
2
|
+
import { type ResidentTabRoute } from "../foundation/resident-tabs/routes.js";
|
|
3
|
+
import type { ResidentTabRecovery } from "../foundation/resident-tabs/recovery.js";
|
|
4
|
+
import type { PiKeybindingsHost } from "../integrations/pi/components/shell-shared-facade.js";
|
|
5
|
+
import type { ComposedSessionBackend } from "./session-backend.js";
|
|
6
|
+
import type { OwnedRouteHostOptions } from "./settings-route-host.js";
|
|
7
|
+
/**
|
|
8
|
+
* The keybindings the shells borrow. Inside a resident tab the host dispatches and labels the tab
|
|
9
|
+
* shortcuts this child projects from its effective declarations, so the projection is published now
|
|
10
|
+
* and again after every customization reload.
|
|
11
|
+
*/
|
|
12
|
+
export declare function residentTabKeybindings(tabBridge: TabBridgeClient | null, agentDir: string, keybindingsHost: PiKeybindingsHost): PiKeybindingsHost;
|
|
13
|
+
/**
|
|
14
|
+
* 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
|
|
15
|
+
* the tab bar's own Plus Menu dialog while this tab's controlling client can show it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function residentRouteHostOptions(tabBridge: TabBridgeClient | null): OwnedRouteHostOptions;
|
|
18
|
+
/** Closes a utility tab when its own screen closes. Invariant: a utility tab's screen is the tab. */
|
|
19
|
+
export declare function closeResidentUtilityRoute(tabBridge: Pick<TabBridgeClient, "tabId" | "requestClose">, route: string): void;
|
|
20
|
+
export declare function bindResidentTabBridge(tabBridge: TabBridgeClient, backend: Pick<ComposedSessionBackend, "identity" | "session" | "workflows" | "generateResidentTabName">, recovery?: Pick<ResidentTabRecovery, "settled"> | null, options?: {
|
|
21
|
+
readonly autoName?: boolean;
|
|
22
|
+
readonly openRoute?: (route: ResidentTabRoute) => void;
|
|
23
|
+
}): Promise<() => void>;
|
|
24
|
+
export declare function correlateResidentTabSubmission(recovery: Pick<ResidentTabRecovery, "correlated" | "settled">, backend: Pick<ComposedSessionBackend, "identity" | "session">, submissionId: string, entryId: string): Promise<void>;
|
|
25
|
+
export declare function currentBackendSessionFile(backend: Pick<ComposedSessionBackend, "identity">): string | null;
|