@ai-agent-forge/agent-forge 0.86.7 → 0.88.0
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/CHANGELOG.md +45 -0
- package/README.md +10 -11
- package/dist/artifacts/artifact-store.d.ts.map +1 -1
- package/dist/artifacts/artifact-store.js +9 -5
- package/dist/artifacts/artifact-store.js.map +1 -1
- package/dist/bundle/.build-manifest.json +430 -413
- package/dist/bundle/chunks/{chunk-A7GUOX2H.js → chunk-6ZKDNZHA.js} +5 -1
- package/dist/bundle/chunks/chunk-HLJEVRWP.js +13 -0
- package/dist/bundle/chunks/chunk-YGHQME4V.js +1456 -0
- package/dist/bundle/chunks/image-resize-worker.js +12 -1
- package/dist/bundle/chunks/{virtual-modules-3IZ4MYSQ.js → virtual-modules-KZ5DRH7Q.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/client.js +1 -1
- package/dist/bundle/index.js +2 -2
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +231 -185
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts.map +1 -1
- package/dist/cli/auth-check.js +17 -4
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +15 -9
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +14 -7
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/experimental/command.d.ts.map +1 -1
- package/dist/cli/experimental/command.js +6 -5
- package/dist/cli/experimental/command.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +9 -8
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/plugin-manager-controller.d.ts.map +1 -1
- package/dist/cli/plugin-manager-controller.js +2 -1
- package/dist/cli/plugin-manager-controller.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +8 -5
- package/dist/cli/serve.js.map +1 -1
- package/dist/client/remote-session.d.ts.map +1 -1
- package/dist/client/remote-session.js +16 -9
- package/dist/client/remote-session.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -3
- package/dist/config.js.map +1 -1
- package/dist/core/agent-capability-contract.d.ts +0 -7
- package/dist/core/agent-capability-contract.d.ts.map +1 -1
- package/dist/core/agent-capability-contract.js +72 -68
- package/dist/core/agent-capability-contract.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-bash.js +5 -4
- package/dist/core/agent-session-bash.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts +6 -10
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +35 -133
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-context.d.ts.map +1 -1
- package/dist/core/agent-session-context.js +18 -13
- package/dist/core/agent-session-context.js.map +1 -1
- package/dist/core/agent-session-internal.d.ts +0 -6
- package/dist/core/agent-session-internal.d.ts.map +1 -1
- package/dist/core/agent-session-internal.js.map +1 -1
- package/dist/core/agent-session-model.d.ts.map +1 -1
- package/dist/core/agent-session-model.js +2 -1
- package/dist/core/agent-session-model.js.map +1 -1
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-retry.js +3 -3
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +7 -6
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-tools.d.ts.map +1 -1
- package/dist/core/agent-session-tools.js +3 -2
- package/dist/core/agent-session-tools.js.map +1 -1
- package/dist/core/agent-session.d.ts +40 -22
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +147 -67
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js +11 -5
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +9 -6
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +2 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/embedded-sdk.d.ts.map +1 -1
- package/dist/core/embedded-sdk.js +10 -6
- package/dist/core/embedded-sdk.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +9 -4
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/extensions/agent-composition.d.ts.map +1 -1
- package/dist/core/extensions/agent-composition.js +26 -19
- package/dist/core/extensions/agent-composition.js.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.js +3 -2
- package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -1
- package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-compaction-policy.js +0 -34
- package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-lifecycle.js +20 -17
- package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
- package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-overflow-policy.js +2 -1
- package/dist/core/extensions/bootstrap-overflow-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-retry-policy.js +4 -3
- package/dist/core/extensions/bootstrap-retry-policy.js.map +1 -1
- package/dist/core/extensions/bootstrap-skills.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-skills.js +7 -6
- package/dist/core/extensions/bootstrap-skills.js.map +1 -1
- package/dist/core/extensions/bootstrap-tools.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-tools.js +2 -1
- package/dist/core/extensions/bootstrap-tools.js.map +1 -1
- package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
- package/dist/core/extensions/capability-plugin.js +37 -13
- package/dist/core/extensions/capability-plugin.js.map +1 -1
- package/dist/core/extensions/capability-runtime-events.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-events.js +17 -13
- package/dist/core/extensions/capability-runtime-events.js.map +1 -1
- package/dist/core/extensions/capability-runtime-guards.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-guards.js +16 -15
- package/dist/core/extensions/capability-runtime-guards.js.map +1 -1
- package/dist/core/extensions/capability-runtime-manifest.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-manifest.js +52 -30
- package/dist/core/extensions/capability-runtime-manifest.js.map +1 -1
- package/dist/core/extensions/capability-runtime-validation.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-validation.js +66 -65
- package/dist/core/extensions/capability-runtime-validation.js.map +1 -1
- package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime.js +147 -127
- package/dist/core/extensions/capability-runtime.js.map +1 -1
- package/dist/core/extensions/compaction-memory-failure-mode.d.ts.map +1 -1
- package/dist/core/extensions/compaction-memory-failure-mode.js +3 -2
- package/dist/core/extensions/compaction-memory-failure-mode.js.map +1 -1
- package/dist/core/extensions/context-strategy-binding.d.ts.map +1 -1
- package/dist/core/extensions/context-strategy-binding.js +7 -4
- package/dist/core/extensions/context-strategy-binding.js.map +1 -1
- package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
- package/dist/core/extensions/lifecycle-catalog.js +290 -279
- package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
- package/dist/core/extensions/lifecycle-delivery-queue.d.ts.map +1 -1
- package/dist/core/extensions/lifecycle-delivery-queue.js +3 -2
- package/dist/core/extensions/lifecycle-delivery-queue.js.map +1 -1
- package/dist/core/extensions/provider-failover.d.ts +7 -3
- package/dist/core/extensions/provider-failover.d.ts.map +1 -1
- package/dist/core/extensions/provider-failover.js +9 -8
- package/dist/core/extensions/provider-failover.js.map +1 -1
- package/dist/core/facade/coding-agent-facade.d.ts +6 -6
- package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
- package/dist/core/facade/coding-agent-facade.js +2 -3
- package/dist/core/facade/coding-agent-facade.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +2 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/i18n/index.d.ts +14 -0
- package/dist/core/i18n/index.d.ts.map +1 -0
- package/dist/core/i18n/index.js +67 -0
- package/dist/core/i18n/index.js.map +1 -0
- package/dist/core/i18n/locales/en/example.d.ts +7 -0
- package/dist/core/i18n/locales/en/example.d.ts.map +1 -0
- package/dist/core/i18n/locales/en/example.js +7 -0
- package/dist/core/i18n/locales/en/example.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/cli.d.ts +8 -0
- package/dist/core/i18n/locales/zh-cn/cli.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/cli.js +229 -0
- package/dist/core/i18n/locales/zh-cn/cli.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/common.d.ts +6 -0
- package/dist/core/i18n/locales/zh-cn/common.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/common.js +6 -0
- package/dist/core/i18n/locales/zh-cn/common.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts +13 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js +173 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts +12 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js +582 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js +55 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts +11 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +455 -0
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.js +191 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/example.d.ts +7 -0
- package/dist/core/i18n/locales/zh-cn/example.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/example.js +10 -0
- package/dist/core/i18n/locales/zh-cn/example.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/index.d.ts +2 -0
- package/dist/core/i18n/locales/zh-cn/index.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/index.js +41 -0
- package/dist/core/i18n/locales/zh-cn/index.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts +10 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js +267 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.d.ts +11 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.js +67 -0
- package/dist/core/i18n/locales/zh-cn/keybindings.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts +7 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.js +39 -0
- package/dist/core/i18n/locales/zh-cn/slash-commands.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts +10 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.js +15 -0
- package/dist/core/i18n/locales/zh-cn/tui-builtin.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts +13 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +102 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts +12 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js +286 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts +9 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js +79 -0
- package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts +8 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts.map +1 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.js +72 -0
- package/dist/core/i18n/locales/zh-cn/tui-self-owned.js.map +1 -0
- package/dist/core/keybindings.d.ts +15 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +18 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +5 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/model-config.d.ts +0 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +9 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +11 -7
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-install-host.d.ts.map +1 -1
- package/dist/core/package-install-host.js +4 -3
- package/dist/core/package-install-host.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +15 -10
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-resource-collection.d.ts.map +1 -1
- package/dist/core/package-resource-collection.js +2 -1
- package/dist/core/package-resource-collection.js.map +1 -1
- package/dist/core/package-source.d.ts.map +1 -1
- package/dist/core/package-source.js +3 -2
- package/dist/core/package-source.js.map +1 -1
- package/dist/core/provider-composer.d.ts +2 -2
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +29 -21
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +6 -2
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +15 -5
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/sdk.d.ts +27 -5
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +80 -55
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +5 -2
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-export.d.ts.map +1 -1
- package/dist/core/session-export.js +2 -1
- package/dist/core/session-export.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +39 -29
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts.map +1 -1
- package/dist/core/session-storage.js +3 -3
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/settings-manager.d.ts +20 -20
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +47 -59
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +53 -32
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +25 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +9 -4
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +4 -3
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +3 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +2 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +6 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/durable/durable-service.d.ts.map +1 -1
- package/dist/durable/durable-service.js +25 -18
- package/dist/durable/durable-service.js.map +1 -1
- package/dist/host/checkpoint-commit.d.ts.map +1 -1
- package/dist/host/checkpoint-commit.js +2 -1
- package/dist/host/checkpoint-commit.js.map +1 -1
- package/dist/host/manual-compaction.d.ts.map +1 -1
- package/dist/host/manual-compaction.js +2 -1
- package/dist/host/manual-compaction.js.map +1 -1
- package/dist/host/output-projection.d.ts +0 -13
- package/dist/host/output-projection.d.ts.map +1 -1
- package/dist/host/output-projection.js +16 -2
- package/dist/host/output-projection.js.map +1 -1
- package/dist/host/summary-retry.d.ts.map +1 -1
- package/dist/host/summary-retry.js +3 -2
- package/dist/host/summary-retry.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +97 -60
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/agents-view.js +18 -15
- package/dist/modes/interactive/components/agents-view.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +6 -5
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +12 -7
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +2 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +6 -5
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +9 -5
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +18 -15
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +2 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.js +5 -4
- package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
- package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-input.js +2 -1
- package/dist/modes/interactive/components/dialog-input.js.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.js +4 -3
- package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +11 -10
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +0 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -10
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +3 -2
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +12 -11
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js +6 -2
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +28 -16
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +10 -9
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.js +22 -13
- package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.js +27 -12
- package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
- package/dist/modes/interactive/components/queue-manager-selector.d.ts +60 -0
- package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/queue-manager-selector.js +166 -0
- package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +16 -14
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +43 -31
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -6
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +115 -120
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.js +5 -4
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +3 -2
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +4 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +14 -5
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +2 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +11 -4
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +8 -3
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-list.js +7 -6
- package/dist/modes/interactive/components/tree-list.js.map +1 -1
- package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-render.js +28 -23
- package/dist/modes/interactive/components/tree-render.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +9 -7
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +5 -4
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/workflow-view.js +36 -21
- package/dist/modes/interactive/components/workflow-view.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-auth.js +71 -40
- package/dist/modes/interactive/interactive-auth.js.map +1 -1
- package/dist/modes/interactive/interactive-commands.d.ts +1 -0
- package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-commands.js +3 -0
- package/dist/modes/interactive/interactive-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-dialog-ui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-dialog-ui.js +5 -5
- package/dist/modes/interactive/interactive-dialog-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-format.js +34 -18
- package/dist/modes/interactive/interactive-format.js.map +1 -1
- package/dist/modes/interactive/interactive-helpers.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-helpers.js +7 -2
- package/dist/modes/interactive/interactive-helpers.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +4 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +350 -279
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.d.ts +9 -0
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +79 -25
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +5 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +26 -23
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +3 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +3 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +0 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +3 -14
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +0 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +0 -19
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +28 -13
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/plugins/ecosystem/catalog.d.ts.map +1 -1
- package/dist/plugins/ecosystem/catalog.js +3 -2
- package/dist/plugins/ecosystem/catalog.js.map +1 -1
- package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
- package/dist/plugins/ecosystem/cli.js +2 -1
- package/dist/plugins/ecosystem/cli.js.map +1 -1
- package/dist/plugins/ecosystem/default-plugin-market.d.ts.map +1 -1
- package/dist/plugins/ecosystem/default-plugin-market.js +3 -2
- package/dist/plugins/ecosystem/default-plugin-market.js.map +1 -1
- package/dist/plugins/ecosystem/distribution.d.ts.map +1 -1
- package/dist/plugins/ecosystem/distribution.js +2 -1
- package/dist/plugins/ecosystem/distribution.js.map +1 -1
- package/dist/plugins/ecosystem/installer.d.ts.map +1 -1
- package/dist/plugins/ecosystem/installer.js +3 -2
- package/dist/plugins/ecosystem/installer.js.map +1 -1
- package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-disk-registry-source.js +20 -17
- package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-distribution-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-distribution-host.js +35 -34
- package/dist/plugins/ecosystem/node-distribution-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.js +35 -34
- package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.js +9 -8
- package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-persistence.js +4 -3
- package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts +9 -2
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js +44 -5
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-trust-root.js +10 -9
- package/dist/plugins/ecosystem/node-plugin-trust-root.js.map +1 -1
- package/dist/plugins/ecosystem/node-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-registry-source.js +31 -30
- package/dist/plugins/ecosystem/node-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-release-package-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-release-package-source.js +30 -29
- package/dist/plugins/ecosystem/node-release-package-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-tar-writer.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-tar-writer.js +11 -10
- package/dist/plugins/ecosystem/node-tar-writer.js.map +1 -1
- package/dist/plugins/ecosystem/node-url-package-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-url-package-source.js +21 -20
- package/dist/plugins/ecosystem/node-url-package-source.js.map +1 -1
- package/dist/plugins/ecosystem/plugin-acquisition.d.ts.map +1 -1
- package/dist/plugins/ecosystem/plugin-acquisition.js +3 -2
- package/dist/plugins/ecosystem/plugin-acquisition.js.map +1 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts +9 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.js +5 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.js.map +1 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.d.ts.map +1 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.js +2 -1
- package/dist/plugins/ecosystem/registry-cli-adapter.js.map +1 -1
- package/dist/plugins/ecosystem/registry.d.ts.map +1 -1
- package/dist/plugins/ecosystem/registry.js +35 -32
- package/dist/plugins/ecosystem/registry.js.map +1 -1
- package/dist/plugins/ecosystem/resolver.d.ts.map +1 -1
- package/dist/plugins/ecosystem/resolver.js +3 -2
- package/dist/plugins/ecosystem/resolver.js.map +1 -1
- package/dist/plugins/ecosystem/selection-store.d.ts.map +1 -1
- package/dist/plugins/ecosystem/selection-store.js +11 -10
- package/dist/plugins/ecosystem/selection-store.js.map +1 -1
- package/dist/plugins/ecosystem/selection.d.ts.map +1 -1
- package/dist/plugins/ecosystem/selection.js +8 -7
- package/dist/plugins/ecosystem/selection.js.map +1 -1
- package/dist/plugins/ecosystem/state.d.ts.map +1 -1
- package/dist/plugins/ecosystem/state.js +24 -23
- package/dist/plugins/ecosystem/state.js.map +1 -1
- package/dist/plugins/ecosystem/updates.d.ts.map +1 -1
- package/dist/plugins/ecosystem/updates.js +5 -4
- package/dist/plugins/ecosystem/updates.js.map +1 -1
- package/dist/plugins/mcp-http.d.ts +0 -17
- package/dist/plugins/mcp-http.d.ts.map +1 -1
- package/dist/plugins/mcp-http.js +30 -7
- package/dist/plugins/mcp-http.js.map +1 -1
- package/dist/plugins/plugin-supervisor.d.ts.map +1 -1
- package/dist/plugins/plugin-supervisor.js +19 -1
- package/dist/plugins/plugin-supervisor.js.map +1 -1
- package/dist/profile/first-roles.d.ts.map +1 -1
- package/dist/profile/first-roles.js +10 -1
- package/dist/profile/first-roles.js.map +1 -1
- package/dist/profile/goal-plugin.d.ts.map +1 -1
- package/dist/profile/goal-plugin.js +24 -5
- package/dist/profile/goal-plugin.js.map +1 -1
- package/dist/profile/identity.d.ts.map +1 -1
- package/dist/profile/identity.js +7 -6
- package/dist/profile/identity.js.map +1 -1
- package/dist/profile/lock.d.ts.map +1 -1
- package/dist/profile/lock.js +15 -1
- package/dist/profile/lock.js.map +1 -1
- package/dist/profile/plan-plugin.d.ts.map +1 -1
- package/dist/profile/plan-plugin.js +26 -13
- package/dist/profile/plan-plugin.js.map +1 -1
- package/dist/profile/plugin-profiles.d.ts.map +1 -1
- package/dist/profile/plugin-profiles.js +2 -1
- package/dist/profile/plugin-profiles.js.map +1 -1
- package/dist/profile/policy-manifest.d.ts.map +1 -1
- package/dist/profile/policy-manifest.js +5 -4
- package/dist/profile/policy-manifest.js.map +1 -1
- package/dist/profile/profile-registry.d.ts +0 -12
- package/dist/profile/profile-registry.d.ts.map +1 -1
- package/dist/profile/profile-registry.js +14 -1
- package/dist/profile/profile-registry.js.map +1 -1
- package/dist/profile/role-catalog.d.ts +0 -1
- package/dist/profile/role-catalog.d.ts.map +1 -1
- package/dist/profile/role-catalog.js +17 -15
- package/dist/profile/role-catalog.js.map +1 -1
- package/dist/profile/role-orchestrator.d.ts.map +1 -1
- package/dist/profile/role-orchestrator.js +8 -7
- package/dist/profile/role-orchestrator.js.map +1 -1
- package/dist/profile/role-runner.d.ts.map +1 -1
- package/dist/profile/role-runner.js +3 -2
- package/dist/profile/role-runner.js.map +1 -1
- package/dist/profile/root-facade.d.ts.map +1 -1
- package/dist/profile/root-facade.js +2 -1
- package/dist/profile/root-facade.js.map +1 -1
- package/dist/profile/skill-discovery-wiring.d.ts.map +1 -1
- package/dist/profile/skill-discovery-wiring.js +7 -2
- package/dist/profile/skill-discovery-wiring.js.map +1 -1
- package/dist/profile/state-store.d.ts.map +1 -1
- package/dist/profile/state-store.js +13 -9
- package/dist/profile/state-store.js.map +1 -1
- package/dist/profile/todo-plugin.d.ts.map +1 -1
- package/dist/profile/todo-plugin.js +9 -4
- package/dist/profile/todo-plugin.js.map +1 -1
- package/dist/profiles/builtin-suites.d.ts +13 -6
- package/dist/profiles/builtin-suites.d.ts.map +1 -1
- package/dist/profiles/builtin-suites.js +15 -6
- package/dist/profiles/builtin-suites.js.map +1 -1
- package/dist/profiles/suite-loader.d.ts +25 -1
- package/dist/profiles/suite-loader.d.ts.map +1 -1
- package/dist/profiles/suite-loader.js +34 -9
- package/dist/profiles/suite-loader.js.map +1 -1
- package/dist/remote/server-entry.d.ts.map +1 -1
- package/dist/remote/server-entry.js +3 -2
- package/dist/remote/server-entry.js.map +1 -1
- package/dist/remote/session-source.d.ts.map +1 -1
- package/dist/remote/session-source.js +8 -4
- package/dist/remote/session-source.js.map +1 -1
- package/dist/share/session-share.d.ts.map +1 -1
- package/dist/share/session-share.js +14 -2
- package/dist/share/session-share.js.map +1 -1
- package/dist/testing/plugin-testkit.d.ts.map +1 -1
- package/dist/testing/plugin-testkit.js +4 -3
- package/dist/testing/plugin-testkit.js.map +1 -1
- package/dist/testing/runtime-delivery-queue.d.ts.map +1 -1
- package/dist/testing/runtime-delivery-queue.js +2 -1
- package/dist/testing/runtime-delivery-queue.js.map +1 -1
- package/dist/testing/session-plugin-testkit.d.ts.map +1 -1
- package/dist/testing/session-plugin-testkit.js +10 -7
- package/dist/testing/session-plugin-testkit.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +2 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +7 -6
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js +3 -2
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/photon.d.ts +2 -2
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js +2 -2
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +9 -8
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +23 -13
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +5 -1
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +1 -3
- package/docs/docs.json +4 -0
- package/docs/index.md +1 -0
- package/docs/keybindings.md +3 -0
- package/docs/mcp.md +103 -0
- package/docs/models.md +14 -22
- package/docs/providers.md +0 -1
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +1 -26
- package/docs/sdk.md +4 -6
- package/docs/settings.md +10 -12
- package/docs/skills.md +1 -9
- package/docs/terminal-setup.md +2 -3
- package/docs/usage.md +7 -6
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/with-deps/plugin.json +1 -1
- package/examples/sdk/10-settings.ts +2 -4
- package/examples/sdk/12-full-control.ts +1 -2
- package/package.json +1 -3
- package/dist/bundle/chunks/chunk-EALJ5DDX.js +0 -1452
- package/dist/core/extensions/microcompact.d.ts +0 -80
- package/dist/core/extensions/microcompact.d.ts.map +0 -1
- package/dist/core/extensions/microcompact.js +0 -134
- package/dist/core/extensions/microcompact.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -106
- package/dist/server/create-harness.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-package-install-host.js","sourceRoot":"","sources":["../../../src/plugins/ecosystem/node-package-install-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, mkdtemp, rename, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { inflateRawSync } from \"node:zlib\";\nimport { parseCapabilityPluginManifest } from \"../../core/extensions/capability-plugin.ts\";\nimport type { PluginDistributionArtifactV1 } from \"./distribution.ts\";\nimport type { PluginInstallationScopeV1, PluginInstallationV1, PluginInstallHostV1 } from \"./installer.ts\";\nimport {\n\tcreateNodePackageInstallPersistenceV1,\n\ttype NodePackageInstallPersistenceV1,\n\ttype NodePackageInstallPersistentRecordV1,\n} from \"./node-package-install-persistence.ts\";\nimport { parseNodeTarGzPackageV1 } from \"./node-tar-package.ts\";\nimport type { PluginManifestV1, PluginUpdateRecordV1 } from \"./types.ts\";\nimport { pluginManifestDigestV1 } from \"./updates.ts\";\n\nconst NODE_PACKAGE_INSTALL_HOST_VERSION_V1 = 1 as const;\nexport const NODE_PACKAGE_FORMAT_VERSION_V1 = 1 as const;\nconst DEFAULT_MAX_ARCHIVE_BYTES_V1 = 128 * 1024 * 1024;\nconst MAX_ARCHIVE_BYTES_V1 = 512 * 1024 * 1024;\nconst DEFAULT_MAX_EXTRACTED_BYTES_V1 = 256 * 1024 * 1024;\nconst MAX_EXTRACTED_BYTES_V1 = 1024 * 1024 * 1024;\nconst DEFAULT_MAX_ENTRY_BYTES_V1 = 64 * 1024 * 1024;\nconst MAX_ENTRY_BYTES_V1 = 256 * 1024 * 1024;\nconst DEFAULT_MAX_ENTRIES_V1 = 2048;\nconst MAX_ENTRIES_V1 = 8192;\nconst MAX_PACKAGE_MANIFEST_BYTES_V1 = 64 * 1024;\nconst ECOSYSTEM_MANIFEST_FILE_V1 = \"agent-forge.json\";\nconst CAPABILITY_MANIFEST_FILE_V1 = \"plugin.json\";\n\nconst LOCAL_FILE_HEADER_V1 = 0x04034b50;\nconst CENTRAL_FILE_HEADER_V1 = 0x02014b50;\nconst END_OF_CENTRAL_DIRECTORY_V1 = 0x06054b50;\nconst ZIP64_END_OF_CENTRAL_DIRECTORY_V1 = 0x06064b50;\nconst ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_V1 = 0x07064b50;\n\nexport type NodePackageInstallErrorCodeV1 =\n\t| \"cancelled\"\n\t| \"host_closed\"\n\t| \"invalid_artifact\"\n\t| \"unsupported_media_type\"\n\t| \"archive_invalid\"\n\t| \"archive_budget_exceeded\"\n\t| \"package_manifest_missing\"\n\t| \"package_manifest_invalid\"\n\t| \"package_manifest_mismatch\"\n\t| \"installation_unknown\"\n\t| \"installation_identity_mismatch\"\n\t| \"installation_io_failed\";\n\nexport class NodePackageInstallErrorV1 extends Error {\n\treadonly code: NodePackageInstallErrorCodeV1;\n\n\tconstructor(code: NodePackageInstallErrorCodeV1) {\n\t\tsuper(`Node package installation failed: ${code}`);\n\t\tthis.name = \"NodePackageInstallErrorV1\";\n\t\tthis.code = code;\n\t}\n}\n\nexport interface NodeZipPackageEntryV1 {\n\treadonly name: string;\n\treadonly directory: boolean;\n\treadonly bytes: Uint8Array;\n}\n\nexport interface NodeZipPackageLimitsV1 {\n\treadonly maxArchiveBytes?: number;\n\treadonly maxExtractedBytes?: number;\n\treadonly maxEntryBytes?: number;\n\treadonly maxEntries?: number;\n}\n\nexport interface NodePackageInstallHostOptionsV1 extends NodeZipPackageLimitsV1 {\n\t/** An opaque artifact reader owned by the distribution host. */\n\treadonly openArtifact: (input: {\n\t\treadonly artifact: PluginDistributionArtifactV1;\n\t\treadonly signal?: AbortSignal;\n\t}) => AsyncIterable<Uint8Array>;\n\t/** Parent directory owned by the host; no local path leaves this adapter. */\n\treadonly installationDirectory?: string;\n\treadonly supportedScopes?: readonly PluginInstallationScopeV1[];\n\t/** Persistent host-owned index; omitted keeps the test-friendly ephemeral mode. */\n\treadonly persistence?: \"ephemeral\" | \"persistent\";\n\treadonly persistenceLockTimeoutMs?: number;\n\t/**\n\t * Host-only runtime assembly seam. The directory and manifest path never\n\t * cross the public installer DTO or model/tool context.\n\t */\n\treadonly loadPlugin?: (input: {\n\t\treadonly installation: PluginInstallationV1;\n\t\treadonly record?: PluginUpdateRecordV1;\n\t\treadonly directory: string;\n\t\treadonly manifestPath: string;\n\t\treadonly signal: AbortSignal;\n\t}) => Promise<{ readonly dispose?: () => void | Promise<void> } | void>;\n}\n\n/** Minimal structural bridge for an AgentSession-owned capability loader. */\nexport interface NodePackageInstallCapabilityPluginSessionV1 {\n\treadonly loadCapabilityPluginManifest: (manifestPath: string) => Promise<{\n\t\treadonly dispose: () => void | Promise<void>;\n\t}>;\n}\n\n/**\n * Adapt an AgentSession-like loader to the host-only runtime seam. The\n * manifest path is never returned as a DTO or sent through model context.\n */\nexport function createNodePackageInstallSessionLoaderV1(\n\tsession: NodePackageInstallCapabilityPluginSessionV1,\n): NonNullable<NodePackageInstallHostOptionsV1[\"loadPlugin\"]> {\n\treturn async ({ manifestPath }) => {\n\t\tconst handle = await session.loadCapabilityPluginManifest(manifestPath);\n\t\treturn { dispose: handle.dispose };\n\t};\n}\n\n/**\n * Create a package host with an explicit AgentSession-compatible runtime\n * loader. This is an opt-in composition helper; it does not alter Core's\n * default session construction or install untrusted package code.\n */\nexport async function createNodePackageInstallHostForSessionV1(\n\toptions: NodePackageInstallHostOptionsV1,\n\tsession: NodePackageInstallCapabilityPluginSessionV1,\n): Promise<NodePackageInstallHostV1> {\n\tif (options.loadPlugin !== undefined) throw new Error(\"loadPlugin must be omitted when binding a session\");\n\treturn await createNodePackageInstallHostV1({\n\t\t...options,\n\t\tloadPlugin: createNodePackageInstallSessionLoaderV1(session),\n\t});\n}\n\nexport interface NodePackageInstallHostV1 extends PluginInstallHostV1 {\n\treadonly version: typeof NODE_PACKAGE_INSTALL_HOST_VERSION_V1;\n\treadonly uninstall: NonNullable<PluginInstallHostV1[\"uninstall\"]>;\n\t/** Host-only bridge for local runtime assembly; never put this path in a DTO or transcript. */\n\treadonly getInstallationDirectory: (input: { readonly installation: PluginInstallationV1 }) => string;\n\treadonly close: () => Promise<void>;\n}\n\ninterface ZipEntryDescriptorV1 {\n\treadonly name: string;\n\treadonly directory: boolean;\n\treadonly flags: number;\n\treadonly method: number;\n\treadonly compressedSize: number;\n\treadonly uncompressedSize: number;\n\treadonly crc32: number;\n\treadonly localOffset: number;\n}\n\ninterface ZipLocalSpanV1 {\n\treadonly start: number;\n\treadonly end: number;\n}\n\ninterface InstalledRecordV1 {\n\treadonly installationRef: string;\n\treadonly directory: string;\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly manifestDigest: string;\n\treadonly scope: PluginInstallationScopeV1;\n\treadonly scopeRef: string;\n\tstate: \"installed\" | \"active\" | \"retained\";\n}\n\nfunction positiveLimit(value: number | undefined, fallback: number, maximum: number, label: string): number {\n\tconst result = value ?? fallback;\n\tif (!Number.isSafeInteger(result) || result < 1 || result > maximum)\n\t\tthrow new Error(`${label} must be a positive integer at most ${maximum}`);\n\treturn result;\n}\n\n/** Resolve the archive budget limits shared by the ZIP and tgz package parsers. */\nexport function resolveNodePackageLimitsV1(limitsInput: NodeZipPackageLimitsV1): Required<NodeZipPackageLimitsV1> {\n\treturn {\n\t\tmaxArchiveBytes: positiveLimit(\n\t\t\tlimitsInput.maxArchiveBytes,\n\t\t\tDEFAULT_MAX_ARCHIVE_BYTES_V1,\n\t\t\tMAX_ARCHIVE_BYTES_V1,\n\t\t\t\"maxArchiveBytes\",\n\t\t),\n\t\tmaxExtractedBytes: positiveLimit(\n\t\t\tlimitsInput.maxExtractedBytes,\n\t\t\tDEFAULT_MAX_EXTRACTED_BYTES_V1,\n\t\t\tMAX_EXTRACTED_BYTES_V1,\n\t\t\t\"maxExtractedBytes\",\n\t\t),\n\t\tmaxEntryBytes: positiveLimit(\n\t\t\tlimitsInput.maxEntryBytes,\n\t\t\tDEFAULT_MAX_ENTRY_BYTES_V1,\n\t\t\tMAX_ENTRY_BYTES_V1,\n\t\t\t\"maxEntryBytes\",\n\t\t),\n\t\tmaxEntries: positiveLimit(limitsInput.maxEntries, DEFAULT_MAX_ENTRIES_V1, MAX_ENTRIES_V1, \"maxEntries\"),\n\t};\n}\n\nfunction readU16(bytes: Uint8Array, offset: number): number {\n\tif (offset < 0 || offset + 2 > bytes.byteLength) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn bytes[offset]! | (bytes[offset + 1]! << 8);\n}\n\nfunction readU32(bytes: Uint8Array, offset: number): number {\n\tif (offset < 0 || offset + 4 > bytes.byteLength) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn (bytes[offset]! | (bytes[offset + 1]! << 8) | (bytes[offset + 2]! << 16) | (bytes[offset + 3]! << 24)) >>> 0;\n}\n\nfunction decodeName(bytes: Uint8Array, utf8: boolean): string {\n\ttry {\n\t\tconst value = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n\t\tif (!utf8 && /[^\\x00-\\x7f]/u.test(value)) throw new Error(\"non-ascii zip name\");\n\t\treturn value;\n\t} catch {\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n}\n\n/** Normalized archive entry name shared by the ZIP and tgz package parsers. */\nexport function normalizedEntryName(value: string): { readonly name: string; readonly directory: boolean } {\n\tif (value.length === 0 || value.includes(\"\\\\\") || /[\\u0000-\\u001f\\u007f]/u.test(value))\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst directory = value.endsWith(\"/\");\n\tif (value.startsWith(\"/\") || /^[a-z]:/iu.test(value)) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst parts = value.split(\"/\");\n\tif (directory) parts.pop();\n\tif (\n\t\tparts.length === 0 ||\n\t\tparts.some(\n\t\t\t(part) =>\n\t\t\t\tpart === \"\" ||\n\t\t\t\tpart === \".\" ||\n\t\t\t\tpart === \"..\" ||\n\t\t\t\tpart.includes(\":\") ||\n\t\t\t\t/[ .]$/u.test(part) ||\n\t\t\t\t/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\..*)?$/iu.test(part),\n\t\t)\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn { name: parts.join(\"/\"), directory };\n}\n\nfunction crcTable(): Uint32Array {\n\tconst table = new Uint32Array(256);\n\tfor (let index = 0; index < table.length; index += 1) {\n\t\tlet value = index;\n\t\tfor (let bit = 0; bit < 8; bit += 1) value = (value & 1) === 0 ? value >>> 1 : (value >>> 1) ^ 0xedb88320;\n\t\ttable[index] = value >>> 0;\n\t}\n\treturn table;\n}\n\nconst CRC_TABLE_V1 = crcTable();\n\nfunction crc32(bytes: Uint8Array): number {\n\tlet value = 0xffffffff;\n\tfor (const byte of bytes) value = (value >>> 8) ^ CRC_TABLE_V1[(value ^ byte) & 0xff]!;\n\treturn (value ^ 0xffffffff) >>> 0;\n}\n\nfunction findEndOfCentralDirectory(bytes: Uint8Array): {\n\treadonly offset: number;\n\treadonly entries: number;\n\treadonly size: number;\n\treadonly start: number;\n} {\n\tconst minimum = Math.max(0, bytes.byteLength - 0xffff - 22);\n\tfor (let offset = bytes.byteLength - 22; offset >= minimum; offset -= 1) {\n\t\tif (readU32(bytes, offset) !== END_OF_CENTRAL_DIRECTORY_V1) continue;\n\t\tconst disk = readU16(bytes, offset + 4);\n\t\tconst centralDisk = readU16(bytes, offset + 6);\n\t\tconst entries = readU16(bytes, offset + 10);\n\t\tconst centralEntries = readU16(bytes, offset + 8);\n\t\tconst size = readU32(bytes, offset + 12);\n\t\tconst start = readU32(bytes, offset + 16);\n\t\tconst commentLength = readU16(bytes, offset + 20);\n\t\tif (\n\t\t\tdisk !== 0 ||\n\t\t\tcentralDisk !== 0 ||\n\t\t\tentries !== centralEntries ||\n\t\t\toffset + 22 + commentLength !== bytes.byteLength\n\t\t)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (entries === 0xffff || size === 0xffffffff || start === 0xffffffff)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (start + size > offset) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\treturn { offset, entries, size, start };\n\t}\n\tfor (let offset = Math.max(0, bytes.byteLength - 64); offset < bytes.byteLength - 3; offset += 1) {\n\t\tconst signature = readU32(bytes, offset);\n\t\tif (signature === ZIP64_END_OF_CENTRAL_DIRECTORY_V1 || signature === ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_V1)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n}\n\nfunction parseCentralDirectory(\n\tbytes: Uint8Array,\n\tlimits: Required<NodeZipPackageLimitsV1>,\n): readonly ZipEntryDescriptorV1[] {\n\tconst end = findEndOfCentralDirectory(bytes);\n\tif (end.entries > limits.maxEntries || end.size > bytes.byteLength || end.start + end.size > end.offset)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\tconst entries: ZipEntryDescriptorV1[] = [];\n\tconst names = new Set<string>();\n\tlet offset = end.start;\n\tfor (let index = 0; index < end.entries; index += 1) {\n\t\tif (readU32(bytes, offset) !== CENTRAL_FILE_HEADER_V1) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tconst madeBy = readU16(bytes, offset + 4) >>> 8;\n\t\tconst flags = readU16(bytes, offset + 8);\n\t\tconst method = readU16(bytes, offset + 10);\n\t\tconst crc = readU32(bytes, offset + 16);\n\t\tconst compressedSize = readU32(bytes, offset + 20);\n\t\tconst uncompressedSize = readU32(bytes, offset + 24);\n\t\tconst nameLength = readU16(bytes, offset + 28);\n\t\tconst extraLength = readU16(bytes, offset + 30);\n\t\tconst commentLength = readU16(bytes, offset + 32);\n\t\tconst disk = readU16(bytes, offset + 34);\n\t\tconst externalAttributes = readU32(bytes, offset + 38);\n\t\tconst localOffset = readU32(bytes, offset + 42);\n\t\tconst nameStart = offset + 46;\n\t\tconst recordEnd = nameStart + nameLength + extraLength + commentLength;\n\t\tif (\n\t\t\trecordEnd > end.start + end.size ||\n\t\t\tdisk !== 0 ||\n\t\t\t(flags & ~(0x8 | 0x800)) !== 0 ||\n\t\t\t(flags & 1) !== 0 ||\n\t\t\t(flags & 0x40) !== 0\n\t\t)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (method !== 0 && method !== 8) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (uncompressedSize > limits.maxEntryBytes || compressedSize > limits.maxArchiveBytes)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\t\tconst name = normalizedEntryName(\n\t\t\tdecodeName(bytes.subarray(nameStart, nameStart + nameLength), (flags & 0x800) !== 0),\n\t\t);\n\t\tif (names.has(name.name)) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tnames.add(name.name);\n\t\tconst unixMode = madeBy === 3 ? (externalAttributes >>> 16) & 0xffff : 0;\n\t\tif ((unixMode & 0xf000) === 0xa000) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tentries.push({\n\t\t\tname: name.name,\n\t\t\tdirectory: name.directory,\n\t\t\tflags,\n\t\t\tmethod,\n\t\t\tcompressedSize,\n\t\t\tuncompressedSize,\n\t\t\tcrc32: crc,\n\t\t\tlocalOffset,\n\t\t});\n\t\toffset = recordEnd;\n\t}\n\tif (offset !== end.start + end.size) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t// Validate the local-file regions before extraction. A forged central\n\t// directory must not be able to point into another entry or into the\n\t// central directory/EOCD; otherwise extraction could reinterpret metadata\n\t// bytes as package contents.\n\tconst spans: ZipLocalSpanV1[] = [];\n\tfor (const entry of entries) {\n\t\tif (entry.localOffset < 0 || entry.localOffset + 30 > end.start)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (readU32(bytes, entry.localOffset) !== LOCAL_FILE_HEADER_V1)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tconst localNameLength = readU16(bytes, entry.localOffset + 26);\n\t\tconst localExtraLength = readU16(bytes, entry.localOffset + 28);\n\t\tconst dataStart = entry.localOffset + 30 + localNameLength + localExtraLength;\n\t\tconst dataEnd = dataStart + entry.compressedSize;\n\t\tif (dataStart < entry.localOffset + 30 || dataEnd < dataStart || dataEnd > end.start)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tspans.push({ start: entry.localOffset, end: dataEnd });\n\t}\n\tspans.sort((left, right) => left.start - right.start || left.end - right.end);\n\tfor (let index = 1; index < spans.length; index += 1) {\n\t\tif (spans[index - 1]!.end > spans[index]!.start) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n\treturn entries;\n}\n\nfunction extractEntry(bytes: Uint8Array, entry: ZipEntryDescriptorV1, maxEntryBytes: number): Uint8Array {\n\tif (entry.directory) {\n\t\tif (entry.compressedSize !== 0 || entry.uncompressedSize !== 0)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\treturn new Uint8Array();\n\t}\n\tif (entry.localOffset + 30 > bytes.byteLength) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\tif (readU32(bytes, entry.localOffset) !== LOCAL_FILE_HEADER_V1)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst localFlags = readU16(bytes, entry.localOffset + 6);\n\tconst localMethod = readU16(bytes, entry.localOffset + 8);\n\tconst nameLength = readU16(bytes, entry.localOffset + 26);\n\tconst extraLength = readU16(bytes, entry.localOffset + 28);\n\tconst localName = decodeName(\n\t\tbytes.subarray(entry.localOffset + 30, entry.localOffset + 30 + nameLength),\n\t\t(entry.flags & 0x800) !== 0,\n\t);\n\tif (normalizedEntryName(localName).name !== entry.name || localFlags !== entry.flags || localMethod !== entry.method)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst localCompressedSize = readU32(bytes, entry.localOffset + 18);\n\tconst localUncompressedSize = readU32(bytes, entry.localOffset + 22);\n\tif (\n\t\t(entry.flags & 8) === 0 &&\n\t\t(localCompressedSize !== entry.compressedSize || localUncompressedSize !== entry.uncompressedSize)\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst dataStart = entry.localOffset + 30 + nameLength + extraLength;\n\tconst dataEnd = dataStart + entry.compressedSize;\n\tif (dataStart > bytes.byteLength || dataEnd > bytes.byteLength)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst compressed = bytes.subarray(dataStart, dataEnd);\n\tlet output: Uint8Array;\n\ttry {\n\t\toutput =\n\t\t\tentry.method === 0\n\t\t\t\t? new Uint8Array(compressed)\n\t\t\t\t: inflateRawSync(compressed, { maxOutputLength: maxEntryBytes });\n\t} catch {\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n\tif (\n\t\toutput.byteLength !== entry.uncompressedSize ||\n\t\toutput.byteLength > maxEntryBytes ||\n\t\tcrc32(output) !== entry.crc32\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn output;\n}\n\nexport function parseNodeZipPackageV1(\n\tinput: Uint8Array,\n\tlimitsInput: NodeZipPackageLimitsV1 = {},\n): readonly NodeZipPackageEntryV1[] {\n\tif (!(input instanceof Uint8Array)) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst limits = resolveNodePackageLimitsV1(limitsInput);\n\tif (input.byteLength > limits.maxArchiveBytes) throw new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\tconst descriptors = parseCentralDirectory(input, limits);\n\tlet extractedBytes = 0;\n\treturn Object.freeze(\n\t\tdescriptors.map((descriptor) => {\n\t\t\tconst bytes = extractEntry(input, descriptor, limits.maxEntryBytes);\n\t\t\textractedBytes += bytes.byteLength;\n\t\t\tif (extractedBytes > limits.maxExtractedBytes) throw new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\t\t\treturn Object.freeze({ name: descriptor.name, directory: descriptor.directory, bytes });\n\t\t}),\n\t);\n}\n\nfunction manifestKeys(value: Record<string, unknown>): boolean {\n\tconst allowed = new Set([\n\t\t\"packageFormatVersion\",\n\t\t\"id\",\n\t\t\"pluginVersion\",\n\t\t\"apiVersion\",\n\t\t\"minHostVersion\",\n\t\t\"maxHostVersion\",\n\t\t\"capabilityRefs\",\n\t\t\"requires\",\n\t\t\"platform\",\n\t\t\"testOnly\",\n\t]);\n\treturn Object.keys(value).every((key) => allowed.has(key));\n}\n\nfunction packageManifest(value: unknown, record: PluginUpdateRecordV1): void {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\tconst manifest = value as Record<string, unknown>;\n\tif (\n\t\t!manifestKeys(manifest) ||\n\t\tmanifest.packageFormatVersion !== NODE_PACKAGE_FORMAT_VERSION_V1 ||\n\t\tmanifest.id !== record.pluginId ||\n\t\tmanifest.pluginVersion !== record.pluginVersion\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\tif (typeof manifest.apiVersion !== \"string\" || manifest.apiVersion !== record.manifest.apiVersion)\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\ttry {\n\t\tif (pluginManifestDigestV1(manifest as unknown as PluginManifestV1) !== record.manifestDigest)\n\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\t} catch (error) {\n\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t}\n}\n\nfunction capabilityManifest(\n\tvalue: unknown,\n\trecord: PluginUpdateRecordV1,\n\tentries: readonly NodeZipPackageEntryV1[],\n): void {\n\tlet manifest: ReturnType<typeof parseCapabilityPluginManifest>;\n\ttry {\n\t\tmanifest = parseCapabilityPluginManifest(value, \"<installed plugin.json>\");\n\t} catch {\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t}\n\tif (manifest.id !== record.pluginId || manifest.version !== record.pluginVersion)\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\tconst entryValue = manifest.entry.startsWith(\"./\") ? manifest.entry.slice(2) : manifest.entry;\n\tconst entry = normalizedEntryName(entryValue);\n\tif (entry.directory || !entries.some((candidate) => candidate.name === entry.name && !candidate.directory))\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n}\n\nfunction opaqueScope(value: string): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.trim() === \"\" ||\n\t\tvalue.length > 2048 ||\n\t\t/\\s|[\\u0000-\\u001f\\u007f]/u.test(value)\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\treturn value;\n}\n\nfunction installationKey(scope: PluginInstallationScopeV1, scopeRef: string, pluginId: string): string {\n\treturn `${scope}\\u0000${scopeRef}\\u0000${pluginId}`;\n}\n\nfunction identityMatches(\n\trecord: InstalledRecordV1,\n\tinput: {\n\t\treadonly pluginId: string;\n\t\treadonly pluginVersion: string;\n\t\treadonly manifestDigest: string;\n\t\treadonly scope: PluginInstallationScopeV1;\n\t\treadonly scopeRef: string;\n\t},\n): boolean {\n\treturn (\n\t\trecord.pluginId === input.pluginId &&\n\t\trecord.pluginVersion === input.pluginVersion &&\n\t\trecord.manifestDigest === input.manifestDigest &&\n\t\trecord.scope === input.scope &&\n\t\trecord.scopeRef === input.scopeRef\n\t);\n}\n\nfunction artifactIdentityMatchesRecord(artifact: PluginDistributionArtifactV1, record: PluginUpdateRecordV1): boolean {\n\treturn (\n\t\tartifact.version === 1 &&\n\t\tartifact.pluginId === record.pluginId &&\n\t\tartifact.pluginVersion === record.pluginVersion &&\n\t\tartifact.manifestDigest === record.manifestDigest\n\t);\n}\n\nfunction expectedArtifactDigest(value: string): { readonly algorithm: \"sha256\" | \"sha512\"; readonly hex: string } {\n\tconst prefixed = /^(sha256|sha512):([0-9a-f]+)$/iu.exec(value);\n\tif (prefixed !== null) {\n\t\tconst algorithm = prefixed[1]!.toLowerCase() as \"sha256\" | \"sha512\";\n\t\tconst hex = prefixed[2]!.toLowerCase();\n\t\tif ((algorithm === \"sha256\" && hex.length === 64) || (algorithm === \"sha512\" && hex.length === 128))\n\t\t\treturn { algorithm, hex };\n\t}\n\tif (/^[0-9a-f]{64}$/iu.test(value)) return { algorithm: \"sha256\", hex: value.toLowerCase() };\n\tif (/^[0-9a-f]{128}$/iu.test(value)) return { algorithm: \"sha512\", hex: value.toLowerCase() };\n\tthrow new NodePackageInstallErrorV1(\"invalid_artifact\");\n}\n\nasync function collectArtifact(\n\topenArtifact: NodePackageInstallHostOptionsV1[\"openArtifact\"],\n\tartifact: PluginDistributionArtifactV1,\n\tmaxBytes: number,\n\tsignal: AbortSignal,\n): Promise<Uint8Array> {\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tfor await (const chunk of openArtifact({ artifact, signal })) {\n\t\tif (signal.aborted) throw new NodePackageInstallErrorV1(\"cancelled\");\n\t\tif (!(chunk instanceof Uint8Array)) throw new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\tif (chunk.byteLength > maxBytes - total) throw new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\t\tchunks.push(new Uint8Array(chunk));\n\t\ttotal += chunk.byteLength;\n\t}\n\tconst result = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\treturn result;\n}\n\nfunction packagePath(root: string, key: string): string {\n\treturn join(root, createHash(\"sha256\").update(key).digest(\"hex\"));\n}\n\nasync function writeEntries(\n\troot: string,\n\tentries: readonly NodeZipPackageEntryV1[],\n\tsignal: AbortSignal,\n): Promise<void> {\n\tawait mkdir(root, { recursive: true, mode: 0o700 });\n\tfor (const entry of entries) {\n\t\tif (signal.aborted) throw new NodePackageInstallErrorV1(\"cancelled\");\n\t\tconst target = join(root, ...entry.name.split(\"/\"));\n\t\tif (entry.directory) {\n\t\t\tawait mkdir(target, { recursive: true, mode: 0o700 });\n\t\t\tcontinue;\n\t\t}\n\t\tconst parent = join(root, ...entry.name.split(\"/\").slice(0, -1));\n\t\tawait mkdir(parent, { recursive: true, mode: 0o700 });\n\t\tawait writeFile(target, entry.bytes, { flag: \"wx\", mode: 0o600 });\n\t}\n}\n\n/**\n * Host-owned ZIP/tgz package installer. It extracts only a bounded,\n * non-encrypted ZIP (\"application/zip\") or gzip-compressed tar\n * (\"application/gzip\") package and never executes package contents. The\n * returned installation handle is opaque; paths stay inside the host-owned\n * instance directory.\n */\nexport async function createNodePackageInstallHostV1(\n\toptions: NodePackageInstallHostOptionsV1,\n): Promise<NodePackageInstallHostV1> {\n\tif (typeof options.openArtifact !== \"function\") throw new Error(\"openArtifact is required\");\n\tconst limits = resolveNodePackageLimitsV1(options);\n\tconst parent = options.installationDirectory ?? tmpdir();\n\tif (!isAbsolute(parent)) throw new Error(\"installationDirectory must be absolute\");\n\tif (options.persistence !== undefined && options.persistence !== \"ephemeral\" && options.persistence !== \"persistent\")\n\t\tthrow new Error(\"persistence mode is invalid\");\n\tconst supportedScopes = options.supportedScopes ?? [\"global\", \"project\"];\n\tif (\n\t\t!Array.isArray(supportedScopes) ||\n\t\tsupportedScopes.length === 0 ||\n\t\tnew Set(supportedScopes).size !== supportedScopes.length ||\n\t\tsupportedScopes.some((scope) => scope !== \"global\" && scope !== \"project\")\n\t)\n\t\tthrow new Error(\"supportedScopes is invalid\");\n\tawait mkdir(parent, { recursive: true, mode: 0o700 });\n\tconst persistent = options.persistence === \"persistent\";\n\tconst instanceRoot = persistent\n\t\t? join(parent, \"agent-forge-plugin-install-store-v1\")\n\t\t: await mkdtemp(join(parent, \"agent-forge-plugin-install-\"));\n\tconst persistence: NodePackageInstallPersistenceV1 | undefined = persistent\n\t\t? await createNodePackageInstallPersistenceV1({\n\t\t\t\trootDirectory: instanceRoot,\n\t\t\t\tlockTimeoutMs: options.persistenceLockTimeoutMs,\n\t\t\t})\n\t\t: undefined;\n\tconst records = new Map<string, InstalledRecordV1>();\n\tconst activeByKey = new Map<string, string>();\n\tif (persistence !== undefined) {\n\t\tfor (const record of await persistence.load()) records.set(record.installationRef, { ...record });\n\t}\n\tfor (const record of records.values()) {\n\t\tif (record.state === \"active\")\n\t\t\tactiveByKey.set(installationKey(record.scope, record.scopeRef, record.pluginId), record.installationRef);\n\t}\n\tlet closed = false;\n\tconst activeOperations = new Set<AbortController>();\n\tconst runtimeHandles = new Map<string, { readonly dispose?: () => void | Promise<void> }>();\n\tconst applyPersistentSnapshot = (snapshot: readonly NodePackageInstallPersistentRecordV1[]): void => {\n\t\trecords.clear();\n\t\tactiveByKey.clear();\n\t\tfor (const value of snapshot) records.set(value.installationRef, { ...value });\n\t\tfor (const value of records.values()) {\n\t\t\tif (value.state === \"active\")\n\t\t\t\tactiveByKey.set(installationKey(value.scope, value.scopeRef, value.pluginId), value.installationRef);\n\t\t}\n\t};\n\tconst commitRecords = async (\n\t\tupdate: (values: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>,\n\t): Promise<void> => {\n\t\tif (persistence === undefined) {\n\t\t\tawait update(records);\n\t\t\treturn;\n\t\t}\n\t\tapplyPersistentSnapshot(await persistence.mutate({ update }));\n\t};\n\tlet drained: (() => void) | undefined;\n\tlet closePromise: Promise<void> | undefined;\n\n\tconst begin = (\n\t\tparentSignal: AbortSignal | undefined,\n\t): { readonly controller: AbortController; readonly signal: AbortSignal } => {\n\t\tif (closed) throw new NodePackageInstallErrorV1(\"host_closed\");\n\t\tconst controller = new AbortController();\n\t\tif (parentSignal?.aborted) controller.abort(parentSignal.reason);\n\t\telse parentSignal?.addEventListener(\"abort\", () => controller.abort(parentSignal.reason), { once: true });\n\t\tactiveOperations.add(controller);\n\t\treturn { controller, signal: controller.signal };\n\t};\n\tconst end = (controller: AbortController): void => {\n\t\tactiveOperations.delete(controller);\n\t\tif (activeOperations.size === 0) {\n\t\t\tdrained?.();\n\t\t\tdrained = undefined;\n\t\t}\n\t};\n\tconst waitDrained = async (): Promise<void> => {\n\t\tif (activeOperations.size === 0) return;\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tdrained = resolve;\n\t\t});\n\t};\n\tconst getRecord = (\n\t\tinstallation: PluginInstallationV1,\n\t\trecord: PluginUpdateRecordV1,\n\t\tscope: PluginInstallationScopeV1,\n\t\tscopeRef: string,\n\t): InstalledRecordV1 => {\n\t\tconst value = records.get(installation.installationRef);\n\t\tif (\n\t\t\tvalue === undefined ||\n\t\t\tinstallation.pluginId !== record.pluginId ||\n\t\t\tinstallation.pluginVersion !== record.pluginVersion ||\n\t\t\tinstallation.manifestDigest !== record.manifestDigest ||\n\t\t\tinstallation.scope !== scope ||\n\t\t\tinstallation.scopeRef !== scopeRef ||\n\t\t\t!identityMatches(value, {\n\t\t\t\tpluginId: record.pluginId,\n\t\t\t\tpluginVersion: record.pluginVersion,\n\t\t\t\tmanifestDigest: record.manifestDigest,\n\t\t\t\tscope,\n\t\t\t\tscopeRef,\n\t\t\t})\n\t\t)\n\t\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\treturn value;\n\t};\n\tconst disposeRuntime = async (installationRef: string): Promise<void> => {\n\t\tconst handle = runtimeHandles.get(installationRef);\n\t\tif (handle === undefined) return;\n\t\tif (handle.dispose !== undefined) await Promise.resolve(handle.dispose());\n\t\truntimeHandles.delete(installationRef);\n\t};\n\tconst loadRuntime = async (\n\t\tinstallation: PluginInstallationV1,\n\t\trecord: PluginUpdateRecordV1 | undefined,\n\t\tdirectory: string,\n\t\tsignal: AbortSignal,\n\t): Promise<{ readonly dispose?: () => void | Promise<void> } | undefined> => {\n\t\tif (options.loadPlugin === undefined) return undefined;\n\t\ttry {\n\t\t\tconst loaded = await options.loadPlugin({\n\t\t\t\tinstallation,\n\t\t\t\trecord,\n\t\t\t\tdirectory,\n\t\t\t\tmanifestPath: join(directory, CAPABILITY_MANIFEST_FILE_V1),\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\treturn loaded ?? undefined;\n\t\t} catch (error) {\n\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t}\n\t};\n\n\tconst host: NodePackageInstallHostV1 = {\n\t\tversion: NODE_PACKAGE_INSTALL_HOST_VERSION_V1,\n\t\tsupportedScopes: Object.freeze([...supportedScopes]),\n\t\tgetInstallationDirectory(input) {\n\t\t\tconst record = records.get(input.installation.installationRef);\n\t\t\tif (\n\t\t\t\trecord === undefined ||\n\t\t\t\trecord.pluginId !== input.installation.pluginId ||\n\t\t\t\trecord.pluginVersion !== input.installation.pluginVersion ||\n\t\t\t\trecord.manifestDigest !== input.installation.manifestDigest ||\n\t\t\t\trecord.scope !== input.installation.scope ||\n\t\t\t\trecord.scopeRef !== input.installation.scopeRef\n\t\t\t)\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_unknown\");\n\t\t\treturn record.directory;\n\t\t},\n\t\tasync install(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\tlet staging: string | undefined;\n\t\t\ttry {\n\t\t\t\tif (input.artifact === undefined) throw new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tif (!artifactIdentityMatchesRecord(input.artifact, input.record))\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tconst mediaType = input.artifact.mediaType.toLowerCase();\n\t\t\t\tif (mediaType !== \"application/zip\" && mediaType !== \"application/gzip\")\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"unsupported_media_type\");\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst bytes = await collectArtifact(\n\t\t\t\t\toptions.openArtifact,\n\t\t\t\t\tinput.artifact,\n\t\t\t\t\tlimits.maxArchiveBytes,\n\t\t\t\t\toperation.signal,\n\t\t\t\t);\n\t\t\t\tif (input.artifact.sizeBytes !== bytes.byteLength) throw new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tconst digest = expectedArtifactDigest(input.artifact.artifactDigest);\n\t\t\t\tif (createHash(digest.algorithm).update(bytes).digest(\"hex\") !== digest.hex)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tconst entries =\n\t\t\t\t\tmediaType === \"application/gzip\"\n\t\t\t\t\t\t? await parseNodeTarGzPackageV1(bytes, limits)\n\t\t\t\t\t\t: parseNodeZipPackageV1(bytes, limits);\n\t\t\t\tconst manifestEntry = entries.find(\n\t\t\t\t\t(entry) => entry.name === ECOSYSTEM_MANIFEST_FILE_V1 && !entry.directory,\n\t\t\t\t);\n\t\t\t\tif (manifestEntry === undefined) throw new NodePackageInstallErrorV1(\"package_manifest_missing\");\n\t\t\t\tif (manifestEntry.bytes.byteLength > MAX_PACKAGE_MANIFEST_BYTES_V1)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\tlet manifest: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tmanifest = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(manifestEntry.bytes));\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\t}\n\t\t\t\tpackageManifest(manifest, input.record);\n\t\t\t\tconst capabilityEntry = entries.find(\n\t\t\t\t\t(entry) => entry.name === CAPABILITY_MANIFEST_FILE_V1 && !entry.directory,\n\t\t\t\t);\n\t\t\t\tif (capabilityEntry === undefined) throw new NodePackageInstallErrorV1(\"package_manifest_missing\");\n\t\t\t\tif (capabilityEntry.bytes.byteLength > MAX_PACKAGE_MANIFEST_BYTES_V1)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\tlet capability: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tcapability = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(capabilityEntry.bytes));\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\t}\n\t\t\t\tcapabilityManifest(capability, input.record, entries);\n\t\t\t\tconst key = installationKey(input.scope, scopeRef, input.record.pluginId);\n\t\t\t\tstaging = join(instanceRoot, `.staging-${randomUUID()}`);\n\t\t\t\tawait writeEntries(staging, entries, operation.signal);\n\t\t\t\tconst installRef = `plugin-install://node-zip/${randomUUID()}`;\n\t\t\t\tconst destination = packagePath(instanceRoot, `${key}\\u0000${installRef}`);\n\t\t\t\tawait rename(staging, destination);\n\t\t\t\tstaging = undefined;\n\t\t\t\tconst installedRecord: InstalledRecordV1 = {\n\t\t\t\t\tinstallationRef: installRef,\n\t\t\t\t\tdirectory: destination,\n\t\t\t\t\tpluginId: input.record.pluginId,\n\t\t\t\t\tpluginVersion: input.record.pluginVersion,\n\t\t\t\t\tmanifestDigest: input.record.manifestDigest,\n\t\t\t\t\tscope: input.scope,\n\t\t\t\t\tscopeRef,\n\t\t\t\t\tstate: \"installed\",\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\t\tvalues.set(installRef, installedRecord);\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tawait rm(destination, { recursive: true, force: true }).catch(() => undefined);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn { installationRef: installRef, scope: input.scope, scopeRef };\n\t\t\t} catch (error) {\n\t\t\t\tif (operation.signal.aborted || input.signal?.aborted) throw new NodePackageInstallErrorV1(\"cancelled\");\n\t\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t} finally {\n\t\t\t\tif (staging !== undefined) await rm(staging, { recursive: true, force: true }).catch(() => undefined);\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync activate(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\tlet candidate: { readonly dispose?: () => void | Promise<void> } | undefined;\n\t\t\ttry {\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst record = getRecord(input.installation, input.record, input.scope, scopeRef);\n\t\t\t\tif (record.state !== \"installed\") throw new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\tcandidate = await loadRuntime(input.installation, input.record, record.directory, operation.signal);\n\t\t\t\tconst key = installationKey(input.scope, scopeRef, input.record.pluginId);\n\t\t\t\tconst previousRef = activeByKey.get(key);\n\t\t\t\tif (previousRef !== undefined) {\n\t\t\t\t\tconst previous = records.get(previousRef);\n\t\t\t\t\tif (previous !== undefined) {\n\t\t\t\t\t\tawait disposeRuntime(previousRef);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\tconst candidateRecord = values.get(input.installation.installationRef);\n\t\t\t\t\tif (candidateRecord === undefined) throw new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\t\tif (previousRef !== undefined) {\n\t\t\t\t\t\tconst previousRecord = values.get(previousRef);\n\t\t\t\t\t\tif (previousRecord !== undefined) values.set(previousRef, { ...previousRecord, state: \"retained\" });\n\t\t\t\t\t}\n\t\t\t\t\tvalues.set(input.installation.installationRef, { ...candidateRecord, state: \"active\" });\n\t\t\t\t});\n\t\t\t\tactiveByKey.set(key, input.installation.installationRef);\n\t\t\t\tif (candidate !== undefined) runtimeHandles.set(input.installation.installationRef, candidate);\n\t\t\t\tcandidate = undefined;\n\t\t\t} catch (error) {\n\t\t\t\tif (candidate?.dispose !== undefined) await Promise.resolve(candidate.dispose()).catch(() => undefined);\n\t\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t} finally {\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync rollback(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\tlet candidate: { readonly dispose?: () => void | Promise<void> } | undefined;\n\t\t\ttry {\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst failed = records.get(input.failed.installationRef);\n\t\t\t\tif (\n\t\t\t\t\tfailed === undefined ||\n\t\t\t\t\t!identityMatches(failed, {\n\t\t\t\t\t\tpluginId: input.failed.pluginId,\n\t\t\t\t\t\tpluginVersion: input.failed.pluginVersion,\n\t\t\t\t\t\tmanifestDigest: input.failed.manifestDigest,\n\t\t\t\t\t\tscope: input.scope,\n\t\t\t\t\t\tscopeRef,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\tconst previous = records.get(input.previous.installationRef);\n\t\t\t\tif (\n\t\t\t\t\tprevious === undefined ||\n\t\t\t\t\t!identityMatches(previous, {\n\t\t\t\t\t\tpluginId: input.previous.pluginId,\n\t\t\t\t\t\tpluginVersion: input.previous.pluginVersion,\n\t\t\t\t\t\tmanifestDigest: input.previous.manifestDigest,\n\t\t\t\t\t\tscope: input.scope,\n\t\t\t\t\t\tscopeRef,\n\t\t\t\t\t}) ||\n\t\t\t\t\t(previous.state !== \"active\" && previous.state !== \"retained\") ||\n\t\t\t\t\tfailed.pluginId !== previous.pluginId\n\t\t\t\t)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\tconst previousInstallation: PluginInstallationV1 = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tpluginId: previous.pluginId,\n\t\t\t\t\tpluginVersion: previous.pluginVersion,\n\t\t\t\t\tmanifestDigest: previous.manifestDigest,\n\t\t\t\t\tscope: previous.scope,\n\t\t\t\t\tscopeRef: previous.scopeRef,\n\t\t\t\t\tinstallationRef: input.previous.installationRef,\n\t\t\t\t\tstate: \"active\",\n\t\t\t\t};\n\t\t\t\tcandidate = await loadRuntime(previousInstallation, undefined, previous.directory, operation.signal);\n\t\t\t\tawait disposeRuntime(input.failed.installationRef);\n\t\t\t\tawait rm(failed.directory, { recursive: true, force: true });\n\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\tvalues.delete(input.failed.installationRef);\n\t\t\t\t\tconst previousRecord = values.get(input.previous.installationRef);\n\t\t\t\t\tif (previousRecord !== undefined)\n\t\t\t\t\t\tvalues.set(input.previous.installationRef, { ...previousRecord, state: \"active\" });\n\t\t\t\t});\n\t\t\t\tactiveByKey.set(installationKey(input.scope, scopeRef, failed.pluginId), input.previous.installationRef);\n\t\t\t\tif (candidate !== undefined) runtimeHandles.set(input.previous.installationRef, candidate);\n\t\t\t\tcandidate = undefined;\n\t\t\t} catch (error) {\n\t\t\t\tif (candidate?.dispose !== undefined) await Promise.resolve(candidate.dispose()).catch(() => undefined);\n\t\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t} finally {\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync uninstall(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\ttry {\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst record = records.get(input.installation.installationRef);\n\t\t\t\tif (\n\t\t\t\t\trecord === undefined ||\n\t\t\t\t\t!identityMatches(record, {\n\t\t\t\t\t\tpluginId: input.installation.pluginId,\n\t\t\t\t\t\tpluginVersion: input.installation.pluginVersion,\n\t\t\t\t\t\tmanifestDigest: input.installation.manifestDigest,\n\t\t\t\t\t\tscope: input.scope,\n\t\t\t\t\t\tscopeRef,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_unknown\");\n\t\t\t\tawait disposeRuntime(input.installation.installationRef);\n\t\t\t\t// force:false keeps rm strict, but a directory that is already\n\t\t\t\t// gone (ghost record from an interrupted uninstall) is the\n\t\t\t\t// desired end state — continue to the index commit instead of\n\t\t\t\t// bricking every later store operation on ENOENT.\n\t\t\t\tawait rm(record.directory, { recursive: true, force: false }).catch((error: unknown) => {\n\t\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\tvalues.delete(input.installation.installationRef);\n\t\t\t\t});\n\t\t\t\tconst key = installationKey(input.scope, scopeRef, record.pluginId);\n\t\t\t\tif (activeByKey.get(key) === input.installation.installationRef) activeByKey.delete(key);\n\t\t\t} finally {\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync close() {\n\t\t\tif (closePromise !== undefined) return await closePromise;\n\t\t\tclosed = true;\n\t\t\tfor (const operation of activeOperations) operation.abort();\n\t\t\tclosePromise = (async () => {\n\t\t\t\tawait waitDrained();\n\t\t\t\tlet disposeError = false;\n\t\t\t\tfor (const installationRef of runtimeHandles.keys()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait disposeRuntime(installationRef);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tdisposeError = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (persistence === undefined) await rm(instanceRoot, { recursive: true, force: true });\n\t\t\t\telse await persistence.close();\n\t\t\t\trecords.clear();\n\t\t\t\tactiveByKey.clear();\n\t\t\t\tif (disposeError) throw new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t})();\n\t\t\treturn await closePromise;\n\t\t},\n\t};\n\tif (options.loadPlugin !== undefined) {\n\t\ttry {\n\t\t\tfor (const record of records.values()) {\n\t\t\t\tif (record.state !== \"active\") continue;\n\t\t\t\tconst installation: PluginInstallationV1 = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tpluginId: record.pluginId,\n\t\t\t\t\tpluginVersion: record.pluginVersion,\n\t\t\t\t\tmanifestDigest: record.manifestDigest,\n\t\t\t\t\tscope: record.scope,\n\t\t\t\t\tscopeRef: record.scopeRef,\n\t\t\t\t\tinstallationRef: record.installationRef,\n\t\t\t\t\tstate: \"active\",\n\t\t\t\t};\n\t\t\t\tconst runtime = await loadRuntime(installation, undefined, record.directory, new AbortController().signal);\n\t\t\t\tif (runtime !== undefined) runtimeHandles.set(record.installationRef, runtime);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait host.close().catch(() => undefined);\n\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t}\n\t}\n\treturn host;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"node-package-install-host.js","sourceRoot":"","sources":["../../../src/plugins/ecosystem/node-package-install-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, mkdtemp, rename, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { inflateRawSync } from \"node:zlib\";\nimport { parseCapabilityPluginManifest } from \"../../core/extensions/capability-plugin.ts\";\nimport { t } from \"../../core/i18n/index.ts\";\nimport type { PluginDistributionArtifactV1 } from \"./distribution.ts\";\nimport type { PluginInstallationScopeV1, PluginInstallationV1, PluginInstallHostV1 } from \"./installer.ts\";\nimport {\n\tcreateNodePackageInstallPersistenceV1,\n\ttype NodePackageInstallPersistenceV1,\n\ttype NodePackageInstallPersistentRecordV1,\n} from \"./node-package-install-persistence.ts\";\nimport { parseNodeTarGzPackageV1 } from \"./node-tar-package.ts\";\nimport type { PluginManifestV1, PluginUpdateRecordV1 } from \"./types.ts\";\nimport { pluginManifestDigestV1 } from \"./updates.ts\";\n\nconst NODE_PACKAGE_INSTALL_HOST_VERSION_V1 = 1 as const;\nexport const NODE_PACKAGE_FORMAT_VERSION_V1 = 1 as const;\nconst DEFAULT_MAX_ARCHIVE_BYTES_V1 = 128 * 1024 * 1024;\nconst MAX_ARCHIVE_BYTES_V1 = 512 * 1024 * 1024;\nconst DEFAULT_MAX_EXTRACTED_BYTES_V1 = 256 * 1024 * 1024;\nconst MAX_EXTRACTED_BYTES_V1 = 1024 * 1024 * 1024;\nconst DEFAULT_MAX_ENTRY_BYTES_V1 = 64 * 1024 * 1024;\nconst MAX_ENTRY_BYTES_V1 = 256 * 1024 * 1024;\nconst DEFAULT_MAX_ENTRIES_V1 = 2048;\nconst MAX_ENTRIES_V1 = 8192;\nconst MAX_PACKAGE_MANIFEST_BYTES_V1 = 64 * 1024;\nconst ECOSYSTEM_MANIFEST_FILE_V1 = \"agent-forge.json\";\nconst CAPABILITY_MANIFEST_FILE_V1 = \"plugin.json\";\n\nconst LOCAL_FILE_HEADER_V1 = 0x04034b50;\nconst CENTRAL_FILE_HEADER_V1 = 0x02014b50;\nconst END_OF_CENTRAL_DIRECTORY_V1 = 0x06054b50;\nconst ZIP64_END_OF_CENTRAL_DIRECTORY_V1 = 0x06064b50;\nconst ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_V1 = 0x07064b50;\n\nexport type NodePackageInstallErrorCodeV1 =\n\t| \"cancelled\"\n\t| \"host_closed\"\n\t| \"invalid_artifact\"\n\t| \"unsupported_media_type\"\n\t| \"archive_invalid\"\n\t| \"archive_budget_exceeded\"\n\t| \"package_manifest_missing\"\n\t| \"package_manifest_invalid\"\n\t| \"package_manifest_mismatch\"\n\t| \"installation_unknown\"\n\t| \"installation_identity_mismatch\"\n\t| \"installation_io_failed\";\n\nexport class NodePackageInstallErrorV1 extends Error {\n\treadonly code: NodePackageInstallErrorCodeV1;\n\n\tconstructor(code: NodePackageInstallErrorCodeV1) {\n\t\tsuper(t(\"Node package installation failed: {code}\", { code }));\n\t\tthis.name = \"NodePackageInstallErrorV1\";\n\t\tthis.code = code;\n\t}\n}\n\nexport interface NodeZipPackageEntryV1 {\n\treadonly name: string;\n\treadonly directory: boolean;\n\treadonly bytes: Uint8Array;\n}\n\nexport interface NodeZipPackageLimitsV1 {\n\treadonly maxArchiveBytes?: number;\n\treadonly maxExtractedBytes?: number;\n\treadonly maxEntryBytes?: number;\n\treadonly maxEntries?: number;\n}\n\nexport interface NodePackageInstallHostOptionsV1 extends NodeZipPackageLimitsV1 {\n\t/** An opaque artifact reader owned by the distribution host. */\n\treadonly openArtifact: (input: {\n\t\treadonly artifact: PluginDistributionArtifactV1;\n\t\treadonly signal?: AbortSignal;\n\t}) => AsyncIterable<Uint8Array>;\n\t/** Parent directory owned by the host; no local path leaves this adapter. */\n\treadonly installationDirectory?: string;\n\treadonly supportedScopes?: readonly PluginInstallationScopeV1[];\n\t/** Persistent host-owned index; omitted keeps the test-friendly ephemeral mode. */\n\treadonly persistence?: \"ephemeral\" | \"persistent\";\n\treadonly persistenceLockTimeoutMs?: number;\n\t/**\n\t * Host-only runtime assembly seam. The directory and manifest path never\n\t * cross the public installer DTO or model/tool context.\n\t */\n\treadonly loadPlugin?: (input: {\n\t\treadonly installation: PluginInstallationV1;\n\t\treadonly record?: PluginUpdateRecordV1;\n\t\treadonly directory: string;\n\t\treadonly manifestPath: string;\n\t\treadonly signal: AbortSignal;\n\t}) => Promise<{ readonly dispose?: () => void | Promise<void> } | void>;\n}\n\n/** Minimal structural bridge for an AgentSession-owned capability loader. */\nexport interface NodePackageInstallCapabilityPluginSessionV1 {\n\treadonly loadCapabilityPluginManifest: (manifestPath: string) => Promise<{\n\t\treadonly dispose: () => void | Promise<void>;\n\t}>;\n}\n\n/**\n * Adapt an AgentSession-like loader to the host-only runtime seam. The\n * manifest path is never returned as a DTO or sent through model context.\n */\nexport function createNodePackageInstallSessionLoaderV1(\n\tsession: NodePackageInstallCapabilityPluginSessionV1,\n): NonNullable<NodePackageInstallHostOptionsV1[\"loadPlugin\"]> {\n\treturn async ({ manifestPath }) => {\n\t\tconst handle = await session.loadCapabilityPluginManifest(manifestPath);\n\t\treturn { dispose: handle.dispose };\n\t};\n}\n\n/**\n * Create a package host with an explicit AgentSession-compatible runtime\n * loader. This is an opt-in composition helper; it does not alter Core's\n * default session construction or install untrusted package code.\n */\nexport async function createNodePackageInstallHostForSessionV1(\n\toptions: NodePackageInstallHostOptionsV1,\n\tsession: NodePackageInstallCapabilityPluginSessionV1,\n): Promise<NodePackageInstallHostV1> {\n\tif (options.loadPlugin !== undefined) throw new Error(t(\"loadPlugin must be omitted when binding a session\"));\n\treturn await createNodePackageInstallHostV1({\n\t\t...options,\n\t\tloadPlugin: createNodePackageInstallSessionLoaderV1(session),\n\t});\n}\n\nexport interface NodePackageInstallHostV1 extends PluginInstallHostV1 {\n\treadonly version: typeof NODE_PACKAGE_INSTALL_HOST_VERSION_V1;\n\treadonly uninstall: NonNullable<PluginInstallHostV1[\"uninstall\"]>;\n\t/** Host-only bridge for local runtime assembly; never put this path in a DTO or transcript. */\n\treadonly getInstallationDirectory: (input: { readonly installation: PluginInstallationV1 }) => string;\n\treadonly close: () => Promise<void>;\n}\n\ninterface ZipEntryDescriptorV1 {\n\treadonly name: string;\n\treadonly directory: boolean;\n\treadonly flags: number;\n\treadonly method: number;\n\treadonly compressedSize: number;\n\treadonly uncompressedSize: number;\n\treadonly crc32: number;\n\treadonly localOffset: number;\n}\n\ninterface ZipLocalSpanV1 {\n\treadonly start: number;\n\treadonly end: number;\n}\n\ninterface InstalledRecordV1 {\n\treadonly installationRef: string;\n\treadonly directory: string;\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly manifestDigest: string;\n\treadonly scope: PluginInstallationScopeV1;\n\treadonly scopeRef: string;\n\tstate: \"installed\" | \"active\" | \"retained\";\n}\n\nfunction positiveLimit(value: number | undefined, fallback: number, maximum: number, label: string): number {\n\tconst result = value ?? fallback;\n\tif (!Number.isSafeInteger(result) || result < 1 || result > maximum)\n\t\tthrow new Error(t(\"{label} must be a positive integer at most {maximum}\", { label, maximum }));\n\treturn result;\n}\n\n/** Resolve the archive budget limits shared by the ZIP and tgz package parsers. */\nexport function resolveNodePackageLimitsV1(limitsInput: NodeZipPackageLimitsV1): Required<NodeZipPackageLimitsV1> {\n\treturn {\n\t\tmaxArchiveBytes: positiveLimit(\n\t\t\tlimitsInput.maxArchiveBytes,\n\t\t\tDEFAULT_MAX_ARCHIVE_BYTES_V1,\n\t\t\tMAX_ARCHIVE_BYTES_V1,\n\t\t\t\"maxArchiveBytes\",\n\t\t),\n\t\tmaxExtractedBytes: positiveLimit(\n\t\t\tlimitsInput.maxExtractedBytes,\n\t\t\tDEFAULT_MAX_EXTRACTED_BYTES_V1,\n\t\t\tMAX_EXTRACTED_BYTES_V1,\n\t\t\t\"maxExtractedBytes\",\n\t\t),\n\t\tmaxEntryBytes: positiveLimit(\n\t\t\tlimitsInput.maxEntryBytes,\n\t\t\tDEFAULT_MAX_ENTRY_BYTES_V1,\n\t\t\tMAX_ENTRY_BYTES_V1,\n\t\t\t\"maxEntryBytes\",\n\t\t),\n\t\tmaxEntries: positiveLimit(limitsInput.maxEntries, DEFAULT_MAX_ENTRIES_V1, MAX_ENTRIES_V1, \"maxEntries\"),\n\t};\n}\n\nfunction readU16(bytes: Uint8Array, offset: number): number {\n\tif (offset < 0 || offset + 2 > bytes.byteLength) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn bytes[offset]! | (bytes[offset + 1]! << 8);\n}\n\nfunction readU32(bytes: Uint8Array, offset: number): number {\n\tif (offset < 0 || offset + 4 > bytes.byteLength) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn (bytes[offset]! | (bytes[offset + 1]! << 8) | (bytes[offset + 2]! << 16) | (bytes[offset + 3]! << 24)) >>> 0;\n}\n\nfunction decodeName(bytes: Uint8Array, utf8: boolean): string {\n\ttry {\n\t\tconst value = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n\t\tif (!utf8 && /[^\\x00-\\x7f]/u.test(value)) throw new Error(t(\"non-ascii zip name\"));\n\t\treturn value;\n\t} catch {\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n}\n\n/** Normalized archive entry name shared by the ZIP and tgz package parsers. */\nexport function normalizedEntryName(value: string): { readonly name: string; readonly directory: boolean } {\n\tif (value.length === 0 || value.includes(\"\\\\\") || /[\\u0000-\\u001f\\u007f]/u.test(value))\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst directory = value.endsWith(\"/\");\n\tif (value.startsWith(\"/\") || /^[a-z]:/iu.test(value)) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst parts = value.split(\"/\");\n\tif (directory) parts.pop();\n\tif (\n\t\tparts.length === 0 ||\n\t\tparts.some(\n\t\t\t(part) =>\n\t\t\t\tpart === \"\" ||\n\t\t\t\tpart === \".\" ||\n\t\t\t\tpart === \"..\" ||\n\t\t\t\tpart.includes(\":\") ||\n\t\t\t\t/[ .]$/u.test(part) ||\n\t\t\t\t/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\..*)?$/iu.test(part),\n\t\t)\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn { name: parts.join(\"/\"), directory };\n}\n\nfunction crcTable(): Uint32Array {\n\tconst table = new Uint32Array(256);\n\tfor (let index = 0; index < table.length; index += 1) {\n\t\tlet value = index;\n\t\tfor (let bit = 0; bit < 8; bit += 1) value = (value & 1) === 0 ? value >>> 1 : (value >>> 1) ^ 0xedb88320;\n\t\ttable[index] = value >>> 0;\n\t}\n\treturn table;\n}\n\nconst CRC_TABLE_V1 = crcTable();\n\nfunction crc32(bytes: Uint8Array): number {\n\tlet value = 0xffffffff;\n\tfor (const byte of bytes) value = (value >>> 8) ^ CRC_TABLE_V1[(value ^ byte) & 0xff]!;\n\treturn (value ^ 0xffffffff) >>> 0;\n}\n\nfunction findEndOfCentralDirectory(bytes: Uint8Array): {\n\treadonly offset: number;\n\treadonly entries: number;\n\treadonly size: number;\n\treadonly start: number;\n} {\n\tconst minimum = Math.max(0, bytes.byteLength - 0xffff - 22);\n\tfor (let offset = bytes.byteLength - 22; offset >= minimum; offset -= 1) {\n\t\tif (readU32(bytes, offset) !== END_OF_CENTRAL_DIRECTORY_V1) continue;\n\t\tconst disk = readU16(bytes, offset + 4);\n\t\tconst centralDisk = readU16(bytes, offset + 6);\n\t\tconst entries = readU16(bytes, offset + 10);\n\t\tconst centralEntries = readU16(bytes, offset + 8);\n\t\tconst size = readU32(bytes, offset + 12);\n\t\tconst start = readU32(bytes, offset + 16);\n\t\tconst commentLength = readU16(bytes, offset + 20);\n\t\tif (\n\t\t\tdisk !== 0 ||\n\t\t\tcentralDisk !== 0 ||\n\t\t\tentries !== centralEntries ||\n\t\t\toffset + 22 + commentLength !== bytes.byteLength\n\t\t)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (entries === 0xffff || size === 0xffffffff || start === 0xffffffff)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (start + size > offset) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\treturn { offset, entries, size, start };\n\t}\n\tfor (let offset = Math.max(0, bytes.byteLength - 64); offset < bytes.byteLength - 3; offset += 1) {\n\t\tconst signature = readU32(bytes, offset);\n\t\tif (signature === ZIP64_END_OF_CENTRAL_DIRECTORY_V1 || signature === ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_V1)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n}\n\nfunction parseCentralDirectory(\n\tbytes: Uint8Array,\n\tlimits: Required<NodeZipPackageLimitsV1>,\n): readonly ZipEntryDescriptorV1[] {\n\tconst end = findEndOfCentralDirectory(bytes);\n\tif (end.entries > limits.maxEntries || end.size > bytes.byteLength || end.start + end.size > end.offset)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\tconst entries: ZipEntryDescriptorV1[] = [];\n\tconst names = new Set<string>();\n\tlet offset = end.start;\n\tfor (let index = 0; index < end.entries; index += 1) {\n\t\tif (readU32(bytes, offset) !== CENTRAL_FILE_HEADER_V1) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tconst madeBy = readU16(bytes, offset + 4) >>> 8;\n\t\tconst flags = readU16(bytes, offset + 8);\n\t\tconst method = readU16(bytes, offset + 10);\n\t\tconst crc = readU32(bytes, offset + 16);\n\t\tconst compressedSize = readU32(bytes, offset + 20);\n\t\tconst uncompressedSize = readU32(bytes, offset + 24);\n\t\tconst nameLength = readU16(bytes, offset + 28);\n\t\tconst extraLength = readU16(bytes, offset + 30);\n\t\tconst commentLength = readU16(bytes, offset + 32);\n\t\tconst disk = readU16(bytes, offset + 34);\n\t\tconst externalAttributes = readU32(bytes, offset + 38);\n\t\tconst localOffset = readU32(bytes, offset + 42);\n\t\tconst nameStart = offset + 46;\n\t\tconst recordEnd = nameStart + nameLength + extraLength + commentLength;\n\t\tif (\n\t\t\trecordEnd > end.start + end.size ||\n\t\t\tdisk !== 0 ||\n\t\t\t(flags & ~(0x8 | 0x800)) !== 0 ||\n\t\t\t(flags & 1) !== 0 ||\n\t\t\t(flags & 0x40) !== 0\n\t\t)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (method !== 0 && method !== 8) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (uncompressedSize > limits.maxEntryBytes || compressedSize > limits.maxArchiveBytes)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\t\tconst name = normalizedEntryName(\n\t\t\tdecodeName(bytes.subarray(nameStart, nameStart + nameLength), (flags & 0x800) !== 0),\n\t\t);\n\t\tif (names.has(name.name)) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tnames.add(name.name);\n\t\tconst unixMode = madeBy === 3 ? (externalAttributes >>> 16) & 0xffff : 0;\n\t\tif ((unixMode & 0xf000) === 0xa000) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tentries.push({\n\t\t\tname: name.name,\n\t\t\tdirectory: name.directory,\n\t\t\tflags,\n\t\t\tmethod,\n\t\t\tcompressedSize,\n\t\t\tuncompressedSize,\n\t\t\tcrc32: crc,\n\t\t\tlocalOffset,\n\t\t});\n\t\toffset = recordEnd;\n\t}\n\tif (offset !== end.start + end.size) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t// Validate the local-file regions before extraction. A forged central\n\t// directory must not be able to point into another entry or into the\n\t// central directory/EOCD; otherwise extraction could reinterpret metadata\n\t// bytes as package contents.\n\tconst spans: ZipLocalSpanV1[] = [];\n\tfor (const entry of entries) {\n\t\tif (entry.localOffset < 0 || entry.localOffset + 30 > end.start)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tif (readU32(bytes, entry.localOffset) !== LOCAL_FILE_HEADER_V1)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tconst localNameLength = readU16(bytes, entry.localOffset + 26);\n\t\tconst localExtraLength = readU16(bytes, entry.localOffset + 28);\n\t\tconst dataStart = entry.localOffset + 30 + localNameLength + localExtraLength;\n\t\tconst dataEnd = dataStart + entry.compressedSize;\n\t\tif (dataStart < entry.localOffset + 30 || dataEnd < dataStart || dataEnd > end.start)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\tspans.push({ start: entry.localOffset, end: dataEnd });\n\t}\n\tspans.sort((left, right) => left.start - right.start || left.end - right.end);\n\tfor (let index = 1; index < spans.length; index += 1) {\n\t\tif (spans[index - 1]!.end > spans[index]!.start) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n\treturn entries;\n}\n\nfunction extractEntry(bytes: Uint8Array, entry: ZipEntryDescriptorV1, maxEntryBytes: number): Uint8Array {\n\tif (entry.directory) {\n\t\tif (entry.compressedSize !== 0 || entry.uncompressedSize !== 0)\n\t\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t\treturn new Uint8Array();\n\t}\n\tif (entry.localOffset + 30 > bytes.byteLength) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\tif (readU32(bytes, entry.localOffset) !== LOCAL_FILE_HEADER_V1)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst localFlags = readU16(bytes, entry.localOffset + 6);\n\tconst localMethod = readU16(bytes, entry.localOffset + 8);\n\tconst nameLength = readU16(bytes, entry.localOffset + 26);\n\tconst extraLength = readU16(bytes, entry.localOffset + 28);\n\tconst localName = decodeName(\n\t\tbytes.subarray(entry.localOffset + 30, entry.localOffset + 30 + nameLength),\n\t\t(entry.flags & 0x800) !== 0,\n\t);\n\tif (normalizedEntryName(localName).name !== entry.name || localFlags !== entry.flags || localMethod !== entry.method)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst localCompressedSize = readU32(bytes, entry.localOffset + 18);\n\tconst localUncompressedSize = readU32(bytes, entry.localOffset + 22);\n\tif (\n\t\t(entry.flags & 8) === 0 &&\n\t\t(localCompressedSize !== entry.compressedSize || localUncompressedSize !== entry.uncompressedSize)\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst dataStart = entry.localOffset + 30 + nameLength + extraLength;\n\tconst dataEnd = dataStart + entry.compressedSize;\n\tif (dataStart > bytes.byteLength || dataEnd > bytes.byteLength)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst compressed = bytes.subarray(dataStart, dataEnd);\n\tlet output: Uint8Array;\n\ttry {\n\t\toutput =\n\t\t\tentry.method === 0\n\t\t\t\t? new Uint8Array(compressed)\n\t\t\t\t: inflateRawSync(compressed, { maxOutputLength: maxEntryBytes });\n\t} catch {\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\t}\n\tif (\n\t\toutput.byteLength !== entry.uncompressedSize ||\n\t\toutput.byteLength > maxEntryBytes ||\n\t\tcrc32(output) !== entry.crc32\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"archive_invalid\");\n\treturn output;\n}\n\nexport function parseNodeZipPackageV1(\n\tinput: Uint8Array,\n\tlimitsInput: NodeZipPackageLimitsV1 = {},\n): readonly NodeZipPackageEntryV1[] {\n\tif (!(input instanceof Uint8Array)) throw new NodePackageInstallErrorV1(\"archive_invalid\");\n\tconst limits = resolveNodePackageLimitsV1(limitsInput);\n\tif (input.byteLength > limits.maxArchiveBytes) throw new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\tconst descriptors = parseCentralDirectory(input, limits);\n\tlet extractedBytes = 0;\n\treturn Object.freeze(\n\t\tdescriptors.map((descriptor) => {\n\t\t\tconst bytes = extractEntry(input, descriptor, limits.maxEntryBytes);\n\t\t\textractedBytes += bytes.byteLength;\n\t\t\tif (extractedBytes > limits.maxExtractedBytes) throw new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\t\t\treturn Object.freeze({ name: descriptor.name, directory: descriptor.directory, bytes });\n\t\t}),\n\t);\n}\n\nfunction manifestKeys(value: Record<string, unknown>): boolean {\n\tconst allowed = new Set([\n\t\t\"packageFormatVersion\",\n\t\t\"id\",\n\t\t\"pluginVersion\",\n\t\t\"apiVersion\",\n\t\t\"minHostVersion\",\n\t\t\"maxHostVersion\",\n\t\t\"capabilityRefs\",\n\t\t\"requires\",\n\t\t\"platform\",\n\t\t\"testOnly\",\n\t]);\n\treturn Object.keys(value).every((key) => allowed.has(key));\n}\n\nfunction packageManifest(value: unknown, record: PluginUpdateRecordV1): void {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\tconst manifest = value as Record<string, unknown>;\n\tif (\n\t\t!manifestKeys(manifest) ||\n\t\tmanifest.packageFormatVersion !== NODE_PACKAGE_FORMAT_VERSION_V1 ||\n\t\tmanifest.id !== record.pluginId ||\n\t\tmanifest.pluginVersion !== record.pluginVersion\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\tif (typeof manifest.apiVersion !== \"string\" || manifest.apiVersion !== record.manifest.apiVersion)\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\ttry {\n\t\tif (pluginManifestDigestV1(manifest as unknown as PluginManifestV1) !== record.manifestDigest)\n\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\t} catch (error) {\n\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t}\n}\n\nfunction capabilityManifest(\n\tvalue: unknown,\n\trecord: PluginUpdateRecordV1,\n\tentries: readonly NodeZipPackageEntryV1[],\n): void {\n\tlet manifest: ReturnType<typeof parseCapabilityPluginManifest>;\n\ttry {\n\t\tmanifest = parseCapabilityPluginManifest(value, \"<installed plugin.json>\");\n\t} catch {\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t}\n\tif (manifest.id !== record.pluginId || manifest.version !== record.pluginVersion)\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n\tconst entryValue = manifest.entry.startsWith(\"./\") ? manifest.entry.slice(2) : manifest.entry;\n\tconst entry = normalizedEntryName(entryValue);\n\tif (entry.directory || !entries.some((candidate) => candidate.name === entry.name && !candidate.directory))\n\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_mismatch\");\n}\n\nfunction opaqueScope(value: string): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.trim() === \"\" ||\n\t\tvalue.length > 2048 ||\n\t\t/\\s|[\\u0000-\\u001f\\u007f]/u.test(value)\n\t)\n\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\treturn value;\n}\n\nfunction installationKey(scope: PluginInstallationScopeV1, scopeRef: string, pluginId: string): string {\n\treturn `${scope}\\u0000${scopeRef}\\u0000${pluginId}`;\n}\n\nfunction identityMatches(\n\trecord: InstalledRecordV1,\n\tinput: {\n\t\treadonly pluginId: string;\n\t\treadonly pluginVersion: string;\n\t\treadonly manifestDigest: string;\n\t\treadonly scope: PluginInstallationScopeV1;\n\t\treadonly scopeRef: string;\n\t},\n): boolean {\n\treturn (\n\t\trecord.pluginId === input.pluginId &&\n\t\trecord.pluginVersion === input.pluginVersion &&\n\t\trecord.manifestDigest === input.manifestDigest &&\n\t\trecord.scope === input.scope &&\n\t\trecord.scopeRef === input.scopeRef\n\t);\n}\n\nfunction artifactIdentityMatchesRecord(artifact: PluginDistributionArtifactV1, record: PluginUpdateRecordV1): boolean {\n\treturn (\n\t\tartifact.version === 1 &&\n\t\tartifact.pluginId === record.pluginId &&\n\t\tartifact.pluginVersion === record.pluginVersion &&\n\t\tartifact.manifestDigest === record.manifestDigest\n\t);\n}\n\nfunction expectedArtifactDigest(value: string): { readonly algorithm: \"sha256\" | \"sha512\"; readonly hex: string } {\n\tconst prefixed = /^(sha256|sha512):([0-9a-f]+)$/iu.exec(value);\n\tif (prefixed !== null) {\n\t\tconst algorithm = prefixed[1]!.toLowerCase() as \"sha256\" | \"sha512\";\n\t\tconst hex = prefixed[2]!.toLowerCase();\n\t\tif ((algorithm === \"sha256\" && hex.length === 64) || (algorithm === \"sha512\" && hex.length === 128))\n\t\t\treturn { algorithm, hex };\n\t}\n\tif (/^[0-9a-f]{64}$/iu.test(value)) return { algorithm: \"sha256\", hex: value.toLowerCase() };\n\tif (/^[0-9a-f]{128}$/iu.test(value)) return { algorithm: \"sha512\", hex: value.toLowerCase() };\n\tthrow new NodePackageInstallErrorV1(\"invalid_artifact\");\n}\n\nasync function collectArtifact(\n\topenArtifact: NodePackageInstallHostOptionsV1[\"openArtifact\"],\n\tartifact: PluginDistributionArtifactV1,\n\tmaxBytes: number,\n\tsignal: AbortSignal,\n): Promise<Uint8Array> {\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tfor await (const chunk of openArtifact({ artifact, signal })) {\n\t\tif (signal.aborted) throw new NodePackageInstallErrorV1(\"cancelled\");\n\t\tif (!(chunk instanceof Uint8Array)) throw new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\tif (chunk.byteLength > maxBytes - total) throw new NodePackageInstallErrorV1(\"archive_budget_exceeded\");\n\t\tchunks.push(new Uint8Array(chunk));\n\t\ttotal += chunk.byteLength;\n\t}\n\tconst result = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\treturn result;\n}\n\nfunction packagePath(root: string, key: string): string {\n\treturn join(root, createHash(\"sha256\").update(key).digest(\"hex\"));\n}\n\nasync function writeEntries(\n\troot: string,\n\tentries: readonly NodeZipPackageEntryV1[],\n\tsignal: AbortSignal,\n): Promise<void> {\n\tawait mkdir(root, { recursive: true, mode: 0o700 });\n\tfor (const entry of entries) {\n\t\tif (signal.aborted) throw new NodePackageInstallErrorV1(\"cancelled\");\n\t\tconst target = join(root, ...entry.name.split(\"/\"));\n\t\tif (entry.directory) {\n\t\t\tawait mkdir(target, { recursive: true, mode: 0o700 });\n\t\t\tcontinue;\n\t\t}\n\t\tconst parent = join(root, ...entry.name.split(\"/\").slice(0, -1));\n\t\tawait mkdir(parent, { recursive: true, mode: 0o700 });\n\t\tawait writeFile(target, entry.bytes, { flag: \"wx\", mode: 0o600 });\n\t}\n}\n\n/**\n * Host-owned ZIP/tgz package installer. It extracts only a bounded,\n * non-encrypted ZIP (\"application/zip\") or gzip-compressed tar\n * (\"application/gzip\") package and never executes package contents. The\n * returned installation handle is opaque; paths stay inside the host-owned\n * instance directory.\n */\nexport async function createNodePackageInstallHostV1(\n\toptions: NodePackageInstallHostOptionsV1,\n): Promise<NodePackageInstallHostV1> {\n\tif (typeof options.openArtifact !== \"function\") throw new Error(t(\"openArtifact is required\"));\n\tconst limits = resolveNodePackageLimitsV1(options);\n\tconst parent = options.installationDirectory ?? tmpdir();\n\tif (!isAbsolute(parent)) throw new Error(t(\"installationDirectory must be absolute\"));\n\tif (options.persistence !== undefined && options.persistence !== \"ephemeral\" && options.persistence !== \"persistent\")\n\t\tthrow new Error(t(\"persistence mode is invalid\"));\n\tconst supportedScopes = options.supportedScopes ?? [\"global\", \"project\"];\n\tif (\n\t\t!Array.isArray(supportedScopes) ||\n\t\tsupportedScopes.length === 0 ||\n\t\tnew Set(supportedScopes).size !== supportedScopes.length ||\n\t\tsupportedScopes.some((scope) => scope !== \"global\" && scope !== \"project\")\n\t)\n\t\tthrow new Error(t(\"supportedScopes is invalid\"));\n\tawait mkdir(parent, { recursive: true, mode: 0o700 });\n\tconst persistent = options.persistence === \"persistent\";\n\tconst instanceRoot = persistent\n\t\t? join(parent, \"agent-forge-plugin-install-store-v1\")\n\t\t: await mkdtemp(join(parent, \"agent-forge-plugin-install-\"));\n\tconst persistence: NodePackageInstallPersistenceV1 | undefined = persistent\n\t\t? await createNodePackageInstallPersistenceV1({\n\t\t\t\trootDirectory: instanceRoot,\n\t\t\t\tlockTimeoutMs: options.persistenceLockTimeoutMs,\n\t\t\t})\n\t\t: undefined;\n\tconst records = new Map<string, InstalledRecordV1>();\n\tconst activeByKey = new Map<string, string>();\n\tif (persistence !== undefined) {\n\t\tfor (const record of await persistence.load()) records.set(record.installationRef, { ...record });\n\t}\n\tfor (const record of records.values()) {\n\t\tif (record.state === \"active\")\n\t\t\tactiveByKey.set(installationKey(record.scope, record.scopeRef, record.pluginId), record.installationRef);\n\t}\n\tlet closed = false;\n\tconst activeOperations = new Set<AbortController>();\n\tconst runtimeHandles = new Map<string, { readonly dispose?: () => void | Promise<void> }>();\n\tconst applyPersistentSnapshot = (snapshot: readonly NodePackageInstallPersistentRecordV1[]): void => {\n\t\trecords.clear();\n\t\tactiveByKey.clear();\n\t\tfor (const value of snapshot) records.set(value.installationRef, { ...value });\n\t\tfor (const value of records.values()) {\n\t\t\tif (value.state === \"active\")\n\t\t\t\tactiveByKey.set(installationKey(value.scope, value.scopeRef, value.pluginId), value.installationRef);\n\t\t}\n\t};\n\tconst commitRecords = async (\n\t\tupdate: (values: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>,\n\t): Promise<void> => {\n\t\tif (persistence === undefined) {\n\t\t\tawait update(records);\n\t\t\treturn;\n\t\t}\n\t\tapplyPersistentSnapshot(await persistence.mutate({ update }));\n\t};\n\tlet drained: (() => void) | undefined;\n\tlet closePromise: Promise<void> | undefined;\n\n\tconst begin = (\n\t\tparentSignal: AbortSignal | undefined,\n\t): { readonly controller: AbortController; readonly signal: AbortSignal } => {\n\t\tif (closed) throw new NodePackageInstallErrorV1(\"host_closed\");\n\t\tconst controller = new AbortController();\n\t\tif (parentSignal?.aborted) controller.abort(parentSignal.reason);\n\t\telse parentSignal?.addEventListener(\"abort\", () => controller.abort(parentSignal.reason), { once: true });\n\t\tactiveOperations.add(controller);\n\t\treturn { controller, signal: controller.signal };\n\t};\n\tconst end = (controller: AbortController): void => {\n\t\tactiveOperations.delete(controller);\n\t\tif (activeOperations.size === 0) {\n\t\t\tdrained?.();\n\t\t\tdrained = undefined;\n\t\t}\n\t};\n\tconst waitDrained = async (): Promise<void> => {\n\t\tif (activeOperations.size === 0) return;\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tdrained = resolve;\n\t\t});\n\t};\n\tconst getRecord = (\n\t\tinstallation: PluginInstallationV1,\n\t\trecord: PluginUpdateRecordV1,\n\t\tscope: PluginInstallationScopeV1,\n\t\tscopeRef: string,\n\t): InstalledRecordV1 => {\n\t\tconst value = records.get(installation.installationRef);\n\t\tif (\n\t\t\tvalue === undefined ||\n\t\t\tinstallation.pluginId !== record.pluginId ||\n\t\t\tinstallation.pluginVersion !== record.pluginVersion ||\n\t\t\tinstallation.manifestDigest !== record.manifestDigest ||\n\t\t\tinstallation.scope !== scope ||\n\t\t\tinstallation.scopeRef !== scopeRef ||\n\t\t\t!identityMatches(value, {\n\t\t\t\tpluginId: record.pluginId,\n\t\t\t\tpluginVersion: record.pluginVersion,\n\t\t\t\tmanifestDigest: record.manifestDigest,\n\t\t\t\tscope,\n\t\t\t\tscopeRef,\n\t\t\t})\n\t\t)\n\t\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\treturn value;\n\t};\n\tconst disposeRuntime = async (installationRef: string): Promise<void> => {\n\t\tconst handle = runtimeHandles.get(installationRef);\n\t\tif (handle === undefined) return;\n\t\tif (handle.dispose !== undefined) await Promise.resolve(handle.dispose());\n\t\truntimeHandles.delete(installationRef);\n\t};\n\tconst loadRuntime = async (\n\t\tinstallation: PluginInstallationV1,\n\t\trecord: PluginUpdateRecordV1 | undefined,\n\t\tdirectory: string,\n\t\tsignal: AbortSignal,\n\t): Promise<{ readonly dispose?: () => void | Promise<void> } | undefined> => {\n\t\tif (options.loadPlugin === undefined) return undefined;\n\t\ttry {\n\t\t\tconst loaded = await options.loadPlugin({\n\t\t\t\tinstallation,\n\t\t\t\trecord,\n\t\t\t\tdirectory,\n\t\t\t\tmanifestPath: join(directory, CAPABILITY_MANIFEST_FILE_V1),\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\treturn loaded ?? undefined;\n\t\t} catch (error) {\n\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t}\n\t};\n\n\tconst host: NodePackageInstallHostV1 = {\n\t\tversion: NODE_PACKAGE_INSTALL_HOST_VERSION_V1,\n\t\tsupportedScopes: Object.freeze([...supportedScopes]),\n\t\tgetInstallationDirectory(input) {\n\t\t\tconst record = records.get(input.installation.installationRef);\n\t\t\tif (\n\t\t\t\trecord === undefined ||\n\t\t\t\trecord.pluginId !== input.installation.pluginId ||\n\t\t\t\trecord.pluginVersion !== input.installation.pluginVersion ||\n\t\t\t\trecord.manifestDigest !== input.installation.manifestDigest ||\n\t\t\t\trecord.scope !== input.installation.scope ||\n\t\t\t\trecord.scopeRef !== input.installation.scopeRef\n\t\t\t)\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_unknown\");\n\t\t\treturn record.directory;\n\t\t},\n\t\tasync install(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\tlet staging: string | undefined;\n\t\t\ttry {\n\t\t\t\tif (input.artifact === undefined) throw new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tif (!artifactIdentityMatchesRecord(input.artifact, input.record))\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tconst mediaType = input.artifact.mediaType.toLowerCase();\n\t\t\t\tif (mediaType !== \"application/zip\" && mediaType !== \"application/gzip\")\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"unsupported_media_type\");\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst bytes = await collectArtifact(\n\t\t\t\t\toptions.openArtifact,\n\t\t\t\t\tinput.artifact,\n\t\t\t\t\tlimits.maxArchiveBytes,\n\t\t\t\t\toperation.signal,\n\t\t\t\t);\n\t\t\t\tif (input.artifact.sizeBytes !== bytes.byteLength) throw new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tconst digest = expectedArtifactDigest(input.artifact.artifactDigest);\n\t\t\t\tif (createHash(digest.algorithm).update(bytes).digest(\"hex\") !== digest.hex)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"invalid_artifact\");\n\t\t\t\tconst entries =\n\t\t\t\t\tmediaType === \"application/gzip\"\n\t\t\t\t\t\t? await parseNodeTarGzPackageV1(bytes, limits)\n\t\t\t\t\t\t: parseNodeZipPackageV1(bytes, limits);\n\t\t\t\tconst manifestEntry = entries.find(\n\t\t\t\t\t(entry) => entry.name === ECOSYSTEM_MANIFEST_FILE_V1 && !entry.directory,\n\t\t\t\t);\n\t\t\t\tif (manifestEntry === undefined) throw new NodePackageInstallErrorV1(\"package_manifest_missing\");\n\t\t\t\tif (manifestEntry.bytes.byteLength > MAX_PACKAGE_MANIFEST_BYTES_V1)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\tlet manifest: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tmanifest = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(manifestEntry.bytes));\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\t}\n\t\t\t\tpackageManifest(manifest, input.record);\n\t\t\t\tconst capabilityEntry = entries.find(\n\t\t\t\t\t(entry) => entry.name === CAPABILITY_MANIFEST_FILE_V1 && !entry.directory,\n\t\t\t\t);\n\t\t\t\tif (capabilityEntry === undefined) throw new NodePackageInstallErrorV1(\"package_manifest_missing\");\n\t\t\t\tif (capabilityEntry.bytes.byteLength > MAX_PACKAGE_MANIFEST_BYTES_V1)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\tlet capability: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tcapability = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(capabilityEntry.bytes));\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"package_manifest_invalid\");\n\t\t\t\t}\n\t\t\t\tcapabilityManifest(capability, input.record, entries);\n\t\t\t\tconst key = installationKey(input.scope, scopeRef, input.record.pluginId);\n\t\t\t\tstaging = join(instanceRoot, `.staging-${randomUUID()}`);\n\t\t\t\tawait writeEntries(staging, entries, operation.signal);\n\t\t\t\tconst installRef = `plugin-install://node-zip/${randomUUID()}`;\n\t\t\t\tconst destination = packagePath(instanceRoot, `${key}\\u0000${installRef}`);\n\t\t\t\tawait rename(staging, destination);\n\t\t\t\tstaging = undefined;\n\t\t\t\tconst installedRecord: InstalledRecordV1 = {\n\t\t\t\t\tinstallationRef: installRef,\n\t\t\t\t\tdirectory: destination,\n\t\t\t\t\tpluginId: input.record.pluginId,\n\t\t\t\t\tpluginVersion: input.record.pluginVersion,\n\t\t\t\t\tmanifestDigest: input.record.manifestDigest,\n\t\t\t\t\tscope: input.scope,\n\t\t\t\t\tscopeRef,\n\t\t\t\t\tstate: \"installed\",\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\t\tvalues.set(installRef, installedRecord);\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tawait rm(destination, { recursive: true, force: true }).catch(() => undefined);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn { installationRef: installRef, scope: input.scope, scopeRef };\n\t\t\t} catch (error) {\n\t\t\t\tif (operation.signal.aborted || input.signal?.aborted) throw new NodePackageInstallErrorV1(\"cancelled\");\n\t\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t} finally {\n\t\t\t\tif (staging !== undefined) await rm(staging, { recursive: true, force: true }).catch(() => undefined);\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync activate(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\tlet candidate: { readonly dispose?: () => void | Promise<void> } | undefined;\n\t\t\ttry {\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst record = getRecord(input.installation, input.record, input.scope, scopeRef);\n\t\t\t\tif (record.state !== \"installed\") throw new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\tcandidate = await loadRuntime(input.installation, input.record, record.directory, operation.signal);\n\t\t\t\tconst key = installationKey(input.scope, scopeRef, input.record.pluginId);\n\t\t\t\tconst previousRef = activeByKey.get(key);\n\t\t\t\tif (previousRef !== undefined) {\n\t\t\t\t\tconst previous = records.get(previousRef);\n\t\t\t\t\tif (previous !== undefined) {\n\t\t\t\t\t\tawait disposeRuntime(previousRef);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\tconst candidateRecord = values.get(input.installation.installationRef);\n\t\t\t\t\tif (candidateRecord === undefined) throw new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\t\tif (previousRef !== undefined) {\n\t\t\t\t\t\tconst previousRecord = values.get(previousRef);\n\t\t\t\t\t\tif (previousRecord !== undefined) values.set(previousRef, { ...previousRecord, state: \"retained\" });\n\t\t\t\t\t}\n\t\t\t\t\tvalues.set(input.installation.installationRef, { ...candidateRecord, state: \"active\" });\n\t\t\t\t});\n\t\t\t\tactiveByKey.set(key, input.installation.installationRef);\n\t\t\t\tif (candidate !== undefined) runtimeHandles.set(input.installation.installationRef, candidate);\n\t\t\t\tcandidate = undefined;\n\t\t\t} catch (error) {\n\t\t\t\tif (candidate?.dispose !== undefined) await Promise.resolve(candidate.dispose()).catch(() => undefined);\n\t\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t} finally {\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync rollback(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\tlet candidate: { readonly dispose?: () => void | Promise<void> } | undefined;\n\t\t\ttry {\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst failed = records.get(input.failed.installationRef);\n\t\t\t\tif (\n\t\t\t\t\tfailed === undefined ||\n\t\t\t\t\t!identityMatches(failed, {\n\t\t\t\t\t\tpluginId: input.failed.pluginId,\n\t\t\t\t\t\tpluginVersion: input.failed.pluginVersion,\n\t\t\t\t\t\tmanifestDigest: input.failed.manifestDigest,\n\t\t\t\t\t\tscope: input.scope,\n\t\t\t\t\t\tscopeRef,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\tconst previous = records.get(input.previous.installationRef);\n\t\t\t\tif (\n\t\t\t\t\tprevious === undefined ||\n\t\t\t\t\t!identityMatches(previous, {\n\t\t\t\t\t\tpluginId: input.previous.pluginId,\n\t\t\t\t\t\tpluginVersion: input.previous.pluginVersion,\n\t\t\t\t\t\tmanifestDigest: input.previous.manifestDigest,\n\t\t\t\t\t\tscope: input.scope,\n\t\t\t\t\t\tscopeRef,\n\t\t\t\t\t}) ||\n\t\t\t\t\t(previous.state !== \"active\" && previous.state !== \"retained\") ||\n\t\t\t\t\tfailed.pluginId !== previous.pluginId\n\t\t\t\t)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_identity_mismatch\");\n\t\t\t\tconst previousInstallation: PluginInstallationV1 = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tpluginId: previous.pluginId,\n\t\t\t\t\tpluginVersion: previous.pluginVersion,\n\t\t\t\t\tmanifestDigest: previous.manifestDigest,\n\t\t\t\t\tscope: previous.scope,\n\t\t\t\t\tscopeRef: previous.scopeRef,\n\t\t\t\t\tinstallationRef: input.previous.installationRef,\n\t\t\t\t\tstate: \"active\",\n\t\t\t\t};\n\t\t\t\tcandidate = await loadRuntime(previousInstallation, undefined, previous.directory, operation.signal);\n\t\t\t\tawait disposeRuntime(input.failed.installationRef);\n\t\t\t\tawait rm(failed.directory, { recursive: true, force: true });\n\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\tvalues.delete(input.failed.installationRef);\n\t\t\t\t\tconst previousRecord = values.get(input.previous.installationRef);\n\t\t\t\t\tif (previousRecord !== undefined)\n\t\t\t\t\t\tvalues.set(input.previous.installationRef, { ...previousRecord, state: \"active\" });\n\t\t\t\t});\n\t\t\t\tactiveByKey.set(installationKey(input.scope, scopeRef, failed.pluginId), input.previous.installationRef);\n\t\t\t\tif (candidate !== undefined) runtimeHandles.set(input.previous.installationRef, candidate);\n\t\t\t\tcandidate = undefined;\n\t\t\t} catch (error) {\n\t\t\t\tif (candidate?.dispose !== undefined) await Promise.resolve(candidate.dispose()).catch(() => undefined);\n\t\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t} finally {\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync uninstall(input) {\n\t\t\tconst operation = begin(input.signal);\n\t\t\ttry {\n\t\t\t\tconst scopeRef = opaqueScope(input.scopeRef);\n\t\t\t\tconst record = records.get(input.installation.installationRef);\n\t\t\t\tif (\n\t\t\t\t\trecord === undefined ||\n\t\t\t\t\t!identityMatches(record, {\n\t\t\t\t\t\tpluginId: input.installation.pluginId,\n\t\t\t\t\t\tpluginVersion: input.installation.pluginVersion,\n\t\t\t\t\t\tmanifestDigest: input.installation.manifestDigest,\n\t\t\t\t\t\tscope: input.scope,\n\t\t\t\t\t\tscopeRef,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t\tthrow new NodePackageInstallErrorV1(\"installation_unknown\");\n\t\t\t\tawait disposeRuntime(input.installation.installationRef);\n\t\t\t\t// force:false keeps rm strict, but a directory that is already\n\t\t\t\t// gone (ghost record from an interrupted uninstall) is the\n\t\t\t\t// desired end state — continue to the index commit instead of\n\t\t\t\t// bricking every later store operation on ENOENT.\n\t\t\t\tawait rm(record.directory, { recursive: true, force: false }).catch((error: unknown) => {\n\t\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t\tawait commitRecords((values) => {\n\t\t\t\t\tvalues.delete(input.installation.installationRef);\n\t\t\t\t});\n\t\t\t\tconst key = installationKey(input.scope, scopeRef, record.pluginId);\n\t\t\t\tif (activeByKey.get(key) === input.installation.installationRef) activeByKey.delete(key);\n\t\t\t} finally {\n\t\t\t\tend(operation.controller);\n\t\t\t}\n\t\t},\n\t\tasync close() {\n\t\t\tif (closePromise !== undefined) return await closePromise;\n\t\t\tclosed = true;\n\t\t\tfor (const operation of activeOperations) operation.abort();\n\t\t\tclosePromise = (async () => {\n\t\t\t\tawait waitDrained();\n\t\t\t\tlet disposeError = false;\n\t\t\t\tfor (const installationRef of runtimeHandles.keys()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait disposeRuntime(installationRef);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tdisposeError = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (persistence === undefined) await rm(instanceRoot, { recursive: true, force: true });\n\t\t\t\telse await persistence.close();\n\t\t\t\trecords.clear();\n\t\t\t\tactiveByKey.clear();\n\t\t\t\tif (disposeError) throw new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t\t})();\n\t\t\treturn await closePromise;\n\t\t},\n\t};\n\tif (options.loadPlugin !== undefined) {\n\t\ttry {\n\t\t\tfor (const record of records.values()) {\n\t\t\t\tif (record.state !== \"active\") continue;\n\t\t\t\tconst installation: PluginInstallationV1 = {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tpluginId: record.pluginId,\n\t\t\t\t\tpluginVersion: record.pluginVersion,\n\t\t\t\t\tmanifestDigest: record.manifestDigest,\n\t\t\t\t\tscope: record.scope,\n\t\t\t\t\tscopeRef: record.scopeRef,\n\t\t\t\t\tinstallationRef: record.installationRef,\n\t\t\t\t\tstate: \"active\",\n\t\t\t\t};\n\t\t\t\tconst runtime = await loadRuntime(installation, undefined, record.directory, new AbortController().signal);\n\t\t\t\tif (runtime !== undefined) runtimeHandles.set(record.installationRef, runtime);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait host.close().catch(() => undefined);\n\t\t\tif (error instanceof NodePackageInstallErrorV1) throw error;\n\t\t\tthrow new NodePackageInstallErrorV1(\"installation_io_failed\");\n\t\t}\n\t}\n\treturn host;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-package-install-persistence.d.ts","sourceRoot":"","sources":["../../../src/plugins/ecosystem/node-package-install-persistence.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAQhE,MAAM,MAAM,wCAAwC,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,eAAe,GAAG,WAAW,CAAC;AAEvH,qBAAa,oCAAqC,SAAQ,KAAK;IAC9D,QAAQ,CAAC,IAAI,EAAE,wCAAwC,CAAC;IAExD,YAAY,IAAI,EAAE,wCAAwC,EAIzD;CACD;AAED,MAAM,WAAW,oCAAoC;IACpD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;CACpD;AAED,MAAM,WAAW,sCAAsC;IACtD,2EAA2E;IAC3E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;QACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;KAC9B,KAAK,OAAO,CAAC,SAAS,oCAAoC,EAAE,CAAC,CAAC;IAC/D,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,oCAAoC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtG,KAAK,OAAO,CAAC,SAAS,oCAAoC,EAAE,CAAC,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAsHD,wBAAsB,qCAAqC,CAC1D,OAAO,EAAE,sCAAsC,GAC7C,OAAO,CAAC,+BAA+B,CAAC,CAgF1C","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { isAbsolute, join } from \"node:path\";\nimport { withinInstallStoreRoot } from \"./install-store-paths.ts\";\nimport type { PluginInstallationScopeV1 } from \"./installer.ts\";\n\nconst PERSISTENCE_VERSION_V1 = 1 as const;\nconst DEFAULT_LOCK_TIMEOUT_MS_V1 = 5000;\nconst MAX_LOCK_TIMEOUT_MS_V1 = 60_000;\nconst MAX_RECORDS_V1 = 8192;\nconst MAX_FIELD_CHARS_V1 = 2048;\n\nexport type NodePackageInstallPersistenceErrorCodeV1 = \"cancelled\" | \"closed\" | \"busy\" | \"invalid_state\" | \"io_failed\";\n\nexport class NodePackageInstallPersistenceErrorV1 extends Error {\n\treadonly code: NodePackageInstallPersistenceErrorCodeV1;\n\n\tconstructor(code: NodePackageInstallPersistenceErrorCodeV1) {\n\t\tsuper(`Node package install persistence failed: ${code}`);\n\t\tthis.name = \"NodePackageInstallPersistenceErrorV1\";\n\t\tthis.code = code;\n\t}\n}\n\nexport interface NodePackageInstallPersistentRecordV1 {\n\treadonly installationRef: string;\n\treadonly directory: string;\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly manifestDigest: string;\n\treadonly scope: PluginInstallationScopeV1;\n\treadonly scopeRef: string;\n\treadonly state: \"installed\" | \"active\" | \"retained\";\n}\n\nexport interface NodePackageInstallPersistenceOptionsV1 {\n\t/** Host-owned absolute directory. It is never returned in a public DTO. */\n\treadonly rootDirectory: string;\n\treadonly lockTimeoutMs?: number;\n}\n\nexport interface NodePackageInstallPersistenceV1 {\n\treadonly rootDirectory: string;\n\treadonly load: (input?: {\n\t\treadonly signal?: AbortSignal;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly mutate: (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly close: () => Promise<void>;\n}\n\nconst INDEX_FILE_V1 = \"index.v1.json\";\nconst LOCK_FILE_V1 = \"index.v1.lock\";\n\nfunction positiveLockTimeout(value: number | undefined): number {\n\tconst result = value ?? DEFAULT_LOCK_TIMEOUT_MS_V1;\n\tif (!Number.isSafeInteger(result) || result < 1 || result > MAX_LOCK_TIMEOUT_MS_V1)\n\t\tthrow new Error(`lockTimeoutMs must be a positive integer at most ${MAX_LOCK_TIMEOUT_MS_V1}`);\n\treturn result;\n}\n\nfunction field(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tvalue.length <= MAX_FIELD_CHARS_V1 &&\n\t\t!/[\\u0000-\\u001f\\u007f]/u.test(value)\n\t);\n}\n\nfunction opaque(value: unknown): value is string {\n\treturn field(value) && !/\\s/u.test(value) && !/^(?:file:|[a-z]:[\\\\/]|[\\\\/]{1,2}|\\\\\\\\)/iu.test(value);\n}\n\nfunction recordKey(record: NodePackageInstallPersistentRecordV1): string {\n\treturn `${record.scope}\\u0000${record.scopeRef}\\u0000${record.pluginId}`;\n}\n\nfunction validateRecord(root: string, value: unknown): NodePackageInstallPersistentRecordV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst record = value as Record<string, unknown>;\n\tconst keys = [\n\t\t\"installationRef\",\n\t\t\"directory\",\n\t\t\"pluginId\",\n\t\t\"pluginVersion\",\n\t\t\"manifestDigest\",\n\t\t\"scope\",\n\t\t\"scopeRef\",\n\t\t\"state\",\n\t];\n\tif (Object.keys(record).length !== keys.length || keys.some((key) => !(key in record)))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tif (\n\t\t!opaque(record.installationRef) ||\n\t\t!field(record.directory) ||\n\t\t!field(record.pluginId) ||\n\t\t!field(record.pluginVersion) ||\n\t\t!field(record.manifestDigest) ||\n\t\t!opaque(record.scopeRef) ||\n\t\t(record.scope !== \"global\" && record.scope !== \"project\") ||\n\t\t(record.state !== \"installed\" && record.state !== \"active\" && record.state !== \"retained\") ||\n\t\t!withinInstallStoreRoot(root, record.directory)\n\t)\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn Object.freeze({\n\t\tinstallationRef: record.installationRef,\n\t\tdirectory: record.directory,\n\t\tpluginId: record.pluginId,\n\t\tpluginVersion: record.pluginVersion,\n\t\tmanifestDigest: record.manifestDigest,\n\t\tscope: record.scope,\n\t\tscopeRef: record.scopeRef,\n\t\tstate: record.state,\n\t});\n}\n\nfunction snapshot(root: string, values: readonly unknown[]): readonly NodePackageInstallPersistentRecordV1[] {\n\tif (values.length > MAX_RECORDS_V1) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst byRef = new Set<string>();\n\tconst active = new Set<string>();\n\tconst result = values.map((value) => validateRecord(root, value));\n\tfor (const record of result) {\n\t\tif (byRef.has(record.installationRef)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tbyRef.add(record.installationRef);\n\t\tif (record.state === \"active\") {\n\t\t\tconst key = recordKey(record);\n\t\t\tif (active.has(key)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\t\tactive.add(key);\n\t\t}\n\t}\n\treturn Object.freeze(result);\n}\n\nfunction parseIndex(root: string, raw: string): readonly NodePackageInstallPersistentRecordV1[] {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t}\n\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst value = parsed as Record<string, unknown>;\n\tif (Object.keys(value).length !== 2 || value.version !== PERSISTENCE_VERSION_V1 || !Array.isArray(value.records))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn snapshot(root, value.records);\n}\n\nfunction serialize(root: string, records: readonly NodePackageInstallPersistentRecordV1[]): string {\n\treturn JSON.stringify({ version: PERSISTENCE_VERSION_V1, records: snapshot(root, records) });\n}\n\nfunction delay(milliseconds: number, signal: AbortSignal | undefined): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst timer = setTimeout(resolve, milliseconds);\n\t\tif (signal === undefined) return;\n\t\tconst abort = (): void => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(new NodePackageInstallPersistenceErrorV1(\"cancelled\"));\n\t\t};\n\t\tif (signal.aborted) abort();\n\t\telse signal.addEventListener(\"abort\", abort, { once: true });\n\t});\n}\n\nexport async function createNodePackageInstallPersistenceV1(\n\toptions: NodePackageInstallPersistenceOptionsV1,\n): Promise<NodePackageInstallPersistenceV1> {\n\tif (!isAbsolute(options.rootDirectory)) throw new Error(\"rootDirectory must be absolute\");\n\tconst lockTimeoutMs = positiveLockTimeout(options.lockTimeoutMs);\n\tconst rootDirectory = options.rootDirectory;\n\tconst indexPath = join(rootDirectory, INDEX_FILE_V1);\n\tconst lockPath = join(rootDirectory, LOCK_FILE_V1);\n\tawait mkdir(rootDirectory, { recursive: true, mode: 0o700 });\n\tlet closed = false;\n\tlet closePromise: Promise<void> | undefined;\n\n\tconst read = async (): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\ttry {\n\t\t\treturn parseIndex(rootDirectory, await readFile(indexPath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tif (error instanceof NodePackageInstallPersistenceErrorV1) throw error;\n\t\t\tif (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return Object.freeze([]);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst acquire = async (signal: AbortSignal | undefined) => {\n\t\tconst deadline = Date.now() + lockTimeoutMs;\n\t\twhile (true) {\n\t\t\tif (signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\t\ttry {\n\t\t\t\tconst handle = await open(lockPath, \"wx\", 0o600);\n\t\t\t\treturn handle;\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"EEXIST\"))\n\t\t\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t\t\tif (Date.now() >= deadline) throw new NodePackageInstallPersistenceErrorV1(\"busy\");\n\t\t\t\tawait delay(10, signal);\n\t\t\t}\n\t\t}\n\t};\n\tconst release = async (handle: Awaited<ReturnType<typeof open>>): Promise<void> => {\n\t\tawait handle.close().catch(() => undefined);\n\t\tawait rm(lockPath, { force: true }).catch(() => undefined);\n\t};\n\tconst write = async (records: readonly NodePackageInstallPersistentRecordV1[]): Promise<void> => {\n\t\tconst temporary = `${indexPath}.${randomUUID()}.tmp`;\n\t\ttry {\n\t\t\tawait writeFile(temporary, serialize(rootDirectory, records), { flag: \"wx\", mode: 0o600 });\n\t\t\tawait rename(temporary, indexPath);\n\t\t} catch {\n\t\t\tawait rm(temporary, { force: true }).catch(() => undefined);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst load = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (input.signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\treturn await read();\n\t};\n\tconst mutate = async (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (typeof input.update !== \"function\") throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tconst handle = await acquire(input.signal);\n\t\ttry {\n\t\t\tconst current = await read();\n\t\t\tconst records = new Map(current.map((record) => [record.installationRef, record]));\n\t\t\tawait input.update(records);\n\t\t\tconst result = snapshot(rootDirectory, [...records.values()]);\n\t\t\tawait write(result);\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tawait release(handle);\n\t\t}\n\t};\n\tconst close = async (): Promise<void> => {\n\t\tif (closePromise !== undefined) return await closePromise;\n\t\tclosed = true;\n\t\tclosePromise = Promise.resolve();\n\t\treturn await closePromise;\n\t};\n\treturn { rootDirectory, load, mutate, close };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"node-package-install-persistence.d.ts","sourceRoot":"","sources":["../../../src/plugins/ecosystem/node-package-install-persistence.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAQhE,MAAM,MAAM,wCAAwC,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,eAAe,GAAG,WAAW,CAAC;AAEvH,qBAAa,oCAAqC,SAAQ,KAAK;IAC9D,QAAQ,CAAC,IAAI,EAAE,wCAAwC,CAAC;IAExD,YAAY,IAAI,EAAE,wCAAwC,EAIzD;CACD;AAED,MAAM,WAAW,oCAAoC;IACpD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;CACpD;AAED,MAAM,WAAW,sCAAsC;IACtD,2EAA2E;IAC3E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;QACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;KAC9B,KAAK,OAAO,CAAC,SAAS,oCAAoC,EAAE,CAAC,CAAC;IAC/D,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,oCAAoC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtG,KAAK,OAAO,CAAC,SAAS,oCAAoC,EAAE,CAAC,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAsHD,wBAAsB,qCAAqC,CAC1D,OAAO,EAAE,sCAAsC,GAC7C,OAAO,CAAC,+BAA+B,CAAC,CAgF1C","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { isAbsolute, join } from \"node:path\";\nimport { t } from \"../../core/i18n/index.ts\";\nimport { withinInstallStoreRoot } from \"./install-store-paths.ts\";\nimport type { PluginInstallationScopeV1 } from \"./installer.ts\";\n\nconst PERSISTENCE_VERSION_V1 = 1 as const;\nconst DEFAULT_LOCK_TIMEOUT_MS_V1 = 5000;\nconst MAX_LOCK_TIMEOUT_MS_V1 = 60_000;\nconst MAX_RECORDS_V1 = 8192;\nconst MAX_FIELD_CHARS_V1 = 2048;\n\nexport type NodePackageInstallPersistenceErrorCodeV1 = \"cancelled\" | \"closed\" | \"busy\" | \"invalid_state\" | \"io_failed\";\n\nexport class NodePackageInstallPersistenceErrorV1 extends Error {\n\treadonly code: NodePackageInstallPersistenceErrorCodeV1;\n\n\tconstructor(code: NodePackageInstallPersistenceErrorCodeV1) {\n\t\tsuper(t(\"Node package install persistence failed: {code}\", { code }));\n\t\tthis.name = \"NodePackageInstallPersistenceErrorV1\";\n\t\tthis.code = code;\n\t}\n}\n\nexport interface NodePackageInstallPersistentRecordV1 {\n\treadonly installationRef: string;\n\treadonly directory: string;\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly manifestDigest: string;\n\treadonly scope: PluginInstallationScopeV1;\n\treadonly scopeRef: string;\n\treadonly state: \"installed\" | \"active\" | \"retained\";\n}\n\nexport interface NodePackageInstallPersistenceOptionsV1 {\n\t/** Host-owned absolute directory. It is never returned in a public DTO. */\n\treadonly rootDirectory: string;\n\treadonly lockTimeoutMs?: number;\n}\n\nexport interface NodePackageInstallPersistenceV1 {\n\treadonly rootDirectory: string;\n\treadonly load: (input?: {\n\t\treadonly signal?: AbortSignal;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly mutate: (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly close: () => Promise<void>;\n}\n\nconst INDEX_FILE_V1 = \"index.v1.json\";\nconst LOCK_FILE_V1 = \"index.v1.lock\";\n\nfunction positiveLockTimeout(value: number | undefined): number {\n\tconst result = value ?? DEFAULT_LOCK_TIMEOUT_MS_V1;\n\tif (!Number.isSafeInteger(result) || result < 1 || result > MAX_LOCK_TIMEOUT_MS_V1)\n\t\tthrow new Error(t(\"lockTimeoutMs must be a positive integer at most {max}\", { max: MAX_LOCK_TIMEOUT_MS_V1 }));\n\treturn result;\n}\n\nfunction field(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tvalue.length <= MAX_FIELD_CHARS_V1 &&\n\t\t!/[\\u0000-\\u001f\\u007f]/u.test(value)\n\t);\n}\n\nfunction opaque(value: unknown): value is string {\n\treturn field(value) && !/\\s/u.test(value) && !/^(?:file:|[a-z]:[\\\\/]|[\\\\/]{1,2}|\\\\\\\\)/iu.test(value);\n}\n\nfunction recordKey(record: NodePackageInstallPersistentRecordV1): string {\n\treturn `${record.scope}\\u0000${record.scopeRef}\\u0000${record.pluginId}`;\n}\n\nfunction validateRecord(root: string, value: unknown): NodePackageInstallPersistentRecordV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst record = value as Record<string, unknown>;\n\tconst keys = [\n\t\t\"installationRef\",\n\t\t\"directory\",\n\t\t\"pluginId\",\n\t\t\"pluginVersion\",\n\t\t\"manifestDigest\",\n\t\t\"scope\",\n\t\t\"scopeRef\",\n\t\t\"state\",\n\t];\n\tif (Object.keys(record).length !== keys.length || keys.some((key) => !(key in record)))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tif (\n\t\t!opaque(record.installationRef) ||\n\t\t!field(record.directory) ||\n\t\t!field(record.pluginId) ||\n\t\t!field(record.pluginVersion) ||\n\t\t!field(record.manifestDigest) ||\n\t\t!opaque(record.scopeRef) ||\n\t\t(record.scope !== \"global\" && record.scope !== \"project\") ||\n\t\t(record.state !== \"installed\" && record.state !== \"active\" && record.state !== \"retained\") ||\n\t\t!withinInstallStoreRoot(root, record.directory)\n\t)\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn Object.freeze({\n\t\tinstallationRef: record.installationRef,\n\t\tdirectory: record.directory,\n\t\tpluginId: record.pluginId,\n\t\tpluginVersion: record.pluginVersion,\n\t\tmanifestDigest: record.manifestDigest,\n\t\tscope: record.scope,\n\t\tscopeRef: record.scopeRef,\n\t\tstate: record.state,\n\t});\n}\n\nfunction snapshot(root: string, values: readonly unknown[]): readonly NodePackageInstallPersistentRecordV1[] {\n\tif (values.length > MAX_RECORDS_V1) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst byRef = new Set<string>();\n\tconst active = new Set<string>();\n\tconst result = values.map((value) => validateRecord(root, value));\n\tfor (const record of result) {\n\t\tif (byRef.has(record.installationRef)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tbyRef.add(record.installationRef);\n\t\tif (record.state === \"active\") {\n\t\t\tconst key = recordKey(record);\n\t\t\tif (active.has(key)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\t\tactive.add(key);\n\t\t}\n\t}\n\treturn Object.freeze(result);\n}\n\nfunction parseIndex(root: string, raw: string): readonly NodePackageInstallPersistentRecordV1[] {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t}\n\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst value = parsed as Record<string, unknown>;\n\tif (Object.keys(value).length !== 2 || value.version !== PERSISTENCE_VERSION_V1 || !Array.isArray(value.records))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn snapshot(root, value.records);\n}\n\nfunction serialize(root: string, records: readonly NodePackageInstallPersistentRecordV1[]): string {\n\treturn JSON.stringify({ version: PERSISTENCE_VERSION_V1, records: snapshot(root, records) });\n}\n\nfunction delay(milliseconds: number, signal: AbortSignal | undefined): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst timer = setTimeout(resolve, milliseconds);\n\t\tif (signal === undefined) return;\n\t\tconst abort = (): void => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(new NodePackageInstallPersistenceErrorV1(\"cancelled\"));\n\t\t};\n\t\tif (signal.aborted) abort();\n\t\telse signal.addEventListener(\"abort\", abort, { once: true });\n\t});\n}\n\nexport async function createNodePackageInstallPersistenceV1(\n\toptions: NodePackageInstallPersistenceOptionsV1,\n): Promise<NodePackageInstallPersistenceV1> {\n\tif (!isAbsolute(options.rootDirectory)) throw new Error(t(\"rootDirectory must be absolute\"));\n\tconst lockTimeoutMs = positiveLockTimeout(options.lockTimeoutMs);\n\tconst rootDirectory = options.rootDirectory;\n\tconst indexPath = join(rootDirectory, INDEX_FILE_V1);\n\tconst lockPath = join(rootDirectory, LOCK_FILE_V1);\n\tawait mkdir(rootDirectory, { recursive: true, mode: 0o700 });\n\tlet closed = false;\n\tlet closePromise: Promise<void> | undefined;\n\n\tconst read = async (): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\ttry {\n\t\t\treturn parseIndex(rootDirectory, await readFile(indexPath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tif (error instanceof NodePackageInstallPersistenceErrorV1) throw error;\n\t\t\tif (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return Object.freeze([]);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst acquire = async (signal: AbortSignal | undefined) => {\n\t\tconst deadline = Date.now() + lockTimeoutMs;\n\t\twhile (true) {\n\t\t\tif (signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\t\ttry {\n\t\t\t\tconst handle = await open(lockPath, \"wx\", 0o600);\n\t\t\t\treturn handle;\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"EEXIST\"))\n\t\t\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t\t\tif (Date.now() >= deadline) throw new NodePackageInstallPersistenceErrorV1(\"busy\");\n\t\t\t\tawait delay(10, signal);\n\t\t\t}\n\t\t}\n\t};\n\tconst release = async (handle: Awaited<ReturnType<typeof open>>): Promise<void> => {\n\t\tawait handle.close().catch(() => undefined);\n\t\tawait rm(lockPath, { force: true }).catch(() => undefined);\n\t};\n\tconst write = async (records: readonly NodePackageInstallPersistentRecordV1[]): Promise<void> => {\n\t\tconst temporary = `${indexPath}.${randomUUID()}.tmp`;\n\t\ttry {\n\t\t\tawait writeFile(temporary, serialize(rootDirectory, records), { flag: \"wx\", mode: 0o600 });\n\t\t\tawait rename(temporary, indexPath);\n\t\t} catch {\n\t\t\tawait rm(temporary, { force: true }).catch(() => undefined);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst load = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (input.signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\treturn await read();\n\t};\n\tconst mutate = async (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (typeof input.update !== \"function\") throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tconst handle = await acquire(input.signal);\n\t\ttry {\n\t\t\tconst current = await read();\n\t\t\tconst records = new Map(current.map((record) => [record.installationRef, record]));\n\t\t\tawait input.update(records);\n\t\t\tconst result = snapshot(rootDirectory, [...records.values()]);\n\t\t\tawait write(result);\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tawait release(handle);\n\t\t}\n\t};\n\tconst close = async (): Promise<void> => {\n\t\tif (closePromise !== undefined) return await closePromise;\n\t\tclosed = true;\n\t\tclosePromise = Promise.resolve();\n\t\treturn await closePromise;\n\t};\n\treturn { rootDirectory, load, mutate, close };\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { mkdir, open, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { isAbsolute, join } from "node:path";
|
|
4
|
+
import { t } from "../../core/i18n/index.js";
|
|
4
5
|
import { withinInstallStoreRoot } from "./install-store-paths.js";
|
|
5
6
|
const PERSISTENCE_VERSION_V1 = 1;
|
|
6
7
|
const DEFAULT_LOCK_TIMEOUT_MS_V1 = 5000;
|
|
@@ -10,7 +11,7 @@ const MAX_FIELD_CHARS_V1 = 2048;
|
|
|
10
11
|
export class NodePackageInstallPersistenceErrorV1 extends Error {
|
|
11
12
|
code;
|
|
12
13
|
constructor(code) {
|
|
13
|
-
super(
|
|
14
|
+
super(t("Node package install persistence failed: {code}", { code }));
|
|
14
15
|
this.name = "NodePackageInstallPersistenceErrorV1";
|
|
15
16
|
this.code = code;
|
|
16
17
|
}
|
|
@@ -20,7 +21,7 @@ const LOCK_FILE_V1 = "index.v1.lock";
|
|
|
20
21
|
function positiveLockTimeout(value) {
|
|
21
22
|
const result = value ?? DEFAULT_LOCK_TIMEOUT_MS_V1;
|
|
22
23
|
if (!Number.isSafeInteger(result) || result < 1 || result > MAX_LOCK_TIMEOUT_MS_V1)
|
|
23
|
-
throw new Error(
|
|
24
|
+
throw new Error(t("lockTimeoutMs must be a positive integer at most {max}", { max: MAX_LOCK_TIMEOUT_MS_V1 }));
|
|
24
25
|
return result;
|
|
25
26
|
}
|
|
26
27
|
function field(value) {
|
|
@@ -126,7 +127,7 @@ function delay(milliseconds, signal) {
|
|
|
126
127
|
}
|
|
127
128
|
export async function createNodePackageInstallPersistenceV1(options) {
|
|
128
129
|
if (!isAbsolute(options.rootDirectory))
|
|
129
|
-
throw new Error("rootDirectory must be absolute");
|
|
130
|
+
throw new Error(t("rootDirectory must be absolute"));
|
|
130
131
|
const lockTimeoutMs = positiveLockTimeout(options.lockTimeoutMs);
|
|
131
132
|
const rootDirectory = options.rootDirectory;
|
|
132
133
|
const indexPath = join(rootDirectory, INDEX_FILE_V1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-package-install-persistence.js","sourceRoot":"","sources":["../../../src/plugins/ecosystem/node-package-install-persistence.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { isAbsolute, join } from \"node:path\";\nimport { withinInstallStoreRoot } from \"./install-store-paths.ts\";\nimport type { PluginInstallationScopeV1 } from \"./installer.ts\";\n\nconst PERSISTENCE_VERSION_V1 = 1 as const;\nconst DEFAULT_LOCK_TIMEOUT_MS_V1 = 5000;\nconst MAX_LOCK_TIMEOUT_MS_V1 = 60_000;\nconst MAX_RECORDS_V1 = 8192;\nconst MAX_FIELD_CHARS_V1 = 2048;\n\nexport type NodePackageInstallPersistenceErrorCodeV1 = \"cancelled\" | \"closed\" | \"busy\" | \"invalid_state\" | \"io_failed\";\n\nexport class NodePackageInstallPersistenceErrorV1 extends Error {\n\treadonly code: NodePackageInstallPersistenceErrorCodeV1;\n\n\tconstructor(code: NodePackageInstallPersistenceErrorCodeV1) {\n\t\tsuper(`Node package install persistence failed: ${code}`);\n\t\tthis.name = \"NodePackageInstallPersistenceErrorV1\";\n\t\tthis.code = code;\n\t}\n}\n\nexport interface NodePackageInstallPersistentRecordV1 {\n\treadonly installationRef: string;\n\treadonly directory: string;\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly manifestDigest: string;\n\treadonly scope: PluginInstallationScopeV1;\n\treadonly scopeRef: string;\n\treadonly state: \"installed\" | \"active\" | \"retained\";\n}\n\nexport interface NodePackageInstallPersistenceOptionsV1 {\n\t/** Host-owned absolute directory. It is never returned in a public DTO. */\n\treadonly rootDirectory: string;\n\treadonly lockTimeoutMs?: number;\n}\n\nexport interface NodePackageInstallPersistenceV1 {\n\treadonly rootDirectory: string;\n\treadonly load: (input?: {\n\t\treadonly signal?: AbortSignal;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly mutate: (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly close: () => Promise<void>;\n}\n\nconst INDEX_FILE_V1 = \"index.v1.json\";\nconst LOCK_FILE_V1 = \"index.v1.lock\";\n\nfunction positiveLockTimeout(value: number | undefined): number {\n\tconst result = value ?? DEFAULT_LOCK_TIMEOUT_MS_V1;\n\tif (!Number.isSafeInteger(result) || result < 1 || result > MAX_LOCK_TIMEOUT_MS_V1)\n\t\tthrow new Error(`lockTimeoutMs must be a positive integer at most ${MAX_LOCK_TIMEOUT_MS_V1}`);\n\treturn result;\n}\n\nfunction field(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tvalue.length <= MAX_FIELD_CHARS_V1 &&\n\t\t!/[\\u0000-\\u001f\\u007f]/u.test(value)\n\t);\n}\n\nfunction opaque(value: unknown): value is string {\n\treturn field(value) && !/\\s/u.test(value) && !/^(?:file:|[a-z]:[\\\\/]|[\\\\/]{1,2}|\\\\\\\\)/iu.test(value);\n}\n\nfunction recordKey(record: NodePackageInstallPersistentRecordV1): string {\n\treturn `${record.scope}\\u0000${record.scopeRef}\\u0000${record.pluginId}`;\n}\n\nfunction validateRecord(root: string, value: unknown): NodePackageInstallPersistentRecordV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst record = value as Record<string, unknown>;\n\tconst keys = [\n\t\t\"installationRef\",\n\t\t\"directory\",\n\t\t\"pluginId\",\n\t\t\"pluginVersion\",\n\t\t\"manifestDigest\",\n\t\t\"scope\",\n\t\t\"scopeRef\",\n\t\t\"state\",\n\t];\n\tif (Object.keys(record).length !== keys.length || keys.some((key) => !(key in record)))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tif (\n\t\t!opaque(record.installationRef) ||\n\t\t!field(record.directory) ||\n\t\t!field(record.pluginId) ||\n\t\t!field(record.pluginVersion) ||\n\t\t!field(record.manifestDigest) ||\n\t\t!opaque(record.scopeRef) ||\n\t\t(record.scope !== \"global\" && record.scope !== \"project\") ||\n\t\t(record.state !== \"installed\" && record.state !== \"active\" && record.state !== \"retained\") ||\n\t\t!withinInstallStoreRoot(root, record.directory)\n\t)\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn Object.freeze({\n\t\tinstallationRef: record.installationRef,\n\t\tdirectory: record.directory,\n\t\tpluginId: record.pluginId,\n\t\tpluginVersion: record.pluginVersion,\n\t\tmanifestDigest: record.manifestDigest,\n\t\tscope: record.scope,\n\t\tscopeRef: record.scopeRef,\n\t\tstate: record.state,\n\t});\n}\n\nfunction snapshot(root: string, values: readonly unknown[]): readonly NodePackageInstallPersistentRecordV1[] {\n\tif (values.length > MAX_RECORDS_V1) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst byRef = new Set<string>();\n\tconst active = new Set<string>();\n\tconst result = values.map((value) => validateRecord(root, value));\n\tfor (const record of result) {\n\t\tif (byRef.has(record.installationRef)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tbyRef.add(record.installationRef);\n\t\tif (record.state === \"active\") {\n\t\t\tconst key = recordKey(record);\n\t\t\tif (active.has(key)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\t\tactive.add(key);\n\t\t}\n\t}\n\treturn Object.freeze(result);\n}\n\nfunction parseIndex(root: string, raw: string): readonly NodePackageInstallPersistentRecordV1[] {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t}\n\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst value = parsed as Record<string, unknown>;\n\tif (Object.keys(value).length !== 2 || value.version !== PERSISTENCE_VERSION_V1 || !Array.isArray(value.records))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn snapshot(root, value.records);\n}\n\nfunction serialize(root: string, records: readonly NodePackageInstallPersistentRecordV1[]): string {\n\treturn JSON.stringify({ version: PERSISTENCE_VERSION_V1, records: snapshot(root, records) });\n}\n\nfunction delay(milliseconds: number, signal: AbortSignal | undefined): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst timer = setTimeout(resolve, milliseconds);\n\t\tif (signal === undefined) return;\n\t\tconst abort = (): void => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(new NodePackageInstallPersistenceErrorV1(\"cancelled\"));\n\t\t};\n\t\tif (signal.aborted) abort();\n\t\telse signal.addEventListener(\"abort\", abort, { once: true });\n\t});\n}\n\nexport async function createNodePackageInstallPersistenceV1(\n\toptions: NodePackageInstallPersistenceOptionsV1,\n): Promise<NodePackageInstallPersistenceV1> {\n\tif (!isAbsolute(options.rootDirectory)) throw new Error(\"rootDirectory must be absolute\");\n\tconst lockTimeoutMs = positiveLockTimeout(options.lockTimeoutMs);\n\tconst rootDirectory = options.rootDirectory;\n\tconst indexPath = join(rootDirectory, INDEX_FILE_V1);\n\tconst lockPath = join(rootDirectory, LOCK_FILE_V1);\n\tawait mkdir(rootDirectory, { recursive: true, mode: 0o700 });\n\tlet closed = false;\n\tlet closePromise: Promise<void> | undefined;\n\n\tconst read = async (): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\ttry {\n\t\t\treturn parseIndex(rootDirectory, await readFile(indexPath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tif (error instanceof NodePackageInstallPersistenceErrorV1) throw error;\n\t\t\tif (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return Object.freeze([]);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst acquire = async (signal: AbortSignal | undefined) => {\n\t\tconst deadline = Date.now() + lockTimeoutMs;\n\t\twhile (true) {\n\t\t\tif (signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\t\ttry {\n\t\t\t\tconst handle = await open(lockPath, \"wx\", 0o600);\n\t\t\t\treturn handle;\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"EEXIST\"))\n\t\t\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t\t\tif (Date.now() >= deadline) throw new NodePackageInstallPersistenceErrorV1(\"busy\");\n\t\t\t\tawait delay(10, signal);\n\t\t\t}\n\t\t}\n\t};\n\tconst release = async (handle: Awaited<ReturnType<typeof open>>): Promise<void> => {\n\t\tawait handle.close().catch(() => undefined);\n\t\tawait rm(lockPath, { force: true }).catch(() => undefined);\n\t};\n\tconst write = async (records: readonly NodePackageInstallPersistentRecordV1[]): Promise<void> => {\n\t\tconst temporary = `${indexPath}.${randomUUID()}.tmp`;\n\t\ttry {\n\t\t\tawait writeFile(temporary, serialize(rootDirectory, records), { flag: \"wx\", mode: 0o600 });\n\t\t\tawait rename(temporary, indexPath);\n\t\t} catch {\n\t\t\tawait rm(temporary, { force: true }).catch(() => undefined);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst load = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (input.signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\treturn await read();\n\t};\n\tconst mutate = async (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (typeof input.update !== \"function\") throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tconst handle = await acquire(input.signal);\n\t\ttry {\n\t\t\tconst current = await read();\n\t\t\tconst records = new Map(current.map((record) => [record.installationRef, record]));\n\t\t\tawait input.update(records);\n\t\t\tconst result = snapshot(rootDirectory, [...records.values()]);\n\t\t\tawait write(result);\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tawait release(handle);\n\t\t}\n\t};\n\tconst close = async (): Promise<void> => {\n\t\tif (closePromise !== undefined) return await closePromise;\n\t\tclosed = true;\n\t\tclosePromise = Promise.resolve();\n\t\treturn await closePromise;\n\t};\n\treturn { rootDirectory, load, mutate, close };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"node-package-install-persistence.js","sourceRoot":"","sources":["../../../src/plugins/ecosystem/node-package-install-persistence.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { isAbsolute, join } from \"node:path\";\nimport { t } from \"../../core/i18n/index.ts\";\nimport { withinInstallStoreRoot } from \"./install-store-paths.ts\";\nimport type { PluginInstallationScopeV1 } from \"./installer.ts\";\n\nconst PERSISTENCE_VERSION_V1 = 1 as const;\nconst DEFAULT_LOCK_TIMEOUT_MS_V1 = 5000;\nconst MAX_LOCK_TIMEOUT_MS_V1 = 60_000;\nconst MAX_RECORDS_V1 = 8192;\nconst MAX_FIELD_CHARS_V1 = 2048;\n\nexport type NodePackageInstallPersistenceErrorCodeV1 = \"cancelled\" | \"closed\" | \"busy\" | \"invalid_state\" | \"io_failed\";\n\nexport class NodePackageInstallPersistenceErrorV1 extends Error {\n\treadonly code: NodePackageInstallPersistenceErrorCodeV1;\n\n\tconstructor(code: NodePackageInstallPersistenceErrorCodeV1) {\n\t\tsuper(t(\"Node package install persistence failed: {code}\", { code }));\n\t\tthis.name = \"NodePackageInstallPersistenceErrorV1\";\n\t\tthis.code = code;\n\t}\n}\n\nexport interface NodePackageInstallPersistentRecordV1 {\n\treadonly installationRef: string;\n\treadonly directory: string;\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly manifestDigest: string;\n\treadonly scope: PluginInstallationScopeV1;\n\treadonly scopeRef: string;\n\treadonly state: \"installed\" | \"active\" | \"retained\";\n}\n\nexport interface NodePackageInstallPersistenceOptionsV1 {\n\t/** Host-owned absolute directory. It is never returned in a public DTO. */\n\treadonly rootDirectory: string;\n\treadonly lockTimeoutMs?: number;\n}\n\nexport interface NodePackageInstallPersistenceV1 {\n\treadonly rootDirectory: string;\n\treadonly load: (input?: {\n\t\treadonly signal?: AbortSignal;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly mutate: (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}) => Promise<readonly NodePackageInstallPersistentRecordV1[]>;\n\treadonly close: () => Promise<void>;\n}\n\nconst INDEX_FILE_V1 = \"index.v1.json\";\nconst LOCK_FILE_V1 = \"index.v1.lock\";\n\nfunction positiveLockTimeout(value: number | undefined): number {\n\tconst result = value ?? DEFAULT_LOCK_TIMEOUT_MS_V1;\n\tif (!Number.isSafeInteger(result) || result < 1 || result > MAX_LOCK_TIMEOUT_MS_V1)\n\t\tthrow new Error(t(\"lockTimeoutMs must be a positive integer at most {max}\", { max: MAX_LOCK_TIMEOUT_MS_V1 }));\n\treturn result;\n}\n\nfunction field(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tvalue.length <= MAX_FIELD_CHARS_V1 &&\n\t\t!/[\\u0000-\\u001f\\u007f]/u.test(value)\n\t);\n}\n\nfunction opaque(value: unknown): value is string {\n\treturn field(value) && !/\\s/u.test(value) && !/^(?:file:|[a-z]:[\\\\/]|[\\\\/]{1,2}|\\\\\\\\)/iu.test(value);\n}\n\nfunction recordKey(record: NodePackageInstallPersistentRecordV1): string {\n\treturn `${record.scope}\\u0000${record.scopeRef}\\u0000${record.pluginId}`;\n}\n\nfunction validateRecord(root: string, value: unknown): NodePackageInstallPersistentRecordV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst record = value as Record<string, unknown>;\n\tconst keys = [\n\t\t\"installationRef\",\n\t\t\"directory\",\n\t\t\"pluginId\",\n\t\t\"pluginVersion\",\n\t\t\"manifestDigest\",\n\t\t\"scope\",\n\t\t\"scopeRef\",\n\t\t\"state\",\n\t];\n\tif (Object.keys(record).length !== keys.length || keys.some((key) => !(key in record)))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tif (\n\t\t!opaque(record.installationRef) ||\n\t\t!field(record.directory) ||\n\t\t!field(record.pluginId) ||\n\t\t!field(record.pluginVersion) ||\n\t\t!field(record.manifestDigest) ||\n\t\t!opaque(record.scopeRef) ||\n\t\t(record.scope !== \"global\" && record.scope !== \"project\") ||\n\t\t(record.state !== \"installed\" && record.state !== \"active\" && record.state !== \"retained\") ||\n\t\t!withinInstallStoreRoot(root, record.directory)\n\t)\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn Object.freeze({\n\t\tinstallationRef: record.installationRef,\n\t\tdirectory: record.directory,\n\t\tpluginId: record.pluginId,\n\t\tpluginVersion: record.pluginVersion,\n\t\tmanifestDigest: record.manifestDigest,\n\t\tscope: record.scope,\n\t\tscopeRef: record.scopeRef,\n\t\tstate: record.state,\n\t});\n}\n\nfunction snapshot(root: string, values: readonly unknown[]): readonly NodePackageInstallPersistentRecordV1[] {\n\tif (values.length > MAX_RECORDS_V1) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst byRef = new Set<string>();\n\tconst active = new Set<string>();\n\tconst result = values.map((value) => validateRecord(root, value));\n\tfor (const record of result) {\n\t\tif (byRef.has(record.installationRef)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tbyRef.add(record.installationRef);\n\t\tif (record.state === \"active\") {\n\t\t\tconst key = recordKey(record);\n\t\t\tif (active.has(key)) throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\t\tactive.add(key);\n\t\t}\n\t}\n\treturn Object.freeze(result);\n}\n\nfunction parseIndex(root: string, raw: string): readonly NodePackageInstallPersistentRecordV1[] {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t}\n\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\tconst value = parsed as Record<string, unknown>;\n\tif (Object.keys(value).length !== 2 || value.version !== PERSISTENCE_VERSION_V1 || !Array.isArray(value.records))\n\t\tthrow new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\treturn snapshot(root, value.records);\n}\n\nfunction serialize(root: string, records: readonly NodePackageInstallPersistentRecordV1[]): string {\n\treturn JSON.stringify({ version: PERSISTENCE_VERSION_V1, records: snapshot(root, records) });\n}\n\nfunction delay(milliseconds: number, signal: AbortSignal | undefined): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst timer = setTimeout(resolve, milliseconds);\n\t\tif (signal === undefined) return;\n\t\tconst abort = (): void => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(new NodePackageInstallPersistenceErrorV1(\"cancelled\"));\n\t\t};\n\t\tif (signal.aborted) abort();\n\t\telse signal.addEventListener(\"abort\", abort, { once: true });\n\t});\n}\n\nexport async function createNodePackageInstallPersistenceV1(\n\toptions: NodePackageInstallPersistenceOptionsV1,\n): Promise<NodePackageInstallPersistenceV1> {\n\tif (!isAbsolute(options.rootDirectory)) throw new Error(t(\"rootDirectory must be absolute\"));\n\tconst lockTimeoutMs = positiveLockTimeout(options.lockTimeoutMs);\n\tconst rootDirectory = options.rootDirectory;\n\tconst indexPath = join(rootDirectory, INDEX_FILE_V1);\n\tconst lockPath = join(rootDirectory, LOCK_FILE_V1);\n\tawait mkdir(rootDirectory, { recursive: true, mode: 0o700 });\n\tlet closed = false;\n\tlet closePromise: Promise<void> | undefined;\n\n\tconst read = async (): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\ttry {\n\t\t\treturn parseIndex(rootDirectory, await readFile(indexPath, \"utf8\"));\n\t\t} catch (error) {\n\t\t\tif (error instanceof NodePackageInstallPersistenceErrorV1) throw error;\n\t\t\tif (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return Object.freeze([]);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst acquire = async (signal: AbortSignal | undefined) => {\n\t\tconst deadline = Date.now() + lockTimeoutMs;\n\t\twhile (true) {\n\t\t\tif (signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\t\ttry {\n\t\t\t\tconst handle = await open(lockPath, \"wx\", 0o600);\n\t\t\t\treturn handle;\n\t\t\t} catch (error) {\n\t\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"EEXIST\"))\n\t\t\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t\t\tif (Date.now() >= deadline) throw new NodePackageInstallPersistenceErrorV1(\"busy\");\n\t\t\t\tawait delay(10, signal);\n\t\t\t}\n\t\t}\n\t};\n\tconst release = async (handle: Awaited<ReturnType<typeof open>>): Promise<void> => {\n\t\tawait handle.close().catch(() => undefined);\n\t\tawait rm(lockPath, { force: true }).catch(() => undefined);\n\t};\n\tconst write = async (records: readonly NodePackageInstallPersistentRecordV1[]): Promise<void> => {\n\t\tconst temporary = `${indexPath}.${randomUUID()}.tmp`;\n\t\ttry {\n\t\t\tawait writeFile(temporary, serialize(rootDirectory, records), { flag: \"wx\", mode: 0o600 });\n\t\t\tawait rename(temporary, indexPath);\n\t\t} catch {\n\t\t\tawait rm(temporary, { force: true }).catch(() => undefined);\n\t\t\tthrow new NodePackageInstallPersistenceErrorV1(\"io_failed\");\n\t\t}\n\t};\n\tconst load = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (input.signal?.aborted) throw new NodePackageInstallPersistenceErrorV1(\"cancelled\");\n\t\treturn await read();\n\t};\n\tconst mutate = async (input: {\n\t\treadonly signal?: AbortSignal;\n\t\treadonly update: (records: Map<string, NodePackageInstallPersistentRecordV1>) => void | Promise<void>;\n\t}): Promise<readonly NodePackageInstallPersistentRecordV1[]> => {\n\t\tif (closed) throw new NodePackageInstallPersistenceErrorV1(\"closed\");\n\t\tif (typeof input.update !== \"function\") throw new NodePackageInstallPersistenceErrorV1(\"invalid_state\");\n\t\tconst handle = await acquire(input.signal);\n\t\ttry {\n\t\t\tconst current = await read();\n\t\t\tconst records = new Map(current.map((record) => [record.installationRef, record]));\n\t\t\tawait input.update(records);\n\t\t\tconst result = snapshot(rootDirectory, [...records.values()]);\n\t\t\tawait write(result);\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tawait release(handle);\n\t\t}\n\t};\n\tconst close = async (): Promise<void> => {\n\t\tif (closePromise !== undefined) return await closePromise;\n\t\tclosed = true;\n\t\tclosePromise = Promise.resolve();\n\t\treturn await closePromise;\n\t};\n\treturn { rootDirectory, load, mutate, close };\n}\n"]}
|