@timurproko/a1 0.2.7-dev.1249 → 0.2.7-dev.1255
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 +11 -36
- package/bin/cli.js +2 -17
- package/bin/ui.js +10 -51
- package/dist/app/session-shell/clipboard-diagnostics.d.ts +2 -2
- package/dist/app/session-shell/clipboard-image.d.ts +0 -1
- package/dist/app/session-shell/clipboard-image.js +1 -1
- package/dist/app/session-shell/dialog-coordinator.d.ts +6 -5
- package/dist/app/session-shell/dialog-coordinator.js +3 -4
- package/dist/app/session-shell/dock-chrome.d.ts +11 -6
- package/dist/app/session-shell/dock-chrome.js +5 -8
- package/dist/app/session-shell/editor-hyperlink-budget.d.ts +0 -2
- package/dist/app/session-shell/editor-hyperlink-budget.js +1 -1
- package/dist/app/session-shell/exit-notice.d.ts +3 -3
- package/dist/app/session-shell/exit-notice.js +10 -10
- package/dist/app/session-shell/extension-surface.d.ts +8 -7
- package/dist/app/session-shell/helper-pool.d.ts +3 -4
- package/dist/app/session-shell/helper-pool.js +1 -1
- package/dist/app/session-shell/image-preparation-client.d.ts +4 -3
- package/dist/app/session-shell/image-preparation.d.ts +0 -2
- package/dist/app/session-shell/image-preparation.js +2 -2
- package/dist/app/session-shell/image-source.d.ts +2 -3
- package/dist/app/session-shell/image-source.js +2 -2
- package/dist/app/session-shell/input-surface-switch.d.ts +9 -7
- package/dist/app/session-shell/input-surface-switch.js +1 -2
- package/dist/app/session-shell/login-interaction.d.ts +5 -4
- package/dist/app/session-shell/login-interaction.js +2 -3
- package/dist/app/session-shell/paste-executor.d.ts +4 -8
- package/dist/app/session-shell/paste-executor.js +2 -2
- package/dist/app/session-shell/paste-protocol.d.ts +2 -2
- package/dist/app/session-shell/path-chip-presentation.d.ts +0 -5
- package/dist/app/session-shell/path-chip-presentation.js +3 -3
- package/dist/app/session-shell/prompt-chips.d.ts +8 -7
- package/dist/app/session-shell/prompt-history-controller.d.ts +3 -3
- package/dist/app/session-shell/prompt-submission.d.ts +7 -6
- package/dist/app/session-shell/prompt-submission.js +7 -28
- package/dist/app/session-shell/quit-outro-effects.d.ts +3 -3
- package/dist/app/session-shell/quit-outro-effects.js +1 -4
- package/dist/app/session-shell/quit-outro.d.ts +9 -12
- package/dist/app/session-shell/quit-outro.js +11 -11
- package/dist/app/session-shell/response-copy-protocol.d.ts +3 -2
- package/dist/app/session-shell/response-copy-transport.d.ts +2 -14
- package/dist/app/session-shell/response-copy-transport.js +2 -3
- package/dist/app/session-shell/session-lifecycle.d.ts +3 -3
- package/dist/app/session-shell/session-lifecycle.js +2 -4
- package/dist/app/session-shell/session-shell-root.d.ts +74 -120
- package/dist/app/session-shell/session-shell-root.js +82 -115
- package/dist/app/session-shell/session-shell.d.ts +13 -16
- package/dist/app/session-shell/session-shell.js +149 -314
- package/dist/app/session-shell/session-viewport-controller.d.ts +7 -6
- package/dist/app/session-shell/session-viewport-controller.js +5 -8
- package/dist/app/session-shell/settings-bindings.d.ts +24 -2
- package/dist/app/session-shell/settings-bindings.js +24 -0
- package/dist/app/session-shell/share-operation.d.ts +3 -3
- package/dist/app/session-shell/share-operation.js +4 -6
- package/dist/app/session-shell/shell-clipboard.d.ts +59 -0
- package/dist/app/session-shell/shell-clipboard.js +119 -0
- package/dist/app/session-shell/shell-editor-factory.d.ts +8 -4
- package/dist/app/session-shell/shell-editor-factory.js +13 -15
- package/dist/app/session-shell/shell-host.d.ts +16 -17
- package/dist/app/session-shell/shell-host.js +20 -37
- package/dist/app/session-shell/shell-layout.d.ts +2 -2
- package/dist/app/session-shell/shell-prompt-suggestions.d.ts +26 -0
- package/dist/app/session-shell/shell-prompt-suggestions.js +48 -0
- package/dist/app/session-shell/suggestion-surface.d.ts +1 -6
- package/dist/app/session-shell/suggestion-surface.js +1 -1
- package/dist/app/session-shell/system-clipboard.d.ts +2 -14
- package/dist/app/session-shell/system-clipboard.js +2 -7
- package/dist/app/session-shell/transcript-document.d.ts +12 -10
- package/dist/app/session-shell/transcript-document.js +15 -41
- package/dist/app/session-shell/viewport-layout.d.ts +2 -2
- package/dist/app/session-shell/workflow-output.d.ts +5 -3
- package/dist/app/session-shell/workflow-output.js +13 -15
- package/dist/app/session-shell/workflow-router.d.ts +1 -3
- package/dist/app/session-shell/workflow-router.js +1 -4
- package/dist/cli/dispatch.d.ts +1 -11
- package/dist/cli/dispatch.js +5 -92
- package/dist/cli/package-messages.d.ts +0 -1
- package/dist/cli/package-messages.js +1 -1
- package/dist/cli/session-context.d.ts +1 -1
- package/dist/cli/session-context.js +5 -7
- package/dist/cli/uninstall.d.ts +4 -7
- package/dist/cli/uninstall.js +6 -35
- package/dist/cli/version-stats.js +4 -7
- package/dist/composition/owned-settings.d.ts +2 -2
- package/dist/composition/owned-settings.js +0 -4
- package/dist/composition/owned-ui.d.ts +3 -25
- package/dist/composition/owned-ui.js +37 -113
- package/dist/composition/reference-selection-options.d.ts +1 -1
- package/dist/composition/reference-selection-options.js +1 -1
- package/dist/composition/release-update-observation.d.ts +4 -4
- package/dist/composition/release-update-observation.js +17 -47
- package/dist/composition/session-backend.d.ts +0 -1
- package/dist/composition/session-runtime-registry.d.ts +5 -4
- package/dist/composition/settings-route-host.d.ts +0 -7
- package/dist/composition/settings-route-host.js +7 -20
- package/dist/composition/settings-search-input.d.ts +2 -1
- package/dist/composition/startup-route.d.ts +2 -3
- package/dist/composition/startup-route.js +2 -3
- package/dist/contracts/owned-ui/extension-ui.d.ts +2 -1
- package/dist/contracts/owned-ui/index.d.ts +2 -1
- package/dist/contracts/owned-ui/model.d.ts +0 -3
- package/dist/contracts/owned-ui/session-presenters.d.ts +3 -0
- package/dist/contracts/owned-ui/session-workflows.d.ts +1 -4
- package/dist/contracts/owned-ui/shell-components.d.ts +543 -0
- package/dist/contracts/presentation/component.d.ts +17 -0
- package/dist/contracts/presentation/component.js +8 -0
- package/dist/contracts/presentation/index.d.ts +6 -15
- package/dist/contracts/presentation/index.js +2 -0
- package/dist/contracts/presentation/terminal.d.ts +290 -0
- package/dist/contracts/presentation/theme.d.ts +46 -0
- package/dist/features/launch/development-launch.js +1 -2
- package/dist/features/launch/index.d.ts +1 -1
- package/dist/features/launch/intent.d.ts +1 -3
- package/dist/features/launch/intent.js +2 -4
- package/dist/features/launch/runtime-selection.d.ts +2 -2
- package/dist/features/launch/runtime-selection.js +2 -2
- package/dist/features/launch/session-context.d.ts +2 -2
- package/dist/features/owned-ui/project-trust-prompt.d.ts +2 -2
- package/dist/features/owned-ui/project-trust-prompt.js +1 -1
- package/dist/features/owned-ui/reference-screen-app.d.ts +0 -2
- package/dist/features/owned-ui/reference-screen-app.js +2 -9
- package/dist/features/owned-ui/release-note-state.d.ts +2 -1
- package/dist/features/owned-ui/settings-app.d.ts +0 -6
- package/dist/features/owned-ui/settings-app.js +42 -254
- package/dist/features/owned-ui/settings-edits.d.ts +31 -0
- package/dist/features/owned-ui/settings-edits.js +139 -0
- package/dist/features/owned-ui/settings-scroll-rail.d.ts +29 -0
- package/dist/features/owned-ui/settings-scroll-rail.js +79 -0
- package/dist/features/owned-ui/settings-search-input.d.ts +2 -1
- package/dist/features/prompt-history/service.d.ts +3 -2
- package/dist/foundation/launch-context/index.d.ts +0 -12
- package/dist/foundation/launch-context/index.js +0 -26
- package/dist/foundation/lifecycle/claim-gate.d.ts +9 -0
- package/dist/foundation/lifecycle/claim-gate.js +37 -0
- package/dist/foundation/lifecycle/index.d.ts +5 -9
- package/dist/foundation/lifecycle/index.js +3 -4
- package/dist/foundation/lifecycle/model.d.ts +2 -59
- package/dist/foundation/lifecycle/model.js +0 -35
- package/dist/foundation/lifecycle/paths.d.ts +0 -24
- package/dist/foundation/lifecycle/paths.js +0 -40
- package/dist/foundation/lifecycle/process-liveness.d.ts +8 -0
- package/dist/foundation/lifecycle/process-liveness.js +18 -0
- package/dist/foundation/lifecycle/session-claim-lock.d.ts +1 -1
- package/dist/foundation/lifecycle/session-claim-lock.js +2 -2
- package/dist/foundation/lifecycle/session-repository-context.d.ts +6 -6
- package/dist/foundation/lifecycle/session-repository-context.js +2 -3
- package/dist/foundation/release/automatic-update.d.ts +6 -17
- package/dist/foundation/release/automatic-update.js +23 -44
- package/dist/foundation/release/bootstrap.d.ts +2 -25
- package/dist/foundation/release/bootstrap.js +37 -348
- package/dist/foundation/release/dependency-certification.d.ts +1 -2
- package/dist/foundation/release/dependency-certification.js +1 -1
- package/dist/foundation/release/early-accent.d.ts +2 -2
- package/dist/foundation/release/early-accent.js +1 -1
- package/dist/foundation/release/index.d.ts +10 -17
- package/dist/foundation/release/index.js +7 -11
- package/dist/foundation/release/latest-release.d.ts +3 -19
- package/dist/foundation/release/latest-release.js +11 -12
- package/dist/foundation/release/ordinary-launch-selection.d.ts +1 -1
- package/dist/foundation/release/ordinary-launch-selection.js +1 -1
- package/dist/foundation/release/process-liveness.d.ts +2 -0
- package/dist/foundation/release/process-liveness.js +12 -0
- package/dist/foundation/release/release-gc.d.ts +13 -10
- package/dist/foundation/release/release-gc.js +37 -101
- package/dist/foundation/release/{cohort-state.d.ts → release-state.d.ts} +44 -69
- package/dist/foundation/release/{cohort-state.js → release-state.js} +38 -70
- package/dist/foundation/release/release-store.d.ts +2 -2
- package/dist/foundation/release/release-store.js +2 -2
- package/dist/foundation/release/restart-certification.js +1 -1
- package/dist/foundation/release/update-activation.d.ts +2 -9
- package/dist/foundation/release/update-activation.js +30 -45
- package/dist/foundation/release/update-execution-lease.d.ts +2 -3
- package/dist/foundation/release/update-execution-lease.js +2 -2
- package/dist/foundation/release/update-launch.d.ts +2 -4
- package/dist/foundation/release/update-launch.js +0 -7
- package/dist/foundation/release/update-recovery.js +1 -1
- package/dist/foundation/release/update-transaction.d.ts +1 -1
- package/dist/foundation/release/update-transaction.js +5 -2
- package/dist/foundation/release/update.d.ts +2 -12
- package/dist/foundation/release/update.js +37 -214
- package/dist/foundation/session-writer-lock/index.d.ts +14 -6
- package/dist/foundation/session-writer-lock/index.js +48 -103
- package/dist/foundation/startup/startup-budget.d.ts +5 -5
- package/dist/foundation/startup/startup-budget.js +2 -2
- package/dist/foundation/startup/startup-runtime.d.ts +1 -1
- package/dist/foundation/terminal-cleanup/exit-notice.d.ts +6 -0
- package/dist/foundation/terminal-cleanup/exit-notice.js +36 -0
- package/dist/foundation/terminal-cleanup/index.d.ts +2 -1
- package/dist/foundation/terminal-cleanup/index.js +2 -1
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +0 -5
- package/dist/foundation/terminal-cleanup/terminal-reset.js +0 -5
- package/dist/integrations/pi/components/editor-interaction.d.ts +4 -12
- package/dist/integrations/pi/components/index.d.ts +15 -9
- package/dist/integrations/pi/components/index.js +9 -5
- package/dist/integrations/pi/components/lazy-selectors.d.ts +2 -10
- package/dist/integrations/pi/components/lazy-selectors.js +1 -1
- package/dist/integrations/pi/components/modal-frame.d.ts +5 -22
- package/dist/integrations/pi/components/modal-frame.js +3 -23
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +4 -3
- package/dist/integrations/pi/components/prompt-input-port.d.ts +2 -19
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +2 -1
- package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +3 -2
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +1 -4
- package/dist/integrations/pi/components/shell-footer-status.d.ts +3 -3
- package/dist/integrations/pi/components/shell-footer-status.js +5 -4
- package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +6 -8
- package/dist/integrations/pi/components/shell-presenters-info.js +6 -19
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +1 -1
- package/dist/integrations/pi/components/shell-presenters-transcript.js +1 -1
- package/dist/integrations/pi/components/shell-session-info-reference.d.ts +2 -1
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +33 -229
- package/dist/integrations/pi/components/shell-shared-facade.js +8 -1
- package/dist/integrations/pi/components/skills-command.d.ts +1 -9
- package/dist/integrations/pi/components/skills-command.js +5 -5
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +2 -5
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +2 -16
- package/dist/integrations/pi/components/theme.d.ts +9 -2
- package/dist/integrations/pi/components/theme.js +17 -2
- package/dist/integrations/pi/components/thinking-selector-dialog.d.ts +2 -1
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +2 -2
- package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +1 -2
- package/dist/integrations/pi/components/upstream/components/session-footer.js +6 -8
- package/dist/integrations/pi/engine/adapter.d.ts +3 -6
- package/dist/integrations/pi/engine/adapter.js +4 -28
- package/dist/integrations/pi/engine/changelog.d.ts +2 -2
- package/dist/integrations/pi/engine/changelog.js +3 -3
- package/dist/integrations/pi/engine/compaction-progress.d.ts +2 -3
- package/dist/integrations/pi/engine/compaction-progress.js +1 -1
- package/dist/integrations/pi/engine/conformance.d.ts +2 -1
- package/dist/integrations/pi/engine/default-model-setting.d.ts +0 -2
- package/dist/integrations/pi/engine/default-model-setting.js +1 -2
- package/dist/integrations/pi/engine/diagnostics-state.d.ts +0 -1
- package/dist/integrations/pi/engine/diagnostics-state.js +0 -14
- package/dist/integrations/pi/engine/event-delivery.d.ts +2 -1
- package/dist/integrations/pi/engine/extension-ui-binding.d.ts +2 -1
- package/dist/integrations/pi/engine/host.js +2 -2
- package/dist/integrations/pi/engine/message-values.d.ts +0 -1
- package/dist/integrations/pi/engine/message-values.js +1 -1
- package/dist/integrations/pi/engine/pending-delivery.d.ts +0 -4
- package/dist/integrations/pi/engine/pending-delivery.js +3 -3
- package/dist/integrations/pi/engine/ports.d.ts +7 -1
- package/dist/integrations/pi/engine/ports.js +4 -0
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +2 -1
- package/dist/integrations/pi/engine/prompt-suggestions.d.ts +3 -3
- package/dist/integrations/pi/engine/prompt-suggestions.js +0 -40
- package/dist/integrations/pi/engine/provider-authentication.d.ts +1 -1
- package/dist/integrations/pi/engine/public-main-entry.d.ts +1 -5
- package/dist/integrations/pi/engine/public-main-entry.js +1 -1
- package/dist/integrations/pi/engine/repository-pr-rest.d.ts +1 -9
- package/dist/integrations/pi/engine/repository-pr-rest.js +2 -2
- package/dist/integrations/pi/engine/repository-pr.d.ts +1 -3
- package/dist/integrations/pi/engine/repository-pr.js +1 -1
- package/dist/integrations/pi/engine/resource-catalog.d.ts +2 -1
- package/dist/integrations/pi/engine/session-integration.d.ts +1 -1
- package/dist/integrations/pi/engine/session-runtime.d.ts +4 -3
- package/dist/integrations/pi/engine/session-runtime.js +0 -2
- package/dist/integrations/pi/engine/settings-bridge.d.ts +0 -2
- package/dist/integrations/pi/engine/settings-bridge.js +1 -1
- package/dist/integrations/pi/engine/settings-port.d.ts +3 -2
- package/dist/integrations/pi/engine/transcript-projection.d.ts +2 -1
- package/dist/integrations/pi/engine/workflow-contexts.d.ts +1 -1
- package/dist/integrations/pi/engine/workflow-runner.d.ts +1 -1
- package/dist/integrations/pi/engine/workflow-runner.js +1 -1
- package/dist/integrations/pi/engine/workflow-support.d.ts +0 -6
- package/dist/integrations/pi/engine/workflow-support.js +4 -18
- package/dist/integrations/pi/engine/workflows.d.ts +5 -5
- package/dist/integrations/pi/session-presenters/components.d.ts +3 -0
- package/dist/integrations/pi/session-presenters/components.js +75 -0
- package/dist/integrations/pi/session-presenters/index.d.ts +1 -0
- package/dist/integrations/pi/session-presenters/index.js +1 -0
- package/dist/integrations/pi/session-presenters/presentation.d.ts +3 -0
- package/dist/integrations/pi/session-presenters/presentation.js +10 -0
- package/dist/integrations/pi/session-presenters/presenters.d.ts +2 -1
- package/dist/integrations/pi/session-presenters/presenters.js +3 -1
- package/dist/integrations/pi/tui-runtime/adapter.d.ts +2 -2
- package/dist/integrations/pi/tui-runtime/adapter.js +23 -32
- package/dist/integrations/pi/tui-runtime/contracts.d.ts +22 -166
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +5 -40
- package/dist/integrations/pi/tui-runtime/index.d.ts +1 -0
- package/dist/integrations/pi/tui-runtime/index.js +1 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +4 -6
- package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +2 -8
- package/dist/integrations/pi/tui-runtime/overlay-geometry.js +3 -9
- package/dist/integrations/pi/tui-runtime/runtime-factory.d.ts +3 -0
- package/dist/integrations/pi/tui-runtime/runtime-factory.js +11 -0
- package/dist/product-identity.d.ts +4 -6
- package/dist/product-identity.js +6 -11
- package/dist/product-identity.json +1 -40
- package/dist/runtime-payload-inventory.json +0 -3
- package/dist/ui/components/index.d.ts +4 -4
- package/dist/ui/components/index.js +2 -2
- package/dist/ui/components/selection-copy.d.ts +0 -1
- package/dist/ui/components/selection-copy.js +0 -12
- package/dist/ui/components/submitted-prompt.d.ts +3 -13
- package/dist/ui/components/submitted-prompt.js +8 -41
- package/dist/ui/components/theme.d.ts +4 -19
- package/dist/ui/components/theme.js +6 -0
- package/dist/ui/components/transcript-viewport.d.ts +1 -3
- package/dist/ui/components/transcript-viewport.js +1 -4
- package/dist/ui/settings/declarations.d.ts +2 -97
- package/dist/ui/settings/declarations.js +2 -78
- package/dist/ui/settings/early-accent.js +1 -1
- package/dist/ui/settings/index.d.ts +3 -5
- package/dist/ui/settings/index.js +2 -3
- package/dist/ui/settings/manager.d.ts +0 -4
- package/dist/ui/settings/manager.js +6 -62
- package/dist/ui/settings/resolution.d.ts +6 -18
- package/dist/ui/settings/resolution.js +4 -103
- package/dist/ui/settings/sections.d.ts +0 -4
- package/dist/ui/settings/sections.js +1 -1
- package/docs/architecture/boundaries.md +23 -40
- package/docs/architecture/code-documentation.md +2 -2
- package/docs/architecture/internal-naming.md +11 -17
- package/docs/architecture/project-structure.md +13 -16
- package/docs/architecture/resource-and-data-policy.md +16 -31
- package/docs/architecture/toolchain.md +14 -19
- package/docs/architecture/ui-reference-provenance.md +2 -2
- package/docs/ci-release-runbook.md +5 -5
- package/docs/features/launch-profiles.md +11 -17
- package/docs/features/prompt-history.md +10 -11
- package/docs/local-worktree-cleanup.md +28 -1
- package/docs/manual-owned-ui-checkpoint.md +0 -1
- package/docs/validation.md +5 -11
- package/docs/worktree-link-recovery.md +6 -6
- package/package.json +7 -20
- package/bin/guardian.js +0 -42
- package/bin/supervisor.js +0 -7
- package/bin/tab-launch-context.d.ts +0 -27
- package/bin/tab-launch-context.js +0 -94
- package/dist/app/session-shell/resident-tab-coordinator.d.ts +0 -38
- package/dist/app/session-shell/resident-tab-coordinator.js +0 -77
- package/dist/cli/tabs-request.d.ts +0 -7
- package/dist/cli/tabs.d.ts +0 -14
- package/dist/cli/tabs.js +0 -151
- package/dist/composition/resident-tab-bridge.d.ts +0 -41
- package/dist/composition/resident-tab-bridge.js +0 -209
- package/dist/composition/utility-tab.d.ts +0 -28
- package/dist/composition/utility-tab.js +0 -244
- package/dist/features/owned-ui/plus-menu-dialog.d.ts +0 -28
- package/dist/features/owned-ui/plus-menu-dialog.js +0 -89
- package/dist/features/resident-tab/auto-name.d.ts +0 -11
- package/dist/features/resident-tab/auto-name.js +0 -44
- package/dist/features/resident-tab/index.d.ts +0 -5
- package/dist/features/resident-tab/index.js +0 -7
- package/dist/features/resident-tab/shortcut-bindings-file.d.ts +0 -8
- package/dist/features/resident-tab/shortcut-bindings-file.js +0 -40
- package/dist/features/resident-tab/shortcut-declarations.d.ts +0 -13
- package/dist/features/resident-tab/shortcut-declarations.js +0 -26
- package/dist/features/resident-tab/shortcut-projection.d.ts +0 -29
- package/dist/features/resident-tab/shortcut-projection.js +0 -64
- package/dist/features/resident-tab/status-deriver.d.ts +0 -10
- package/dist/features/resident-tab/status-deriver.js +0 -12
- package/dist/foundation/launch-guardian/exit-watcher.d.ts +0 -14
- package/dist/foundation/launch-guardian/exit-watcher.js +0 -103
- package/dist/foundation/launch-guardian/index.d.ts +0 -2
- package/dist/foundation/launch-guardian/index.js +0 -1
- package/dist/foundation/launch-guardian/main.d.ts +0 -39
- package/dist/foundation/launch-guardian/main.js +0 -232
- package/dist/foundation/lifecycle/commands.d.ts +0 -40
- package/dist/foundation/lifecycle/launch-instance.d.ts +0 -46
- package/dist/foundation/lifecycle/launch-instance.js +0 -134
- package/dist/foundation/lifecycle/native-claim-gate.d.ts +0 -5
- package/dist/foundation/lifecycle/native-claim-gate.js +0 -41
- package/dist/foundation/lifecycle/supervisor-startup.d.ts +0 -30
- package/dist/foundation/lifecycle/supervisor-startup.js +0 -106
- package/dist/foundation/process-containment/addon-containment.d.ts +0 -20
- package/dist/foundation/process-containment/addon-containment.js +0 -139
- package/dist/foundation/process-containment/addon-process-inspector.d.ts +0 -11
- package/dist/foundation/process-containment/addon-process-inspector.js +0 -36
- package/dist/foundation/process-containment/addon.d.ts +0 -47
- package/dist/foundation/process-containment/addon.js +0 -57
- package/dist/foundation/process-containment/artifact.d.ts +0 -1
- package/dist/foundation/process-containment/artifact.js +0 -35
- package/dist/foundation/process-containment/contracts.d.ts +0 -33
- package/dist/foundation/process-containment/contracts.js +0 -35
- package/dist/foundation/process-containment/index.d.ts +0 -9
- package/dist/foundation/process-containment/index.js +0 -7
- package/dist/foundation/process-containment/linux-process-inspector.d.ts +0 -7
- package/dist/foundation/process-containment/linux-process-inspector.js +0 -27
- package/dist/foundation/process-containment/native-process-inspector.d.ts +0 -4
- package/dist/foundation/process-containment/native-process-inspector.js +0 -21
- package/dist/foundation/protocol/client.d.ts +0 -18
- package/dist/foundation/protocol/client.js +0 -130
- package/dist/foundation/protocol/index.d.ts +0 -3
- package/dist/foundation/protocol/index.js +0 -2
- package/dist/foundation/protocol/messages.d.ts +0 -90
- package/dist/foundation/protocol/messages.js +0 -100
- package/dist/foundation/release/cohort-selection.d.ts +0 -33
- package/dist/foundation/release/cohort-selection.js +0 -67
- package/dist/foundation/release/endpoint-lock.d.ts +0 -2
- package/dist/foundation/release/endpoint-lock.js +0 -37
- package/dist/foundation/release/endpoint-recovery.d.ts +0 -10
- package/dist/foundation/release/endpoint-recovery.js +0 -45
- package/dist/foundation/release/endpoints.d.ts +0 -32
- package/dist/foundation/release/endpoints.js +0 -152
- package/dist/foundation/release/prepared-update-activation.d.ts +0 -3
- package/dist/foundation/release/prepared-update-activation.js +0 -27
- package/dist/foundation/release/process-cleanup.d.ts +0 -14
- package/dist/foundation/release/process-cleanup.js +0 -76
- package/dist/foundation/release/supervisor-identity.d.ts +0 -15
- package/dist/foundation/release/supervisor-identity.js +0 -63
- package/dist/foundation/resident-tabs/boot-identity.d.ts +0 -6
- package/dist/foundation/resident-tabs/boot-identity.js +0 -16
- package/dist/foundation/resident-tabs/bounded-host-command.d.ts +0 -20
- package/dist/foundation/resident-tabs/bounded-host-command.js +0 -62
- package/dist/foundation/resident-tabs/bridge-client.d.ts +0 -73
- package/dist/foundation/resident-tabs/bridge-client.js +0 -327
- package/dist/foundation/resident-tabs/continuity.d.ts +0 -12
- package/dist/foundation/resident-tabs/continuity.js +0 -63
- package/dist/foundation/resident-tabs/doctor.d.ts +0 -28
- package/dist/foundation/resident-tabs/doctor.js +0 -166
- package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +0 -27
- package/dist/foundation/resident-tabs/draft-checkpoint.js +0 -145
- package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +0 -36
- package/dist/foundation/resident-tabs/ensure-terminal-host.js +0 -151
- package/dist/foundation/resident-tabs/fault-injection.d.ts +0 -8
- package/dist/foundation/resident-tabs/fault-injection.js +0 -26
- package/dist/foundation/resident-tabs/fixture-control.d.ts +0 -7
- package/dist/foundation/resident-tabs/fixture-control.js +0 -35
- package/dist/foundation/resident-tabs/host-entry.js +0 -17
- package/dist/foundation/resident-tabs/index.d.ts +0 -15
- package/dist/foundation/resident-tabs/index.js +0 -10
- package/dist/foundation/resident-tabs/maintenance.d.ts +0 -39
- package/dist/foundation/resident-tabs/maintenance.js +0 -75
- package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +0 -34
- package/dist/foundation/resident-tabs/progress-observation-schema.js +0 -1
- package/dist/foundation/resident-tabs/progress-observation.d.ts +0 -4
- package/dist/foundation/resident-tabs/progress-observation.js +0 -150
- package/dist/foundation/resident-tabs/prompt-journal.d.ts +0 -63
- package/dist/foundation/resident-tabs/prompt-journal.js +0 -213
- package/dist/foundation/resident-tabs/protocol.d.ts +0 -12
- package/dist/foundation/resident-tabs/protocol.js +0 -195
- package/dist/foundation/resident-tabs/recovery.d.ts +0 -26
- package/dist/foundation/resident-tabs/recovery.js +0 -205
- package/dist/foundation/resident-tabs/release-holds.d.ts +0 -28
- package/dist/foundation/resident-tabs/release-holds.js +0 -78
- package/dist/foundation/resident-tabs/routes.d.ts +0 -5
- package/dist/foundation/resident-tabs/routes.js +0 -5
- package/dist/foundation/resident-tabs/routing.d.ts +0 -11
- package/dist/foundation/resident-tabs/routing.js +0 -10
- package/dist/foundation/resident-tabs/runtime-control.d.ts +0 -38
- package/dist/foundation/resident-tabs/runtime-control.js +0 -74
- package/dist/foundation/resident-tabs/session-sync.d.ts +0 -14
- package/dist/foundation/resident-tabs/session-sync.js +0 -37
- package/dist/foundation/resident-tabs/settings.d.ts +0 -16
- package/dist/foundation/resident-tabs/settings.js +0 -60
- package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +0 -14
- package/dist/foundation/resident-tabs/terminal-host-artifact.js +0 -78
- package/dist/foundation/resident-tabs/zip-archive.d.ts +0 -9
- package/dist/foundation/resident-tabs/zip-archive.js +0 -56
- package/dist/foundation/storage/control-store.d.ts +0 -20
- package/dist/foundation/storage/control-store.js +0 -331
- package/dist/foundation/storage/index.d.ts +0 -1
- package/dist/foundation/storage/index.js +0 -1
- package/dist/foundation/supervision/index.d.ts +0 -3
- package/dist/foundation/supervision/index.js +0 -3
- package/dist/foundation/supervision/main.d.ts +0 -1
- package/dist/foundation/supervision/main.js +0 -86
- package/dist/foundation/supervision/paths.d.ts +0 -1
- package/dist/foundation/supervision/paths.js +0 -1
- package/dist/foundation/supervision/server.d.ts +0 -46
- package/dist/foundation/supervision/server.js +0 -611
- package/dist/integrations/pi/components/components.d.ts +0 -4
- package/dist/integrations/pi/components/components.js +0 -48
- package/dist/integrations/pi/components/conformance.d.ts +0 -18
- package/dist/integrations/pi/components/conformance.js +0 -70
- package/dist/integrations/pi/components/shell-components.d.ts +0 -7
- package/dist/integrations/pi/components/shell-components.js +0 -7
- package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +0 -33
- package/dist/integrations/pi/components/upstream/theme/theme-controller.js +0 -114
- package/dist/integrations/pi/engine/offline-settings-port.d.ts +0 -23
- package/dist/integrations/pi/engine/offline-settings-port.js +0 -54
- package/dist/native/darwin-arm64/manifest.json +0 -23
- package/dist/native/darwin-arm64/process-guardian.node +0 -0
- package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10500
- package/dist/native/darwin-arm64/terminal-host.manifest.json +0 -46
- package/dist/native/darwin-arm64/terminal-host.node +0 -0
- package/dist/native/darwin-x64/manifest.json +0 -23
- package/dist/native/darwin-x64/process-guardian.node +0 -0
- package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10737
- package/dist/native/darwin-x64/terminal-host.manifest.json +0 -46
- package/dist/native/darwin-x64/terminal-host.node +0 -0
- package/dist/native/linux-x64/manifest.json +0 -23
- package/dist/native/linux-x64/process-guardian.node +0 -0
- package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -11226
- package/dist/native/linux-x64/terminal-host.manifest.json +0 -46
- package/dist/native/linux-x64/terminal-host.node +0 -0
- package/dist/native/win32-x64/manifest.json +0 -23
- package/dist/native/win32-x64/process-guardian.node +0 -0
- package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10757
- package/dist/native/win32-x64/terminal-host.manifest.json +0 -46
- package/dist/native/win32-x64/terminal-host.node +0 -0
- package/dist/ui/settings/migrations.d.ts +0 -19
- package/dist/ui/settings/migrations.js +0 -209
- package/dist/ui/settings/progress-palette.generated.d.ts +0 -139
- package/dist/ui/settings/progress-palette.generated.js +0 -139
- package/docs/architecture/evidence/resident-tabs/linux-x64.md +0 -37
- package/docs/architecture/evidence/resident-tabs/macos-arm64.md +0 -36
- package/docs/architecture/evidence/resident-tabs/macos-x64.md +0 -35
- package/docs/architecture/evidence/resident-tabs/windows-x64.md +0 -36
- package/docs/architecture/evidence/terminal-host-spike/manual-one-pane-terminal-host.md +0 -70
- package/docs/architecture/evidence/terminal-host-spike/manual-two-by-two-basic-terminal-host.md +0 -32
- package/docs/architecture/evidence/terminal-host-spike/milestone-baseline.json +0 -115
- package/docs/architecture/evidence/terminal-host-spike/owned-ui-foundation-prerequisite.json +0 -48
- package/docs/architecture/evidence/terminal-host-spike/terminal-host-provenance.json +0 -125
- package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-1.json +0 -56
- package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-3.json +0 -174
- package/docs/architecture/evidence/terminal-host-spike/terminal-spike-acceptance-record.json +0 -18
- package/docs/architecture/native-fixture-isolation.md +0 -23
- package/docs/architecture/process-guardian-provenance.md +0 -36
- package/docs/architecture/resident-tabs-requirements.md +0 -18
- package/docs/architecture/resident-tabs.md +0 -668
- package/docs/architecture/terminal-host-proof-gate.md +0 -34
- package/docs/architecture/terminal-host-provenance.md +0 -81
- package/docs/architecture/terminal-host-spike-evidence.md +0 -39
- package/docs/launch-recovery.md +0 -23
- package/docs/manual-launch-instance-acceptance.md +0 -43
- package/docs/manual-resident-tabs-acceptance.md +0 -51
- /package/dist/{cli/tabs-request.js → contracts/owned-ui/shell-components.js} +0 -0
- /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.d.ts +0 -0
- /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.js +0 -0
- /package/dist/{foundation/lifecycle/commands.js → contracts/presentation/terminal.js} +0 -0
- /package/dist/{foundation/resident-tabs/host-entry.d.ts → contracts/presentation/theme.js} +0 -0
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
3
|
-
import { homedir, release as osRelease } from "node:os";
|
|
4
|
-
import { basename, dirname, resolve, sep } from "node:path";
|
|
5
|
-
import { resolveTerminalHostPath } from "./ensure-terminal-host.js";
|
|
6
|
-
import { TERMINAL_HOST_MANIFEST_FILENAME, verifyTerminalHostArtifact } from "./terminal-host-artifact.js";
|
|
7
|
-
import { encodeZip } from "./zip-archive.js";
|
|
8
|
-
export const DOCTOR_MAX_BYTES = 25 * 1024 * 1024;
|
|
9
|
-
const LOG_NAME = /^terminal-host-[a-z0-9-]+\.log(?:\.(\d{1,2}))?$/u;
|
|
10
|
-
const CRASH_NAME = /^crash-[a-z0-9-]+\.json$/u;
|
|
11
|
-
/**
|
|
12
|
-
* Writes an owner-only diagnostic bundle by allowlist: structured logs, crash records, host
|
|
13
|
-
* status, a redacted registry, the owner marker without secrets, artifact verification, platform
|
|
14
|
-
* facts, and the Tabs settings. Secrets, tokens, environment values, prompt journals, drafts,
|
|
15
|
-
* last screens, the private child-stderr sink, and terminal content are never read.
|
|
16
|
-
*/
|
|
17
|
-
export async function writeDoctorBundle(options) {
|
|
18
|
-
const home = options.home ?? homedir();
|
|
19
|
-
const redact = (value) => homeRelative(value, home);
|
|
20
|
-
const now = options.now ?? new Date();
|
|
21
|
-
const maxBytes = options.maxBytes ?? DOCTOR_MAX_BYTES;
|
|
22
|
-
const diagnostics = resolve(options.stateDir, "diagnostics");
|
|
23
|
-
const names = await readdir(diagnostics).catch(() => []);
|
|
24
|
-
const fixed = [
|
|
25
|
-
json("host-status.json", redactHostStatus(options.hostStatus, redact)),
|
|
26
|
-
json("registry.json", await redactedRegistry(resolve(options.stateDir, "registry.json"), redact)),
|
|
27
|
-
json("server-marker.json", await redactedMarker(resolve(options.stateDir, "server.json"), redact)),
|
|
28
|
-
json("artifacts.json", await artifactFacts(options.releaseRoots, options.platform ?? process.platform, options.architecture ?? process.arch, redact)),
|
|
29
|
-
json("platform.json", {
|
|
30
|
-
platform: options.platform ?? process.platform,
|
|
31
|
-
architecture: options.architecture ?? process.arch,
|
|
32
|
-
osRelease: osRelease(),
|
|
33
|
-
node: process.version,
|
|
34
|
-
detachmentMode: options.hostStatus.result?.detachmentMode ?? null,
|
|
35
|
-
}),
|
|
36
|
-
json("settings.json", { tabsAutoName: options.settings.tabsAutoName }),
|
|
37
|
-
];
|
|
38
|
-
const crashes = [];
|
|
39
|
-
for (const name of names.filter(name => CRASH_NAME.test(name)).sort()) {
|
|
40
|
-
crashes.push({ name: `crashes/${name}`, data: await readFile(resolve(diagnostics, name)) });
|
|
41
|
-
}
|
|
42
|
-
// Rationale: when the bundle would exceed its cap, the oldest log generations go first.
|
|
43
|
-
const logs = names
|
|
44
|
-
.filter(name => LOG_NAME.test(name))
|
|
45
|
-
.map(name => ({ name, generation: Number(LOG_NAME.exec(name)?.[1] ?? 0) }))
|
|
46
|
-
.sort((left, right) => left.generation - right.generation || left.name.localeCompare(right.name));
|
|
47
|
-
const dropped = [];
|
|
48
|
-
const included = [...fixed, ...crashes];
|
|
49
|
-
let budget = maxBytes - 64 * 1024 - included.reduce((total, entry) => total + entry.data.length, 0);
|
|
50
|
-
for (const log of logs) {
|
|
51
|
-
const size = (await stat(resolve(diagnostics, log.name))).size;
|
|
52
|
-
if (size > budget) {
|
|
53
|
-
dropped.push(log.name);
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
budget -= size;
|
|
57
|
-
included.push({ name: `logs/${log.name}`, data: await readFile(resolve(diagnostics, log.name)) });
|
|
58
|
-
}
|
|
59
|
-
const manifest = [
|
|
60
|
-
"a1 tabs doctor bundle",
|
|
61
|
-
`created: ${now.toISOString()}`,
|
|
62
|
-
...included.map(entry => `included: ${entry.name}`),
|
|
63
|
-
...dropped.map(name => `dropped to stay within ${maxBytes} bytes: logs/${name}`),
|
|
64
|
-
"",
|
|
65
|
-
].join("\n");
|
|
66
|
-
const archive = encodeZip([{ name: "manifest.txt", data: Buffer.from(manifest, "utf8") }, ...included], now);
|
|
67
|
-
const directory = resolve(options.stateDir, "doctor");
|
|
68
|
-
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
69
|
-
const path = resolve(directory, `a1-tabs-doctor-${now.toISOString().replace(/[:.]/gu, "-")}.zip`);
|
|
70
|
-
await writeFile(path, archive, { mode: 0o600, flag: "wx" });
|
|
71
|
-
return { path, bytes: archive.length, dropped };
|
|
72
|
-
}
|
|
73
|
-
function json(name, value) {
|
|
74
|
-
return { name, data: Buffer.from(`${JSON.stringify(value, null, 2)}\n`, "utf8") };
|
|
75
|
-
}
|
|
76
|
-
function stableHash(value) {
|
|
77
|
-
return createHash("sha256").update(value).digest("hex").slice(0, 16);
|
|
78
|
-
}
|
|
79
|
-
function homeRelative(value, home) {
|
|
80
|
-
const normalized = resolve(value);
|
|
81
|
-
const root = resolve(home);
|
|
82
|
-
const comparable = (path) => process.platform === "win32" ? path.toLowerCase() : path;
|
|
83
|
-
if (comparable(normalized) === comparable(root))
|
|
84
|
-
return "~";
|
|
85
|
-
return comparable(normalized).startsWith(comparable(`${root}${sep}`)) ? `~${normalized.slice(root.length).replaceAll("\\", "/")}` : normalized;
|
|
86
|
-
}
|
|
87
|
-
function redactHostStatus(report, redact) {
|
|
88
|
-
const result = report.result ? { ...report.result } : undefined;
|
|
89
|
-
if (result && Array.isArray(result.logs))
|
|
90
|
-
result.logs = result.logs.map(path => typeof path === "string" ? basename(path) : null);
|
|
91
|
-
if (result && typeof result.release === "string")
|
|
92
|
-
result.release = redact(result.release);
|
|
93
|
-
return {
|
|
94
|
-
host: report.host,
|
|
95
|
-
pid: report.pid ?? null,
|
|
96
|
-
exitCode: report.exitCode,
|
|
97
|
-
result: result ?? null,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
async function redactedRegistry(path, redact) {
|
|
101
|
-
let document;
|
|
102
|
-
try {
|
|
103
|
-
document = JSON.parse(await readFile(path, "utf8"));
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
return { readable: false, reason: error instanceof Error && "code" in error ? String(error.code) : "unparseable" };
|
|
107
|
-
}
|
|
108
|
-
const tabs = Array.isArray(document.tabs) ? document.tabs : [];
|
|
109
|
-
const text = (value) => typeof value === "string" ? value : null;
|
|
110
|
-
return {
|
|
111
|
-
readable: true,
|
|
112
|
-
registryRevision: document.registryRevision ?? null,
|
|
113
|
-
epoch: document.epoch ?? null,
|
|
114
|
-
tabs: tabs.map(tab => {
|
|
115
|
-
const sessionFile = text(tab.sessionFile);
|
|
116
|
-
return {
|
|
117
|
-
tabId: text(tab.tabId),
|
|
118
|
-
// Security: names can be generated from prompts, so only a stable hash is kept.
|
|
119
|
-
nameHash: text(tab.displayName) === null ? null : stableHash(text(tab.displayName)),
|
|
120
|
-
nameSource: text(tab.nameSource),
|
|
121
|
-
order: tab.order ?? null,
|
|
122
|
-
cwd: text(tab.cwd) === null ? null : redact(text(tab.cwd)),
|
|
123
|
-
sessionDirectory: sessionFile === null ? null : redact(dirname(sessionFile)),
|
|
124
|
-
sessionFileHash: sessionFile === null ? null : stableHash(basename(sessionFile)),
|
|
125
|
-
desired: text(tab.desired),
|
|
126
|
-
lifecycle: text(tab.lifecycle),
|
|
127
|
-
incarnation: tab.incarnation ?? null,
|
|
128
|
-
holderPid: tab.holderPid ?? null,
|
|
129
|
-
childPid: tab.childPid ?? null,
|
|
130
|
-
release: text(tab.release) === null ? null : redact(text(tab.release)),
|
|
131
|
-
lastExit: text(tab.lastExit),
|
|
132
|
-
restarts: tab.restarts ?? null,
|
|
133
|
-
};
|
|
134
|
-
}),
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
async function redactedMarker(path, redact) {
|
|
138
|
-
try {
|
|
139
|
-
const marker = JSON.parse(await readFile(path, "utf8"));
|
|
140
|
-
return {
|
|
141
|
-
present: true,
|
|
142
|
-
pid: marker.pid ?? null,
|
|
143
|
-
generation: marker.generation ?? null,
|
|
144
|
-
verified: marker.verified ?? null,
|
|
145
|
-
detachmentMode: marker.detachmentMode ?? null,
|
|
146
|
-
releaseRoot: typeof marker.releaseRoot === "string" ? redact(marker.releaseRoot) : null,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
return { present: false };
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
async function artifactFacts(roots, platform, architecture, redact) {
|
|
154
|
-
const facts = [];
|
|
155
|
-
for (const root of roots) {
|
|
156
|
-
const addon = resolveTerminalHostPath(root, {}, platform, architecture);
|
|
157
|
-
const manifest = await readFile(resolve(dirname(addon), TERMINAL_HOST_MANIFEST_FILENAME), "utf8")
|
|
158
|
-
.then(text => JSON.parse(text))
|
|
159
|
-
.catch(() => null);
|
|
160
|
-
const verification = await verifyTerminalHostArtifact(addon, platform, architecture)
|
|
161
|
-
.then(() => "verified")
|
|
162
|
-
.catch((error) => error instanceof Error && "code" in error ? String(error.code) : "failed");
|
|
163
|
-
facts.push({ releaseRoot: redact(root), verification, manifest });
|
|
164
|
-
}
|
|
165
|
-
return facts;
|
|
166
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { ResidentTabFaultInjection } from "./fault-injection.js";
|
|
2
|
-
export interface DraftCheckpointState {
|
|
3
|
-
readonly text: string;
|
|
4
|
-
readonly savedAt: string;
|
|
5
|
-
}
|
|
6
|
-
export interface DraftCheckpointOptions {
|
|
7
|
-
readonly intervalMs?: number;
|
|
8
|
-
readonly maximumDirtyMs?: number;
|
|
9
|
-
readonly faults?: ResidentTabFaultInjection;
|
|
10
|
-
readonly now?: () => number;
|
|
11
|
-
readonly onDegraded?: (degraded: boolean) => void;
|
|
12
|
-
readonly write?: (path: string, text: string) => Promise<void>;
|
|
13
|
-
readonly move?: (from: string, to: string) => Promise<void>;
|
|
14
|
-
readonly schedule?: (callback: () => void | Promise<void>, delayMs: number) => unknown;
|
|
15
|
-
readonly cancel?: (timer: unknown) => void;
|
|
16
|
-
}
|
|
17
|
-
/** Periodic rather than inactivity-debounced: continuous input still checkpoints every interval. */
|
|
18
|
-
export declare class DraftCheckpointer {
|
|
19
|
-
#private;
|
|
20
|
-
readonly path: string;
|
|
21
|
-
constructor(path: string, options?: DraftCheckpointOptions);
|
|
22
|
-
get degraded(): boolean;
|
|
23
|
-
change(text: string): void;
|
|
24
|
-
restore(): Promise<DraftCheckpointState | null>;
|
|
25
|
-
flush(): Promise<void>;
|
|
26
|
-
close(): Promise<void>;
|
|
27
|
-
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { chmod, mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
|
-
import { dirname } from "node:path";
|
|
4
|
-
import { ResidentTabFaultInjection } from "./fault-injection.js";
|
|
5
|
-
/** Periodic rather than inactivity-debounced: continuous input still checkpoints every interval. */
|
|
6
|
-
export class DraftCheckpointer {
|
|
7
|
-
path;
|
|
8
|
-
#intervalMs;
|
|
9
|
-
#maximumDirtyMs;
|
|
10
|
-
#faults;
|
|
11
|
-
#now;
|
|
12
|
-
#onDegraded;
|
|
13
|
-
#write;
|
|
14
|
-
#move;
|
|
15
|
-
#scheduleTimer;
|
|
16
|
-
#cancelTimer;
|
|
17
|
-
#text = "";
|
|
18
|
-
#dirtySince = null;
|
|
19
|
-
#timer = null;
|
|
20
|
-
#degradedTimer = null;
|
|
21
|
-
#writing = null;
|
|
22
|
-
#closed = false;
|
|
23
|
-
#degraded = false;
|
|
24
|
-
constructor(path, options = {}) {
|
|
25
|
-
this.path = path;
|
|
26
|
-
this.#intervalMs = options.intervalMs ?? 500;
|
|
27
|
-
this.#maximumDirtyMs = options.maximumDirtyMs ?? 1_000;
|
|
28
|
-
this.#faults = options.faults ?? new ResidentTabFaultInjection();
|
|
29
|
-
this.#now = options.now ?? Date.now;
|
|
30
|
-
this.#onDegraded = options.onDegraded ?? (() => { });
|
|
31
|
-
this.#write = options.write ?? (async (target, text) => writeFile(target, text, { encoding: "utf8", mode: 0o600, flag: "wx" }));
|
|
32
|
-
this.#move = options.move ?? rename;
|
|
33
|
-
this.#scheduleTimer = options.schedule ?? ((callback, delayMs) => setTimeout(callback, delayMs));
|
|
34
|
-
this.#cancelTimer = options.cancel ?? (timer => clearTimeout(timer));
|
|
35
|
-
}
|
|
36
|
-
get degraded() { return this.#degraded; }
|
|
37
|
-
change(text) {
|
|
38
|
-
if (this.#closed)
|
|
39
|
-
return;
|
|
40
|
-
this.#text = text;
|
|
41
|
-
this.#dirtySince ??= this.#now();
|
|
42
|
-
this.#schedule();
|
|
43
|
-
this.#armDegradedDeadline();
|
|
44
|
-
}
|
|
45
|
-
async restore() {
|
|
46
|
-
try {
|
|
47
|
-
const value = JSON.parse(await readFile(this.path, "utf8"));
|
|
48
|
-
if (typeof value !== "object" || value === null || typeof value.text !== "string"
|
|
49
|
-
|| typeof value.savedAt !== "string")
|
|
50
|
-
return null;
|
|
51
|
-
return value;
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
if (error.code === "ENOENT" || error instanceof SyntaxError)
|
|
55
|
-
return null;
|
|
56
|
-
throw error;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
async flush() {
|
|
60
|
-
if (this.#timer !== null) {
|
|
61
|
-
this.#cancelTimer(this.#timer);
|
|
62
|
-
this.#timer = null;
|
|
63
|
-
}
|
|
64
|
-
await this.#writing;
|
|
65
|
-
if (this.#dirtySince !== null)
|
|
66
|
-
await this.#checkpoint();
|
|
67
|
-
}
|
|
68
|
-
async close() {
|
|
69
|
-
await this.flush();
|
|
70
|
-
this.#closed = true;
|
|
71
|
-
}
|
|
72
|
-
#armDegradedDeadline() {
|
|
73
|
-
if (this.#degradedTimer !== null || this.#dirtySince === null || this.#closed)
|
|
74
|
-
return;
|
|
75
|
-
const delay = Math.max(0, this.#maximumDirtyMs - (this.#now() - this.#dirtySince));
|
|
76
|
-
this.#degradedTimer = this.#scheduleTimer(() => {
|
|
77
|
-
this.#degradedTimer = null;
|
|
78
|
-
if (this.#dirtySince !== null && this.#now() - this.#dirtySince >= this.#maximumDirtyMs) {
|
|
79
|
-
this.#setDegraded(true);
|
|
80
|
-
}
|
|
81
|
-
else if (this.#dirtySince !== null) {
|
|
82
|
-
this.#armDegradedDeadline();
|
|
83
|
-
}
|
|
84
|
-
}, delay);
|
|
85
|
-
}
|
|
86
|
-
#clearDegradedDeadline() {
|
|
87
|
-
if (this.#degradedTimer !== null)
|
|
88
|
-
this.#cancelTimer(this.#degradedTimer);
|
|
89
|
-
this.#degradedTimer = null;
|
|
90
|
-
}
|
|
91
|
-
#schedule() {
|
|
92
|
-
if (this.#timer !== null || this.#writing !== null || this.#closed)
|
|
93
|
-
return;
|
|
94
|
-
const age = this.#dirtySince === null ? 0 : this.#now() - this.#dirtySince;
|
|
95
|
-
if (age > this.#maximumDirtyMs)
|
|
96
|
-
this.#setDegraded(true);
|
|
97
|
-
this.#timer = this.#scheduleTimer(async () => {
|
|
98
|
-
this.#timer = null;
|
|
99
|
-
this.#writing = this.#checkpoint().finally(() => {
|
|
100
|
-
this.#writing = null;
|
|
101
|
-
if (this.#dirtySince !== null)
|
|
102
|
-
this.#schedule();
|
|
103
|
-
});
|
|
104
|
-
await this.#writing.catch(() => undefined);
|
|
105
|
-
}, this.#intervalMs);
|
|
106
|
-
}
|
|
107
|
-
async #checkpoint() {
|
|
108
|
-
if (this.#dirtySince === null)
|
|
109
|
-
return;
|
|
110
|
-
const snapshot = this.#text;
|
|
111
|
-
const temporary = `${this.path}.tmp-${process.pid}-${randomUUID()}`;
|
|
112
|
-
try {
|
|
113
|
-
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
114
|
-
if (process.platform !== "win32")
|
|
115
|
-
await chmod(dirname(this.path), 0o700);
|
|
116
|
-
this.#faults.at("draft-during-temp-write");
|
|
117
|
-
await this.#write(temporary, `${JSON.stringify({ text: snapshot, savedAt: new Date(this.#now()).toISOString() })}\n`);
|
|
118
|
-
this.#faults.at("draft-before-rename");
|
|
119
|
-
await this.#move(temporary, this.path);
|
|
120
|
-
this.#faults.at("draft-after-rename");
|
|
121
|
-
if (process.platform !== "win32")
|
|
122
|
-
await chmod(this.path, 0o600);
|
|
123
|
-
if (this.#text === snapshot)
|
|
124
|
-
this.#dirtySince = null;
|
|
125
|
-
else
|
|
126
|
-
this.#dirtySince = this.#now();
|
|
127
|
-
this.#clearDegradedDeadline();
|
|
128
|
-
if (this.#dirtySince !== null)
|
|
129
|
-
this.#armDegradedDeadline();
|
|
130
|
-
this.#setDegraded(false);
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
await unlink(temporary).catch(() => undefined);
|
|
134
|
-
this.#clearDegradedDeadline();
|
|
135
|
-
this.#setDegraded(true);
|
|
136
|
-
throw error;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
#setDegraded(value) {
|
|
140
|
-
if (this.#degraded === value)
|
|
141
|
-
return;
|
|
142
|
-
this.#degraded = value;
|
|
143
|
-
this.#onDegraded(value);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export type TerminalHostFallbackReason = "unsupported platform" | "no interactive terminal" | "terminal host not installed" | "terminal host not verified" | "host probe failed" | "incompatible generation" | "registry unreadable" | "recovery blocked" | "launch not verified" | "host startup timed out";
|
|
2
|
-
export interface TerminalHostCommand {
|
|
3
|
-
readonly executable: string;
|
|
4
|
-
readonly entry: string;
|
|
5
|
-
}
|
|
6
|
-
export type EnsureTerminalHostResult = {
|
|
7
|
-
readonly status: "ready";
|
|
8
|
-
readonly executable: TerminalHostCommand;
|
|
9
|
-
readonly endpoint: string;
|
|
10
|
-
} | {
|
|
11
|
-
readonly status: "fallback";
|
|
12
|
-
readonly reason: TerminalHostFallbackReason;
|
|
13
|
-
};
|
|
14
|
-
interface HostCommandResult {
|
|
15
|
-
readonly code: number;
|
|
16
|
-
readonly stdout: string;
|
|
17
|
-
readonly stderr: string;
|
|
18
|
-
}
|
|
19
|
-
export interface EnsureTerminalHostOptions {
|
|
20
|
-
readonly releaseRoot: string;
|
|
21
|
-
readonly profileRoot: string;
|
|
22
|
-
readonly dataDir: string;
|
|
23
|
-
readonly runtimeDir: string;
|
|
24
|
-
readonly environment: NodeJS.ProcessEnv;
|
|
25
|
-
readonly platform?: NodeJS.Platform;
|
|
26
|
-
readonly architecture?: string;
|
|
27
|
-
readonly timeoutMs?: number;
|
|
28
|
-
readonly maxConcurrentStarts?: number;
|
|
29
|
-
readonly unresponsiveRestartSeconds?: number;
|
|
30
|
-
readonly run?: (executable: string, arguments_: readonly string[], environment: NodeJS.ProcessEnv, timeoutMs: number) => Promise<HostCommandResult>;
|
|
31
|
-
readonly verify?: (addon: string, platform: NodeJS.Platform, architecture: string) => Promise<unknown>;
|
|
32
|
-
}
|
|
33
|
-
export declare function resolveTerminalHostPath(releaseRoot: string, environment?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, architecture?: string): string;
|
|
34
|
-
export declare function resolveTerminalHostEntryPath(releaseRoot: string): string;
|
|
35
|
-
export declare function ensureTerminalHost(options: EnsureTerminalHostOptions): Promise<EnsureTerminalHostResult>;
|
|
36
|
-
export {};
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { access } from "node:fs/promises";
|
|
3
|
-
import { constants } from "node:fs";
|
|
4
|
-
import { resolve } from "node:path";
|
|
5
|
-
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
6
|
-
import { TerminalHostArtifactError, verifyTerminalHostArtifact } from "./terminal-host-artifact.js";
|
|
7
|
-
export function resolveTerminalHostPath(releaseRoot, environment = process.env, platform = process.platform, architecture = process.arch) {
|
|
8
|
-
const override = developmentOverride(environment);
|
|
9
|
-
if (override)
|
|
10
|
-
return resolve(override);
|
|
11
|
-
return resolve(releaseRoot, "dist", "native", `${platform}-${architecture}`, `${PRODUCT_IDENTITY.artifacts.terminalHostAddon}.node`);
|
|
12
|
-
}
|
|
13
|
-
export function resolveTerminalHostEntryPath(releaseRoot) {
|
|
14
|
-
return resolve(releaseRoot, "dist", "foundation", "resident-tabs", `${PRODUCT_IDENTITY.artifacts.terminalHostEntry}.js`);
|
|
15
|
-
}
|
|
16
|
-
/** The terminal-host override is a development aid; installed releases always run their own verified artifact. */
|
|
17
|
-
function developmentOverride(environment) {
|
|
18
|
-
if (!environment[PRODUCT_IDENTITY.environment.developmentInstanceId])
|
|
19
|
-
return undefined;
|
|
20
|
-
return environment[PRODUCT_IDENTITY.environment.terminalHostPath]?.trim() || undefined;
|
|
21
|
-
}
|
|
22
|
-
export async function ensureTerminalHost(options) {
|
|
23
|
-
const platform = options.platform ?? process.platform;
|
|
24
|
-
const architecture = options.architecture ?? process.arch;
|
|
25
|
-
if (!supported(platform, architecture))
|
|
26
|
-
return { status: "fallback", reason: "unsupported platform" };
|
|
27
|
-
const addon = resolveTerminalHostPath(options.releaseRoot, options.environment, platform, architecture);
|
|
28
|
-
const command = { executable: process.execPath, entry: resolveTerminalHostEntryPath(options.releaseRoot) };
|
|
29
|
-
if (developmentOverride(options.environment)) {
|
|
30
|
-
try {
|
|
31
|
-
await Promise.all([access(addon, constants.R_OK), access(command.entry, constants.R_OK)]);
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return { status: "fallback", reason: "terminal host not installed" };
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
try {
|
|
39
|
-
await (options.verify ?? verifyTerminalHostArtifact)(addon, platform, architecture);
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
return { status: "fallback", reason: verificationReason(error) };
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const run = options.run ?? runHostCommand;
|
|
46
|
-
const timeoutMs = options.timeoutMs ?? 8_000;
|
|
47
|
-
const common = ["--profile", options.profileRoot, "--data-dir", options.dataDir, "--runtime-dir", options.runtimeDir];
|
|
48
|
-
const environment = { ...options.environment };
|
|
49
|
-
const invoke = async (arguments_, commandTimeoutMs) => await run(command.executable, [command.entry, ...arguments_], environment, commandTimeoutMs);
|
|
50
|
-
try {
|
|
51
|
-
const probe = await invoke(["probe", ...common], Math.min(4_000, timeoutMs));
|
|
52
|
-
const existing = parseResult(probe.stdout);
|
|
53
|
-
if (probe.code === 0) {
|
|
54
|
-
if (existing?.generation === 1 && typeof existing.endpoint === "string") {
|
|
55
|
-
return { status: "ready", executable: command, endpoint: existing.endpoint };
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
status: "fallback",
|
|
59
|
-
reason: typeof existing?.generation === "number" ? "incompatible generation" : "host probe failed",
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
if (probe.code === 4 || existing?.outcome === "incompatible-generation")
|
|
63
|
-
return { status: "fallback", reason: "incompatible generation" };
|
|
64
|
-
if (existing?.outcome !== "not-running" && probe.code !== 3)
|
|
65
|
-
return { status: "fallback", reason: classifiedReason(existing?.reason, "host probe failed") };
|
|
66
|
-
const maximum = Math.max(1, Math.min(8, Math.trunc(options.maxConcurrentStarts ?? 2)));
|
|
67
|
-
const unresponsiveRestartSeconds = Math.max(30, Math.min(600, Math.trunc(options.unresponsiveRestartSeconds ?? 120)));
|
|
68
|
-
const start = await invoke([
|
|
69
|
-
"server", "--detach", ...common,
|
|
70
|
-
"--max-concurrent-starts", String(maximum),
|
|
71
|
-
"--unresponsive-restart-seconds", String(unresponsiveRestartSeconds),
|
|
72
|
-
], timeoutMs);
|
|
73
|
-
const started = parseResult(start.stdout);
|
|
74
|
-
if (start.code !== 0)
|
|
75
|
-
return { status: "fallback", reason: classifiedReason(started?.reason, "launch not verified") };
|
|
76
|
-
if (started?.verified !== true || typeof started.endpoint !== "string")
|
|
77
|
-
return { status: "fallback", reason: "launch not verified" };
|
|
78
|
-
const deadline = Date.now() + timeoutMs;
|
|
79
|
-
while (Date.now() < deadline) {
|
|
80
|
-
const result = await invoke(["probe", ...common], Math.min(1_000, Math.max(1, deadline - Date.now())));
|
|
81
|
-
const ready = parseResult(result.stdout);
|
|
82
|
-
if (result.code === 0) {
|
|
83
|
-
if (ready?.generation === 1 && typeof ready.endpoint === "string") {
|
|
84
|
-
return { status: "ready", executable: command, endpoint: ready.endpoint };
|
|
85
|
-
}
|
|
86
|
-
return {
|
|
87
|
-
status: "fallback",
|
|
88
|
-
reason: typeof ready?.generation === "number" ? "incompatible generation" : "host probe failed",
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
if (result.code === 4 || ready?.outcome === "incompatible-generation")
|
|
92
|
-
return { status: "fallback", reason: "incompatible generation" };
|
|
93
|
-
await new Promise(resolvePromise => setTimeout(resolvePromise, 40));
|
|
94
|
-
}
|
|
95
|
-
return { status: "fallback", reason: "host startup timed out" };
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
return { status: "fallback", reason: isTimeout(error) ? "host startup timed out" : "host probe failed" };
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
function supported(platform, architecture) {
|
|
102
|
-
return (platform === "win32" || platform === "linux") && architecture === "x64"
|
|
103
|
-
|| platform === "darwin" && (architecture === "arm64" || architecture === "x64");
|
|
104
|
-
}
|
|
105
|
-
function verificationReason(error) {
|
|
106
|
-
if (!(error instanceof TerminalHostArtifactError))
|
|
107
|
-
return "terminal host not verified";
|
|
108
|
-
if (error.code === "TERMINAL_HOST_ARTIFACT_MISSING")
|
|
109
|
-
return "terminal host not installed";
|
|
110
|
-
if (error.code === "TERMINAL_HOST_ARTIFACT_UNSUPPORTED")
|
|
111
|
-
return "unsupported platform";
|
|
112
|
-
return "terminal host not verified";
|
|
113
|
-
}
|
|
114
|
-
function parseResult(output) {
|
|
115
|
-
const line = output.trim().split(/\r?\n/).filter(Boolean).at(-1);
|
|
116
|
-
if (!line)
|
|
117
|
-
return null;
|
|
118
|
-
try {
|
|
119
|
-
const parsed = JSON.parse(line);
|
|
120
|
-
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) ? parsed : null;
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
function classifiedReason(value, fallback) {
|
|
127
|
-
if (value === "registry-unreadable")
|
|
128
|
-
return "registry unreadable";
|
|
129
|
-
if (value === "blocked")
|
|
130
|
-
return "recovery blocked";
|
|
131
|
-
if (value === "incompatible-generation")
|
|
132
|
-
return "incompatible generation";
|
|
133
|
-
return fallback;
|
|
134
|
-
}
|
|
135
|
-
function isTimeout(error) { return error instanceof Error && "code" in error && error.code === "ETIMEDOUT"; }
|
|
136
|
-
async function runHostCommand(executable, arguments_, environment, timeoutMs) {
|
|
137
|
-
return await new Promise((resolvePromise, rejectPromise) => {
|
|
138
|
-
const child = spawn(executable, [...arguments_], { env: environment, windowsHide: true, stdio: ["ignore", "pipe", "pipe"] });
|
|
139
|
-
const stdout = [];
|
|
140
|
-
const stderr = [];
|
|
141
|
-
child.stdout.on("data", chunk => stdout.push(Buffer.from(chunk)));
|
|
142
|
-
child.stderr.on("data", chunk => stderr.push(Buffer.from(chunk)));
|
|
143
|
-
child.once("error", rejectPromise);
|
|
144
|
-
child.once("close", code => { clearTimeout(timer); resolvePromise({ code: code ?? 1, stdout: Buffer.concat(stdout).toString("utf8"), stderr: Buffer.concat(stderr).toString("utf8") }); });
|
|
145
|
-
const timer = setTimeout(() => {
|
|
146
|
-
child.kill("SIGKILL");
|
|
147
|
-
rejectPromise(Object.assign(new Error("terminal host command timed out"), { code: "ETIMEDOUT" }));
|
|
148
|
-
}, timeoutMs);
|
|
149
|
-
timer.unref();
|
|
150
|
-
});
|
|
151
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export declare const RESIDENT_TAB_FAULT_ENVIRONMENT: readonly ["A1_TABS_FAULT_CRASH_POINT", "A1_TABS_HERMETIC_TEST"];
|
|
2
|
-
export declare function residentTabFaultEnvironment(point: string, hermetic?: boolean): NodeJS.ProcessEnv;
|
|
3
|
-
/** Test-only crash points are inert unless the caller explicitly marks a hermetic process. */
|
|
4
|
-
export declare class ResidentTabFaultInjection {
|
|
5
|
-
#private;
|
|
6
|
-
constructor(environment?: NodeJS.ProcessEnv, crash?: (point: string) => never);
|
|
7
|
-
at(point: string): void;
|
|
8
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const CRASH_POINT = "A1_TABS_FAULT_CRASH_POINT";
|
|
2
|
-
const HERMETIC = "A1_TABS_HERMETIC_TEST";
|
|
3
|
-
export const RESIDENT_TAB_FAULT_ENVIRONMENT = Object.freeze([CRASH_POINT, HERMETIC]);
|
|
4
|
-
export function residentTabFaultEnvironment(point, hermetic = true) {
|
|
5
|
-
return Object.fromEntries(hermetic ? [[CRASH_POINT, point], [HERMETIC, "1"]] : [[CRASH_POINT, point]]);
|
|
6
|
-
}
|
|
7
|
-
/** Test-only crash points are inert unless the caller explicitly marks a hermetic process. */
|
|
8
|
-
export class ResidentTabFaultInjection {
|
|
9
|
-
#point;
|
|
10
|
-
#crash;
|
|
11
|
-
constructor(environment = process.env, crash = point => {
|
|
12
|
-
process.stderr.write(`resident tab injected crash: ${point}\n`);
|
|
13
|
-
process.abort();
|
|
14
|
-
}) {
|
|
15
|
-
const point = environment[CRASH_POINT];
|
|
16
|
-
if (point !== undefined && environment[HERMETIC] !== "1") {
|
|
17
|
-
throw new Error(`${CRASH_POINT} is available only in a hermetic resident-tab test`);
|
|
18
|
-
}
|
|
19
|
-
this.#point = point;
|
|
20
|
-
this.#crash = crash;
|
|
21
|
-
}
|
|
22
|
-
at(point) {
|
|
23
|
-
if (this.#point === point)
|
|
24
|
-
this.#crash(point);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export type ResidentFixtureStoppedStage = "child-render-write";
|
|
2
|
-
export interface ResidentFixtureControlPort {
|
|
3
|
-
stopped(stage: ResidentFixtureStoppedStage): boolean;
|
|
4
|
-
fragmentChildWrite(data: string): readonly string[];
|
|
5
|
-
}
|
|
6
|
-
/** Returns the exact-artifact fixture control, or null for every ordinary resident child. */
|
|
7
|
-
export declare function residentFixtureControl(environment?: NodeJS.ProcessEnv): ResidentFixtureControlPort | null;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
4
|
-
import { residentProgressObserver } from "./progress-observation.js";
|
|
5
|
-
/** Returns the exact-artifact fixture control, or null for every ordinary resident child. */
|
|
6
|
-
export function residentFixtureControl(environment = process.env) {
|
|
7
|
-
const directory = environment[PRODUCT_IDENTITY.environment.residentFixtureControlDir];
|
|
8
|
-
if (environment === process.env)
|
|
9
|
-
delete process.env[PRODUCT_IDENTITY.environment.residentFixtureControlDir];
|
|
10
|
-
// Invariant: launch erases the bridge tab identity; the observer retains the observed one.
|
|
11
|
-
const tabId = residentProgressObserver(environment)?.tabId;
|
|
12
|
-
if (!directory || !tabId || !/^[a-z0-9-]{1,128}$/iu.test(tabId))
|
|
13
|
-
return null;
|
|
14
|
-
return {
|
|
15
|
-
stopped: stage => existsSync(join(directory, `${tabId}.${stage}.stop`)),
|
|
16
|
-
fragmentChildWrite: data => existsSync(join(directory, `${tabId}.child-render-fragments.enable`))
|
|
17
|
-
? boundedFragments(data)
|
|
18
|
-
: [data],
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function boundedFragments(data) {
|
|
22
|
-
const points = [...data];
|
|
23
|
-
if (points.length <= 1)
|
|
24
|
-
return [data];
|
|
25
|
-
if (points.length <= 16)
|
|
26
|
-
return points;
|
|
27
|
-
const fragments = points.slice(0, 8);
|
|
28
|
-
const middle = points.slice(8, -8);
|
|
29
|
-
const chunkSize = Math.max(1, Math.ceil(middle.length / 48));
|
|
30
|
-
for (let index = 0; index < middle.length; index += chunkSize) {
|
|
31
|
-
fragments.push(middle.slice(index, index + chunkSize).join(""));
|
|
32
|
-
}
|
|
33
|
-
fragments.push(...points.slice(-8));
|
|
34
|
-
return fragments;
|
|
35
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { createRequire } from "node:module";
|
|
2
|
-
import { dirname, resolve } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
5
|
-
const filename = fileURLToPath(import.meta.url);
|
|
6
|
-
const target = `${process.platform}-${process.arch}`;
|
|
7
|
-
const development = process.env[PRODUCT_IDENTITY.environment.developmentInstanceId]?.trim();
|
|
8
|
-
const override = development ? process.env[PRODUCT_IDENTITY.environment.terminalHostPath]?.trim() : undefined;
|
|
9
|
-
const addonPath = resolve(override || resolve(dirname(filename), "../../native", target, `${PRODUCT_IDENTITY.artifacts.terminalHostAddon}.node`));
|
|
10
|
-
const addon = createRequire(import.meta.url)(addonPath);
|
|
11
|
-
if (typeof addon.runRole !== "function")
|
|
12
|
-
throw new Error("terminal host addon exports are incompatible");
|
|
13
|
-
// Invariant: runRole blocks Node's main thread, so this entry must not register JavaScript signal
|
|
14
|
-
// listeners whose callbacks cannot run until the native role has already returned. Default process
|
|
15
|
-
// signal handling keeps attach clients and identity-verified resident roles externally stoppable.
|
|
16
|
-
process.env[PRODUCT_IDENTITY.environment.terminalHostPath] = addonPath;
|
|
17
|
-
process.exitCode = addon.runRole(process.argv.slice(2), { executable: process.execPath, entry: filename, artifact: addonPath });
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export { ensureTerminalHost, resolveTerminalHostEntryPath, resolveTerminalHostPath } from "./ensure-terminal-host.js";
|
|
2
|
-
export type { EnsureTerminalHostOptions, EnsureTerminalHostResult, TerminalHostCommand, TerminalHostFallbackReason } from "./ensure-terminal-host.js";
|
|
3
|
-
export { readResidentTabLaunchSettings } from "./settings.js";
|
|
4
|
-
export type { ResidentTabLaunchSettings } from "./settings.js";
|
|
5
|
-
export { selectResidentHost } from "./routing.js";
|
|
6
|
-
export type { ResidentHostSelectionOptions } from "./routing.js";
|
|
7
|
-
export { readResidentReleaseHolds } from "./release-holds.js";
|
|
8
|
-
export type { ResidentReleaseHoldReport } from "./release-holds.js";
|
|
9
|
-
export { runTerminalHostMaintenance } from "./maintenance.js";
|
|
10
|
-
export type { MaintenanceAction, MaintenanceHostState, MaintenanceOptions, MaintenanceReport } from "./maintenance.js";
|
|
11
|
-
export { DOCTOR_MAX_BYTES, writeDoctorBundle } from "./doctor.js";
|
|
12
|
-
export type { DoctorBundle, DoctorOptions } from "./doctor.js";
|
|
13
|
-
export type { ContinuityOptions } from "./continuity.js";
|
|
14
|
-
/** Load native continuity inspection only when a caller is preparing client activation. */
|
|
15
|
-
export declare function assertResidentContinuity(options: import("./continuity.js").ContinuityOptions): Promise<void>;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { ensureTerminalHost, resolveTerminalHostEntryPath, resolveTerminalHostPath } from "./ensure-terminal-host.js";
|
|
2
|
-
export { readResidentTabLaunchSettings } from "./settings.js";
|
|
3
|
-
export { selectResidentHost } from "./routing.js";
|
|
4
|
-
export { readResidentReleaseHolds } from "./release-holds.js";
|
|
5
|
-
export { runTerminalHostMaintenance } from "./maintenance.js";
|
|
6
|
-
export { DOCTOR_MAX_BYTES, writeDoctorBundle } from "./doctor.js";
|
|
7
|
-
/** Load native continuity inspection only when a caller is preparing client activation. */
|
|
8
|
-
export async function assertResidentContinuity(options) {
|
|
9
|
-
await (await import("./continuity.js")).assertResidentContinuity(options);
|
|
10
|
-
}
|