@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,20 +1,16 @@
|
|
|
1
|
-
export { certifyMaterializedRelease,
|
|
2
|
-
export { selectCohortLaunch } from "./cohort-selection.js";
|
|
1
|
+
export { certifyMaterializedRelease, recordParentCertifiedRelease, releaseEnvironment, runBootstrap, } from "./bootstrap.js";
|
|
3
2
|
export { selectOrdinaryLaunchReleaseId } from "./ordinary-launch-selection.js";
|
|
4
|
-
export {
|
|
3
|
+
export { ReleaseStateStore, RELEASE_STATE_SCHEMA, RELEASE_RETENTION_MS, emptyState, planProtectedReleases, withinRetention } from "./release-state.js";
|
|
5
4
|
export { DEPENDENCY_LAYER_MANIFEST, DEPENDENCY_LAYER_SCHEMA, RUNTIME_PAYLOAD_INVENTORY, dependencyLayerCertificationPath, dependencyReference, generateDependencyRuntimePayload, legacyDependencyLayerCertificationPath, materializeDependencyLayer, readCertifiedDependencyLayer, selectDependencyRuntimePayload, selectPublishedDependencyRuntimePayload, verifyDependencyLayer, } from "./dependency-layer.js";
|
|
6
|
-
export {
|
|
7
|
-
export { currentSupervisorStartIdentity, observeSupervisorProcess, supervisorProcessState } from "./supervisor-identity.js";
|
|
8
|
-
export { withEndpointLock } from "./endpoint-lock.js";
|
|
9
|
-
export { cleanupProvenIdleOwner, cleanupVerifiedOwner, processIsAlive } from "./process-cleanup.js";
|
|
5
|
+
export { processIsAlive } from "./process-liveness.js";
|
|
10
6
|
export { PRODUCT_PACKAGE_NAME, createReleaseIdentity, deriveReleaseIdentity, digestManifestFiles, discoverReleasePayload, packageRootFromModule, releaseFileIdentity, resolveWithin, } from "./release.js";
|
|
11
|
-
export {
|
|
7
|
+
export { prepareReleaseCleanup, runBoundedReleaseCleanup, runReleaseCleanupWorker, scheduleReleaseCleanup } from "./release-gc.js";
|
|
12
8
|
export { RELEASE_MANIFEST_FILENAME, ReleaseRepairUnavailableError, assertCertifiedFilesPresent, assertImmutableExecutionRoot, consumeMaterializationProof, materializeRelease, readCertifiedReleaseManifest, readMaterializedRelease, repairMaterializedRelease, resolveReleaseEntryPoint, verifyMaterializedRelease, } from "./release-store.js";
|
|
13
9
|
export { createRestartSeal, readRestartCertifiedRelease, releaseCertificationDocument, restartSealDigest } from "./restart-certification.js";
|
|
14
10
|
export { STABLE_RELEASE_SCHEMA, createStableReleaseEvidence, verifyStableRegistry } from "./stable-release.js";
|
|
15
|
-
export { PACKAGE_UNLOCK_PATIENCE_MS,
|
|
16
|
-
export { UPDATE_ACTIVATION_CONTRACT, UPDATE_ACTIVATION_ENTRY, UPDATE_ACTIVATION_MANIFEST_FIELD,
|
|
17
|
-
export {
|
|
11
|
+
export { PACKAGE_UNLOCK_PATIENCE_MS, UPDATE_ALREADY_RUNNING_EXIT_CODE, PRODUCT_PACKAGE, assertUpdatePerformanceBudget, createNpmProcessRunner, createUpdateLifecycleCoordinator, isPackageLockError, lockedPackageDiagnostic, renderUpdateProgressBar, runSelfUpdate, } from "./update.js";
|
|
12
|
+
export { UPDATE_ACTIVATION_CONTRACT, UPDATE_ACTIVATION_ENTRY, UPDATE_ACTIVATION_MANIFEST_FIELD, activateInstalledRelease, delegateActivation, readActivationContracts, runActivationEntry, } from "./update-activation.js";
|
|
13
|
+
export { selectUpdateLaunchRelease } from "./update-launch.js";
|
|
18
14
|
export { UPDATE_RECOVERY_SCHEMA, cleanupUpdateRecoveryCapsules, inspectUpdateLauncherSet, npmPrefixForGlobalRoot, prepareUpdateRecoveryCapsule, readUpdateRecoveryCapsule, removeUpdateRecoveryCapsule, resolveNpmCli, runProtectedPackageReplacement, updateLauncherPaths, updateNpmInstallArguments, } from "./update-recovery.js";
|
|
19
15
|
export { UPDATE_JOURNAL_SCHEMA, UpdateTransactionStore } from "./update-transaction.js";
|
|
20
16
|
export { warmMaterializedRelease } from "./warmup.js";
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
/** Published release channels: stable `X.Y.Z` on dist-tag `latest`, development `X.Y.Z-dev.N` on `next`. */
|
|
2
2
|
export type ReleaseChannel = "stable" | "development";
|
|
3
|
-
export type StartupUpdateMode = "auto" | "
|
|
4
|
-
export interface DistTagVersions {
|
|
5
|
-
readonly release: string | null;
|
|
6
|
-
readonly develop: string | null;
|
|
7
|
-
readonly error: string | null;
|
|
8
|
-
}
|
|
3
|
+
export type StartupUpdateMode = "auto" | "manual";
|
|
9
4
|
export type RegistryFetcher = (url: string) => Promise<{
|
|
10
5
|
readonly ok: boolean;
|
|
11
6
|
readonly status: number;
|
|
@@ -19,15 +14,13 @@ export interface AvailableRelease {
|
|
|
19
14
|
/** The GitHub Release page; development releases have none. */
|
|
20
15
|
readonly changelogUrl: string | null;
|
|
21
16
|
}
|
|
22
|
-
export declare const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org";
|
|
23
17
|
export declare const UPDATE_CHECK_INTERVAL_MS: number;
|
|
24
|
-
export declare const NOTIFY_CHECK_INTERVAL_MS: number;
|
|
25
18
|
/** One published version with the pull request its manifest records, when it records one. */
|
|
26
19
|
export interface PublishedVersion {
|
|
27
20
|
readonly version: string;
|
|
28
21
|
readonly pullRequest: number | null;
|
|
29
22
|
}
|
|
30
|
-
|
|
23
|
+
interface PublishedVersions {
|
|
31
24
|
readonly versions: readonly PublishedVersion[];
|
|
32
25
|
readonly error: string | null;
|
|
33
26
|
}
|
|
@@ -38,23 +31,14 @@ export interface PublishedVersions {
|
|
|
38
31
|
export declare function releaseChannelOf(version: string): ReleaseChannel | null;
|
|
39
32
|
/** True only when both versions are valid semver and the candidate sorts strictly above the current one. */
|
|
40
33
|
export declare function isNewerRelease(candidate: string, current: string): boolean;
|
|
41
|
-
export declare function distTagsUrl(registry?: string): string;
|
|
42
|
-
/** Read `latest` (required) and `next` (optional) from a dist-tags object. */
|
|
43
|
-
export declare function parseDistTags(metadata: unknown, source: string): DistTagVersions;
|
|
44
|
-
export declare function queryRegistryDistTags(fetcher: RegistryFetcher, registry?: string): Promise<DistTagVersions>;
|
|
45
|
-
export declare function packageDocumentUrl(registry?: string): string;
|
|
46
|
-
/** The pull request a published or installed manifest records under `publication.pullRequest`, when valid. */
|
|
47
|
-
export declare function recordedPullRequest(manifest: unknown): number | null;
|
|
48
34
|
/**
|
|
49
35
|
* Every published version with its recorded pull request, read from the registry's full package
|
|
50
36
|
* document: its per-version manifests keep the publication metadata that version lists and the
|
|
51
37
|
* abbreviated install document leave out.
|
|
52
38
|
*/
|
|
53
39
|
export declare function queryPublishedVersions(fetcher: RegistryFetcher, registry?: string): Promise<PublishedVersions>;
|
|
54
|
-
export declare function parsePublishedVersions(document: unknown): PublishedVersions;
|
|
55
40
|
/** Forget the startup release check so the next interactive launch asks the registry again. */
|
|
56
41
|
export declare function invalidateReleaseCheckCache(configDir: string): Promise<void>;
|
|
57
|
-
export declare function unavailableDistTags(error: string): DistTagVersions;
|
|
58
42
|
export declare function createRegistryFetcher(timeoutMs: number, signal?: AbortSignal): RegistryFetcher;
|
|
59
43
|
export interface StartupReleaseCheckOptions {
|
|
60
44
|
readonly runningVersion: string;
|
|
@@ -78,4 +62,4 @@ export declare function startupReleaseCheckSkipReason(options: StartupReleaseChe
|
|
|
78
62
|
* answer replaces the cache. Every failure resolves to null: the notice is best-effort.
|
|
79
63
|
*/
|
|
80
64
|
export declare function checkForNewerRelease(options: StartupReleaseCheckOptions): Promise<AvailableRelease | null>;
|
|
81
|
-
export
|
|
65
|
+
export {};
|
|
@@ -4,9 +4,8 @@ import { join } from "node:path";
|
|
|
4
4
|
import { gt, prerelease, valid as validSemver } from "semver";
|
|
5
5
|
import lockfile from "proper-lockfile";
|
|
6
6
|
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
7
|
-
|
|
7
|
+
const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org";
|
|
8
8
|
export const UPDATE_CHECK_INTERVAL_MS = 15 * 60_000;
|
|
9
|
-
export const NOTIFY_CHECK_INTERVAL_MS = 24 * 60 * 60_000;
|
|
10
9
|
const STARTUP_FETCH_TIMEOUT_MS = 3_000;
|
|
11
10
|
const CACHE_FILENAME = "update-check.json";
|
|
12
11
|
const CACHE_VERSION = 2;
|
|
@@ -31,11 +30,11 @@ export function isNewerRelease(candidate, current) {
|
|
|
31
30
|
const right = validSemver(current);
|
|
32
31
|
return left !== null && right !== null && gt(left, right);
|
|
33
32
|
}
|
|
34
|
-
|
|
33
|
+
function distTagsUrl(registry = DEFAULT_NPM_REGISTRY) {
|
|
35
34
|
return `${registry.replace(/\/+$/u, "")}/-/package/${encodeURIComponent(PRODUCT_TEXT.packageName)}/dist-tags`;
|
|
36
35
|
}
|
|
37
36
|
/** Read `latest` (required) and `next` (optional) from a dist-tags object. */
|
|
38
|
-
|
|
37
|
+
function parseDistTags(metadata, source) {
|
|
39
38
|
if (typeof metadata !== "object" || metadata === null || Array.isArray(metadata)) {
|
|
40
39
|
return unavailableDistTags(`${source} returned a non-object dist-tags value`);
|
|
41
40
|
}
|
|
@@ -49,7 +48,7 @@ export function parseDistTags(metadata, source) {
|
|
|
49
48
|
return unavailableDistTags(errorMessage(error));
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
|
-
|
|
51
|
+
async function queryRegistryDistTags(fetcher, registry) {
|
|
53
52
|
try {
|
|
54
53
|
const response = await fetcher(distTagsUrl(registry));
|
|
55
54
|
if (!response.ok)
|
|
@@ -60,11 +59,11 @@ export async function queryRegistryDistTags(fetcher, registry) {
|
|
|
60
59
|
return unavailableDistTags(errorMessage(error));
|
|
61
60
|
}
|
|
62
61
|
}
|
|
63
|
-
|
|
62
|
+
function packageDocumentUrl(registry = DEFAULT_NPM_REGISTRY) {
|
|
64
63
|
return `${registry.replace(/\/+$/u, "")}/${encodeURIComponent(PRODUCT_TEXT.packageName)}`;
|
|
65
64
|
}
|
|
66
65
|
/** The pull request a published or installed manifest records under `publication.pullRequest`, when valid. */
|
|
67
|
-
|
|
66
|
+
function recordedPullRequest(manifest) {
|
|
68
67
|
if (typeof manifest !== "object" || manifest === null)
|
|
69
68
|
return null;
|
|
70
69
|
const publication = manifest.publication;
|
|
@@ -92,7 +91,7 @@ export async function queryPublishedVersions(fetcher, registry) {
|
|
|
92
91
|
return { versions: [], error: errorMessage(error) };
|
|
93
92
|
}
|
|
94
93
|
}
|
|
95
|
-
|
|
94
|
+
function parsePublishedVersions(document) {
|
|
96
95
|
if (typeof document !== "object" || document === null || Array.isArray(document)) {
|
|
97
96
|
return { versions: [], error: "registry returned a non-object package document" };
|
|
98
97
|
}
|
|
@@ -109,7 +108,7 @@ export function parsePublishedVersions(document) {
|
|
|
109
108
|
export async function invalidateReleaseCheckCache(configDir) {
|
|
110
109
|
await withCacheLock(configDir, async () => { await rm(join(configDir, CACHE_FILENAME), { force: true }); });
|
|
111
110
|
}
|
|
112
|
-
|
|
111
|
+
function unavailableDistTags(error) {
|
|
113
112
|
return { release: null, develop: null, error };
|
|
114
113
|
}
|
|
115
114
|
export function createRegistryFetcher(timeoutMs, signal) {
|
|
@@ -127,7 +126,7 @@ export function startupReleaseCheckSkipReason(options) {
|
|
|
127
126
|
return "ci";
|
|
128
127
|
if (!options.interactive)
|
|
129
128
|
return "not-interactive";
|
|
130
|
-
if (options.settingMode === "
|
|
129
|
+
if (options.settingMode === "manual")
|
|
131
130
|
return "disabled-by-setting";
|
|
132
131
|
if (releaseChannelOf(options.runningVersion) === null)
|
|
133
132
|
return "unpublished-version";
|
|
@@ -146,7 +145,7 @@ export async function checkForNewerRelease(options) {
|
|
|
146
145
|
const now = options.now ?? Date.now;
|
|
147
146
|
const cachePath = join(options.configDir, CACHE_FILENAME);
|
|
148
147
|
try {
|
|
149
|
-
const interval =
|
|
148
|
+
const interval = UPDATE_CHECK_INTERVAL_MS;
|
|
150
149
|
const latest = await withCacheLock(options.configDir, async () => {
|
|
151
150
|
if (options.signal?.aborted)
|
|
152
151
|
return null;
|
|
@@ -171,7 +170,7 @@ export async function checkForNewerRelease(options) {
|
|
|
171
170
|
return null;
|
|
172
171
|
}
|
|
173
172
|
}
|
|
174
|
-
|
|
173
|
+
function availableRelease(channel, version) {
|
|
175
174
|
return {
|
|
176
175
|
channel,
|
|
177
176
|
version,
|
|
@@ -8,7 +8,7 @@ interface ApprovedOrdinaryLaunchRelease extends OrdinaryLaunchRelease {
|
|
|
8
8
|
/**
|
|
9
9
|
* Ordinary launch has no rollback authority: it may advance to its installed package, but an
|
|
10
10
|
* older package installation must follow a newer approved active release instead of moving the
|
|
11
|
-
* shared selector backward. Explicit update/rollback uses
|
|
11
|
+
* shared selector backward. Explicit update/rollback uses ReleaseStateStore.activate directly.
|
|
12
12
|
*/
|
|
13
13
|
export declare function selectOrdinaryLaunchReleaseId(candidate: OrdinaryLaunchRelease, active?: ApprovedOrdinaryLaunchRelease): string;
|
|
14
14
|
export {};
|
|
@@ -2,7 +2,7 @@ import { compare, valid as validSemver } from "semver";
|
|
|
2
2
|
/**
|
|
3
3
|
* Ordinary launch has no rollback authority: it may advance to its installed package, but an
|
|
4
4
|
* older package installation must follow a newer approved active release instead of moving the
|
|
5
|
-
* shared selector backward. Explicit update/rollback uses
|
|
5
|
+
* shared selector backward. Explicit update/rollback uses ReleaseStateStore.activate directly.
|
|
6
6
|
*/
|
|
7
7
|
export function selectOrdinaryLaunchReleaseId(candidate, active) {
|
|
8
8
|
if (!active || active.approval !== "approved")
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Whether a process with this id exists; a permission refusal still proves it is running. */
|
|
2
|
+
export function processIsAlive(pid) {
|
|
3
|
+
if (!Number.isSafeInteger(pid) || pid <= 0)
|
|
4
|
+
return false;
|
|
5
|
+
try {
|
|
6
|
+
process.kill(pid, 0);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
return error instanceof Error && "code" in error && error.code === "EPERM";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { rename, rm } from "node:fs/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { ReleaseStateStore, type OrphanReleaseDisposition } from "./release-state.js";
|
|
3
3
|
import type { ProductPaths } from "../lifecycle/index.js";
|
|
4
4
|
import { UpdateTransactionStore } from "./update-transaction.js";
|
|
5
|
-
import { type ResidentReleaseHoldReport } from "../resident-tabs/index.js";
|
|
6
5
|
export interface ReleaseCleanupLimits {
|
|
7
6
|
readonly maxItems: number;
|
|
8
7
|
readonly maxDurationMs: number;
|
|
@@ -13,7 +12,15 @@ export interface ReleaseCleanupOperations {
|
|
|
13
12
|
readonly remove?: typeof rm;
|
|
14
13
|
}
|
|
15
14
|
export interface ReleaseCleanupOptions {
|
|
16
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Releases the command that started cleanup runs from. Defaults to the release named by this
|
|
17
|
+
* process's launch context, so a command never collects the files it is running.
|
|
18
|
+
*/
|
|
19
|
+
readonly ownReleaseIds?: readonly string[];
|
|
20
|
+
/** Age window measured from approval; defaults to seven days. */
|
|
21
|
+
readonly retentionMs?: number;
|
|
22
|
+
/** Wall clock the retention window is measured against; `now` only paces a batch. */
|
|
23
|
+
readonly wallClock?: () => number;
|
|
17
24
|
readonly transactionStore?: Pick<UpdateTransactionStore, "read">;
|
|
18
25
|
readonly limits?: Partial<ReleaseCleanupLimits>;
|
|
19
26
|
readonly candidateAgeMs?: number;
|
|
@@ -22,8 +29,6 @@ export interface ReleaseCleanupOptions {
|
|
|
22
29
|
readonly operations?: ReleaseCleanupOperations;
|
|
23
30
|
/** Process-start seam for scheduler and continuation tests. */
|
|
24
31
|
readonly workerSpawner?: (entry: string, environment: NodeJS.ProcessEnv) => Promise<void>;
|
|
25
|
-
/** Resident-tab inspection seam; the default asks a verified installed terminal host. */
|
|
26
|
-
readonly residentHolds?: (dataDir: string, releaseRoots: readonly string[]) => Promise<ResidentReleaseHoldReport>;
|
|
27
32
|
}
|
|
28
33
|
export interface ReleaseCleanupWorkerOptions {
|
|
29
34
|
readonly cleanup?: ReleaseCleanupOptions;
|
|
@@ -53,11 +58,11 @@ interface DiscoveredCleanupInputs {
|
|
|
53
58
|
}[];
|
|
54
59
|
}
|
|
55
60
|
/**
|
|
56
|
-
* Reconcile
|
|
61
|
+
* Reconcile age-based retention under the release-state lock and durably detach obsolete releases.
|
|
57
62
|
* This operation intentionally reads only manifests and directory metadata, never payload bytes.
|
|
58
63
|
*/
|
|
59
|
-
export declare function prepareReleaseCleanup(dataDir: string,
|
|
60
|
-
readonly store:
|
|
64
|
+
export declare function prepareReleaseCleanup(dataDir: string, _paths?: ProductPaths, options?: ReleaseCleanupOptions): Promise<{
|
|
65
|
+
readonly store: ReleaseStateStore;
|
|
61
66
|
readonly discovered: DiscoveredCleanupInputs;
|
|
62
67
|
}>;
|
|
63
68
|
/** Run a bounded, restart-safe physical cleanup pass over detached releases and abandoned artifacts. */
|
|
@@ -69,6 +74,4 @@ export declare function runBoundedReleaseCleanup(dataDir: string, paths?: Produc
|
|
|
69
74
|
export declare function scheduleReleaseCleanup(dataDir: string, paths: ProductPaths, options?: ReleaseCleanupOptions): Promise<void>;
|
|
70
75
|
/** Entry used by the private cleanup executable shipped in every immutable release. */
|
|
71
76
|
export declare function runReleaseCleanupWorker(environment?: NodeJS.ProcessEnv, workerOptions?: ReleaseCleanupWorkerOptions): Promise<ReleaseCleanupResult>;
|
|
72
|
-
/** Compatibility helper: detach one requested release and execute a one-item pass. */
|
|
73
|
-
export declare function collectRelease(store: CohortStateStore, dataDir: string, releaseId: string, externalReferences: readonly string[], paths?: ProductPaths): Promise<void>;
|
|
74
77
|
export {};
|
|
@@ -3,8 +3,7 @@ import { spawn } from "node:child_process";
|
|
|
3
3
|
import { lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat } from "node:fs/promises";
|
|
4
4
|
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import {
|
|
7
|
-
import { liveReleaseIds } from "./endpoints.js";
|
|
6
|
+
import { ReleaseStateStore, } from "./release-state.js";
|
|
8
7
|
import { resolveProductPaths } from "../lifecycle/index.js";
|
|
9
8
|
import { RELEASE_MANIFEST_FILENAME } from "./release-store.js";
|
|
10
9
|
import { DEPENDENCY_LAYER_MANIFEST, readCertifiedDependencyLayer } from "./dependency-layer.js";
|
|
@@ -14,24 +13,25 @@ import { UpdateTransactionStore } from "./update-transaction.js";
|
|
|
14
13
|
import { cleanupUpdateRecoveryCapsules } from "./update-recovery.js";
|
|
15
14
|
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
16
15
|
import { collectCompileCaches, startupCompileCachePath } from "../startup/index.js";
|
|
17
|
-
import {
|
|
16
|
+
import { readLaunchContext } from "../launch-context/index.js";
|
|
17
|
+
import { processIsAlive } from "./process-liveness.js";
|
|
18
18
|
const DEFAULT_CANDIDATE_AGE_MS = 60 * 60 * 1_000;
|
|
19
19
|
const DEFAULT_LIMITS = { maxItems: 8, maxDurationMs: 2_000, concurrency: 1 };
|
|
20
20
|
const DEFAULT_WORKER_DURATION_MS = 10 * 60 * 1_000;
|
|
21
21
|
const DEFAULT_NO_PROGRESS_BATCHES = 5;
|
|
22
22
|
const DEFAULT_RETRY_DELAY_MS = 500;
|
|
23
|
-
const
|
|
23
|
+
const WORKER_KEEP_ENV = "RELEASE_CLEANUP_KEEP";
|
|
24
24
|
const WORKER_RUN_ID_ENV = "RELEASE_CLEANUP_RUN_ID";
|
|
25
25
|
const WORKER_LEASE_FILENAME = "release-cleanup-worker.lock";
|
|
26
26
|
/**
|
|
27
|
-
* Reconcile
|
|
27
|
+
* Reconcile age-based retention under the release-state lock and durably detach obsolete releases.
|
|
28
28
|
* This operation intentionally reads only manifests and directory metadata, never payload bytes.
|
|
29
29
|
*/
|
|
30
|
-
export async function prepareReleaseCleanup(dataDir,
|
|
31
|
-
const store = new
|
|
30
|
+
export async function prepareReleaseCleanup(dataDir, _paths, options = {}) {
|
|
31
|
+
const store = new ReleaseStateStore(dataDir);
|
|
32
32
|
const discovered = await discoverCleanupInputs(dataDir, store, options);
|
|
33
33
|
const transactionStore = options.transactionStore ?? new UpdateTransactionStore(dataDir);
|
|
34
|
-
await store.reconcileRetention(async () => await protectionInputs(
|
|
34
|
+
await store.reconcileRetention(async () => await protectionInputs(transactionStore, options), discovered.orphans);
|
|
35
35
|
for (const diagnostic of discovered.diagnostics.slice(0, 16)) {
|
|
36
36
|
await store.recordCleanupFailure(diagnostic.releaseId, diagnostic.stage, diagnostic.error);
|
|
37
37
|
}
|
|
@@ -42,7 +42,7 @@ export async function runBoundedReleaseCleanup(dataDir, paths, options = {}) {
|
|
|
42
42
|
const now = options.now ?? Date.now;
|
|
43
43
|
const limits = normalizeLimits(options.limits);
|
|
44
44
|
const { store, discovered } = await prepareReleaseCleanup(dataDir, paths, options);
|
|
45
|
-
// Performance: The physical-work allowance begins after discovery
|
|
45
|
+
// Performance: The physical-work allowance begins after discovery and the
|
|
46
46
|
// durable reconciliation write. A slow preparation phase must not starve every worker invocation.
|
|
47
47
|
const startedAt = now();
|
|
48
48
|
const initial = await store.read();
|
|
@@ -67,7 +67,7 @@ export async function runBoundedReleaseCleanup(dataDir, paths, options = {}) {
|
|
|
67
67
|
pendingOffset += size;
|
|
68
68
|
maximum -= size;
|
|
69
69
|
attempted += batch.length;
|
|
70
|
-
const results = await Promise.all(batch.map(async (disposition) => await collectDisposition(store, dataDir,
|
|
70
|
+
const results = await Promise.all(batch.map(async (disposition) => await collectDisposition(store, dataDir, disposition, options)));
|
|
71
71
|
completed += results.filter(Boolean).length;
|
|
72
72
|
guaranteed = false;
|
|
73
73
|
}
|
|
@@ -78,7 +78,7 @@ export async function runBoundedReleaseCleanup(dataDir, paths, options = {}) {
|
|
|
78
78
|
maximum -= 1;
|
|
79
79
|
const certificationId = certificationReleaseId(artifact);
|
|
80
80
|
if (certificationId !== null) {
|
|
81
|
-
const inputs = await protectionInputs(
|
|
81
|
+
const inputs = await protectionInputs(transactionStore, options);
|
|
82
82
|
if (isProtectedDetachedRelease(await store.read(), inputs, certificationId))
|
|
83
83
|
continue;
|
|
84
84
|
}
|
|
@@ -137,7 +137,7 @@ export async function scheduleReleaseCleanup(dataDir, paths, options = {}) {
|
|
|
137
137
|
...process.env,
|
|
138
138
|
[PRODUCT_IDENTITY.environment.dataDir]: dataDir,
|
|
139
139
|
[PRODUCT_IDENTITY.environment.runtimeDir]: paths.runtimeDir,
|
|
140
|
-
[
|
|
140
|
+
[WORKER_KEEP_ENV]: JSON.stringify(ownReleaseIds(options)),
|
|
141
141
|
[WORKER_RUN_ID_ENV]: runId,
|
|
142
142
|
};
|
|
143
143
|
try {
|
|
@@ -152,13 +152,13 @@ export async function scheduleReleaseCleanup(dataDir, paths, options = {}) {
|
|
|
152
152
|
/** Entry used by the private cleanup executable shipped in every immutable release. */
|
|
153
153
|
export async function runReleaseCleanupWorker(environment = process.env, workerOptions = {}) {
|
|
154
154
|
const paths = resolveProductPaths(environment);
|
|
155
|
-
const store = new
|
|
155
|
+
const store = new ReleaseStateStore(paths.dataDir);
|
|
156
156
|
const runId = environment[WORKER_RUN_ID_ENV] ?? randomUUID();
|
|
157
157
|
const now = workerOptions.now ?? Date.now;
|
|
158
158
|
const sleep = workerOptions.sleep ?? (async (durationMs) => await new Promise(resolvePromise => setTimeout(resolvePromise, durationMs)));
|
|
159
159
|
const cleanupOptions = {
|
|
160
160
|
...workerOptions.cleanup,
|
|
161
|
-
|
|
161
|
+
ownReleaseIds: workerOptions.cleanup?.ownReleaseIds ?? parseWorkerKeep(environment[WORKER_KEEP_ENV]),
|
|
162
162
|
};
|
|
163
163
|
const summary = { batches: 0, attempted: 0, completed: 0, remaining: Object.keys((await store.read()).cleanup.pending).length };
|
|
164
164
|
let lease = null;
|
|
@@ -227,24 +227,10 @@ export async function runReleaseCleanupWorker(environment = process.env, workerO
|
|
|
227
227
|
durationMs: Math.max(0, now() - startedAt),
|
|
228
228
|
};
|
|
229
229
|
}
|
|
230
|
-
|
|
231
|
-
export async function collectRelease(store, dataDir, releaseId, externalReferences, paths) {
|
|
232
|
-
const holds = externalReferences.map(referenced => ({ authority: "migration", releaseId: referenced }));
|
|
233
|
-
const state = await store.read();
|
|
234
|
-
if (!state.releases[releaseId])
|
|
235
|
-
throw new Error(`unknown release ${releaseId}`);
|
|
236
|
-
await store.reconcileRetention(async () => ({ ...(await protectionInputs(dataDir, paths, new UpdateTransactionStore(dataDir), holds)) }));
|
|
237
|
-
const disposition = (await store.read()).cleanup.pending[releaseId];
|
|
238
|
-
if (!disposition)
|
|
239
|
-
throw new Error(`release ${releaseId} is still referenced and cannot be collected`);
|
|
240
|
-
const removed = await collectDisposition(store, dataDir, paths, disposition, { externalHolds: holds, limits: { maxItems: 1 } });
|
|
241
|
-
if (!removed)
|
|
242
|
-
throw new Error(`release ${releaseId} could not be collected`);
|
|
243
|
-
}
|
|
244
|
-
async function collectDisposition(store, dataDir, paths, disposition, options) {
|
|
230
|
+
async function collectDisposition(store, dataDir, disposition, options) {
|
|
245
231
|
const releaseId = disposition.release.releaseId;
|
|
246
232
|
try {
|
|
247
|
-
const inputs = await protectionInputs(
|
|
233
|
+
const inputs = await protectionInputs(options.transactionStore ?? new UpdateTransactionStore(dataDir), options);
|
|
248
234
|
const current = await store.read();
|
|
249
235
|
if (isProtectedDetachedRelease(current, inputs, releaseId))
|
|
250
236
|
return false;
|
|
@@ -285,67 +271,30 @@ async function collectDisposition(store, dataDir, paths, disposition, options) {
|
|
|
285
271
|
function isProtectedDetachedRelease(state, inputs, releaseId) {
|
|
286
272
|
const selected = [state.references.active, state.references.pending, state.references.approved, state.references.rollback]
|
|
287
273
|
.some(reference => reference === releaseId);
|
|
274
|
+
// Concurrency: a launch may have recorded the same release again after it was detached.
|
|
288
275
|
return selected
|
|
289
|
-
||
|
|
290
|
-
|| (inputs.
|
|
276
|
+
|| state.releases[releaseId] !== undefined
|
|
277
|
+
|| (inputs.ownReleaseIds ?? []).includes(releaseId)
|
|
291
278
|
|| (inputs.transaction?.status === "active" && inputs.transaction.priorActiveReleaseId === releaseId);
|
|
292
279
|
}
|
|
293
|
-
async function protectionInputs(
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
transactionStore.read(),
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
280
|
+
async function protectionInputs(transactionStore, options) {
|
|
281
|
+
return {
|
|
282
|
+
ownReleaseIds: ownReleaseIds(options),
|
|
283
|
+
transaction: transactionReference(await transactionStore.read()),
|
|
284
|
+
now: (options.wallClock ?? Date.now)(),
|
|
285
|
+
...(options.retentionMs === undefined ? {} : { retentionMs: options.retentionMs }),
|
|
286
|
+
};
|
|
300
287
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
...Object.values(state.releases),
|
|
310
|
-
...Object.values(state.cleanup.pending).map(disposition => disposition.release),
|
|
311
|
-
];
|
|
312
|
-
const preferred = [state.references.active, state.references.rollback]
|
|
313
|
-
.flatMap(id => id && state.releases[id] ? [state.releases[id].releaseRoot] : []);
|
|
314
|
-
const roots = [...new Set([...preferred, ...Object.values(state.releases).map(record => record.releaseRoot)])];
|
|
315
|
-
const report = await (reader ?? ((directory, releaseRoots) => readResidentReleaseHolds({ dataDir: directory, releaseRoots })))(dataDir, roots);
|
|
316
|
-
const everything = () => [...new Set(records.map(record => record.releaseId))].map(releaseId => ({ authority: "resident", releaseId }));
|
|
317
|
-
if (!report.complete)
|
|
318
|
-
return everything();
|
|
319
|
-
if (report.releaseRoots.length === 0)
|
|
288
|
+
function ownReleaseIds(options) {
|
|
289
|
+
if (options.ownReleaseIds !== undefined)
|
|
290
|
+
return options.ownReleaseIds;
|
|
291
|
+
try {
|
|
292
|
+
const own = readLaunchContext(process.env).releaseId;
|
|
293
|
+
return own === undefined ? [] : [own];
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
320
296
|
return [];
|
|
321
|
-
|
|
322
|
-
const byRoot = new Map();
|
|
323
|
-
for (const record of records) {
|
|
324
|
-
const canonical = await realpath(record.releaseRoot).catch(() => record.releaseRoot);
|
|
325
|
-
byRoot.set(comparablePath(canonical), record.releaseId);
|
|
326
|
-
}
|
|
327
|
-
const directory = await realpath(resolve(dataDir, "releases")).catch(() => null);
|
|
328
|
-
if (directory === null)
|
|
329
|
-
return everything();
|
|
330
|
-
const store = comparablePath(directory);
|
|
331
|
-
const holds = new Set();
|
|
332
|
-
for (const root of report.releaseRoots) {
|
|
333
|
-
// Security: an unresolved live root may alias managed content; uncertainty must retain it.
|
|
334
|
-
const canonical = await realpath(root).catch(() => null);
|
|
335
|
-
if (canonical === null)
|
|
336
|
-
return everything();
|
|
337
|
-
const key = comparablePath(canonical);
|
|
338
|
-
const releaseId = byRoot.get(key);
|
|
339
|
-
if (releaseId)
|
|
340
|
-
holds.add(releaseId);
|
|
341
|
-
else if (key.startsWith(`${store}${sep}`))
|
|
342
|
-
return everything();
|
|
343
|
-
}
|
|
344
|
-
return [...holds].sort().map(releaseId => ({ authority: "resident", releaseId }));
|
|
345
|
-
}
|
|
346
|
-
function comparablePath(path) {
|
|
347
|
-
const absolute = resolve(path);
|
|
348
|
-
return process.platform === "win32" ? absolute.toLowerCase() : absolute;
|
|
297
|
+
}
|
|
349
298
|
}
|
|
350
299
|
function transactionReference(transaction) {
|
|
351
300
|
return transaction === null ? null : { status: transaction.status, priorActiveReleaseId: transaction.priorActiveReleaseId };
|
|
@@ -779,25 +728,12 @@ async function readWorkerLease(path) {
|
|
|
779
728
|
return null;
|
|
780
729
|
}
|
|
781
730
|
}
|
|
782
|
-
function
|
|
783
|
-
try {
|
|
784
|
-
process.kill(pid, 0);
|
|
785
|
-
return true;
|
|
786
|
-
}
|
|
787
|
-
catch (error) {
|
|
788
|
-
return error instanceof Error && "code" in error && error.code === "EPERM";
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
function parseWorkerHolds(value) {
|
|
731
|
+
function parseWorkerKeep(value) {
|
|
792
732
|
if (!value)
|
|
793
733
|
return [];
|
|
794
734
|
try {
|
|
795
735
|
const parsed = JSON.parse(value);
|
|
796
|
-
|
|
797
|
-
return [];
|
|
798
|
-
return parsed.filter((hold) => Boolean(hold) && typeof hold === "object"
|
|
799
|
-
&& ["agent", "migration", "resident"].includes(hold.authority)
|
|
800
|
-
&& typeof hold.releaseId === "string");
|
|
736
|
+
return Array.isArray(parsed) ? parsed.filter((id) => typeof id === "string" && id.length > 0) : [];
|
|
801
737
|
}
|
|
802
738
|
catch {
|
|
803
739
|
return [];
|