@timurproko/a1 0.2.6 → 0.2.7-dev.1221
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -3
- package/bin/automatic-update.js +7 -0
- package/bin/cli.js +4 -0
- package/bin/guardian.js +5 -0
- package/bin/tab-launch-context.d.ts +27 -0
- package/bin/tab-launch-context.js +94 -0
- package/bin/ui.js +107 -59
- package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
- package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
- package/dist/app/session-shell/dialog-coordinator.js +133 -0
- package/dist/app/session-shell/dock-chrome.d.ts +34 -0
- package/dist/app/session-shell/dock-chrome.js +109 -0
- package/dist/app/session-shell/exit-notice.d.ts +1 -1
- package/dist/app/session-shell/exit-notice.js +1 -1
- package/dist/app/session-shell/extension-surface.d.ts +30 -0
- package/dist/app/session-shell/extension-surface.js +105 -0
- package/dist/app/session-shell/helper-pool.d.ts +3 -5
- package/dist/app/session-shell/helper-pool.js +3 -5
- package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
- package/dist/app/session-shell/input-surface-switch.js +85 -0
- package/dist/app/session-shell/login-interaction.d.ts +27 -0
- package/dist/app/session-shell/login-interaction.js +91 -0
- package/dist/app/session-shell/prompt-submission.d.ts +48 -0
- package/dist/app/session-shell/prompt-submission.js +276 -0
- package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
- package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
- package/dist/app/session-shell/response-copy-helper.js +21 -6
- package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
- package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
- package/dist/app/session-shell/response-copy-transport.js +69 -17
- package/dist/app/session-shell/session-concern.d.ts +22 -0
- package/dist/app/session-shell/session-concern.js +29 -0
- package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
- package/dist/app/session-shell/session-lifecycle.js +49 -0
- package/dist/app/session-shell/session-shell-root.d.ts +42 -6
- package/dist/app/session-shell/session-shell-root.js +196 -908
- package/dist/app/session-shell/session-shell.d.ts +3 -8
- package/dist/app/session-shell/session-shell.js +324 -835
- package/dist/app/session-shell/session-viewport-controller.d.ts +2 -2
- package/dist/app/session-shell/session-viewport-controller.js +29 -15
- package/dist/app/session-shell/settings-bindings.d.ts +17 -0
- package/dist/app/session-shell/settings-bindings.js +91 -0
- package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
- package/dist/app/session-shell/shell-editor-factory.js +102 -0
- package/dist/app/session-shell/shell-host.d.ts +6 -0
- package/dist/app/session-shell/shell-host.js +34 -7
- package/dist/app/session-shell/shell-layout.d.ts +64 -0
- package/dist/app/session-shell/shell-layout.js +18 -0
- package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
- package/dist/app/session-shell/suggestion-surface.js +63 -0
- package/dist/app/session-shell/transcript-document.d.ts +78 -0
- package/dist/app/session-shell/transcript-document.js +365 -0
- package/dist/app/session-shell/viewport-layout.d.ts +31 -0
- package/dist/app/session-shell/viewport-layout.js +160 -0
- package/dist/app/session-shell/workflow-output.d.ts +33 -0
- package/dist/app/session-shell/workflow-output.js +174 -0
- package/dist/app/session-shell/workflow-router.d.ts +25 -0
- package/dist/app/session-shell/workflow-router.js +39 -0
- package/dist/cli/dispatch.d.ts +11 -1
- package/dist/cli/dispatch.js +79 -5
- package/dist/cli/tabs-request.d.ts +7 -0
- package/dist/cli/tabs-request.js +1 -0
- package/dist/cli/tabs.d.ts +14 -0
- package/dist/cli/tabs.js +151 -0
- package/dist/cli/version-stats.js +38 -3
- package/dist/composition/owned-settings.d.ts +12 -0
- package/dist/composition/owned-settings.js +36 -0
- package/dist/composition/owned-ui.d.ts +27 -28
- package/dist/composition/owned-ui.js +205 -153
- package/dist/composition/resident-tab-bridge.d.ts +25 -0
- package/dist/composition/resident-tab-bridge.js +180 -0
- package/dist/composition/session-backend.d.ts +19 -0
- package/dist/composition/session-backend.js +1 -0
- package/dist/composition/session-runtime-registry.d.ts +20 -0
- package/dist/composition/session-runtime-registry.js +85 -0
- package/dist/composition/settings-route-host.d.ts +16 -1
- package/dist/composition/settings-route-host.js +29 -10
- package/dist/composition/settings-search-input.d.ts +9 -0
- package/dist/composition/settings-search-input.js +58 -0
- package/dist/composition/startup-route.d.ts +32 -0
- package/dist/composition/startup-route.js +72 -0
- package/dist/composition/utility-tab.d.ts +28 -0
- package/dist/composition/utility-tab.js +242 -0
- package/dist/contracts/owned-ui/index.d.ts +1 -1
- package/dist/contracts/owned-ui/model.d.ts +3 -0
- package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
- package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
- package/dist/contracts/presentation/index.d.ts +11 -0
- package/dist/contracts/presentation/index.js +12 -0
- package/dist/features/launch/development-launch.js +6 -0
- package/dist/features/launch/index.d.ts +1 -1
- package/dist/features/launch/intent.d.ts +3 -1
- package/dist/features/launch/intent.js +7 -4
- package/dist/features/launch/profile-paths.js +4 -0
- package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
- package/dist/features/owned-ui/plus-menu-dialog.js +76 -0
- package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
- package/dist/features/owned-ui/project-trust-dialog.js +6 -8
- package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
- package/dist/features/owned-ui/project-trust-prompt.js +7 -3
- package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
- package/dist/features/owned-ui/reference-screen-app.js +12 -2
- package/dist/features/owned-ui/settings-app.d.ts +12 -2
- package/dist/features/owned-ui/settings-app.js +116 -81
- package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
- package/dist/features/owned-ui/settings-search-input.js +1 -0
- package/dist/features/prompt-history/index.d.ts +1 -1
- package/dist/features/prompt-history/paths.d.ts +2 -1
- package/dist/features/prompt-history/paths.js +10 -2
- package/dist/features/prompt-history/service.d.ts +5 -0
- package/dist/features/prompt-history/service.js +1 -1
- package/dist/features/resident-tab/auto-name.d.ts +11 -0
- package/dist/features/resident-tab/auto-name.js +44 -0
- package/dist/features/resident-tab/index.d.ts +5 -0
- package/dist/features/resident-tab/index.js +7 -0
- package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
- package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
- package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
- package/dist/features/resident-tab/shortcut-declarations.js +26 -0
- package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
- package/dist/features/resident-tab/shortcut-projection.js +64 -0
- package/dist/features/resident-tab/status-deriver.d.ts +10 -0
- package/dist/features/resident-tab/status-deriver.js +12 -0
- package/dist/foundation/launch-context/index.d.ts +12 -0
- package/dist/foundation/launch-context/index.js +26 -0
- package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
- package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
- package/dist/foundation/launch-guardian/main.d.ts +7 -1
- package/dist/foundation/launch-guardian/main.js +60 -7
- package/dist/foundation/lifecycle/session-repository-context.js +16 -2
- package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
- package/dist/foundation/process-containment/addon-containment.js +139 -0
- package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
- package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
- package/dist/foundation/process-containment/addon.d.ts +42 -0
- package/dist/foundation/process-containment/addon.js +57 -0
- package/dist/foundation/process-containment/artifact.d.ts +1 -1
- package/dist/foundation/process-containment/artifact.js +6 -5
- package/dist/foundation/process-containment/contracts.d.ts +2 -0
- package/dist/foundation/process-containment/index.d.ts +4 -4
- package/dist/foundation/process-containment/index.js +3 -3
- package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
- package/dist/foundation/process-containment/native-process-inspector.js +10 -10
- package/dist/foundation/release/automatic-update.d.ts +37 -0
- package/dist/foundation/release/automatic-update.js +265 -0
- package/dist/foundation/release/bootstrap.d.ts +7 -9
- package/dist/foundation/release/bootstrap.js +107 -24
- package/dist/foundation/release/cohort-state.d.ts +1 -1
- package/dist/foundation/release/cohort-state.js +1 -1
- package/dist/foundation/release/dependency-certification.js +54 -19
- package/dist/foundation/release/early-accent.d.ts +12 -0
- package/dist/foundation/release/early-accent.js +59 -0
- package/dist/foundation/release/index.d.ts +2 -2
- package/dist/foundation/release/index.js +2 -2
- package/dist/foundation/release/latest-release.d.ts +24 -2
- package/dist/foundation/release/latest-release.js +51 -1
- package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
- package/dist/foundation/release/progress-palette.generated.js +137 -3
- package/dist/foundation/release/release-gc.d.ts +3 -0
- package/dist/foundation/release/release-gc.js +59 -8
- package/dist/foundation/release/release-store.d.ts +12 -0
- package/dist/foundation/release/release-store.js +124 -2
- package/dist/foundation/release/update-execution-lease.d.ts +48 -0
- package/dist/foundation/release/update-execution-lease.js +161 -0
- package/dist/foundation/release/update.d.ts +12 -7
- package/dist/foundation/release/update.js +281 -196
- package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
- package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
- package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
- package/dist/foundation/resident-tabs/bridge-client.js +321 -0
- package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
- package/dist/foundation/resident-tabs/doctor.js +166 -0
- package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
- package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
- package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
- package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
- package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
- package/dist/foundation/resident-tabs/fault-injection.js +26 -0
- package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
- package/dist/foundation/resident-tabs/fixture-control.js +35 -0
- package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
- package/dist/foundation/resident-tabs/host-entry.js +17 -0
- package/dist/foundation/resident-tabs/index.d.ts +12 -0
- package/dist/foundation/resident-tabs/index.js +6 -0
- package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
- package/dist/foundation/resident-tabs/maintenance.js +75 -0
- package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
- package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
- package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
- package/dist/foundation/resident-tabs/progress-observation.js +150 -0
- package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
- package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
- package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
- package/dist/foundation/resident-tabs/protocol.js +195 -0
- package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
- package/dist/foundation/resident-tabs/recovery.js +205 -0
- package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
- package/dist/foundation/resident-tabs/release-holds.js +75 -0
- package/dist/foundation/resident-tabs/routes.d.ts +5 -0
- package/dist/foundation/resident-tabs/routes.js +5 -0
- package/dist/foundation/resident-tabs/routing.d.ts +11 -0
- package/dist/foundation/resident-tabs/routing.js +10 -0
- package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
- package/dist/foundation/resident-tabs/session-sync.js +37 -0
- package/dist/foundation/resident-tabs/settings.d.ts +12 -0
- package/dist/foundation/resident-tabs/settings.js +58 -0
- package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
- package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
- package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
- package/dist/foundation/resident-tabs/zip-archive.js +56 -0
- package/dist/foundation/session-writer-lock/index.d.ts +30 -0
- package/dist/foundation/session-writer-lock/index.js +203 -0
- package/dist/foundation/startup/startup-descriptor.js +2 -2
- package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
- package/dist/foundation/terminal-cleanup/index.js +1 -1
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
- package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
- package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
- package/dist/integrations/pi/components/modal-frame.js +48 -9
- package/dist/integrations/pi/components/models-dialog.js +4 -52
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
- package/dist/integrations/pi/components/owned-editor-ux.js +90 -6
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
- package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
- package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
- package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
- package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
- package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
- package/dist/integrations/pi/components/shell-footer-status.js +21 -5
- package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
- package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
- package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
- package/dist/integrations/pi/components/skills-dialog.js +2 -2
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
- package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
- package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
- package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
- package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
- package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
- package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
- package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
- package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
- package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
- package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
- package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
- package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
- package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
- package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
- package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
- package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
- package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
- package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
- package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
- package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
- package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
- package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
- package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
- package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
- package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
- package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
- package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
- package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
- package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
- package/dist/integrations/pi/engine/adapter.d.ts +5 -77
- package/dist/integrations/pi/engine/adapter.js +95 -394
- package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
- package/dist/integrations/pi/engine/command-dispatch.js +57 -0
- package/dist/integrations/pi/engine/host.js +2 -2
- package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
- package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
- package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
- package/dist/integrations/pi/engine/ports.d.ts +56 -0
- package/dist/integrations/pi/engine/ports.js +93 -0
- package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
- package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
- package/dist/integrations/pi/engine/resources/changelog.json +4 -4
- package/dist/integrations/pi/engine/runtime-integration.js +102 -29
- package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
- package/dist/integrations/pi/engine/session-runtime.js +13 -5
- package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
- package/dist/integrations/pi/engine/session-selection.js +45 -9
- package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
- package/dist/integrations/pi/engine/settings-bridge.js +15 -0
- package/dist/integrations/pi/engine/settings-port.js +11 -15
- package/dist/integrations/pi/engine/view-state.d.ts +42 -0
- package/dist/integrations/pi/engine/view-state.js +126 -0
- package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
- package/dist/integrations/pi/engine/workflow-runner.js +73 -4
- package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
- package/dist/integrations/pi/engine/workflow-support.js +36 -0
- package/dist/integrations/pi/engine/workflows.d.ts +3 -1
- package/dist/integrations/pi/engine/workflows.js +1 -0
- package/dist/integrations/pi/startup-public.js +257 -310
- package/dist/integrations/pi/startup-public.manifest.json +564 -440
- package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
- package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
- package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
- package/dist/native/darwin-arm64/manifest.json +10 -7
- package/dist/native/darwin-arm64/process-guardian.node +0 -0
- package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
- package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
- package/dist/native/darwin-arm64/terminal-host.node +0 -0
- package/dist/native/darwin-x64/manifest.json +23 -0
- package/dist/native/darwin-x64/process-guardian.node +0 -0
- package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
- package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
- package/dist/native/darwin-x64/terminal-host.node +0 -0
- package/dist/native/linux-x64/manifest.json +10 -7
- package/dist/native/linux-x64/process-guardian.node +0 -0
- package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
- package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
- package/dist/native/linux-x64/terminal-host.node +0 -0
- package/dist/native/win32-x64/manifest.json +10 -7
- package/dist/native/win32-x64/process-guardian.node +0 -0
- package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
- package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
- package/dist/native/win32-x64/terminal-host.node +0 -0
- package/dist/product-identity.d.ts +3 -3
- package/dist/product-identity.js +4 -4
- package/dist/product-identity.json +16 -2
- package/dist/runtime-payload-inventory.json +6330 -6677
- package/dist/ui/apps/host.d.ts +2 -0
- package/dist/ui/apps/host.js +7 -1
- package/dist/ui/components/dialog-panel.js +35 -30
- package/dist/ui/components/index.d.ts +2 -2
- package/dist/ui/components/index.js +1 -1
- package/dist/ui/components/line-input.d.ts +4 -1
- package/dist/ui/components/line-input.js +3 -1
- package/dist/ui/components/prompt-input.d.ts +11 -8
- package/dist/ui/components/prompt-input.js +15 -13
- package/dist/ui/components/selection-copy.d.ts +2 -0
- package/dist/ui/components/selection-copy.js +13 -0
- package/dist/ui/components/spans.js +2 -2
- package/dist/ui/components/submitted-prompt.d.ts +9 -6
- package/dist/ui/components/submitted-prompt.js +20 -12
- package/dist/ui/components/surface.js +4 -2
- package/dist/ui/components/text.d.ts +3 -6
- package/dist/ui/components/text.js +6 -8
- package/dist/ui/components/transcript-viewport.d.ts +9 -2
- package/dist/ui/components/transcript-viewport.js +176 -55
- package/dist/ui/settings/declarations.d.ts +90 -16
- package/dist/ui/settings/declarations.js +67 -14
- package/dist/ui/settings/early-accent.d.ts +81 -0
- package/dist/ui/settings/early-accent.js +50 -0
- package/dist/ui/settings/index.d.ts +4 -2
- package/dist/ui/settings/index.js +2 -1
- package/dist/ui/settings/manager.d.ts +16 -3
- package/dist/ui/settings/manager.js +122 -33
- package/dist/ui/settings/migrations.d.ts +6 -0
- package/dist/ui/settings/migrations.js +73 -0
- package/dist/ui/settings/profile-document.d.ts +26 -0
- package/dist/ui/settings/profile-document.js +164 -0
- package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
- package/dist/ui/settings/progress-palette.generated.js +139 -0
- package/dist/ui/settings/sections.d.ts +4 -0
- package/dist/ui/settings/sections.js +9 -3
- package/docs/architecture/boundaries.md +24 -9
- package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
- package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
- package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
- package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
- package/docs/architecture/internal-naming.md +3 -1
- package/docs/architecture/process-guardian-provenance.md +18 -10
- package/docs/architecture/project-structure.md +8 -0
- package/docs/architecture/resident-tabs-requirements.md +18 -0
- package/docs/architecture/resident-tabs.md +648 -0
- package/docs/architecture/response-copy-delivery.md +1 -1
- package/docs/architecture/terminal-host-proof-gate.md +2 -0
- package/docs/architecture/terminal-host-provenance.md +16 -4
- package/docs/architecture/tool-image-presentation.md +2 -1
- package/docs/architecture/toolchain.md +11 -9
- package/docs/ci-release-runbook.md +14 -7
- package/docs/features/launch-profiles.md +11 -8
- package/docs/features/prompt-history.md +41 -20
- package/docs/manual-resident-tabs-acceptance.md +51 -0
- package/docs/openspec-archive-automation.md +49 -22
- package/docs/validation.md +49 -9
- package/package.json +19 -6
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
- package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
- package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
- package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
- package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/process-guardian.exe +0 -0
package/README.md
CHANGED
|
@@ -57,6 +57,12 @@ Launch A1 (profile: `~/.a1/agent`):
|
|
|
57
57
|
a1
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
+
Launch A1 in single agent mode:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
a1 solo
|
|
64
|
+
```
|
|
65
|
+
|
|
60
66
|
Show all commands:
|
|
61
67
|
|
|
62
68
|
```text
|
|
@@ -77,6 +83,30 @@ a1 pi
|
|
|
77
83
|
|
|
78
84
|
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
|
|
79
85
|
|
|
86
|
+
## Tabs
|
|
87
|
+
|
|
88
|
+
Tabs keep running after their terminal closes. List them, or stop one; its session stays resumable:
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
a1 tabs
|
|
92
|
+
a1 tabs stop <id>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Stop every tab and the resident host, for example before going back to single agent mode with `a1 solo`:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
a1 tabs host stop
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Show host health, or write a redacted diagnostic bundle:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
a1 tabs host status
|
|
105
|
+
a1 tabs doctor
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
|
|
109
|
+
|
|
80
110
|
## Update
|
|
81
111
|
|
|
82
112
|
Install the release:
|
|
@@ -115,7 +145,13 @@ Stuck on `0.2.2` and `a1 update` fails? Run the installer once, then use `a1 upd
|
|
|
115
145
|
npm x -y -- @timurproko/a1-install
|
|
116
146
|
```
|
|
117
147
|
|
|
118
|
-
|
|
148
|
+
The **Update** setting controls the at-most-daily startup check:
|
|
149
|
+
|
|
150
|
+
- **Auto** (default) silently installs a verified update for the running channel, then shows `Update installed · Restart to update`.
|
|
151
|
+
- **Notify** keeps the `Update Available` notice and leaves installation manual.
|
|
152
|
+
- **No** performs no startup update check; updates remain available through the commands above.
|
|
153
|
+
|
|
154
|
+
`A1_SKIP_VERSION_CHECK=1` also disables the startup check. Manual stable, development, and exact-version update commands remain available in every mode.
|
|
119
155
|
|
|
120
156
|
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
|
|
121
157
|
|
|
@@ -155,13 +191,15 @@ a1 update npm:pi-mcp-adapter
|
|
|
155
191
|
|
|
156
192
|
## Develop
|
|
157
193
|
|
|
194
|
+
A source build needs Node.js, npm, git, and Rustup. Windows additionally needs Visual Studio or Visual Studio Build Tools with the **Desktop development with C++** workload, MSVC x64/x86 tools, and a Windows SDK; Visual Studio Code is not required. A1 discovers installed Rustup and Visual Studio tools and initializes them for build children, so Git Bash and ordinary PowerShell do not need manual `PATH` or developer-shell setup. It never installs these tools or accepts their licenses automatically.
|
|
195
|
+
|
|
158
196
|
Install exact locked dependencies:
|
|
159
197
|
|
|
160
198
|
```text
|
|
161
199
|
npm ci
|
|
162
200
|
```
|
|
163
201
|
|
|
164
|
-
Compile TypeScript and the
|
|
202
|
+
Compile TypeScript and the native addons into `dist`:
|
|
165
203
|
|
|
166
204
|
```text
|
|
167
205
|
npm run build
|
|
@@ -191,7 +229,7 @@ Complete non-physical suite:
|
|
|
191
229
|
npm run test:full
|
|
192
230
|
```
|
|
193
231
|
|
|
194
|
-
Report Node, npm, git, Rust, and
|
|
232
|
+
Report Node, npm, git, Rust, dependency, and Windows C++ readiness. Missing Windows tools are listed in setup order; after installing them, rerun the same build command:
|
|
195
233
|
|
|
196
234
|
```text
|
|
197
235
|
npm run doctor
|
package/bin/cli.js
CHANGED
|
@@ -69,6 +69,10 @@ process.exitCode = await dispatchCli(process.argv.slice(2), {
|
|
|
69
69
|
},
|
|
70
70
|
});
|
|
71
71
|
},
|
|
72
|
+
tabs: async request => {
|
|
73
|
+
const { runTabsCommand } = await import("../dist/cli/tabs.js");
|
|
74
|
+
return await runTabsCommand(request, { packageRoot: fileURLToPath(packageRoot) });
|
|
75
|
+
},
|
|
72
76
|
}, {
|
|
73
77
|
stdout: message => process.stdout.write(message),
|
|
74
78
|
stderr: message => process.stderr.write(message),
|
package/bin/guardian.js
CHANGED
|
@@ -16,8 +16,13 @@ const profileId = readLaunchContext(process.env, "profile").launchProfile;
|
|
|
16
16
|
if (releaseRoot === undefined || profileId === undefined) throw new Error("A1 launch context is incomplete");
|
|
17
17
|
|
|
18
18
|
const sessionSelection = parseSessionSelection(process.argv.slice(2));
|
|
19
|
+
const rootCommand = launchContext.residentRootExecutable === undefined ? undefined : {
|
|
20
|
+
executable: launchContext.residentRootExecutable,
|
|
21
|
+
arguments: JSON.parse(launchContext.residentRootArguments ?? "[]"),
|
|
22
|
+
};
|
|
19
23
|
Promise.resolve().then(() => runLaunchGuardian({
|
|
20
24
|
...(sessionSelection === undefined ? {} : { sessionSelection }),
|
|
25
|
+
...(rootCommand === undefined ? {} : { rootCommand }),
|
|
21
26
|
profileId,
|
|
22
27
|
releaseRoot,
|
|
23
28
|
uiEntry: resolve(releaseRoot, "bin", "ui.js"),
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface TabLaunchCredentials {
|
|
2
|
+
readonly tabId: string;
|
|
3
|
+
readonly token: string;
|
|
4
|
+
readonly endpoint: string;
|
|
5
|
+
readonly releaseId?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function formatResidentFallbackNotice(reason: string): string;
|
|
9
|
+
|
|
10
|
+
export function assignFreshSessionRuntimeId(
|
|
11
|
+
environment: Record<string, string | undefined>,
|
|
12
|
+
name: string,
|
|
13
|
+
createId: () => string,
|
|
14
|
+
): string;
|
|
15
|
+
|
|
16
|
+
export function waitForStandbyPromotion(input: NodeJS.ReadStream, promotionFile?: string): Promise<void>;
|
|
17
|
+
|
|
18
|
+
export function consumeTabLaunchContext(
|
|
19
|
+
arguments_: readonly string[],
|
|
20
|
+
environment: Record<string, string | undefined>,
|
|
21
|
+
): {
|
|
22
|
+
readonly uiArguments: string[];
|
|
23
|
+
readonly tabCredentials: TabLaunchCredentials | undefined;
|
|
24
|
+
readonly tabDataDir?: string;
|
|
25
|
+
readonly tabIncarnation?: number;
|
|
26
|
+
readonly tabStandby: boolean;
|
|
27
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
|
|
3
|
+
const TAB_ENVIRONMENT_NAMES = ["A1_TAB_ID", "A1_TAB_TOKEN", "A1_TAB_ENDPOINT", "A1_TAB_RELEASE_ID"];
|
|
4
|
+
|
|
5
|
+
/** @param {string} reason */
|
|
6
|
+
export function formatResidentFallbackNotice(reason) {
|
|
7
|
+
// Protocol: a host of another generation is never replaced automatically; only the user stops it.
|
|
8
|
+
if (reason === "incompatible generation") {
|
|
9
|
+
return "A1 normal mode unavailable (running tabs use another version); running in single agent mode. Run `a1 tabs host stop` to restart them on this version.";
|
|
10
|
+
}
|
|
11
|
+
return `A1 normal mode unavailable (${reason}); running in single agent mode.`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {Record<string, string | undefined>} environment
|
|
16
|
+
* @param {string} name
|
|
17
|
+
* @param {() => string} createId
|
|
18
|
+
*/
|
|
19
|
+
export function assignFreshSessionRuntimeId(environment, name, createId) {
|
|
20
|
+
const id = createId();
|
|
21
|
+
if (typeof id !== "string" || id.length === 0 || id.includes("\0")) throw new Error("Session runtime identity generation failed");
|
|
22
|
+
environment[name] = id;
|
|
23
|
+
return id;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Keep the standby below the session/runtime boundary until its authenticated holder promotes it.
|
|
28
|
+
* Platform: Windows ConPTY may drop the in-band marker, so the holder also creates the promotion
|
|
29
|
+
* file inside the tab's private data directory; whichever arrives first promotes the standby.
|
|
30
|
+
* @param {NodeJS.ReadStream} input
|
|
31
|
+
* @param {string} [promotionFile]
|
|
32
|
+
*/
|
|
33
|
+
export function waitForStandbyPromotion(input, promotionFile) {
|
|
34
|
+
return /** @type {Promise<void>} */ (new Promise((resolve, reject) => {
|
|
35
|
+
const marker = Buffer.from("\x1b]a1;standby-promote\x07");
|
|
36
|
+
let buffered = Buffer.alloc(0);
|
|
37
|
+
/** @type {NodeJS.Timeout | undefined} */
|
|
38
|
+
let poll;
|
|
39
|
+
const cleanup = () => {
|
|
40
|
+
if (poll !== undefined) clearInterval(poll);
|
|
41
|
+
input.off("data", onData);
|
|
42
|
+
input.off("error", onError);
|
|
43
|
+
input.pause();
|
|
44
|
+
if (input.isTTY) input.setRawMode(false);
|
|
45
|
+
};
|
|
46
|
+
/** @param {Error} error */
|
|
47
|
+
const onError = error => { cleanup(); reject(error); };
|
|
48
|
+
/** @param {Buffer | string} chunk */
|
|
49
|
+
const onData = chunk => {
|
|
50
|
+
const bytes = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
51
|
+
buffered = Buffer.concat([buffered, bytes]).subarray(-marker.length);
|
|
52
|
+
if (buffered.equals(marker)) { cleanup(); resolve(undefined); }
|
|
53
|
+
};
|
|
54
|
+
if (input.isTTY) input.setRawMode(true);
|
|
55
|
+
input.on("data", onData);
|
|
56
|
+
input.on("error", onError);
|
|
57
|
+
input.resume();
|
|
58
|
+
if (promotionFile !== undefined) {
|
|
59
|
+
poll = setInterval(() => {
|
|
60
|
+
if (existsSync(promotionFile)) { cleanup(); resolve(undefined); }
|
|
61
|
+
}, 10);
|
|
62
|
+
}
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Security: consume bridge credentials into caller-private memory and erase their inheritable
|
|
68
|
+
* environment entries before any extension-capable module loads.
|
|
69
|
+
* @param {readonly string[]} arguments_
|
|
70
|
+
* @param {Record<string, string | undefined>} environment
|
|
71
|
+
*/
|
|
72
|
+
export function consumeTabLaunchContext(arguments_, environment) {
|
|
73
|
+
const uiArguments = [...arguments_];
|
|
74
|
+
const tabArgument = uiArguments.indexOf("--tab");
|
|
75
|
+
const tabMode = tabArgument !== -1;
|
|
76
|
+
if (tabMode) uiArguments.splice(tabArgument, 1);
|
|
77
|
+
const standbyArgument = uiArguments.indexOf("--tab-standby");
|
|
78
|
+
const tabStandby = standbyArgument !== -1;
|
|
79
|
+
if (tabStandby) uiArguments.splice(standbyArgument, 1);
|
|
80
|
+
const dataArgument = uiArguments.indexOf("--tab-data-dir");
|
|
81
|
+
const tabDataDir = dataArgument === -1 ? undefined : uiArguments[dataArgument + 1];
|
|
82
|
+
if (dataArgument !== -1) uiArguments.splice(dataArgument, 2);
|
|
83
|
+
const incarnationArgument = uiArguments.indexOf("--tab-incarnation");
|
|
84
|
+
const tabIncarnation = incarnationArgument === -1 ? undefined : Number(uiArguments[incarnationArgument + 1]);
|
|
85
|
+
if (incarnationArgument !== -1) uiArguments.splice(incarnationArgument, 2);
|
|
86
|
+
const [tabId, token, endpoint, releaseId] = TAB_ENVIRONMENT_NAMES.map(name => environment[name]);
|
|
87
|
+
for (const name of TAB_ENVIRONMENT_NAMES) delete environment[name];
|
|
88
|
+
if (!tabMode) return { uiArguments, tabCredentials: undefined, tabStandby: false };
|
|
89
|
+
if (!tabId || !token || !endpoint || !tabDataDir || tabDataDir.includes("\0")
|
|
90
|
+
|| typeof tabIncarnation !== "number" || !Number.isSafeInteger(tabIncarnation) || tabIncarnation < 1) {
|
|
91
|
+
throw new Error("A1 tab mode requires bridge credentials, recovery directory, and incarnation");
|
|
92
|
+
}
|
|
93
|
+
return { uiArguments, tabCredentials: { tabId, token, endpoint, ...(releaseId === undefined ? {} : { releaseId }) }, tabDataDir, tabIncarnation, tabStandby };
|
|
94
|
+
}
|
package/bin/ui.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
// Security: this helper has no A1, Pi, tool, or extension dependency and erases credentials before those modules load.
|
|
4
|
+
const { assignFreshSessionRuntimeId, consumeTabLaunchContext, formatResidentFallbackNotice, waitForStandbyPromotion } = await import("./tab-launch-context.js");
|
|
5
|
+
const { uiArguments, tabCredentials, tabDataDir, tabIncarnation, tabStandby } = consumeTabLaunchContext(process.argv.slice(2), process.env);
|
|
6
|
+
|
|
3
7
|
// Invariant: one terminal module identity per process, decided before any A1 or Pi module loads.
|
|
4
8
|
const { installPinnedPiTuiResolver } = await import("./module-resolver.js");
|
|
5
9
|
installPinnedPiTuiResolver(new URL("..", import.meta.url).pathname.replace(/^\/(.:)/, "$1").replace(/\/$/, ""));
|
|
10
|
+
const utilityRoute = tabCredentials === undefined
|
|
11
|
+
? null
|
|
12
|
+
: (await import("../dist/foundation/resident-tabs/routes.js")).residentUtilityRoute(tabCredentials.tabId);
|
|
6
13
|
const startup = await import("../dist/foundation/startup/startup-runtime.js");
|
|
7
14
|
startup.enableEnvironmentCompileCache(process.env);
|
|
8
|
-
const { readLaunchContext } = await import("../dist/foundation/launch-context/index.js");
|
|
15
|
+
const { hidesTabSettings, readLaunchContext } = await import("../dist/foundation/launch-context/index.js");
|
|
9
16
|
const launchContext = readLaunchContext(process.env, "profile");
|
|
10
17
|
const profile = launchContext.launchProfile;
|
|
11
18
|
if (profile === undefined) throw new Error("A1 launch profile is missing");
|
|
@@ -14,78 +21,119 @@ if (profile === "a1") {
|
|
|
14
21
|
import("node:crypto"),
|
|
15
22
|
import("../dist/product-identity.js"),
|
|
16
23
|
]);
|
|
17
|
-
process.env
|
|
24
|
+
assignFreshSessionRuntimeId(process.env, PRODUCT_IDENTITY.environment.sessionRuntimeId, randomUUID);
|
|
18
25
|
}
|
|
19
26
|
const { installFatalExit } = await import("../dist/foundation/terminal-cleanup/fatal-exit.js");
|
|
20
27
|
const { resolveProductPaths } = await import("../dist/foundation/lifecycle/paths.js");
|
|
21
|
-
const { join } = await import("node:path");
|
|
28
|
+
const { dirname, join } = await import("node:path");
|
|
22
29
|
/** @type {{ dispose(): void | Promise<unknown> } | undefined} */
|
|
23
30
|
let runningApplication;
|
|
24
31
|
const fatal = profile === "a1" ? installFatalExit({
|
|
25
|
-
directory:
|
|
32
|
+
directory: tabDataDir === undefined
|
|
33
|
+
? join(resolveProductPaths().runtimeDir, "crashes")
|
|
34
|
+
: join(dirname(tabDataDir), "diagnostics"),
|
|
26
35
|
...(launchContext.releaseId === undefined ? {} : { releaseId: launchContext.releaseId }),
|
|
27
36
|
dispose: () => runningApplication?.dispose(),
|
|
28
37
|
}) : undefined;
|
|
29
|
-
const [{ fileURLToPath }, identity
|
|
38
|
+
const [{ fileURLToPath }, identity] = await Promise.all([
|
|
30
39
|
import("node:url"),
|
|
31
40
|
import("./module-identity.js"),
|
|
32
|
-
import("../dist/foundation/startup/startup-descriptor.js"),
|
|
33
41
|
]);
|
|
34
42
|
const packageRootPath = fileURLToPath(new URL("..", import.meta.url));
|
|
35
43
|
identity.configurePinnedPiPublicPackage(packageRootPath);
|
|
36
|
-
// Performance: begin the exact launch graph together while the trace write is pending.
|
|
37
|
-
// Direct owned-module entries avoid evaluating unrelated barrel exports before first paint.
|
|
38
|
-
const modules = descriptor.loadDeclaredStartupGraph();
|
|
39
|
-
await startup.markStartupPhase(process.env, "ui-entry");
|
|
40
|
-
const [
|
|
41
|
-
{ runSelectedInteractiveRuntime },
|
|
42
|
-
{ parseSessionSelection },
|
|
43
|
-
{ createConsoleProjectTrustPrompt },
|
|
44
|
-
{ createConsoleSessionForkPrompt },
|
|
45
|
-
{ runOwnedUi, terminateOwnedUiProcess },
|
|
46
|
-
{ composeOwnedUi },
|
|
47
|
-
] = await modules;
|
|
48
44
|
|
|
49
|
-
// Compatibility: before
|
|
50
|
-
// resolve it to the same copy
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
// Compatibility: before either composition uses pinned Pi's terminal stack, confirm A1 and Pi
|
|
46
|
+
// resolve it to the same copy so every owned screen shares one module identity.
|
|
47
|
+
const assertPiTuiIdentity = () => identity.assertSinglePiTuiModuleAtLaunch(
|
|
48
|
+
packageRootPath,
|
|
49
|
+
(/** @type {string} */ message) => process.stderr.write(message),
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
if (utilityRoute !== null) {
|
|
53
|
+
if (profile !== "a1" || tabCredentials === undefined) throw new Error("utility tabs require the normal A1 tab profile");
|
|
54
|
+
await startup.markStartupPhase(process.env, "ui-entry");
|
|
55
|
+
assertPiTuiIdentity();
|
|
56
|
+
const utility = await import("../dist/composition/utility-tab.js");
|
|
57
|
+
await startup.markStartupPhase(process.env, "ui-modules-loaded");
|
|
58
|
+
const bridge = new (await import("../dist/foundation/resident-tabs/bridge-client.js")).TabBridgeClient({ credentials: tabCredentials });
|
|
59
|
+
completeRun(utility.runUtilityTab({
|
|
60
|
+
route: utilityRoute,
|
|
61
|
+
bridge,
|
|
62
|
+
cwd: process.cwd(),
|
|
63
|
+
profileId: profile,
|
|
64
|
+
onApplication: application => { runningApplication = application; },
|
|
65
|
+
}), utility.terminateOwnedUiProcess);
|
|
66
|
+
} else {
|
|
67
|
+
const descriptor = await import("../dist/foundation/startup/startup-descriptor.js");
|
|
68
|
+
// Performance: begin the exact Agent launch graph together while the trace write is pending.
|
|
69
|
+
// Direct owned-module entries avoid evaluating unrelated barrel exports before first paint.
|
|
70
|
+
const modules = descriptor.loadDeclaredStartupGraph();
|
|
71
|
+
await startup.markStartupPhase(process.env, "ui-entry");
|
|
72
|
+
const [
|
|
73
|
+
{ runSelectedInteractiveRuntime },
|
|
74
|
+
{ parseSessionSelection },
|
|
75
|
+
{ createConsoleProjectTrustPrompt },
|
|
76
|
+
{ createConsoleSessionForkPrompt },
|
|
77
|
+
{ runOwnedUi, terminateOwnedUiProcess },
|
|
78
|
+
{ composeOwnedUi },
|
|
79
|
+
] = await modules;
|
|
53
80
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
81
|
+
if (tabStandby) await waitForStandbyPromotion(process.stdin, tabDataDir === undefined ? undefined : join(tabDataDir, "standby-promote"));
|
|
82
|
+
assertPiTuiIdentity();
|
|
83
|
+
await startup.markStartupPhase(process.env, "ui-modules-loaded");
|
|
84
|
+
|
|
85
|
+
const sessionSelection = parseSessionSelection(uiArguments);
|
|
86
|
+
completeRun(Promise.resolve().then(async () => {
|
|
87
|
+
const tab = tabCredentials === undefined ? undefined : {
|
|
88
|
+
bridge: new (await import("../dist/foundation/resident-tabs/bridge-client.js")).TabBridgeClient({ credentials: tabCredentials }),
|
|
89
|
+
dataDir: /** @type {string} */ (tabDataDir),
|
|
90
|
+
incarnation: /** @type {number} */ (tabIncarnation),
|
|
91
|
+
};
|
|
92
|
+
if (sessionSelection && profile !== "a1") throw new Error("session selection requires the normal A1 profile");
|
|
93
|
+
return runSelectedInteractiveRuntime(profile, {
|
|
94
|
+
ownedUi: async (profileId, ownedSurfaces) => {
|
|
95
|
+
const processInspector = ownedSurfaces
|
|
96
|
+
? await import("../dist/foundation/process-containment/native-process-inspector.js")
|
|
97
|
+
.then(module => module.createNativeProcessInspector(process.env, process.platform, launchContext.releaseRoot))
|
|
98
|
+
.catch(() => null)
|
|
99
|
+
: null;
|
|
100
|
+
const { application, settings } = await composeOwnedUi({
|
|
101
|
+
cwd: process.cwd(),
|
|
102
|
+
profileId,
|
|
103
|
+
ownedSurfaces,
|
|
104
|
+
notificationVersion: launchContext.updateVersion,
|
|
105
|
+
...(hidesTabSettings(launchContext) ? { hideTabSettings: true } : {}),
|
|
106
|
+
...(processInspector === null ? {} : { inspectProcess: pid => processInspector.observe(pid) }),
|
|
107
|
+
projectTrustPrompt: createConsoleProjectTrustPrompt({ presentation: profile === "a1" ? "bare" : "comparison" }),
|
|
108
|
+
sessionForkPrompt: createConsoleSessionForkPrompt(),
|
|
109
|
+
...(sessionSelection === undefined ? {} : { sessionSelection }),
|
|
110
|
+
...(tab === undefined ? {} : { tab }),
|
|
111
|
+
...(launchContext.residentFallback === undefined ? {} : {
|
|
112
|
+
residentFallbackNotice: formatResidentFallbackNotice(launchContext.residentFallback),
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
115
|
+
runningApplication = application;
|
|
116
|
+
return await runOwnedUi({ application, ...(settings === null ? {} : { settings }) });
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}), terminateOwnedUiProcess);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** @param {Promise<number>} run @param {(code: number) => Promise<never>} terminate */
|
|
123
|
+
function completeRun(run, terminate) {
|
|
124
|
+
run.then(
|
|
125
|
+
code => {
|
|
126
|
+
fatal?.remove();
|
|
127
|
+
return terminate(code);
|
|
75
128
|
},
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (trustExit) return terminateOwnedUiProcess(error.exitCode);
|
|
88
|
-
console.error(error instanceof Error ? error.message : String(error));
|
|
89
|
-
process.exitCode = sessionSelectionError ? error.exitCode : 1;
|
|
90
|
-
},
|
|
91
|
-
);
|
|
129
|
+
error => {
|
|
130
|
+
const sessionSelectionError = error?.name === "PiSessionSelectionError";
|
|
131
|
+
const trustExit = error?.name === "ProjectTrustPromptExitError";
|
|
132
|
+
if (fatal && !sessionSelectionError && !trustExit) { fatal.fail(error); return; }
|
|
133
|
+
fatal?.remove();
|
|
134
|
+
if (trustExit) return terminate(error.exitCode);
|
|
135
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
136
|
+
process.exitCode = sessionSelectionError ? error.exitCode : 1;
|
|
137
|
+
},
|
|
138
|
+
);
|
|
139
|
+
}
|
|
@@ -39,7 +39,7 @@ export class ClipboardDiagnosticCapture {
|
|
|
39
39
|
// Security: project only declared scalar fields. Never serialize the supplied event object or raw errors.
|
|
40
40
|
this.#records.push({ source, phase: event.phase, atMs: scalar(event.atMs), request: event.request !== undefined && event.request < 0 ? -scalar(-event.request) : scalar(event.request), pending: scalar(event.pending), bytes: scalar(event.bytes), elapsedMs: scalar(event.elapsedMs),
|
|
41
41
|
sourceUnits: scalar(event.sourceUnits), pendingBytes,
|
|
42
|
-
transport: ["native", "terminal", "provided", "injected"].includes(event.transport ?? "") ? event.transport : "none",
|
|
42
|
+
transport: ["native", "terminal", "platform", "provided", "injected"].includes(event.transport ?? "") ? event.transport : "none",
|
|
43
43
|
outcome: ["ready", "failed", "canceled", "delivered", "submitted-unverified", "timed-out", "superseded"].includes(event.outcome ?? "") ? event.outcome : "none" });
|
|
44
44
|
if (this.#records.length > 128)
|
|
45
45
|
this.#records.shift();
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { OwnedUiCommandResult, OwnedUiDialog } from "../../contracts/owned-ui/index.js";
|
|
2
|
+
import type { UiRouteHost, UiRouteInput } from "../../ui/apps/contracts.js";
|
|
3
|
+
import type { PiShellSelectorOption } from "../../integrations/pi/components/shell-shared-facade.js";
|
|
4
|
+
import type { PiTuiOverlayHandle } from "../../integrations/pi/tui-runtime/contracts.js";
|
|
5
|
+
import type { OwnedUiPresenterTerminal } from "./shell-host.js";
|
|
6
|
+
import type { OwnedUiSessionShellOptions, OwnedUiSessionShellRoot } from "./session-shell-root.js";
|
|
7
|
+
type StartupRoute = NonNullable<OwnedUiSessionShellOptions["engine"]["startupRoute"]>;
|
|
8
|
+
export interface SessionDialogPorts {
|
|
9
|
+
readonly terminal: Pick<OwnedUiPresenterTerminal, "running" | "hasOverlay" | "showOverlay" | "openRoute" | "requestRender">;
|
|
10
|
+
readonly root: Pick<OwnedUiSessionShellRoot, "dismissNotice" | "setInputSurface" | "usesDefaultInputSurface">;
|
|
11
|
+
readonly routeHost: UiRouteHost | null;
|
|
12
|
+
readonly disposed: () => boolean;
|
|
13
|
+
/** A route, or the interrupt chord over it, asked to leave A1. */
|
|
14
|
+
readonly exit: () => void;
|
|
15
|
+
/** A rendered route closed itself. */
|
|
16
|
+
readonly routeClosed?: (route: string) => void;
|
|
17
|
+
readonly startupRoute?: StartupRoute;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Owns the one modal overlay a session shows at a time, whichever source opened it: an owned route,
|
|
21
|
+
* a local selector, or a backend dialog. Opening one hides the previous one, and every close path
|
|
22
|
+
* clears the same state.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SessionDialogCoordinator {
|
|
25
|
+
#private;
|
|
26
|
+
constructor(ports: SessionDialogPorts);
|
|
27
|
+
/** Clears the replacement input surface a selector put in the dock; the shared close action of every dock selector. */
|
|
28
|
+
readonly closeInputSurface: () => void;
|
|
29
|
+
showSelector(title: string, options: readonly PiShellSelectorOption[], onSelect: (id: string) => void, onCancel?: () => void): PiTuiOverlayHandle;
|
|
30
|
+
/** Mirrors the backend's pending dialog; locally owned routes and selectors are left alone when it has none. */
|
|
31
|
+
syncBackend(dialog: OwnedUiDialog | null): void;
|
|
32
|
+
openRoute(route: string, input?: UiRouteInput, onClosed?: () => void | Promise<void>): OwnedUiCommandResult;
|
|
33
|
+
claimsRoute(name: string): boolean;
|
|
34
|
+
/** Retains a route requested before the runtime runs; the latest request wins. */
|
|
35
|
+
retainStartupRoute(route: string): void;
|
|
36
|
+
/** Opens the retained startup route once no overlay or replacement input surface holds the screen. */
|
|
37
|
+
presentStartupRoute(): void;
|
|
38
|
+
/** A replaced session takes its dialog with it; a retained startup route still opens. */
|
|
39
|
+
onSessionReplaced(): void;
|
|
40
|
+
dispose(): void;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { createPiShellDialog, createPiShellSelector } from "../../integrations/pi/components/shell-selectors-dialogs.js";
|
|
2
|
+
const OVERLAY_OPTIONS = { width: "70%", maxHeight: "80%", anchor: "center", inputCoordination: "owned" };
|
|
3
|
+
const STARTUP_ROUTE_RETRY_MS = 25;
|
|
4
|
+
/**
|
|
5
|
+
* Owns the one modal overlay a session shows at a time, whichever source opened it: an owned route,
|
|
6
|
+
* a local selector, or a backend dialog. Opening one hides the previous one, and every close path
|
|
7
|
+
* clears the same state.
|
|
8
|
+
*/
|
|
9
|
+
export class SessionDialogCoordinator {
|
|
10
|
+
#ports;
|
|
11
|
+
#handle;
|
|
12
|
+
#id;
|
|
13
|
+
#source;
|
|
14
|
+
#startupRoute;
|
|
15
|
+
#startupRouteTimer;
|
|
16
|
+
constructor(ports) {
|
|
17
|
+
this.#ports = ports;
|
|
18
|
+
this.#startupRoute = ports.startupRoute;
|
|
19
|
+
}
|
|
20
|
+
/** Clears the replacement input surface a selector put in the dock; the shared close action of every dock selector. */
|
|
21
|
+
closeInputSurface = () => {
|
|
22
|
+
this.#ports.root.setInputSurface(null);
|
|
23
|
+
this.#ports.terminal.requestRender();
|
|
24
|
+
};
|
|
25
|
+
showSelector(title, options, onSelect, onCancel) {
|
|
26
|
+
this.#handle?.hide();
|
|
27
|
+
this.#source = "local";
|
|
28
|
+
this.#id = undefined;
|
|
29
|
+
const component = createPiShellSelector({
|
|
30
|
+
title,
|
|
31
|
+
options,
|
|
32
|
+
onSelect: id => {
|
|
33
|
+
onSelect(id);
|
|
34
|
+
this.#close();
|
|
35
|
+
},
|
|
36
|
+
onCancel: () => {
|
|
37
|
+
this.#close();
|
|
38
|
+
onCancel?.();
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const handle = this.#ports.terminal.showOverlay(component, OVERLAY_OPTIONS);
|
|
42
|
+
this.#handle = handle;
|
|
43
|
+
return handle;
|
|
44
|
+
}
|
|
45
|
+
/** Mirrors the backend's pending dialog; locally owned routes and selectors are left alone when it has none. */
|
|
46
|
+
syncBackend(dialog) {
|
|
47
|
+
if (!this.#ports.terminal.running)
|
|
48
|
+
return;
|
|
49
|
+
if (dialog === null) {
|
|
50
|
+
// Invariant: locally owned routes (notably /settings) are independent of backend
|
|
51
|
+
// lifecycle/status events and remain open while an agent is working.
|
|
52
|
+
if (this.#source === "backend")
|
|
53
|
+
this.#close();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (this.#source === "backend" && this.#id === dialog.id)
|
|
57
|
+
return;
|
|
58
|
+
this.#handle?.hide();
|
|
59
|
+
this.#source = "backend";
|
|
60
|
+
const component = createPiShellDialog(dialog, { onSelect: () => this.#close(), onCancel: () => this.#close() });
|
|
61
|
+
this.#handle = this.#ports.terminal.showOverlay(component, OVERLAY_OPTIONS);
|
|
62
|
+
this.#id = dialog.id;
|
|
63
|
+
}
|
|
64
|
+
openRoute(route, input, onClosed) {
|
|
65
|
+
const surface = this.#ports.routeHost?.open(route, input) ?? null;
|
|
66
|
+
if (surface === null)
|
|
67
|
+
return { outcome: "failed", diagnostic: `route is unavailable: ${route}` };
|
|
68
|
+
if (!this.#ports.terminal.running)
|
|
69
|
+
return { outcome: "failed", diagnostic: "runtime is not active" };
|
|
70
|
+
this.#ports.root.dismissNotice();
|
|
71
|
+
this.#handle?.hide();
|
|
72
|
+
this.#source = "route";
|
|
73
|
+
const handle = this.#ports.terminal.openRoute(surface, {
|
|
74
|
+
exit: () => this.#ports.exit(),
|
|
75
|
+
closed: rendered => {
|
|
76
|
+
if (this.#handle === handle)
|
|
77
|
+
this.#clear();
|
|
78
|
+
if (rendered) {
|
|
79
|
+
try {
|
|
80
|
+
void onClosed?.()?.catch(() => undefined);
|
|
81
|
+
}
|
|
82
|
+
catch { /* Rationale: a failed acknowledgement stays pending. */ }
|
|
83
|
+
this.#ports.routeClosed?.(route);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
this.#handle = handle;
|
|
88
|
+
this.#id = surface.id;
|
|
89
|
+
return { outcome: "completed", diagnostic: null };
|
|
90
|
+
}
|
|
91
|
+
claimsRoute(name) {
|
|
92
|
+
return this.#ports.routeHost?.claims(name) ?? false;
|
|
93
|
+
}
|
|
94
|
+
/** Retains a route requested before the runtime runs; the latest request wins. */
|
|
95
|
+
retainStartupRoute(route) {
|
|
96
|
+
this.#startupRoute = { route };
|
|
97
|
+
}
|
|
98
|
+
/** Opens the retained startup route once no overlay or replacement input surface holds the screen. */
|
|
99
|
+
presentStartupRoute() {
|
|
100
|
+
const pending = this.#startupRoute;
|
|
101
|
+
if (pending === undefined || this.#ports.disposed() || !this.#ports.terminal.running)
|
|
102
|
+
return;
|
|
103
|
+
if (this.#ports.terminal.hasOverlay() || !this.#ports.root.usesDefaultInputSurface()) {
|
|
104
|
+
this.#startupRouteTimer = setTimeout(() => {
|
|
105
|
+
this.#startupRouteTimer = undefined;
|
|
106
|
+
this.presentStartupRoute();
|
|
107
|
+
}, STARTUP_ROUTE_RETRY_MS);
|
|
108
|
+
this.#startupRouteTimer.unref?.();
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
this.#startupRoute = undefined;
|
|
112
|
+
this.openRoute(pending.route, pending.input, pending.onClosed);
|
|
113
|
+
}
|
|
114
|
+
/** A replaced session takes its dialog with it; a retained startup route still opens. */
|
|
115
|
+
onSessionReplaced() {
|
|
116
|
+
this.#close();
|
|
117
|
+
}
|
|
118
|
+
dispose() {
|
|
119
|
+
if (this.#startupRouteTimer !== undefined)
|
|
120
|
+
clearTimeout(this.#startupRouteTimer);
|
|
121
|
+
this.#startupRouteTimer = undefined;
|
|
122
|
+
this.#handle?.hide();
|
|
123
|
+
}
|
|
124
|
+
#close() {
|
|
125
|
+
this.#handle?.hide();
|
|
126
|
+
this.#clear();
|
|
127
|
+
}
|
|
128
|
+
#clear() {
|
|
129
|
+
this.#handle = undefined;
|
|
130
|
+
this.#id = undefined;
|
|
131
|
+
this.#source = undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|