@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,27 +1,44 @@
|
|
|
1
|
-
export const OWNED_UI_SETTINGS_VERSION =
|
|
1
|
+
export const OWNED_UI_SETTINGS_VERSION = 19;
|
|
2
2
|
const UI_ACCENT_COLOR_CHOICES = Object.freeze([
|
|
3
|
-
"
|
|
3
|
+
"blue", "purple", "cyan", "green", "orange", "pink",
|
|
4
4
|
]);
|
|
5
5
|
const MAX_ID_LENGTH = 64;
|
|
6
6
|
const ID_PATTERN = /^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)*$/;
|
|
7
|
-
/** Declared first so the settings screen opens on it; sections follow first-declaration order. */
|
|
8
7
|
const GENERIC_SECTION = Object.freeze({ id: "generic", title: "Generic" });
|
|
9
8
|
const APPEARANCE_SECTION = Object.freeze({ id: "appearance", title: "Appearance" });
|
|
10
9
|
const SCROLL_SECTION = Object.freeze({ id: "scroll", title: "Scroll" });
|
|
11
10
|
const AGENT_SECTION = Object.freeze({ id: "agent", title: "Agent" });
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
const TABS_SECTION = Object.freeze({ id: "tabs", title: "Tab Bar" });
|
|
12
|
+
/** The tab kinds the strip's `+` can offer, in the order it shows them. */
|
|
13
|
+
const PLUS_MENU_KINDS = Object.freeze([
|
|
14
|
+
Object.freeze({ key: "agent", label: "Agent", description: "Add a new Agent tab every time." }),
|
|
15
|
+
Object.freeze({ key: "settings", label: "Settings", description: "Show the one Settings tab." }),
|
|
16
|
+
Object.freeze({ key: "changelog", label: "Changelog", description: "Show the one Changelog tab." }),
|
|
17
|
+
]);
|
|
18
|
+
/** Every enabled subset of the plus-menu kinds, each in kind order. */
|
|
19
|
+
const PLUS_MENU_VALUES = Object.freeze([
|
|
20
|
+
"", "agent", "settings", "changelog", "agent,settings", "agent,changelog", "settings,changelog", "agent,settings,changelog",
|
|
21
|
+
]);
|
|
16
22
|
export const OWNED_SETTING_DECLARATIONS = Object.freeze({
|
|
17
23
|
updateCheck: Object.freeze({
|
|
18
24
|
id: "updateCheck",
|
|
19
|
-
label: "Update
|
|
25
|
+
label: "Update",
|
|
20
26
|
section: GENERIC_SECTION,
|
|
21
|
-
description: "
|
|
27
|
+
description: "Auto installs verified channel updates silently, Notify shows the current update notice, and No leaves updates manual. Checks use the public npm registry; applies on next start.",
|
|
22
28
|
application: "restart",
|
|
23
|
-
defaultValue:
|
|
24
|
-
allowedValues: Object.freeze([
|
|
29
|
+
defaultValue: "auto",
|
|
30
|
+
allowedValues: Object.freeze(["auto", "notify", "no"]),
|
|
31
|
+
}),
|
|
32
|
+
timeFormat: Object.freeze({
|
|
33
|
+
id: "timeFormat",
|
|
34
|
+
label: "Time format",
|
|
35
|
+
section: GENERIC_SECTION,
|
|
36
|
+
description: "Format used by submitted-prompt timestamps and the resident tab clock.",
|
|
37
|
+
application: "live",
|
|
38
|
+
defaultValue: "8:00 PM",
|
|
39
|
+
allowedValues: Object.freeze([
|
|
40
|
+
"20:00", "8:00 PM",
|
|
41
|
+
]),
|
|
25
42
|
}),
|
|
26
43
|
accentColor: Object.freeze({
|
|
27
44
|
id: "accentColor",
|
|
@@ -29,7 +46,7 @@ export const OWNED_SETTING_DECLARATIONS = Object.freeze({
|
|
|
29
46
|
section: APPEARANCE_SECTION,
|
|
30
47
|
description: "Color used by highlighted interface controls, list markers, and tonal interface surfaces.",
|
|
31
48
|
application: "live",
|
|
32
|
-
defaultValue: "
|
|
49
|
+
defaultValue: "blue",
|
|
33
50
|
allowedValues: UI_ACCENT_COLOR_CHOICES,
|
|
34
51
|
}),
|
|
35
52
|
backgroundStyle: Object.freeze({
|
|
@@ -83,11 +100,20 @@ export const OWNED_SETTING_DECLARATIONS = Object.freeze({
|
|
|
83
100
|
id: "promptHistoryEnabled",
|
|
84
101
|
label: "Persistent history",
|
|
85
102
|
section: Object.freeze({ id: "history", title: "History" }),
|
|
86
|
-
description: "Retain reusable prompts
|
|
103
|
+
description: "Retain reusable prompts after restart. Applies on next start; disabling does not erase saved history or stop existing instances.",
|
|
87
104
|
application: "restart",
|
|
88
105
|
defaultValue: true,
|
|
89
106
|
allowedValues: Object.freeze([true, false]),
|
|
90
107
|
}),
|
|
108
|
+
promptHistoryScope: Object.freeze({
|
|
109
|
+
id: "promptHistoryScope",
|
|
110
|
+
label: "History scope",
|
|
111
|
+
section: Object.freeze({ id: "history", title: "History" }),
|
|
112
|
+
description: "Unique shows each agent session's history; Shared shows the profile-wide history. Switches running agents without moving or erasing saved prompts.",
|
|
113
|
+
application: "live",
|
|
114
|
+
defaultValue: "unique",
|
|
115
|
+
allowedValues: Object.freeze(["unique", "shared"]),
|
|
116
|
+
}),
|
|
91
117
|
promptHistoryMaxItems: Object.freeze({
|
|
92
118
|
id: "promptHistoryMaxItems",
|
|
93
119
|
label: "History limit",
|
|
@@ -124,8 +150,35 @@ export const OWNED_SETTING_DECLARATIONS = Object.freeze({
|
|
|
124
150
|
defaultValue: 8,
|
|
125
151
|
allowedValues: Object.freeze([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
|
|
126
152
|
}),
|
|
153
|
+
tabsPosition: Object.freeze({
|
|
154
|
+
id: "tabsPosition",
|
|
155
|
+
label: "Position",
|
|
156
|
+
section: TABS_SECTION,
|
|
157
|
+
description: "Place the resident tab bar at the top or bottom of the terminal.",
|
|
158
|
+
application: "live",
|
|
159
|
+
defaultValue: "top",
|
|
160
|
+
allowedValues: Object.freeze(["top", "bottom"]),
|
|
161
|
+
}),
|
|
162
|
+
tabBarPlusMenu: Object.freeze({
|
|
163
|
+
id: "tabBarPlusMenu",
|
|
164
|
+
label: "Plus menu",
|
|
165
|
+
section: TABS_SECTION,
|
|
166
|
+
description: "The tabs + offers. With only Agent, + adds an Agent at once; with more, it opens a menu; with none, + is hidden.",
|
|
167
|
+
application: "live",
|
|
168
|
+
defaultValue: "agent",
|
|
169
|
+
allowedValues: PLUS_MENU_VALUES,
|
|
170
|
+
flags: PLUS_MENU_KINDS,
|
|
171
|
+
}),
|
|
172
|
+
tabsAutoName: Object.freeze({
|
|
173
|
+
id: "tabsAutoName",
|
|
174
|
+
label: "Auto name",
|
|
175
|
+
section: TABS_SECTION,
|
|
176
|
+
description: "Automatically name a new tab from its first completed turn with the tab's current model.",
|
|
177
|
+
application: "live",
|
|
178
|
+
defaultValue: true,
|
|
179
|
+
allowedValues: Object.freeze([true, false]),
|
|
180
|
+
}),
|
|
127
181
|
});
|
|
128
|
-
/** The declarations in declaration order, for resolution, persistence, and the settings screen. */
|
|
129
182
|
export const OWNED_UI_SETTING_DECLARATIONS = Object.freeze(Object.values(OWNED_SETTING_DECLARATIONS));
|
|
130
183
|
export function isOwnedSettingId(id) {
|
|
131
184
|
return Object.hasOwn(OWNED_SETTING_DECLARATIONS, id);
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { UiAccentColor } from "../../contracts/owned-ui/index.js";
|
|
2
|
+
type Appearance = "dark" | "light";
|
|
3
|
+
type ColorMode = "truecolor" | "256color";
|
|
4
|
+
/** Global settings only: project resources must remain unavailable until trust is resolved. */
|
|
5
|
+
export declare function readPreTrustAccent(environment?: NodeJS.ProcessEnv): UiAccentColor;
|
|
6
|
+
export declare function preTrustPalette(color: UiAccentColor, appearance: Appearance, mode: ColorMode): {
|
|
7
|
+
accent: string;
|
|
8
|
+
border: string;
|
|
9
|
+
} | {
|
|
10
|
+
accent: string;
|
|
11
|
+
border: string;
|
|
12
|
+
} | {
|
|
13
|
+
accent: string;
|
|
14
|
+
border: string;
|
|
15
|
+
} | {
|
|
16
|
+
accent: string;
|
|
17
|
+
border: string;
|
|
18
|
+
} | {
|
|
19
|
+
accent: string;
|
|
20
|
+
border: string;
|
|
21
|
+
} | {
|
|
22
|
+
accent: string;
|
|
23
|
+
border: string;
|
|
24
|
+
} | {
|
|
25
|
+
accent: string;
|
|
26
|
+
border: string;
|
|
27
|
+
} | {
|
|
28
|
+
accent: string;
|
|
29
|
+
border: string;
|
|
30
|
+
} | {
|
|
31
|
+
accent: string;
|
|
32
|
+
border: string;
|
|
33
|
+
} | {
|
|
34
|
+
accent: string;
|
|
35
|
+
border: string;
|
|
36
|
+
} | {
|
|
37
|
+
accent: string;
|
|
38
|
+
border: string;
|
|
39
|
+
} | {
|
|
40
|
+
accent: string;
|
|
41
|
+
border: string;
|
|
42
|
+
} | {
|
|
43
|
+
accent: string;
|
|
44
|
+
border: string;
|
|
45
|
+
} | {
|
|
46
|
+
accent: string;
|
|
47
|
+
border: string;
|
|
48
|
+
} | {
|
|
49
|
+
accent: string;
|
|
50
|
+
border: string;
|
|
51
|
+
} | {
|
|
52
|
+
accent: string;
|
|
53
|
+
border: string;
|
|
54
|
+
} | {
|
|
55
|
+
accent: string;
|
|
56
|
+
border: string;
|
|
57
|
+
} | {
|
|
58
|
+
accent: string;
|
|
59
|
+
border: string;
|
|
60
|
+
} | {
|
|
61
|
+
accent: string;
|
|
62
|
+
border: string;
|
|
63
|
+
} | {
|
|
64
|
+
accent: string;
|
|
65
|
+
border: string;
|
|
66
|
+
} | {
|
|
67
|
+
accent: string;
|
|
68
|
+
border: string;
|
|
69
|
+
} | {
|
|
70
|
+
accent: string;
|
|
71
|
+
border: string;
|
|
72
|
+
} | {
|
|
73
|
+
accent: string;
|
|
74
|
+
border: string;
|
|
75
|
+
} | {
|
|
76
|
+
accent: string;
|
|
77
|
+
border: string;
|
|
78
|
+
};
|
|
79
|
+
export declare function preTrustTerminalAppearance(environment?: NodeJS.ProcessEnv): Appearance;
|
|
80
|
+
export declare function preTrustTerminalColorMode(environment?: NodeJS.ProcessEnv): ColorMode;
|
|
81
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { isAbsolute, join } from "node:path";
|
|
4
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
5
|
+
import { SHARED_PROGRESS_PALETTE } from "./progress-palette.generated.js";
|
|
6
|
+
/** Global settings only: project resources must remain unavailable until trust is resolved. */
|
|
7
|
+
export function readPreTrustAccent(environment = process.env) {
|
|
8
|
+
try {
|
|
9
|
+
const home = environment[PRODUCT_IDENTITY.environment.profileHome] ?? homedir();
|
|
10
|
+
if (!isAbsolute(home) || home.includes("\0"))
|
|
11
|
+
return "blue";
|
|
12
|
+
const file = join(home, PRODUCT_IDENTITY.state.piAgentProfile, "settings.json");
|
|
13
|
+
if (statSync(file).size > 256 * 1024)
|
|
14
|
+
return "blue";
|
|
15
|
+
const raw = readFileSync(file, "utf8");
|
|
16
|
+
if (Buffer.byteLength(raw, "utf8") > 256 * 1024)
|
|
17
|
+
return "blue";
|
|
18
|
+
const root = JSON.parse(raw.replace(/^\uFEFF/u, ""));
|
|
19
|
+
if (root === null || typeof root !== "object" || Array.isArray(root))
|
|
20
|
+
return "blue";
|
|
21
|
+
const namespace = root[PRODUCT_IDENTITY.commandName];
|
|
22
|
+
if (namespace === null || typeof namespace !== "object" || Array.isArray(namespace))
|
|
23
|
+
return "blue";
|
|
24
|
+
const value = namespace.accentColor;
|
|
25
|
+
if (value === "default")
|
|
26
|
+
return "purple";
|
|
27
|
+
return typeof value === "string" && Object.hasOwn(SHARED_PROGRESS_PALETTE, value) ? value : "blue";
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return "blue";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function preTrustPalette(color, appearance, mode) {
|
|
34
|
+
return SHARED_PROGRESS_PALETTE[color][appearance][mode];
|
|
35
|
+
}
|
|
36
|
+
export function preTrustTerminalAppearance(environment = process.env) {
|
|
37
|
+
const index = Number.parseInt((environment.COLORFGBG ?? "").split(";").at(-1) ?? "", 10);
|
|
38
|
+
return Number.isInteger(index) && (index === 7 || index === 15 || index >= 231) ? "light" : "dark";
|
|
39
|
+
}
|
|
40
|
+
export function preTrustTerminalColorMode(environment = process.env) {
|
|
41
|
+
if (environment.PI_TRUE_COLOR === "1")
|
|
42
|
+
return "truecolor";
|
|
43
|
+
if (environment.PI_TRUE_COLOR === "0")
|
|
44
|
+
return "256color";
|
|
45
|
+
const program = (environment.TERM_PROGRAM ?? "").toLowerCase();
|
|
46
|
+
const known = ["kitty", "ghostty", "wezterm", "rex", "warpterminal", "iterm.app", "alacritty", "vscode", "zed"];
|
|
47
|
+
return /^(truecolor|24bit)$/iu.test(environment.COLORTERM ?? "") || (environment.TERM ?? "").endsWith("-direct")
|
|
48
|
+
|| process.platform === "win32" || environment.WT_SESSION !== undefined || known.includes(program)
|
|
49
|
+
? "truecolor" : "256color";
|
|
50
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING_DECLARATIONS, assertOwnedUiSettingDeclarations, findOwnedUiSettingDeclaration, isOwnedSettingId, } from "./declarations.js";
|
|
2
2
|
export type { OwnedSettingId, OwnedSettingValueOf, OwnedUiSettingApplication, OwnedUiSettingDeclaration, OwnedUiSettingValue } from "./declarations.js";
|
|
3
|
-
export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom } from "./migrations.js";
|
|
4
|
-
export type { OwnedUiSettingsMigration } from "./migrations.js";
|
|
3
|
+
export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom, normalizeOwnedUiSettingsValues, } from "./migrations.js";
|
|
4
|
+
export type { OwnedUiSettingsCompatibilityResult, OwnedUiSettingsMigration } from "./migrations.js";
|
|
5
5
|
export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, settingValue } from "./resolution.js";
|
|
6
6
|
export type { OwnedUiResolvedSetting, OwnedUiSettingSource, OwnedUiSettingsDocument, OwnedUiSettingsNotice, OwnedUiSettingsNoticeCode, OwnedUiSettingsResolution, ResolveOwnedUiSettingsInput, } from "./resolution.js";
|
|
7
7
|
export { AGENT_SECTION_ID, buildOwnedUiSettingsSections, findOwnedUiSettingsEntry } from "./sections.js";
|
|
8
8
|
export type { AgentSettingsSnapshot, BuildOwnedUiSettingsSectionsInput, OwnedUiSettingsBackend, OwnedUiSettingsEntry, OwnedUiSettingsSection, } from "./sections.js";
|
|
9
9
|
export { OwnedSettingsManager } from "./manager.js";
|
|
10
10
|
export type { OwnedSettingsManagerOptions, OwnedUiSettingsChangeOutcome, OwnedUiSettingsListener } from "./manager.js";
|
|
11
|
+
export { assertProfileSettingsNamespaceAvailable, readProfileSettingsNamespace, repairProfileSettingsDocument, updateProfileSettingsNamespace, } from "./profile-document.js";
|
|
12
|
+
export type { ProfileSettingsNamespaceRead, ProfileSettingsNamespaceUpdate } from "./profile-document.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING_DECLARATIONS, assertOwnedUiSettingDeclarations, findOwnedUiSettingDeclaration, isOwnedSettingId, } from "./declarations.js";
|
|
2
|
-
export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom } from "./migrations.js";
|
|
2
|
+
export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom, normalizeOwnedUiSettingsValues, } from "./migrations.js";
|
|
3
3
|
export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, settingValue } from "./resolution.js";
|
|
4
4
|
export { AGENT_SECTION_ID, buildOwnedUiSettingsSections, findOwnedUiSettingsEntry } from "./sections.js";
|
|
5
5
|
export { OwnedSettingsManager } from "./manager.js";
|
|
6
|
+
export { assertProfileSettingsNamespaceAvailable, readProfileSettingsNamespace, repairProfileSettingsDocument, updateProfileSettingsNamespace, } from "./profile-document.js";
|
|
@@ -4,13 +4,20 @@ import { type OwnedUiSettingsMigration } from "./migrations.js";
|
|
|
4
4
|
import { type OwnedUiSettingsResolution } from "./resolution.js";
|
|
5
5
|
import { type OwnedUiSettingsBackend, type OwnedUiSettingsSection } from "./sections.js";
|
|
6
6
|
export interface OwnedSettingsManagerOptions {
|
|
7
|
-
/**
|
|
8
|
-
readonly
|
|
7
|
+
/** Selected global agent profile containing the shared `settings.json`. */
|
|
8
|
+
readonly profileDir?: string;
|
|
9
|
+
/** Compatibility alias for SDK/tests that supplied the former root option. */
|
|
10
|
+
readonly configDir?: string;
|
|
9
11
|
readonly profileId: string;
|
|
12
|
+
/** Product namespace; defaults to profileId for generic and hermetic consumers. */
|
|
13
|
+
readonly namespace?: string;
|
|
14
|
+
/** Former product configuration root, consulted only while the namespace is absent. */
|
|
15
|
+
readonly legacyConfigDir?: string;
|
|
10
16
|
readonly declarations?: readonly OwnedUiSettingDeclaration[];
|
|
11
17
|
readonly migrations?: readonly OwnedUiSettingsMigration[];
|
|
12
18
|
readonly agent?: AgentSettingsPort | null;
|
|
13
19
|
readonly agentProvider?: () => AgentSettingsPort | null;
|
|
20
|
+
readonly hiddenOwnedSettingIds?: readonly string[];
|
|
14
21
|
readonly hiddenAgentSettingIds?: readonly string[];
|
|
15
22
|
readonly agentSettingLabelOverrides?: Readonly<Record<string, string>>;
|
|
16
23
|
}
|
|
@@ -37,9 +44,15 @@ export declare class OwnedSettingsManager {
|
|
|
37
44
|
constructor(options: OwnedSettingsManagerOptions);
|
|
38
45
|
get file(): string;
|
|
39
46
|
get resolution(): OwnedUiSettingsResolution;
|
|
40
|
-
/** Reads and resolves the
|
|
47
|
+
/** Reads and resolves the product namespace. Never throws: every failure becomes a notice. */
|
|
41
48
|
read(): OwnedUiSettingsResolution;
|
|
42
49
|
load(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Adopts values another process stored in the shared document. Notifies only when a
|
|
52
|
+
* resolved value differs, so a peer's own write echo stays silent. Restart-bound values
|
|
53
|
+
* keep their session-start effect and surface as pending instead.
|
|
54
|
+
*/
|
|
55
|
+
refresh(): boolean;
|
|
43
56
|
sections(): readonly OwnedUiSettingsSection[];
|
|
44
57
|
/**
|
|
45
58
|
* The value in effect for a declared setting, typed by its declaration. A restart-bound
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { assertAgentSettingDescriptor } from "../../contracts/agent-engine/index.js";
|
|
4
4
|
import { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING_DECLARATIONS, } from "./declarations.js";
|
|
5
|
-
import { OWNED_UI_SETTINGS_MIGRATIONS } from "./migrations.js";
|
|
6
|
-
import {
|
|
5
|
+
import { OWNED_UI_SETTINGS_MIGRATIONS, normalizeOwnedUiSettingsValues, } from "./migrations.js";
|
|
6
|
+
import { parseOwnedUiSettingsDocument, resolveOwnedUiSettings, } from "./resolution.js";
|
|
7
7
|
import { buildOwnedUiSettingsSections, findOwnedUiSettingsEntry, } from "./sections.js";
|
|
8
|
+
import { readProfileSettingsNamespace, repairProfileSettingsDocument, updateProfileSettingsNamespace, } from "./profile-document.js";
|
|
8
9
|
const PROFILE_ID_PATTERN = /^[a-z][a-z0-9-]{0,63}$/;
|
|
9
10
|
const MAX_DOCUMENT_BYTES = 256 * 1024;
|
|
10
11
|
/**
|
|
@@ -15,11 +16,14 @@ const MAX_DOCUMENT_BYTES = 256 * 1024;
|
|
|
15
16
|
*/
|
|
16
17
|
export class OwnedSettingsManager {
|
|
17
18
|
#file;
|
|
19
|
+
#legacyFile;
|
|
20
|
+
#namespace;
|
|
18
21
|
#declarations;
|
|
19
22
|
#migrations;
|
|
20
23
|
#agent;
|
|
21
24
|
#agentProvider;
|
|
22
25
|
#listeners = new Set();
|
|
26
|
+
#hiddenOwnedSettingIds;
|
|
23
27
|
#hiddenAgentSettingIds;
|
|
24
28
|
#agentSettingLabelOverrides;
|
|
25
29
|
#resolution;
|
|
@@ -30,11 +34,19 @@ export class OwnedSettingsManager {
|
|
|
30
34
|
if (!PROFILE_ID_PATTERN.test(options.profileId)) {
|
|
31
35
|
throw new Error(`owned UI settings profile id is not a bounded slug: ${options.profileId}`);
|
|
32
36
|
}
|
|
33
|
-
|
|
37
|
+
const profileDir = options.profileDir ?? options.configDir;
|
|
38
|
+
if (profileDir === undefined)
|
|
39
|
+
throw new Error("owned UI settings require a profile directory");
|
|
40
|
+
this.#file = path.join(path.resolve(profileDir), "settings.json");
|
|
41
|
+
this.#legacyFile = options.legacyConfigDir === undefined
|
|
42
|
+
? null
|
|
43
|
+
: path.join(path.resolve(options.legacyConfigDir), "settings", `${options.profileId}.json`);
|
|
44
|
+
this.#namespace = options.namespace ?? options.profileId;
|
|
34
45
|
this.#declarations = options.declarations ?? OWNED_UI_SETTING_DECLARATIONS;
|
|
35
46
|
this.#migrations = options.migrations ?? OWNED_UI_SETTINGS_MIGRATIONS;
|
|
36
47
|
this.#agent = options.agent ?? null;
|
|
37
48
|
this.#agentProvider = options.agentProvider ?? null;
|
|
49
|
+
this.#hiddenOwnedSettingIds = new Set(options.hiddenOwnedSettingIds ?? []);
|
|
38
50
|
this.#hiddenAgentSettingIds = new Set(options.hiddenAgentSettingIds ?? []);
|
|
39
51
|
this.#agentSettingLabelOverrides = { ...(options.agentSettingLabelOverrides ?? {}) };
|
|
40
52
|
this.#resolution = this.read();
|
|
@@ -49,24 +61,59 @@ export class OwnedSettingsManager {
|
|
|
49
61
|
get resolution() {
|
|
50
62
|
return this.#resolution;
|
|
51
63
|
}
|
|
52
|
-
/** Reads and resolves the
|
|
64
|
+
/** Reads and resolves the product namespace. Never throws: every failure becomes a notice. */
|
|
53
65
|
read() {
|
|
66
|
+
try {
|
|
67
|
+
repairProfileSettingsDocument(this.#file);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Compatibility: recovery is opportunistic; unreadable-document handling stays authoritative.
|
|
71
|
+
}
|
|
72
|
+
const shared = readProfileSettingsNamespace(this.#file, this.#namespace);
|
|
73
|
+
if (shared.status === "available") {
|
|
74
|
+
if (Buffer.byteLength(JSON.stringify(shared.value), "utf8") > MAX_DOCUMENT_BYTES) {
|
|
75
|
+
return this.#resolveNamespace(null, `${this.#file} contains a ${this.#namespace} namespace exceeding the ${MAX_DOCUMENT_BYTES}-byte settings limit`);
|
|
76
|
+
}
|
|
77
|
+
return this.#resolveCompatibleNamespace(shared.value);
|
|
78
|
+
}
|
|
79
|
+
if (shared.status === "invalid")
|
|
80
|
+
return this.#resolveNamespace(null, shared.detail);
|
|
81
|
+
return this.#readLegacy();
|
|
82
|
+
}
|
|
83
|
+
#resolveCompatibleNamespace(values) {
|
|
84
|
+
const compatibility = normalizeOwnedUiSettingsValues(values);
|
|
85
|
+
return compatibility.values === null
|
|
86
|
+
? this.#resolveNamespace(null, compatibility.failure ?? "product settings compatibility failed")
|
|
87
|
+
: this.#resolveNamespace(compatibility.values);
|
|
88
|
+
}
|
|
89
|
+
#resolveNamespace(values, unreadableDetail) {
|
|
90
|
+
return resolveOwnedUiSettings({
|
|
91
|
+
declarations: this.#declarations,
|
|
92
|
+
migrations: [],
|
|
93
|
+
document: values === null ? null : { version: OWNED_UI_SETTINGS_VERSION, values },
|
|
94
|
+
...(unreadableDetail === undefined ? {} : { unreadableDetail }),
|
|
95
|
+
currentVersion: OWNED_UI_SETTINGS_VERSION,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
#readLegacy() {
|
|
99
|
+
if (this.#legacyFile === null)
|
|
100
|
+
return this.#resolveNamespace(null);
|
|
54
101
|
let raw = null;
|
|
55
102
|
let unreadable = null;
|
|
56
103
|
try {
|
|
57
|
-
raw = readFileSync(this.#
|
|
104
|
+
raw = readFileSync(this.#legacyFile, "utf8");
|
|
58
105
|
}
|
|
59
106
|
catch (error) {
|
|
60
107
|
if (!isMissing(error))
|
|
61
|
-
unreadable = `${this.#
|
|
108
|
+
unreadable = `${this.#legacyFile} could not be read: ${describe(error)}`;
|
|
62
109
|
}
|
|
63
110
|
if (raw !== null && Buffer.byteLength(raw, "utf8") > MAX_DOCUMENT_BYTES) {
|
|
64
|
-
unreadable = `${this.#
|
|
111
|
+
unreadable = `${this.#legacyFile} exceeds the ${MAX_DOCUMENT_BYTES}-byte settings limit and was ignored`;
|
|
65
112
|
raw = null;
|
|
66
113
|
}
|
|
67
114
|
const document = raw === null ? null : parseOwnedUiSettingsDocument(raw);
|
|
68
115
|
if (raw !== null && document === null && unreadable === null) {
|
|
69
|
-
unreadable = `${this.#
|
|
116
|
+
unreadable = `${this.#legacyFile} is not a valid settings document and was ignored`;
|
|
70
117
|
}
|
|
71
118
|
return resolveOwnedUiSettings({
|
|
72
119
|
declarations: this.#declarations,
|
|
@@ -82,8 +129,36 @@ export class OwnedSettingsManager {
|
|
|
82
129
|
this.#agentSnapshot = agent === null ? null : await snapshotOf(agent, this.#hiddenAgentSettingIds);
|
|
83
130
|
this.#notify();
|
|
84
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Adopts values another process stored in the shared document. Notifies only when a
|
|
134
|
+
* resolved value differs, so a peer's own write echo stays silent. Restart-bound values
|
|
135
|
+
* keep their session-start effect and surface as pending instead.
|
|
136
|
+
*/
|
|
137
|
+
refresh() {
|
|
138
|
+
const next = this.read();
|
|
139
|
+
if (resolvedValuesKey(next) === resolvedValuesKey(this.#resolution))
|
|
140
|
+
return false;
|
|
141
|
+
this.#resolution = next;
|
|
142
|
+
for (const setting of next.settings) {
|
|
143
|
+
const id = setting.declaration.id;
|
|
144
|
+
if (!this.#restartEffective.has(id))
|
|
145
|
+
continue;
|
|
146
|
+
if (setting.value === this.#restartEffective.get(id))
|
|
147
|
+
this.#pending.delete(id);
|
|
148
|
+
else
|
|
149
|
+
this.#pending.set(id, setting.value);
|
|
150
|
+
}
|
|
151
|
+
this.#notify();
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
85
154
|
sections() {
|
|
86
|
-
|
|
155
|
+
const resolution = this.#hiddenOwnedSettingIds.size === 0
|
|
156
|
+
? this.#resolution
|
|
157
|
+
: {
|
|
158
|
+
...this.#resolution,
|
|
159
|
+
settings: this.#resolution.settings.filter(setting => !this.#hiddenOwnedSettingIds.has(setting.declaration.id)),
|
|
160
|
+
};
|
|
161
|
+
return buildOwnedUiSettingsSections({ resolution, agent: this.#agentSnapshot }).map(section => ({
|
|
87
162
|
...section,
|
|
88
163
|
entries: section.entries.map(entry => {
|
|
89
164
|
if (entry.backend === "a1" && this.#restartEffective.has(entry.id)) {
|
|
@@ -113,9 +188,13 @@ export class OwnedSettingsManager {
|
|
|
113
188
|
return () => this.#listeners.delete(listener);
|
|
114
189
|
}
|
|
115
190
|
async changeStructured(backend, id, value) {
|
|
116
|
-
if (backend
|
|
117
|
-
return
|
|
118
|
-
|
|
191
|
+
if (backend === "agent")
|
|
192
|
+
return await this.#changeAgentValue(id, value);
|
|
193
|
+
// Invariant: a flagged A1 setting stores its enabled parts as one value, in declaration order.
|
|
194
|
+
const flags = findOwnedUiSettingsEntry(this.sections(), id, "a1")?.flags ?? [];
|
|
195
|
+
if (flags.length === 0)
|
|
196
|
+
return failed(`${id} holds no structured value`);
|
|
197
|
+
return await this.change("a1", id, flags.filter(flag => value[flag.key] === true).map(flag => flag.key).join(","));
|
|
119
198
|
}
|
|
120
199
|
async change(backend, id, value) {
|
|
121
200
|
const entry = findOwnedUiSettingsEntry(this.sections(), id, backend);
|
|
@@ -126,7 +205,7 @@ export class OwnedSettingsManager {
|
|
|
126
205
|
return backend === "a1" ? this.#changeOwned(id, value) : await this.#changeAgentValue(id, value);
|
|
127
206
|
}
|
|
128
207
|
#changeOwned(id, value) {
|
|
129
|
-
const outcome = this.#write(
|
|
208
|
+
const outcome = this.#write(id, value);
|
|
130
209
|
if (!outcome.stored)
|
|
131
210
|
return failed(outcome.failure ?? `${id} could not be stored`);
|
|
132
211
|
const previous = this.#resolution;
|
|
@@ -141,35 +220,34 @@ export class OwnedSettingsManager {
|
|
|
141
220
|
this.#notify();
|
|
142
221
|
return changed("applied", "live", value, value);
|
|
143
222
|
}
|
|
144
|
-
// Invariant:
|
|
145
|
-
// Concurrency:
|
|
146
|
-
|
|
147
|
-
#write(resolution, id, value) {
|
|
223
|
+
// Invariant: only non-default declared values and unknown product properties are stored.
|
|
224
|
+
// Concurrency: the namespace updater rereads current JSON while holding Pi's compatible lock.
|
|
225
|
+
#write(id, value) {
|
|
148
226
|
const declaration = this.#declarations.find(candidate => candidate.id === id);
|
|
149
227
|
if (!declaration)
|
|
150
228
|
return { stored: false, failure: `unknown owned UI setting: ${id}` };
|
|
151
229
|
if (!declaration.allowedValues.includes(value)) {
|
|
152
230
|
return { stored: false, failure: `value ${JSON.stringify(value)} is not allowed for ${id}` };
|
|
153
231
|
}
|
|
154
|
-
const current = documentFrom(resolution);
|
|
155
|
-
const next = {
|
|
156
|
-
version: OWNED_UI_SETTINGS_VERSION,
|
|
157
|
-
values: { ...current.values, [id]: value },
|
|
158
|
-
};
|
|
159
|
-
const temporary = `${this.#file}.${process.pid}.tmp`;
|
|
160
232
|
try {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
233
|
+
updateProfileSettingsNamespace(this.#file, this.#namespace, current => {
|
|
234
|
+
let latest = this.#readLegacy();
|
|
235
|
+
if (current !== null) {
|
|
236
|
+
const compatibility = normalizeOwnedUiSettingsValues(current);
|
|
237
|
+
if (compatibility.values === null)
|
|
238
|
+
throw new Error(compatibility.failure ?? "product settings compatibility failed");
|
|
239
|
+
latest = this.#resolveNamespace(compatibility.values);
|
|
240
|
+
}
|
|
241
|
+
const next = compactValues(latest);
|
|
242
|
+
if (value === declaration.defaultValue)
|
|
243
|
+
delete next[id];
|
|
244
|
+
else
|
|
245
|
+
next[id] = value;
|
|
246
|
+
return Object.keys(next).length === 0 ? null : next;
|
|
247
|
+
});
|
|
164
248
|
return { stored: true, failure: null };
|
|
165
249
|
}
|
|
166
250
|
catch (error) {
|
|
167
|
-
try {
|
|
168
|
-
rmSync(temporary, { force: true });
|
|
169
|
-
}
|
|
170
|
-
catch {
|
|
171
|
-
// Security: a leftover temporary file is inert: read() only ever opens the target path.
|
|
172
|
-
}
|
|
173
251
|
return { stored: false, failure: `${this.#file} could not be written: ${describe(error)}` };
|
|
174
252
|
}
|
|
175
253
|
}
|
|
@@ -218,6 +296,9 @@ async function snapshotOf(agent, hidden) {
|
|
|
218
296
|
return { descriptors: [], writeAdvertised: false, failure: describe(error) };
|
|
219
297
|
}
|
|
220
298
|
}
|
|
299
|
+
function resolvedValuesKey(resolution) {
|
|
300
|
+
return JSON.stringify(resolution.settings.map(setting => [setting.declaration.id, setting.value]));
|
|
301
|
+
}
|
|
221
302
|
function failed(failure) {
|
|
222
303
|
return {
|
|
223
304
|
status: "failed",
|
|
@@ -254,6 +335,14 @@ function fromAgentOutcome(result) {
|
|
|
254
335
|
failure: result.failure,
|
|
255
336
|
};
|
|
256
337
|
}
|
|
338
|
+
function compactValues(resolution) {
|
|
339
|
+
const values = { ...resolution.preserved };
|
|
340
|
+
for (const setting of resolution.settings) {
|
|
341
|
+
if (setting.value !== setting.declaration.defaultValue)
|
|
342
|
+
values[setting.declaration.id] = setting.value;
|
|
343
|
+
}
|
|
344
|
+
return values;
|
|
345
|
+
}
|
|
257
346
|
function isMissing(error) {
|
|
258
347
|
return typeof error === "object" && error !== null && error.code === "ENOENT";
|
|
259
348
|
}
|
|
@@ -9,5 +9,11 @@ export interface OwnedUiSettingsMigration {
|
|
|
9
9
|
* is the first stored shape.
|
|
10
10
|
*/
|
|
11
11
|
export declare const OWNED_UI_SETTINGS_MIGRATIONS: readonly OwnedUiSettingsMigration[];
|
|
12
|
+
export interface OwnedUiSettingsCompatibilityResult {
|
|
13
|
+
readonly values: Readonly<Record<string, unknown>> | null;
|
|
14
|
+
readonly failure: string | null;
|
|
15
|
+
}
|
|
16
|
+
/** Shape-selected compatibility for the metadata-free product object. */
|
|
17
|
+
export declare function normalizeOwnedUiSettingsValues(source: Readonly<Record<string, unknown>>): OwnedUiSettingsCompatibilityResult;
|
|
12
18
|
export declare function assertOwnedUiSettingsMigrations(migrations: readonly OwnedUiSettingsMigration[], currentVersion?: number): void;
|
|
13
19
|
export declare function migrationsFrom(migrations: readonly OwnedUiSettingsMigration[], storedVersion: number): readonly OwnedUiSettingsMigration[];
|