@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,8 +1,63 @@
|
|
|
1
|
+
import { closeSync, mkdirSync, openSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
1
3
|
import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, resolveModelScopeWithDiagnostics, SessionManager, SettingsManager, } from "../startup-public.js";
|
|
2
4
|
import { resolvePiProjectTrustPreflight, } from "./project-trust-preflight.js";
|
|
3
|
-
import { openSelectedPiSession, resolveSessionArgumentPath } from "./session-selection.js";
|
|
5
|
+
import { openSelectedPiSession, resolveSessionArgumentPath, takeSelectedSessionWriter } from "./session-selection.js";
|
|
4
6
|
import { markStartupPhase } from "../../../foundation/startup/startup-runtime.js";
|
|
5
7
|
import { createWindowsNulCleanupExtension } from "./windows-filesystem-hygiene.js";
|
|
8
|
+
import { acquireSessionWriter, } from "../../../foundation/session-writer-lock/index.js";
|
|
9
|
+
class SessionWriterCoordinator {
|
|
10
|
+
#current;
|
|
11
|
+
prepare(manager) {
|
|
12
|
+
const selected = takeSelectedSessionWriter(manager);
|
|
13
|
+
if (selected !== undefined)
|
|
14
|
+
return { handle: selected, alreadyCurrent: false };
|
|
15
|
+
const path = manager.getSessionFile();
|
|
16
|
+
if (path === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (this.#current?.path === path)
|
|
19
|
+
return { handle: this.#current, alreadyCurrent: true };
|
|
20
|
+
const handle = acquireSessionWriter(path);
|
|
21
|
+
try {
|
|
22
|
+
if (!handle.bound) {
|
|
23
|
+
const header = manager.getHeader();
|
|
24
|
+
if (header === null)
|
|
25
|
+
throw new Error("new session is missing its generated header");
|
|
26
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
27
|
+
const descriptor = openSync(path, "wx", 0o600);
|
|
28
|
+
try {
|
|
29
|
+
handle.bind(path);
|
|
30
|
+
writeFileSync(descriptor, `${JSON.stringify(header)}\n`);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
closeSync(descriptor);
|
|
34
|
+
}
|
|
35
|
+
manager.setSessionFile(path);
|
|
36
|
+
}
|
|
37
|
+
return { handle, alreadyCurrent: false };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
handle.release();
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
activate(pending) {
|
|
45
|
+
if (pending === undefined || pending.alreadyCurrent)
|
|
46
|
+
return;
|
|
47
|
+
const previous = this.#current;
|
|
48
|
+
this.#current = pending.handle;
|
|
49
|
+
previous?.release();
|
|
50
|
+
}
|
|
51
|
+
abandon(pending) {
|
|
52
|
+
if (pending !== undefined && !pending.alreadyCurrent)
|
|
53
|
+
pending.handle.release();
|
|
54
|
+
}
|
|
55
|
+
release() {
|
|
56
|
+
this.#current?.release();
|
|
57
|
+
this.#current = undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const runtimeSessionWriters = new WeakMap();
|
|
6
61
|
/**
|
|
7
62
|
* Mirrors pinned Pi's CLI startup: resolve the `models` patterns from settings
|
|
8
63
|
* into a scoped model list, keep the resolver's warnings (e.g. "No models match
|
|
@@ -69,40 +124,52 @@ export async function createPiRuntimeIntegration(options) {
|
|
|
69
124
|
cwd: options.cwd, selection,
|
|
70
125
|
...(sessionDir === undefined ? {} : { sessionDir }),
|
|
71
126
|
...(options.sessionForkPrompt === undefined ? {} : { forkPrompt: options.sessionForkPrompt }),
|
|
127
|
+
guardWriter: true,
|
|
72
128
|
});
|
|
129
|
+
const sessionWriters = new SessionWriterCoordinator();
|
|
73
130
|
const createRuntime = async ({ cwd, sessionManager: targetSessionManager, sessionStartEvent, }) => {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
...
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
131
|
+
const pendingWriter = sessionWriters.prepare(targetSessionManager);
|
|
132
|
+
try {
|
|
133
|
+
const { services, trust } = await createPiRuntimeServicesAfterTrust({
|
|
134
|
+
cwd,
|
|
135
|
+
agentDir: options.agentDir,
|
|
136
|
+
...(options.projectTrustPrompt === undefined ? {} : { projectTrustPrompt: options.projectTrustPrompt }),
|
|
137
|
+
...(options.preflightDependencies === undefined ? {} : { preflightDependencies: options.preflightDependencies }),
|
|
138
|
+
...(options.markStartupPhase === undefined ? {} : { markStartupPhase: options.markStartupPhase }),
|
|
139
|
+
});
|
|
140
|
+
const modelScope = await resolveConfiguredModelScope(services, options.signal);
|
|
141
|
+
const hasExistingSession = targetSessionManager.buildSessionContext().messages.length > 0;
|
|
142
|
+
const created = await createAgentSessionFromServices({
|
|
143
|
+
services,
|
|
144
|
+
sessionManager: targetSessionManager,
|
|
145
|
+
...(sessionStartEvent ? { sessionStartEvent } : {}),
|
|
146
|
+
...(modelScope.model && !hasExistingSession ? { model: modelScope.model } : {}),
|
|
147
|
+
...(modelScope.thinkingLevel && !hasExistingSession ? { thinkingLevel: modelScope.thinkingLevel } : {}),
|
|
148
|
+
...(modelScope.scopedModels.length > 0 ? { scopedModels: [...modelScope.scopedModels] } : {}),
|
|
149
|
+
});
|
|
150
|
+
sessionWriters.activate(pendingWriter);
|
|
151
|
+
await (options.markStartupPhase ?? defaultStartupPhaseMarker)("session-created");
|
|
152
|
+
return {
|
|
153
|
+
...created,
|
|
154
|
+
services,
|
|
155
|
+
diagnostics: [
|
|
156
|
+
...(trust.diagnostic === null ? [] : [{ type: "warning", code: "project-trust", message: trust.diagnostic }]),
|
|
157
|
+
...modelScope.diagnostics,
|
|
158
|
+
],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
sessionWriters.abandon(pendingWriter);
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
100
165
|
};
|
|
101
|
-
|
|
166
|
+
const runtime = await createAgentSessionRuntime(createRuntime, {
|
|
102
167
|
cwd: sessionManager.getCwd(),
|
|
103
168
|
agentDir: options.agentDir,
|
|
104
169
|
sessionManager,
|
|
105
170
|
});
|
|
171
|
+
runtimeSessionWriters.set(runtime, sessionWriters);
|
|
172
|
+
return runtime;
|
|
106
173
|
}
|
|
107
174
|
function defaultStartupPhaseMarker(phase) {
|
|
108
175
|
return markStartupPhase(process.env, phase);
|
|
@@ -119,5 +186,11 @@ export async function replacePiRuntimeSession(runtime, replacement) {
|
|
|
119
186
|
export async function disposePiRuntimeIntegration(runtime) {
|
|
120
187
|
runtime.setRebindSession(undefined);
|
|
121
188
|
runtime.setBeforeSessionInvalidate(undefined);
|
|
122
|
-
|
|
189
|
+
try {
|
|
190
|
+
await runtime.dispose();
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
runtimeSessionWriters.get(runtime)?.release();
|
|
194
|
+
runtimeSessionWriters.delete(runtime);
|
|
195
|
+
}
|
|
123
196
|
}
|
|
@@ -64,12 +64,6 @@ export interface PiEngineRuntimePorts {
|
|
|
64
64
|
diagnostic(severity: OwnedUiDiagnostics["severity"], code: string, message: string, recoverable: boolean): void;
|
|
65
65
|
emitView(): void;
|
|
66
66
|
}
|
|
67
|
-
/**
|
|
68
|
-
* The pinned Pi runtime and the session bound to it: creation through the runtime factory, the
|
|
69
|
-
* session generation that stamps and invalidates events, the subscription that forwards session
|
|
70
|
-
* events, compaction progress observation, the queued-input integration, and disposal order. The
|
|
71
|
-
* adapter derives its view state from the session it is handed and never touches these directly.
|
|
72
|
-
*/
|
|
73
67
|
export declare class PiEngineRuntime {
|
|
74
68
|
#private;
|
|
75
69
|
constructor(options: PiEngineRuntimeOptions, ports: PiEngineRuntimePorts);
|
|
@@ -2,6 +2,7 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { promisify } from "node:util";
|
|
4
4
|
import { PRODUCT_IDENTITY } from "../../../product-identity.js";
|
|
5
|
+
import { residentProgressObserver } from "../../../foundation/resident-tabs/progress-observation.js";
|
|
5
6
|
import { observeCompactionProgress } from "./compaction-progress.js";
|
|
6
7
|
import { createPiRuntimeIntegration } from "./runtime-integration.js";
|
|
7
8
|
import { PiSessionCommandIntegration } from "./session-integration.js";
|
|
@@ -18,6 +19,9 @@ const GIT_BRANCH_MAX_BUFFER_BYTES = 4 * 1024;
|
|
|
18
19
|
* events, compaction progress observation, the queued-input integration, and disposal order. The
|
|
19
20
|
* adapter derives its view state from the session it is handed and never touches these directly.
|
|
20
21
|
*/
|
|
22
|
+
function hasSessionContent(path, session) {
|
|
23
|
+
return path !== null && existsSync(path) && session.messages.length > 0;
|
|
24
|
+
}
|
|
21
25
|
export class PiEngineRuntime {
|
|
22
26
|
#options;
|
|
23
27
|
#ports;
|
|
@@ -154,14 +158,16 @@ export class PiEngineRuntime {
|
|
|
154
158
|
return typeof value === "string" && value.length > 0 ? value : null;
|
|
155
159
|
}
|
|
156
160
|
currentSessionResumeMetadata() {
|
|
157
|
-
const
|
|
158
|
-
|
|
161
|
+
const session = this.#session;
|
|
162
|
+
const manager = session?.sessionManager;
|
|
163
|
+
if (session === undefined
|
|
164
|
+
|| manager === undefined
|
|
159
165
|
|| typeof manager.isPersisted !== "function"
|
|
160
166
|
|| typeof manager.getSessionId !== "function"
|
|
161
167
|
|| typeof manager.getSessionDir !== "function"
|
|
162
168
|
|| typeof manager.usesDefaultSessionDir !== "function"
|
|
163
169
|
|| manager.isPersisted() !== true
|
|
164
|
-
|| !
|
|
170
|
+
|| !hasSessionContent(this.currentSessionFile(), session))
|
|
165
171
|
return null;
|
|
166
172
|
const sessionId = manager.getSessionId();
|
|
167
173
|
const sessionDir = manager.getSessionDir();
|
|
@@ -364,8 +370,10 @@ export class PiEngineRuntime {
|
|
|
364
370
|
return;
|
|
365
371
|
const generation = this.#sessionGeneration;
|
|
366
372
|
this.#unsubscribe = session.subscribe(event => {
|
|
367
|
-
if (generation
|
|
368
|
-
|
|
373
|
+
if (generation !== this.#sessionGeneration || this.#ports.disposed())
|
|
374
|
+
return;
|
|
375
|
+
residentProgressObserver()?.engineDelivery(event);
|
|
376
|
+
this.#ports.event(event);
|
|
369
377
|
});
|
|
370
378
|
}
|
|
371
379
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SessionManager, type SessionInfo } from "../startup-public.js";
|
|
2
|
+
import { type SessionWriterHandle } from "../../../foundation/session-writer-lock/index.js";
|
|
2
3
|
export interface PiSessionSelection {
|
|
3
4
|
readonly target: string;
|
|
4
5
|
readonly sessionDir?: string;
|
|
@@ -16,11 +17,13 @@ interface SessionSelectionOptions {
|
|
|
16
17
|
readonly selection: PiSessionSelection;
|
|
17
18
|
readonly sessionDir?: string;
|
|
18
19
|
readonly forkPrompt?: PiSessionForkPrompt;
|
|
20
|
+
readonly guardWriter?: boolean;
|
|
19
21
|
/** Public API seam for deterministic lookup/open race and listing-order evidence. */
|
|
20
22
|
readonly sessions?: Pick<typeof SessionManager, "list" | "open" | "forkFrom"> & {
|
|
21
23
|
readonly listAll: (sessionDir?: string) => Promise<SessionInfo[]>;
|
|
22
24
|
};
|
|
23
25
|
}
|
|
26
|
+
export declare function takeSelectedSessionWriter(manager: SessionManager): SessionWriterHandle | undefined;
|
|
24
27
|
/** Pinned Pi 0.84.2 main.ts policy, using SDK APIs rather than importing the CLI. */
|
|
25
28
|
export declare function openSelectedPiSession(options: SessionSelectionOptions): Promise<SessionManager>;
|
|
26
29
|
/** Resolve before switching effective cwd, including quoted home-relative paths. */
|
|
@@ -2,6 +2,7 @@ import { accessSync, constants, existsSync, realpathSync, statSync } from "node:
|
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { SessionManager } from "../startup-public.js";
|
|
5
|
+
import { acquireExisting, acquireSessionWriter, SessionWriterConflict, } from "../../../foundation/session-writer-lock/index.js";
|
|
5
6
|
/** Expected resume outcomes are concise CLI diagnostics, not engine crashes. */
|
|
6
7
|
export class PiSessionSelectionError extends Error {
|
|
7
8
|
exitCode;
|
|
@@ -11,13 +12,23 @@ export class PiSessionSelectionError extends Error {
|
|
|
11
12
|
this.name = "PiSessionSelectionError";
|
|
12
13
|
}
|
|
13
14
|
}
|
|
15
|
+
const selectedSessionWriters = new WeakMap();
|
|
16
|
+
export function takeSelectedSessionWriter(manager) {
|
|
17
|
+
const writer = selectedSessionWriters.get(manager);
|
|
18
|
+
selectedSessionWriters.delete(manager);
|
|
19
|
+
return writer;
|
|
20
|
+
}
|
|
21
|
+
function holdSelectedWriter(manager, writer) {
|
|
22
|
+
selectedSessionWriters.set(manager, writer);
|
|
23
|
+
return manager;
|
|
24
|
+
}
|
|
14
25
|
/** Pinned Pi 0.84.2 main.ts policy, using SDK APIs rather than importing the CLI. */
|
|
15
26
|
export async function openSelectedPiSession(options) {
|
|
27
|
+
const sessions = options.sessions ?? SessionManager;
|
|
28
|
+
const cwd = resolve(options.cwd);
|
|
29
|
+
const directory = options.selection.sessionDir ?? options.sessionDir ?? process.env.PI_CODING_AGENT_SESSION_DIR;
|
|
30
|
+
const sessionDir = directory === undefined ? undefined : resolveSessionArgumentPath(directory, cwd);
|
|
16
31
|
try {
|
|
17
|
-
const sessions = options.sessions ?? SessionManager;
|
|
18
|
-
const cwd = resolve(options.cwd);
|
|
19
|
-
const directory = options.selection.sessionDir ?? options.sessionDir ?? process.env.PI_CODING_AGENT_SESSION_DIR;
|
|
20
|
-
const sessionDir = directory === undefined ? undefined : resolveSessionArgumentPath(directory, cwd);
|
|
21
32
|
const target = options.selection.target;
|
|
22
33
|
let path;
|
|
23
34
|
let global;
|
|
@@ -43,18 +54,43 @@ export async function openSelectedPiSession(options) {
|
|
|
43
54
|
}
|
|
44
55
|
assertResumeFile(path);
|
|
45
56
|
assertCwd(cwd);
|
|
46
|
-
|
|
57
|
+
const manager = sessions.forkFrom(path, cwd, sessionDir);
|
|
58
|
+
if (!options.guardWriter)
|
|
59
|
+
return manager;
|
|
60
|
+
const target = manager.getSessionFile();
|
|
61
|
+
if (target === undefined)
|
|
62
|
+
throw new PiSessionSelectionError("Fork did not create a session file");
|
|
63
|
+
return holdSelectedWriter(manager, acquireSessionWriter(target));
|
|
47
64
|
}
|
|
48
65
|
// Invariant: no await between the final guard and SDK open. A disappeared target
|
|
49
66
|
// can otherwise produce a new in-memory header instead of an existing session.
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
67
|
+
const writer = options.guardWriter ? acquireExisting(path) : undefined;
|
|
68
|
+
try {
|
|
69
|
+
const manager = sessions.open(path, sessionDir);
|
|
70
|
+
assertResumeFile(path);
|
|
71
|
+
assertCwd(manager.getCwd());
|
|
72
|
+
return writer === undefined ? manager : holdSelectedWriter(manager, writer);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
writer?.release();
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
54
78
|
}
|
|
55
79
|
catch (error) {
|
|
56
80
|
if (error instanceof PiSessionSelectionError)
|
|
57
81
|
throw error;
|
|
82
|
+
if (error instanceof SessionWriterConflict) {
|
|
83
|
+
if (options.forkPrompt && await options.forkPrompt({ sourceCwd: cwd })) {
|
|
84
|
+
const manager = sessions.forkFrom(error.path, cwd, sessionDir);
|
|
85
|
+
if (!options.guardWriter)
|
|
86
|
+
return manager;
|
|
87
|
+
const target = manager.getSessionFile();
|
|
88
|
+
if (target === undefined)
|
|
89
|
+
throw new PiSessionSelectionError("Fork did not create a session file");
|
|
90
|
+
return holdSelectedWriter(manager, acquireSessionWriter(target));
|
|
91
|
+
}
|
|
92
|
+
throw new PiSessionSelectionError("session is open in another A1 process");
|
|
93
|
+
}
|
|
58
94
|
throw new PiSessionSelectionError(`Could not resume session: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
95
|
}
|
|
60
96
|
}
|
|
@@ -80,6 +80,11 @@ export interface PiSettingsModelChoice {
|
|
|
80
80
|
readonly description: string;
|
|
81
81
|
readonly levels: readonly string[];
|
|
82
82
|
}
|
|
83
|
+
/** The engine's rule: no reasoning means "off" only; xhigh and max exist only where the model maps them. */
|
|
84
|
+
export declare function supportedThinkingLevels(model: {
|
|
85
|
+
readonly reasoning?: boolean;
|
|
86
|
+
readonly thinkingLevelMap?: Readonly<Record<string, unknown>>;
|
|
87
|
+
}): readonly string[];
|
|
83
88
|
/** The choice that clears a per-model override; the engine then applies its global default. */
|
|
84
89
|
export declare const MODEL_THINKING_DEFAULT = "default";
|
|
85
90
|
export declare const AUTOMATIC_THEME = "automatic";
|
|
@@ -24,6 +24,7 @@ export const PI_SETTING_EFFECTS = Object.freeze({
|
|
|
24
24
|
enableInstallTelemetry: effect("next-start", "installation", "none", "install lifecycle and its pinned failure diagnostic", "settings-effects-installation-parity"),
|
|
25
25
|
quietStartup: hiddenEffect("next-start", "startup", "pinned startup suppression lifecycle", "pi-startup-composition-parity"),
|
|
26
26
|
defaultProjectTrust: effect("next-start", "startup", "startup-selector", "pinned pre-resource project trust selector", "project-trust-startup-parity"),
|
|
27
|
+
sessionShareDestination: effect("live", "agent", "none", "pinned /share Radius or gist upload and its status rows", "pinned-share-destination-parity"),
|
|
27
28
|
doubleEscapeAction: effect("live", "shell", "selector", "pinned tree or fork selector", "pinned-selector-parity"),
|
|
28
29
|
treeFilterMode: effect("live", "shell", "selector", "pinned tree selector filter, rows, and hints", "pinned-selector-parity"),
|
|
29
30
|
showHardwareCursor: effect("live", "terminal", "terminal-cursor", "pinned editor, overlay, blur, failure, and exit cursor operations", "pi-terminal-operation-parity"),
|
|
@@ -251,6 +252,19 @@ function outcome(status, application, storedValue, effectiveValue, failure, limi
|
|
|
251
252
|
function describe(error) {
|
|
252
253
|
return error instanceof Error ? error.message : String(error);
|
|
253
254
|
}
|
|
255
|
+
/** The engine's rule: no reasoning means "off" only; xhigh and max exist only where the model maps them. */
|
|
256
|
+
export function supportedThinkingLevels(model) {
|
|
257
|
+
if (!model.reasoning)
|
|
258
|
+
return ["off"];
|
|
259
|
+
return ["off", "minimal", "low", "medium", "high", "xhigh", "max"].filter(level => {
|
|
260
|
+
const mapped = model.thinkingLevelMap?.[level];
|
|
261
|
+
if (mapped === null)
|
|
262
|
+
return false;
|
|
263
|
+
if (level === "xhigh" || level === "max")
|
|
264
|
+
return mapped !== undefined;
|
|
265
|
+
return true;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
254
268
|
/** The choice that clears a per-model override; the engine then applies its global default. */
|
|
255
269
|
export const MODEL_THINKING_DEFAULT = "default";
|
|
256
270
|
export const AUTOMATIC_THEME = "automatic";
|
|
@@ -411,6 +425,7 @@ function operations(settings, providers) {
|
|
|
411
425
|
bool("enableInstallTelemetry", () => settings.getEnableInstallTelemetry(), value => settings.setEnableInstallTelemetry(value)),
|
|
412
426
|
quietStartupSetting(settings),
|
|
413
427
|
choice("defaultProjectTrust", offered("defaultProjectTrust"), () => settings.getDefaultProjectTrust(), value => settings.setDefaultProjectTrust(value)),
|
|
428
|
+
choice("sessionShareDestination", offered("sessionShareDestination"), () => settings.getSessionShareDestination(), value => settings.setSessionShareDestination(value)),
|
|
414
429
|
choice("doubleEscapeAction", offered("doubleEscapeAction"), () => settings.getDoubleEscapeAction(), value => settings.setDoubleEscapeAction(value)),
|
|
415
430
|
choice("treeFilterMode", offered("treeFilterMode"), () => settings.getTreeFilterMode(), value => settings.setTreeFilterMode(value)),
|
|
416
431
|
bool("showHardwareCursor", () => settings.getShowHardwareCursor(), value => settings.setShowHardwareCursor(value)),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isRecord, readThinkingLevel, stringProperty } from "./message-values.js";
|
|
2
2
|
import { collectionResult } from "./resource-catalog.js";
|
|
3
|
-
import { MODEL_THINKING_DEFAULT, PiSettingsBridge } from "./settings-bridge.js";
|
|
3
|
+
import { MODEL_THINKING_DEFAULT, PiSettingsBridge, supportedThinkingLevels } from "./settings-bridge.js";
|
|
4
4
|
import { workflowResult } from "./workflow-support.js";
|
|
5
5
|
import { PINNED_PI_SETTINGS_CALLBACKS } from "./workflows.js";
|
|
6
6
|
/**
|
|
@@ -142,6 +142,12 @@ export class PiEngineSettings {
|
|
|
142
142
|
session.setThinkingLevel(level);
|
|
143
143
|
this.#ports.thinkingLevelChanged(readThinkingLevel(session.thinkingLevel));
|
|
144
144
|
} },
|
|
145
|
+
sessionShareDestination: { apply: value => {
|
|
146
|
+
if (value !== "auto" && value !== "gist" && value !== "radius")
|
|
147
|
+
throw new TypeError("Session share destination is invalid");
|
|
148
|
+
// Invariant: `/share` reads the manager per run, so persisting is the whole live effect.
|
|
149
|
+
settings.setSessionShareDestination(value);
|
|
150
|
+
} },
|
|
145
151
|
warnings: { apply: value => {
|
|
146
152
|
if (!isRecord(value) || Object.values(value).some(flag => typeof flag !== "boolean"))
|
|
147
153
|
throw new TypeError("Warnings setting is invalid");
|
|
@@ -222,6 +228,7 @@ export class PiEngineSettings {
|
|
|
222
228
|
autocompleteMaxVisible: setting(settings?.getAutocompleteMaxVisible, 5),
|
|
223
229
|
quietStartup: setting(settings?.getQuietStartup, false),
|
|
224
230
|
defaultProjectTrust: setting(settings?.getDefaultProjectTrust, "ask"),
|
|
231
|
+
sessionShareDestination: setting(settings?.getSessionShareDestination, "auto"),
|
|
225
232
|
clearOnShrink: setting(settings?.getClearOnShrink, false),
|
|
226
233
|
showTerminalProgress: setting(settings?.getShowTerminalProgress, false),
|
|
227
234
|
tuiMode: setting(settings?.getTuiMode, "regular"),
|
|
@@ -274,6 +281,7 @@ export class PiEngineSettings {
|
|
|
274
281
|
onEnableInstallTelemetryChange: snapshot.enableInstallTelemetry,
|
|
275
282
|
onQuietStartupChange: snapshot.quietStartup,
|
|
276
283
|
onDefaultProjectTrustChange: snapshot.defaultProjectTrust,
|
|
284
|
+
onSessionShareDestinationChange: snapshot.sessionShareDestination,
|
|
277
285
|
onDoubleEscapeActionChange: snapshot.doubleEscapeAction,
|
|
278
286
|
onTreeFilterModeChange: snapshot.treeFilterMode,
|
|
279
287
|
onShowHardwareCursorChange: snapshot.showHardwareCursor,
|
|
@@ -331,7 +339,8 @@ function settingKeyForCallback(callback) {
|
|
|
331
339
|
onHideThinkingBlockChange: "hideThinkingBlock", onMermaidRenderingModeChange: "mermaidRenderingMode",
|
|
332
340
|
onShowCacheMissNoticesChange: "showCacheMissNotices", onCollapseChangelogChange: "collapseChangelog",
|
|
333
341
|
onEnableInstallTelemetryChange: "enableInstallTelemetry", onQuietStartupChange: "quietStartup",
|
|
334
|
-
onDefaultProjectTrustChange: "defaultProjectTrust",
|
|
342
|
+
onDefaultProjectTrustChange: "defaultProjectTrust", onSessionShareDestinationChange: "sessionShareDestination",
|
|
343
|
+
onDoubleEscapeActionChange: "doubleEscapeAction",
|
|
335
344
|
onTreeFilterModeChange: "treeFilterMode", onShowHardwareCursorChange: "showHardwareCursor",
|
|
336
345
|
onEditorPaddingXChange: "editorPaddingX", onOutputPadChange: "outputPad", onAutocompleteMaxVisibleChange: "autocompleteMaxVisible",
|
|
337
346
|
onClearOnShrinkChange: "clearOnShrink", onShowTerminalProgressChange: "showTerminalProgress", onTuiModeChange: "tuiMode",
|
|
@@ -352,19 +361,6 @@ function agentJsonValue(value) {
|
|
|
352
361
|
function isThinkingLevel(value) {
|
|
353
362
|
return typeof value === "string" && ["off", "minimal", "low", "medium", "high", "xhigh", "max"].includes(value);
|
|
354
363
|
}
|
|
355
|
-
/** The engine's own rule: no reasoning means "off" only; xhigh and max exist only where the model maps them. */
|
|
356
|
-
function supportedThinkingLevels(model) {
|
|
357
|
-
if (!model.reasoning)
|
|
358
|
-
return ["off"];
|
|
359
|
-
return ["off", "minimal", "low", "medium", "high", "xhigh", "max"].filter(level => {
|
|
360
|
-
const mapped = model.thinkingLevelMap?.[level];
|
|
361
|
-
if (mapped === null)
|
|
362
|
-
return false;
|
|
363
|
-
if (level === "xhigh" || level === "max")
|
|
364
|
-
return mapped !== undefined;
|
|
365
|
-
return true;
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
364
|
function settingLabel(callback) {
|
|
369
365
|
return callback
|
|
370
366
|
.replace(/^on/, "")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { OwnedUiDiagnostics, OwnedUiEditorState, OwnedUiModelInfo, OwnedUiSessionViewModel, OwnedUiStatusView, OwnedUiTerminalSurface, OwnedUiThinkingLevel, OwnedUiUsageView } from "../../../contracts/owned-ui/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* The engine adapter's own view-model state: lifecycle, editor, status, terminal surface, active
|
|
4
|
+
* model, thinking level, the usage cache, diagnostics, and the view revision. Every change that
|
|
5
|
+
* touches more than one field is one named mutator, so the adapter and its collaborators never
|
|
6
|
+
* rebuild these objects inline.
|
|
7
|
+
*/
|
|
8
|
+
export declare class EngineViewState {
|
|
9
|
+
#private;
|
|
10
|
+
lifecycle: OwnedUiSessionViewModel["lifecycle"];
|
|
11
|
+
activeModel: OwnedUiModelInfo | null;
|
|
12
|
+
thinkingLevel: OwnedUiThinkingLevel;
|
|
13
|
+
get revision(): number;
|
|
14
|
+
get editor(): OwnedUiEditorState;
|
|
15
|
+
get status(): OwnedUiStatusView;
|
|
16
|
+
get terminal(): OwnedUiTerminalSurface;
|
|
17
|
+
get diagnostics(): readonly OwnedUiDiagnostics[];
|
|
18
|
+
/** Any emitted event advances the revision. */
|
|
19
|
+
advance(): void;
|
|
20
|
+
/** A full view is about to be published: usage is recomputed and the revision advances. */
|
|
21
|
+
invalidate(): void;
|
|
22
|
+
invalidateUsage(): void;
|
|
23
|
+
/** The cached usage view, computed once per published view. */
|
|
24
|
+
usage(read: () => OwnedUiUsageView): OwnedUiUsageView;
|
|
25
|
+
/** The engine started: the session is ready and accepts submissions. */
|
|
26
|
+
markReady(): void;
|
|
27
|
+
/** A run started with `message` as its working status; true when the session was already busy. */
|
|
28
|
+
enterWork(message: string): boolean;
|
|
29
|
+
leaveWork(): void;
|
|
30
|
+
/** Records compaction or retry progress; false when it did not change. */
|
|
31
|
+
setWorkProgress(percent: Exclude<OwnedUiStatusView["workingProgress"], undefined>): boolean;
|
|
32
|
+
setQueuedSubmissions(queuedSubmissions: readonly string[]): void;
|
|
33
|
+
/** Fills an empty editor with `text`, as tree navigation does for the selected branch's prompt. */
|
|
34
|
+
offerEditorText(text: string): void;
|
|
35
|
+
setHardwareCursor(hardwareCursor: boolean): void;
|
|
36
|
+
setTerminal(surface: OwnedUiTerminalSurface): void;
|
|
37
|
+
/** A replaced session starts with an empty editor that accepts submissions and no working status. */
|
|
38
|
+
replaceSession(): void;
|
|
39
|
+
/** Delivery overload ended the run: ready when it can resume, stopped once disposed, otherwise failed. */
|
|
40
|
+
settleOverload(canResume: boolean, disposed: boolean): void;
|
|
41
|
+
recordDiagnostic(severity: OwnedUiDiagnostics["severity"], code: string, message: string, recoverable: boolean): OwnedUiDiagnostics;
|
|
42
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const DEFAULT_SURFACE = {
|
|
2
|
+
columns: 100,
|
|
3
|
+
rows: 32,
|
|
4
|
+
focusedRegion: "editor",
|
|
5
|
+
hardwareCursor: false,
|
|
6
|
+
};
|
|
7
|
+
const MAX_DIAGNOSTICS = 100;
|
|
8
|
+
const MAX_STATUS_DIAGNOSTICS = 8;
|
|
9
|
+
/**
|
|
10
|
+
* The engine adapter's own view-model state: lifecycle, editor, status, terminal surface, active
|
|
11
|
+
* model, thinking level, the usage cache, diagnostics, and the view revision. Every change that
|
|
12
|
+
* touches more than one field is one named mutator, so the adapter and its collaborators never
|
|
13
|
+
* rebuild these objects inline.
|
|
14
|
+
*/
|
|
15
|
+
export class EngineViewState {
|
|
16
|
+
#revision = 0;
|
|
17
|
+
#editor = {
|
|
18
|
+
text: "",
|
|
19
|
+
queuedSubmissions: [],
|
|
20
|
+
selection: null,
|
|
21
|
+
cursorOffset: 0,
|
|
22
|
+
historyRevision: 0,
|
|
23
|
+
submitEnabled: false,
|
|
24
|
+
};
|
|
25
|
+
#status = {
|
|
26
|
+
title: "Pi",
|
|
27
|
+
workingMessage: null,
|
|
28
|
+
diagnostics: [],
|
|
29
|
+
badges: [],
|
|
30
|
+
};
|
|
31
|
+
#terminal = DEFAULT_SURFACE;
|
|
32
|
+
lifecycle = "starting";
|
|
33
|
+
activeModel = null;
|
|
34
|
+
thinkingLevel = "medium";
|
|
35
|
+
#usage;
|
|
36
|
+
#diagnostics = [];
|
|
37
|
+
get revision() { return this.#revision; }
|
|
38
|
+
get editor() { return this.#editor; }
|
|
39
|
+
get status() { return this.#status; }
|
|
40
|
+
get terminal() { return this.#terminal; }
|
|
41
|
+
get diagnostics() { return this.#diagnostics; }
|
|
42
|
+
/** Any emitted event advances the revision. */
|
|
43
|
+
advance() {
|
|
44
|
+
this.#revision += 1;
|
|
45
|
+
}
|
|
46
|
+
/** A full view is about to be published: usage is recomputed and the revision advances. */
|
|
47
|
+
invalidate() {
|
|
48
|
+
this.#usage = undefined;
|
|
49
|
+
this.#revision += 1;
|
|
50
|
+
}
|
|
51
|
+
invalidateUsage() {
|
|
52
|
+
this.#usage = undefined;
|
|
53
|
+
}
|
|
54
|
+
/** The cached usage view, computed once per published view. */
|
|
55
|
+
usage(read) {
|
|
56
|
+
return this.#usage ??= read();
|
|
57
|
+
}
|
|
58
|
+
/** The engine started: the session is ready and accepts submissions. */
|
|
59
|
+
markReady() {
|
|
60
|
+
this.lifecycle = "ready";
|
|
61
|
+
this.#editor = { ...this.#editor, submitEnabled: true };
|
|
62
|
+
}
|
|
63
|
+
/** A run started with `message` as its working status; true when the session was already busy. */
|
|
64
|
+
enterWork(message) {
|
|
65
|
+
const wasBusy = this.lifecycle === "busy";
|
|
66
|
+
this.lifecycle = "busy";
|
|
67
|
+
this.#status = { ...this.#status, workingMessage: message, workingProgress: null };
|
|
68
|
+
return wasBusy;
|
|
69
|
+
}
|
|
70
|
+
leaveWork() {
|
|
71
|
+
this.lifecycle = "ready";
|
|
72
|
+
this.#status = { ...this.#status, workingMessage: null, workingProgress: null };
|
|
73
|
+
}
|
|
74
|
+
/** Records compaction or retry progress; false when it did not change. */
|
|
75
|
+
setWorkProgress(percent) {
|
|
76
|
+
if (this.#status.workingProgress === percent)
|
|
77
|
+
return false;
|
|
78
|
+
this.#status = { ...this.#status, workingProgress: percent };
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
setQueuedSubmissions(queuedSubmissions) {
|
|
82
|
+
this.#editor = { ...this.#editor, queuedSubmissions: [...queuedSubmissions], historyRevision: this.#editor.historyRevision + 1 };
|
|
83
|
+
}
|
|
84
|
+
/** Fills an empty editor with `text`, as tree navigation does for the selected branch's prompt. */
|
|
85
|
+
offerEditorText(text) {
|
|
86
|
+
if (!this.#editor.text.trim()) {
|
|
87
|
+
this.#editor = { ...this.#editor, text, selection: null, cursorOffset: text.length };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
setHardwareCursor(hardwareCursor) {
|
|
91
|
+
this.#terminal = { ...this.#terminal, hardwareCursor };
|
|
92
|
+
}
|
|
93
|
+
setTerminal(surface) {
|
|
94
|
+
this.#terminal = { ...surface };
|
|
95
|
+
}
|
|
96
|
+
/** A replaced session starts with an empty editor that accepts submissions and no working status. */
|
|
97
|
+
replaceSession() {
|
|
98
|
+
this.#editor = {
|
|
99
|
+
text: "",
|
|
100
|
+
queuedSubmissions: [],
|
|
101
|
+
selection: null,
|
|
102
|
+
cursorOffset: 0,
|
|
103
|
+
historyRevision: this.#editor.historyRevision + 1,
|
|
104
|
+
submitEnabled: true,
|
|
105
|
+
};
|
|
106
|
+
this.#status = { ...this.#status, workingMessage: null, workingProgress: null, badges: [] };
|
|
107
|
+
}
|
|
108
|
+
/** Delivery overload ended the run: ready when it can resume, stopped once disposed, otherwise failed. */
|
|
109
|
+
settleOverload(canResume, disposed) {
|
|
110
|
+
this.#status = { ...this.#status, workingMessage: null, workingProgress: null };
|
|
111
|
+
this.lifecycle = disposed ? "stopped" : canResume ? "ready" : "failed";
|
|
112
|
+
this.#editor = { ...this.#editor, submitEnabled: canResume && !disposed };
|
|
113
|
+
this.#revision += 1;
|
|
114
|
+
}
|
|
115
|
+
recordDiagnostic(severity, code, message, recoverable) {
|
|
116
|
+
const diagnostic = { sequence: this.#diagnostics.length, code, severity, message, recoverable };
|
|
117
|
+
this.#diagnostics.push(diagnostic);
|
|
118
|
+
if (this.#diagnostics.length > MAX_DIAGNOSTICS)
|
|
119
|
+
this.#diagnostics.shift();
|
|
120
|
+
this.#status = {
|
|
121
|
+
...this.#status,
|
|
122
|
+
diagnostics: [...this.#status.diagnostics, message].slice(-MAX_STATUS_DIAGNOSTICS),
|
|
123
|
+
};
|
|
124
|
+
return diagnostic;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -3,6 +3,7 @@ import { dirname, resolve } from "node:path";
|
|
|
3
3
|
import { dynamicObject, isRecord, requireCapability, stringProperty } from "./message-values.js";
|
|
4
4
|
import { ProjectTrustStore, SessionManager } from "../startup-public.js";
|
|
5
5
|
import { resolveConfiguredModelIds, scopedModelRecords, scopedModelReference, workflowOptions } from "./workflow-support.js";
|
|
6
|
+
import { acquireExisting } from "../../../foundation/session-writer-lock/index.js";
|
|
6
7
|
/**
|
|
7
8
|
* The selector contexts and option lists the owned UI's workflow dialogs read from pinned Pi:
|
|
8
9
|
* model, scoped-model, session, tree, fork, project-trust, and provider-authentication state,
|
|
@@ -102,7 +103,15 @@ export class PiWorkflowContexts {
|
|
|
102
103
|
const next = (nextName ?? "").trim();
|
|
103
104
|
if (!next)
|
|
104
105
|
return;
|
|
105
|
-
|
|
106
|
+
const isCurrent = typeof currentSessionFilePath === "string"
|
|
107
|
+
&& resolve(currentSessionFilePath) === resolve(sessionFilePath);
|
|
108
|
+
const writer = isCurrent ? undefined : acquireExisting(sessionFilePath);
|
|
109
|
+
try {
|
|
110
|
+
SessionManager.open(sessionFilePath).appendSessionInfo(next);
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
writer?.release();
|
|
114
|
+
}
|
|
106
115
|
},
|
|
107
116
|
};
|
|
108
117
|
}
|