@timurproko/a1 0.2.6 → 0.2.7-dev.1222
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 +197 -908
- package/dist/app/session-shell/session-shell.d.ts +3 -8
- package/dist/app/session-shell/session-shell.js +327 -835
- package/dist/app/session-shell/session-viewport-controller.d.ts +2 -1
- package/dist/app/session-shell/session-viewport-controller.js +41 -38
- 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 +105 -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 +207 -153
- package/dist/composition/reference-selection-options.d.ts +3 -0
- package/dist/composition/reference-selection-options.js +16 -0
- 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 -2
- package/dist/composition/settings-route-host.js +42 -17
- package/dist/composition/settings-search-input.d.ts +9 -0
- package/dist/composition/settings-search-input.js +61 -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 +244 -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 +84 -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-document-selection.d.ts +30 -0
- package/dist/features/owned-ui/reference-document-selection.js +179 -0
- package/dist/features/owned-ui/reference-screen-app.d.ts +6 -1
- package/dist/features/owned-ui/reference-screen-app.js +51 -10
- package/dist/features/owned-ui/settings-app.d.ts +13 -2
- package/dist/features/owned-ui/settings-app.js +136 -97
- 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 +138 -11
- 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 +74 -5
- 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.d.ts +17 -8
- package/dist/ui/components/dialog-panel.js +117 -41
- package/dist/ui/components/index.d.ts +5 -5
- package/dist/ui/components/index.js +4 -4
- 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/scrollbar.d.ts +1 -1
- package/dist/ui/components/scrollbar.js +1 -1
- package/dist/ui/components/selection-copy.d.ts +3 -3
- package/dist/ui/components/selection-copy.js +16 -1
- 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-selection.d.ts +1 -2
- package/dist/ui/components/text-selection.js +5 -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 +179 -58
- 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 +649 -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
|
@@ -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[];
|
|
@@ -104,7 +104,80 @@ export const OWNED_UI_SETTINGS_MIGRATIONS = Object.freeze([
|
|
|
104
104
|
return { ...values };
|
|
105
105
|
},
|
|
106
106
|
}),
|
|
107
|
+
Object.freeze({
|
|
108
|
+
to: 14,
|
|
109
|
+
description: "Introduce the opt-in resident tabs preview with a disabled default.",
|
|
110
|
+
migrate(values) {
|
|
111
|
+
return { ...values };
|
|
112
|
+
},
|
|
113
|
+
}),
|
|
114
|
+
Object.freeze({
|
|
115
|
+
to: 15,
|
|
116
|
+
description: "Introduce the bounded concurrent resident-tab start limit.",
|
|
117
|
+
migrate(values) {
|
|
118
|
+
return { ...values };
|
|
119
|
+
},
|
|
120
|
+
}),
|
|
121
|
+
Object.freeze({
|
|
122
|
+
to: 16,
|
|
123
|
+
description: "Make bare A1 tabs unconditional and keep only tab UX controls.",
|
|
124
|
+
migrate(values) {
|
|
125
|
+
const migrated = { ...values };
|
|
126
|
+
delete migrated.residentTabs;
|
|
127
|
+
delete migrated.tabsMaxConcurrentStarts;
|
|
128
|
+
delete migrated.tabsUnresponsiveRestartSeconds;
|
|
129
|
+
delete migrated.tabsStallNoticeSeconds;
|
|
130
|
+
return migrated;
|
|
131
|
+
},
|
|
132
|
+
}),
|
|
133
|
+
Object.freeze({
|
|
134
|
+
to: 17,
|
|
135
|
+
description: "Introduce the shared twelve-hour time format default.",
|
|
136
|
+
migrate(values) {
|
|
137
|
+
return { ...values };
|
|
138
|
+
},
|
|
139
|
+
}),
|
|
140
|
+
Object.freeze({
|
|
141
|
+
to: 18,
|
|
142
|
+
description: "Introduce the top resident tab-bar position default.",
|
|
143
|
+
migrate(values) {
|
|
144
|
+
return { ...values };
|
|
145
|
+
},
|
|
146
|
+
}),
|
|
147
|
+
Object.freeze({
|
|
148
|
+
to: 19,
|
|
149
|
+
description: "Expand the update check into auto, notify, and no modes.",
|
|
150
|
+
migrate(values) {
|
|
151
|
+
if (values.updateCheck === true)
|
|
152
|
+
return { ...values, updateCheck: "notify" };
|
|
153
|
+
if (values.updateCheck === false)
|
|
154
|
+
return { ...values, updateCheck: "no" };
|
|
155
|
+
return { ...values };
|
|
156
|
+
},
|
|
157
|
+
}),
|
|
107
158
|
]);
|
|
159
|
+
/** Shape-selected compatibility for the metadata-free product object. */
|
|
160
|
+
export function normalizeOwnedUiSettingsValues(source) {
|
|
161
|
+
const values = { ...source };
|
|
162
|
+
// Compatibility: "high" is valid again, so the old speed meaning is ambiguous without legacy metadata.
|
|
163
|
+
if (values.scrollbarAppearance === "hover")
|
|
164
|
+
values.scrollbarAppearance = "auto";
|
|
165
|
+
if (values.accentColor === "default")
|
|
166
|
+
values.accentColor = "purple";
|
|
167
|
+
if (values.updateCheck === true)
|
|
168
|
+
values.updateCheck = "notify";
|
|
169
|
+
else if (values.updateCheck === false)
|
|
170
|
+
values.updateCheck = "no";
|
|
171
|
+
if (values.quitEffect === "off") {
|
|
172
|
+
if (Object.hasOwn(values, "quitAnimation") && values.quitAnimation !== false) {
|
|
173
|
+
return { values: null, failure: "legacy quitEffect conflicts with quitAnimation" };
|
|
174
|
+
}
|
|
175
|
+
values.quitAnimation = false;
|
|
176
|
+
}
|
|
177
|
+
delete values.quitEffect;
|
|
178
|
+
delete values.quitEffectDurationMs;
|
|
179
|
+
return { values, failure: null };
|
|
180
|
+
}
|
|
108
181
|
export function assertOwnedUiSettingsMigrations(migrations, currentVersion = OWNED_UI_SETTINGS_VERSION) {
|
|
109
182
|
const firstProduced = currentVersion - migrations.length + 1;
|
|
110
183
|
if (migrations.length > 0 && firstProduced < 2) {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type ProfileSettingsNamespaceRead = {
|
|
2
|
+
readonly status: "missing";
|
|
3
|
+
readonly value: null;
|
|
4
|
+
} | {
|
|
5
|
+
readonly status: "available";
|
|
6
|
+
readonly value: Readonly<Record<string, unknown>>;
|
|
7
|
+
} | {
|
|
8
|
+
readonly status: "invalid";
|
|
9
|
+
readonly value: null;
|
|
10
|
+
readonly detail: string;
|
|
11
|
+
};
|
|
12
|
+
export type ProfileSettingsNamespaceUpdate = (current: Readonly<Record<string, unknown>> | null) => Readonly<Record<string, unknown>> | null;
|
|
13
|
+
/** Refuse an injected namespace already claimed by the surrounding root schema. */
|
|
14
|
+
export declare function assertProfileSettingsNamespaceAvailable(namespace: string, rootSettingKeys: readonly string[]): void;
|
|
15
|
+
/** Read one product-owned root object without exposing unrelated profile settings. */
|
|
16
|
+
export declare function readProfileSettingsNamespace(file: string, namespace: string): ProfileSettingsNamespaceRead;
|
|
17
|
+
/**
|
|
18
|
+
* Remove bounded leading noise only when the remaining bytes are one complete root object.
|
|
19
|
+
* The repair is silent and uses the same lock and atomic replacement path as namespace writes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function repairProfileSettingsDocument(file: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Replace one root namespace through the lock protocol used by pinned Pi.
|
|
24
|
+
* The updater receives bytes reread while locked, so unrelated concurrent writes survive.
|
|
25
|
+
*/
|
|
26
|
+
export declare function updateProfileSettingsNamespace(file: string, namespace: string, update: ProfileSettingsNamespaceUpdate): void;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import lockfile from "proper-lockfile";
|
|
5
|
+
const NAMESPACE_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
6
|
+
const MAX_RECOVERABLE_PREFIX_BYTES = 256;
|
|
7
|
+
/** Refuse an injected namespace already claimed by the surrounding root schema. */
|
|
8
|
+
export function assertProfileSettingsNamespaceAvailable(namespace, rootSettingKeys) {
|
|
9
|
+
assertNamespace(namespace);
|
|
10
|
+
if (rootSettingKeys.includes(namespace))
|
|
11
|
+
throw new Error(`profile settings namespace collides with a root setting: ${namespace}`);
|
|
12
|
+
}
|
|
13
|
+
/** Read one product-owned root object without exposing unrelated profile settings. */
|
|
14
|
+
export function readProfileSettingsNamespace(file, namespace) {
|
|
15
|
+
assertNamespace(namespace);
|
|
16
|
+
let raw;
|
|
17
|
+
try {
|
|
18
|
+
raw = readFileSync(file, "utf8");
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (isMissing(error))
|
|
22
|
+
return { status: "missing", value: null };
|
|
23
|
+
return { status: "invalid", value: null, detail: `${file} could not be read: ${describe(error)}` };
|
|
24
|
+
}
|
|
25
|
+
const root = parseRoot(raw);
|
|
26
|
+
if (root === null)
|
|
27
|
+
return { status: "invalid", value: null, detail: `${file} is not a valid settings object` };
|
|
28
|
+
if (!Object.hasOwn(root, namespace))
|
|
29
|
+
return { status: "missing", value: null };
|
|
30
|
+
const value = root[namespace];
|
|
31
|
+
if (!isRecord(value)) {
|
|
32
|
+
return { status: "invalid", value: null, detail: `${file} contains a non-object ${namespace} settings namespace` };
|
|
33
|
+
}
|
|
34
|
+
return { status: "available", value: Object.freeze({ ...value }) };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove bounded leading noise only when the remaining bytes are one complete root object.
|
|
38
|
+
* The repair is silent and uses the same lock and atomic replacement path as namespace writes.
|
|
39
|
+
*/
|
|
40
|
+
export function repairProfileSettingsDocument(file) {
|
|
41
|
+
if (!existsSync(file))
|
|
42
|
+
return false;
|
|
43
|
+
const release = acquireLock(file);
|
|
44
|
+
try {
|
|
45
|
+
if (!existsSync(file))
|
|
46
|
+
return false;
|
|
47
|
+
const raw = readFileSync(file, "utf8");
|
|
48
|
+
if (parseRoot(raw) !== null)
|
|
49
|
+
return false;
|
|
50
|
+
const root = parseRootAfterLeadingNoise(raw);
|
|
51
|
+
if (root === null)
|
|
52
|
+
return false;
|
|
53
|
+
replaceRoot(file, root);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
release();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Replace one root namespace through the lock protocol used by pinned Pi.
|
|
62
|
+
* The updater receives bytes reread while locked, so unrelated concurrent writes survive.
|
|
63
|
+
*/
|
|
64
|
+
export function updateProfileSettingsNamespace(file, namespace, update) {
|
|
65
|
+
assertNamespace(namespace);
|
|
66
|
+
mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
|
|
67
|
+
const release = acquireLock(file);
|
|
68
|
+
try {
|
|
69
|
+
const root = existsSync(file) ? parseRoot(readFileSync(file, "utf8")) : {};
|
|
70
|
+
if (root === null)
|
|
71
|
+
throw new Error(`${file} is not a valid settings object`);
|
|
72
|
+
const existing = root[namespace];
|
|
73
|
+
if (existing !== undefined && !isRecord(existing)) {
|
|
74
|
+
throw new Error(`${file} contains a non-object ${namespace} settings namespace`);
|
|
75
|
+
}
|
|
76
|
+
const nextNamespace = update(existing === undefined ? null : Object.freeze({ ...existing }));
|
|
77
|
+
const nextRoot = { ...root };
|
|
78
|
+
if (nextNamespace === null || Object.keys(nextNamespace).length === 0)
|
|
79
|
+
delete nextRoot[namespace];
|
|
80
|
+
else
|
|
81
|
+
nextRoot[namespace] = { ...nextNamespace };
|
|
82
|
+
replaceRoot(file, nextRoot);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
release();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function acquireLock(file) {
|
|
89
|
+
for (let attempt = 0;; attempt += 1) {
|
|
90
|
+
try {
|
|
91
|
+
return lockfile.lockSync(file, { realpath: false });
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (attempt >= 9 || !isLocked(error))
|
|
95
|
+
throw error;
|
|
96
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function replaceRoot(file, root) {
|
|
101
|
+
let temporary = `${file}.${process.pid}.${randomUUID()}.tmp`;
|
|
102
|
+
try {
|
|
103
|
+
writeFileSync(temporary, `${JSON.stringify(root, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
104
|
+
renameSync(temporary, file);
|
|
105
|
+
temporary = null;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
if (temporary !== null) {
|
|
109
|
+
try {
|
|
110
|
+
rmSync(temporary, { force: true });
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Invariant: failed temporary cleanup cannot make the target document authoritative.
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function parseRoot(raw) {
|
|
119
|
+
return parseRootValue(stripBom(raw));
|
|
120
|
+
}
|
|
121
|
+
function parseRootAfterLeadingNoise(raw) {
|
|
122
|
+
const withoutBom = stripBom(raw);
|
|
123
|
+
const start = withoutBom.indexOf("{");
|
|
124
|
+
if (start <= 0)
|
|
125
|
+
return null;
|
|
126
|
+
const prefix = withoutBom.slice(0, start);
|
|
127
|
+
if (Buffer.byteLength(prefix, "utf8") > MAX_RECOVERABLE_PREFIX_BYTES || prefix.trim().length === 0)
|
|
128
|
+
return null;
|
|
129
|
+
try {
|
|
130
|
+
JSON.parse(prefix);
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return parseRootValue(withoutBom.slice(start));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function parseRootValue(raw) {
|
|
138
|
+
try {
|
|
139
|
+
const value = JSON.parse(raw);
|
|
140
|
+
return isRecord(value) ? value : null;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function stripBom(raw) {
|
|
147
|
+
return raw.charCodeAt(0) === 0xfeff ? raw.slice(1) : raw;
|
|
148
|
+
}
|
|
149
|
+
function isRecord(value) {
|
|
150
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
151
|
+
}
|
|
152
|
+
function assertNamespace(namespace) {
|
|
153
|
+
if (!NAMESPACE_PATTERN.test(namespace))
|
|
154
|
+
throw new Error(`profile settings namespace is invalid: ${namespace}`);
|
|
155
|
+
}
|
|
156
|
+
function isMissing(error) {
|
|
157
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
158
|
+
}
|
|
159
|
+
function isLocked(error) {
|
|
160
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ELOCKED";
|
|
161
|
+
}
|
|
162
|
+
function describe(error) {
|
|
163
|
+
return error instanceof Error ? error.message : String(error);
|
|
164
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by scripts/pi/sync-progress-palette.ts from A1's named accent projection
|
|
3
|
+
* over pinned Pi 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0. Do not edit directly.
|
|
4
|
+
*/
|
|
5
|
+
export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
6
|
+
blue: {
|
|
7
|
+
dark: {
|
|
8
|
+
truecolor: {
|
|
9
|
+
accent: string;
|
|
10
|
+
border: string;
|
|
11
|
+
};
|
|
12
|
+
"256color": {
|
|
13
|
+
accent: string;
|
|
14
|
+
border: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
light: {
|
|
18
|
+
truecolor: {
|
|
19
|
+
accent: string;
|
|
20
|
+
border: string;
|
|
21
|
+
};
|
|
22
|
+
"256color": {
|
|
23
|
+
accent: string;
|
|
24
|
+
border: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
purple: {
|
|
29
|
+
dark: {
|
|
30
|
+
truecolor: {
|
|
31
|
+
accent: string;
|
|
32
|
+
border: string;
|
|
33
|
+
};
|
|
34
|
+
"256color": {
|
|
35
|
+
accent: string;
|
|
36
|
+
border: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
light: {
|
|
40
|
+
truecolor: {
|
|
41
|
+
accent: string;
|
|
42
|
+
border: string;
|
|
43
|
+
};
|
|
44
|
+
"256color": {
|
|
45
|
+
accent: string;
|
|
46
|
+
border: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
cyan: {
|
|
51
|
+
dark: {
|
|
52
|
+
truecolor: {
|
|
53
|
+
accent: string;
|
|
54
|
+
border: string;
|
|
55
|
+
};
|
|
56
|
+
"256color": {
|
|
57
|
+
accent: string;
|
|
58
|
+
border: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
light: {
|
|
62
|
+
truecolor: {
|
|
63
|
+
accent: string;
|
|
64
|
+
border: string;
|
|
65
|
+
};
|
|
66
|
+
"256color": {
|
|
67
|
+
accent: string;
|
|
68
|
+
border: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
green: {
|
|
73
|
+
dark: {
|
|
74
|
+
truecolor: {
|
|
75
|
+
accent: string;
|
|
76
|
+
border: string;
|
|
77
|
+
};
|
|
78
|
+
"256color": {
|
|
79
|
+
accent: string;
|
|
80
|
+
border: string;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
light: {
|
|
84
|
+
truecolor: {
|
|
85
|
+
accent: string;
|
|
86
|
+
border: string;
|
|
87
|
+
};
|
|
88
|
+
"256color": {
|
|
89
|
+
accent: string;
|
|
90
|
+
border: string;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
orange: {
|
|
95
|
+
dark: {
|
|
96
|
+
truecolor: {
|
|
97
|
+
accent: string;
|
|
98
|
+
border: string;
|
|
99
|
+
};
|
|
100
|
+
"256color": {
|
|
101
|
+
accent: string;
|
|
102
|
+
border: string;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
light: {
|
|
106
|
+
truecolor: {
|
|
107
|
+
accent: string;
|
|
108
|
+
border: string;
|
|
109
|
+
};
|
|
110
|
+
"256color": {
|
|
111
|
+
accent: string;
|
|
112
|
+
border: string;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
pink: {
|
|
117
|
+
dark: {
|
|
118
|
+
truecolor: {
|
|
119
|
+
accent: string;
|
|
120
|
+
border: string;
|
|
121
|
+
};
|
|
122
|
+
"256color": {
|
|
123
|
+
accent: string;
|
|
124
|
+
border: string;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
light: {
|
|
128
|
+
truecolor: {
|
|
129
|
+
accent: string;
|
|
130
|
+
border: string;
|
|
131
|
+
};
|
|
132
|
+
"256color": {
|
|
133
|
+
accent: string;
|
|
134
|
+
border: string;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
}>;
|
|
139
|
+
export declare const SHARED_PROGRESS_ACCENT_ANSI: string;
|