@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":"credential-print.d.ts","sourceRoot":"","sources":["../../src/cli/credential-print.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credential-print.d.ts","sourceRoot":"","sources":["../../src/cli/credential-print.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAoB,KAAK,eAAe,EAA8C,MAAM,mBAAmB,CAAC;AAIvH,KAAK,mBAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,mBAAmB,EACzB,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAgFjB","sourcesContent":["import type { Api, CredentialInfo, Model } from \"@agent-forge/ai\";\nimport { t } from \"../core/i18n/index.ts\";\nimport { resolveCliModel } from \"../core/model-resolver.ts\";\nimport type { ModelRuntime } from \"../core/model-runtime.ts\";\nimport type { Args } from \"./args.ts\";\nimport { AuthCommandError, type AuthCommandKind, getAuthCredential, validateAuthCommandArgs } from \"./auth-command.ts\";\n\nconst DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS = 30 * 60_000;\n\ntype CredentialPrintKind = Exclude<AuthCommandKind, \"check\">;\n\n/**\n * Resolve one configured provider credential.\n *\n * This intentionally calls ModelRuntime.getAuth(), which refreshes and persists\n * OAuth credentials with less than five minutes remaining through the normal request-auth path.\n */\nexport async function resolveCredentialForPrint(\n\targs: Args,\n\tmodelRuntime: ModelRuntime,\n\tkind: CredentialPrintKind,\n\tminExpiryMs?: number,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst { provider: cliProvider, model: cliModel } = validateAuthCommandArgs(args, kind);\n\tconst credentialTypes = new Map<string, CredentialInfo[\"type\"]>(\n\t\t(await modelRuntime.listCredentials({ signal })).map((credential) => [credential.providerId, credential.type]),\n\t);\n\tconst providers: Array<{ id: string; model?: Model<Api> }> = [];\n\tif (cliProvider) {\n\t\tconst provider = modelRuntime.getProvider(cliProvider);\n\t\tif (!provider) {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Unknown provider \"{provider}\". Use --list-models to see available providers.', {\n\t\t\t\t\tprovider: cliProvider,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tif (cliModel) {\n\t\t\tconst resolved = resolveCliModel({ cliProvider: provider.id, cliModel, modelRuntime });\n\t\t\tif (resolved.error || !resolved.model) {\n\t\t\t\tthrow new AuthCommandError(resolved.error ?? t(\"Unable to resolve the requested provider/model\"));\n\t\t\t}\n\t\t\tproviders.push({ id: provider.id, model: resolved.model });\n\t\t} else {\n\t\t\tproviders.push({ id: provider.id });\n\t\t}\n\t} else {\n\t\tfor (const provider of modelRuntime.getProviders()) {\n\t\t\tif (!credentialTypes.has(provider.id)) continue;\n\t\t\tconst resolved = resolveCliModel({ cliProvider: provider.id, cliModel: cliModel!, modelRuntime });\n\t\t\tif (resolved.model && !resolved.error && !resolved.warning?.includes(\"Using custom model id\")) {\n\t\t\t\tproviders.push({ id: provider.id, model: resolved.model });\n\t\t\t}\n\t\t}\n\t\tif (providers.length === 0) {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Model \"{model}\" not found. Use --list-models to see available models.', { model: cliModel! }),\n\t\t\t);\n\t\t}\n\t}\n\n\tconst credentials: Array<{ providerId: string; value: string }> = [];\n\tfor (const provider of providers) {\n\t\tconst type = credentialTypes.get(provider.id);\n\t\tif (kind === \"api_key\" && type === \"oauth\") continue;\n\t\tif (kind === \"bearer_token\" && type !== \"oauth\") continue;\n\t\tconst authOptions = {\n\t\t\t...(kind === \"bearer_token\" ? { minOAuthValidityMs: minExpiryMs ?? DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS } : {}),\n\t\t\tsignal,\n\t\t};\n\t\tconst auth = provider.model\n\t\t\t? await modelRuntime.getAuth(provider.model, authOptions)\n\t\t\t: await modelRuntime.getAuth(provider.id, authOptions);\n\t\tconst value = getAuthCredential(auth);\n\t\tif (value) credentials.push({ providerId: provider.id, value });\n\t}\n\n\tif (credentials.length === 1) return credentials[0].value;\n\tif (credentials.length === 0) {\n\t\tconst providerId = providers[0]?.id;\n\t\tconst type = providerId ? credentialTypes.get(providerId) : undefined;\n\t\tif (cliProvider && kind === \"api_key\" && type === \"oauth\") {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Provider \"{providerId}\" is configured with OAuth, not an API key', { providerId }),\n\t\t\t);\n\t\t}\n\t\tif (cliProvider && kind === \"bearer_token\" && type !== \"oauth\") {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Provider \"{providerId}\" is not configured with an OAuth bearer token', { providerId }),\n\t\t\t);\n\t\t}\n\t\tthrow new AuthCommandError(\n\t\t\tt(\"No usable {credential} is configured\", {\n\t\t\t\tcredential: kind === \"api_key\" ? \"API key\" : \"OAuth bearer token\",\n\t\t\t}),\n\t\t);\n\t}\n\tthrow new AuthCommandError(\n\t\tt(\"Multiple configured providers matched ({providers}). Specify --provider.\", {\n\t\t\tproviders: credentials.map(({ providerId }) => providerId).join(\", \"),\n\t\t}),\n\t);\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t } from "../core/i18n/index.js";
|
|
1
2
|
import { resolveCliModel } from "../core/model-resolver.js";
|
|
2
3
|
import { AuthCommandError, getAuthCredential, validateAuthCommandArgs } from "./auth-command.js";
|
|
3
4
|
const DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS = 30 * 60_000;
|
|
@@ -14,12 +15,14 @@ export async function resolveCredentialForPrint(args, modelRuntime, kind, minExp
|
|
|
14
15
|
if (cliProvider) {
|
|
15
16
|
const provider = modelRuntime.getProvider(cliProvider);
|
|
16
17
|
if (!provider) {
|
|
17
|
-
throw new AuthCommandError(
|
|
18
|
+
throw new AuthCommandError(t('Unknown provider "{provider}". Use --list-models to see available providers.', {
|
|
19
|
+
provider: cliProvider,
|
|
20
|
+
}));
|
|
18
21
|
}
|
|
19
22
|
if (cliModel) {
|
|
20
23
|
const resolved = resolveCliModel({ cliProvider: provider.id, cliModel, modelRuntime });
|
|
21
24
|
if (resolved.error || !resolved.model) {
|
|
22
|
-
throw new AuthCommandError(resolved.error ?? "Unable to resolve the requested provider/model");
|
|
25
|
+
throw new AuthCommandError(resolved.error ?? t("Unable to resolve the requested provider/model"));
|
|
23
26
|
}
|
|
24
27
|
providers.push({ id: provider.id, model: resolved.model });
|
|
25
28
|
}
|
|
@@ -37,7 +40,7 @@ export async function resolveCredentialForPrint(args, modelRuntime, kind, minExp
|
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
if (providers.length === 0) {
|
|
40
|
-
throw new AuthCommandError(
|
|
43
|
+
throw new AuthCommandError(t('Model "{model}" not found. Use --list-models to see available models.', { model: cliModel }));
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
46
|
const credentials = [];
|
|
@@ -64,13 +67,17 @@ export async function resolveCredentialForPrint(args, modelRuntime, kind, minExp
|
|
|
64
67
|
const providerId = providers[0]?.id;
|
|
65
68
|
const type = providerId ? credentialTypes.get(providerId) : undefined;
|
|
66
69
|
if (cliProvider && kind === "api_key" && type === "oauth") {
|
|
67
|
-
throw new AuthCommandError(
|
|
70
|
+
throw new AuthCommandError(t('Provider "{providerId}" is configured with OAuth, not an API key', { providerId }));
|
|
68
71
|
}
|
|
69
72
|
if (cliProvider && kind === "bearer_token" && type !== "oauth") {
|
|
70
|
-
throw new AuthCommandError(
|
|
73
|
+
throw new AuthCommandError(t('Provider "{providerId}" is not configured with an OAuth bearer token', { providerId }));
|
|
71
74
|
}
|
|
72
|
-
throw new AuthCommandError(
|
|
75
|
+
throw new AuthCommandError(t("No usable {credential} is configured", {
|
|
76
|
+
credential: kind === "api_key" ? "API key" : "OAuth bearer token",
|
|
77
|
+
}));
|
|
73
78
|
}
|
|
74
|
-
throw new AuthCommandError(
|
|
79
|
+
throw new AuthCommandError(t("Multiple configured providers matched ({providers}). Specify --provider.", {
|
|
80
|
+
providers: credentials.map(({ providerId }) => providerId).join(", "),
|
|
81
|
+
}));
|
|
75
82
|
}
|
|
76
83
|
//# sourceMappingURL=credential-print.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-print.js","sourceRoot":"","sources":["../../src/cli/credential-print.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAwB,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEvH,MAAM,kCAAkC,GAAG,EAAE,GAAG,MAAM,CAAC;AAIvD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,IAAU,EACV,YAA0B,EAC1B,IAAyB,EACzB,WAAoB,EACpB,MAAoB,EACF;IAClB,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvF,MAAM,eAAe,GAAG,IAAI,GAAG,CAC9B,CAAC,MAAM,YAAY,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAC9G,CAAC;IACF,MAAM,SAAS,GAA8C,EAAE,CAAC;IAChE,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"credential-print.js","sourceRoot":"","sources":["../../src/cli/credential-print.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, CredentialInfo, Model } from \"@agent-forge/ai\";\nimport { t } from \"../core/i18n/index.ts\";\nimport { resolveCliModel } from \"../core/model-resolver.ts\";\nimport type { ModelRuntime } from \"../core/model-runtime.ts\";\nimport type { Args } from \"./args.ts\";\nimport { AuthCommandError, type AuthCommandKind, getAuthCredential, validateAuthCommandArgs } from \"./auth-command.ts\";\n\nconst DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS = 30 * 60_000;\n\ntype CredentialPrintKind = Exclude<AuthCommandKind, \"check\">;\n\n/**\n * Resolve one configured provider credential.\n *\n * This intentionally calls ModelRuntime.getAuth(), which refreshes and persists\n * OAuth credentials with less than five minutes remaining through the normal request-auth path.\n */\nexport async function resolveCredentialForPrint(\n\targs: Args,\n\tmodelRuntime: ModelRuntime,\n\tkind: CredentialPrintKind,\n\tminExpiryMs?: number,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst { provider: cliProvider, model: cliModel } = validateAuthCommandArgs(args, kind);\n\tconst credentialTypes = new Map<string, CredentialInfo[\"type\"]>(\n\t\t(await modelRuntime.listCredentials({ signal })).map((credential) => [credential.providerId, credential.type]),\n\t);\n\tconst providers: Array<{ id: string; model?: Model<Api> }> = [];\n\tif (cliProvider) {\n\t\tconst provider = modelRuntime.getProvider(cliProvider);\n\t\tif (!provider) {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Unknown provider \"{provider}\". Use --list-models to see available providers.', {\n\t\t\t\t\tprovider: cliProvider,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tif (cliModel) {\n\t\t\tconst resolved = resolveCliModel({ cliProvider: provider.id, cliModel, modelRuntime });\n\t\t\tif (resolved.error || !resolved.model) {\n\t\t\t\tthrow new AuthCommandError(resolved.error ?? t(\"Unable to resolve the requested provider/model\"));\n\t\t\t}\n\t\t\tproviders.push({ id: provider.id, model: resolved.model });\n\t\t} else {\n\t\t\tproviders.push({ id: provider.id });\n\t\t}\n\t} else {\n\t\tfor (const provider of modelRuntime.getProviders()) {\n\t\t\tif (!credentialTypes.has(provider.id)) continue;\n\t\t\tconst resolved = resolveCliModel({ cliProvider: provider.id, cliModel: cliModel!, modelRuntime });\n\t\t\tif (resolved.model && !resolved.error && !resolved.warning?.includes(\"Using custom model id\")) {\n\t\t\t\tproviders.push({ id: provider.id, model: resolved.model });\n\t\t\t}\n\t\t}\n\t\tif (providers.length === 0) {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Model \"{model}\" not found. Use --list-models to see available models.', { model: cliModel! }),\n\t\t\t);\n\t\t}\n\t}\n\n\tconst credentials: Array<{ providerId: string; value: string }> = [];\n\tfor (const provider of providers) {\n\t\tconst type = credentialTypes.get(provider.id);\n\t\tif (kind === \"api_key\" && type === \"oauth\") continue;\n\t\tif (kind === \"bearer_token\" && type !== \"oauth\") continue;\n\t\tconst authOptions = {\n\t\t\t...(kind === \"bearer_token\" ? { minOAuthValidityMs: minExpiryMs ?? DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS } : {}),\n\t\t\tsignal,\n\t\t};\n\t\tconst auth = provider.model\n\t\t\t? await modelRuntime.getAuth(provider.model, authOptions)\n\t\t\t: await modelRuntime.getAuth(provider.id, authOptions);\n\t\tconst value = getAuthCredential(auth);\n\t\tif (value) credentials.push({ providerId: provider.id, value });\n\t}\n\n\tif (credentials.length === 1) return credentials[0].value;\n\tif (credentials.length === 0) {\n\t\tconst providerId = providers[0]?.id;\n\t\tconst type = providerId ? credentialTypes.get(providerId) : undefined;\n\t\tif (cliProvider && kind === \"api_key\" && type === \"oauth\") {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Provider \"{providerId}\" is configured with OAuth, not an API key', { providerId }),\n\t\t\t);\n\t\t}\n\t\tif (cliProvider && kind === \"bearer_token\" && type !== \"oauth\") {\n\t\t\tthrow new AuthCommandError(\n\t\t\t\tt('Provider \"{providerId}\" is not configured with an OAuth bearer token', { providerId }),\n\t\t\t);\n\t\t}\n\t\tthrow new AuthCommandError(\n\t\t\tt(\"No usable {credential} is configured\", {\n\t\t\t\tcredential: kind === \"api_key\" ? \"API key\" : \"OAuth bearer token\",\n\t\t\t}),\n\t\t);\n\t}\n\tthrow new AuthCommandError(\n\t\tt(\"Multiple configured providers matched ({providers}). Specify --provider.\", {\n\t\t\tproviders: credentials.map(({ providerId }) => providerId).join(\", \"),\n\t\t}),\n\t);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/cli/experimental/command.ts"],"names":[],"mappings":"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","sourcesContent":["export interface NamedCommandInvocation {\n\treadonly command: string;\n}\n\nexport type CommandParseResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandExecutionResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandOptionParseResult<TValue> =\n\t| { readonly ok: true; readonly value: TValue }\n\t| { readonly ok: false; readonly error: string };\n\nexport interface CommandOption<TValue> {\n\treadonly name: `--${string}`;\n\tparse(value: string): CommandOptionParseResult<TValue>;\n}\n\nexport function valueOption<TValue>(\n\tname: `--${string}`,\n\tparse: (value: string) => CommandOptionParseResult<TValue>,\n): CommandOption<TValue> {\n\treturn { name, parse };\n}\n\nexport function stringOption(name: `--${string}`): CommandOption<string> {\n\treturn valueOption(name, (value) => ({ ok: true, value }));\n}\n\nexport interface ParsedCommandInput {\n\treadonly remainingArgs: readonly string[];\n\tvalue<TValue>(option: CommandOption<TValue>): TValue | undefined;\n\tvalues<TValue>(option: CommandOption<TValue>): readonly TValue[];\n}\n\nexport type CommandBuildResult<TInvocation extends NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\ninterface MutableParsedCommandInput {\n\treadonly values: Map<string, unknown[]>;\n\treadonly remainingArgs: string[];\n\treadonly errors: string[];\n}\n\ntype CommandBuilder<TInvocation extends NamedCommandInvocation> = (\n\tinput: ParsedCommandInput,\n) => CommandBuildResult<TInvocation>;\n\ntype CommandAction<TInvocation extends NamedCommandInvocation, TContext> = (\n\tcommand: TInvocation,\n\tcontext: TContext,\n) => void | Promise<void>;\n\ninterface RegisteredCommand {\n\tparse(argv: readonly string[]): CommandParseResult;\n\texecute(argv: readonly string[], context: unknown): Promise<CommandExecutionResult>;\n}\n\nexport class Command<\n\tTOwnInvocation extends NamedCommandInvocation,\n\tTContext,\n\tTInvocation extends NamedCommandInvocation = TOwnInvocation,\n> {\n\treadonly name: string;\n\tprivate readonly options = new Map<string, CommandOption<unknown>>();\n\tprivate readonly subcommands = new Map<string, RegisteredCommand>();\n\tprivate builder?: CommandBuilder<TOwnInvocation>;\n\tprivate commandAction?: CommandAction<TOwnInvocation, TContext>;\n\n\tconstructor(name: string) {\n\t\tthis.name = name;\n\t}\n\n\toption<TValue>(option: CommandOption<TValue>): this {\n\t\tif (this.options.has(option.name)) {\n\t\t\tthrow new Error(`Option ${option.name} is already registered for ${this.name}`);\n\t\t}\n\t\tthis.options.set(option.name, option);\n\t\treturn this;\n\t}\n\n\tbuild(builder: CommandBuilder<TOwnInvocation>): this {\n\t\tthis.builder = builder;\n\t\treturn this;\n\t}\n\n\taction(action: CommandAction<TOwnInvocation, TContext>): this {\n\t\tthis.commandAction = action;\n\t\treturn this;\n\t}\n\n\tcommand<\n\t\tTSubcommandOwnInvocation extends NamedCommandInvocation,\n\t\tTSubcommandContext,\n\t\tTSubcommandInvocation extends NamedCommandInvocation,\n\t>(\n\t\tcommand: Command<TSubcommandOwnInvocation, TSubcommandContext, TSubcommandInvocation>,\n\t): Command<TOwnInvocation, TContext & TSubcommandContext, TInvocation | TSubcommandInvocation> {\n\t\tif (this.subcommands.has(command.name)) throw new Error(`Command ${command.name} is already registered`);\n\t\tthis.subcommands.set(command.name, {\n\t\t\tparse: (argv) => command.parse(argv),\n\t\t\texecute: (argv, context) => command.execute(argv, context as TSubcommandContext),\n\t\t});\n\t\treturn this as unknown as Command<\n\t\t\tTOwnInvocation,\n\t\t\tTContext & TSubcommandContext,\n\t\t\tTInvocation | TSubcommandInvocation\n\t\t>;\n\t}\n\n\tparse(argv: readonly string[]): CommandParseResult<TInvocation> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) return selected.command.parse(selected.argv) as CommandParseResult<TInvocation>;\n\t\treturn this.parseOwn(argv) as CommandParseResult<TInvocation>;\n\t}\n\n\tasync execute(argv: readonly string[], context: TContext): Promise<CommandExecutionResult<TInvocation>> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) {\n\t\t\treturn selected.command.execute(selected.argv, context) as Promise<CommandExecutionResult<TInvocation>>;\n\t\t}\n\n\t\tconst parsed = this.parseOwn(argv);\n\t\tif (!parsed.ok) return parsed;\n\t\tif (!this.commandAction) throw new Error(`Command ${this.name} does not define an action`);\n\t\tawait this.commandAction(parsed.command, context);\n\t\treturn { ok: true, command: parsed.command as unknown as TInvocation };\n\t}\n\n\tprivate select(argv: readonly string[]): { command: RegisteredCommand; argv: readonly string[] } | undefined {\n\t\tconst candidate = argv[0];\n\t\tif (candidate === undefined) return undefined;\n\t\tconst command = this.subcommands.get(candidate);\n\t\treturn command ? { command, argv: argv.slice(1) } : undefined;\n\t}\n\n\tprivate parseOwn(argv: readonly string[]): CommandParseResult<TOwnInvocation> {\n\t\tif (!this.builder) throw new Error(`Command ${this.name} does not define a builder`);\n\t\tconst parsed = this.parseOptions(argv);\n\t\tconst input: ParsedCommandInput = {\n\t\t\tremainingArgs: parsed.remainingArgs,\n\t\t\tvalue: <TValue>(option: CommandOption<TValue>) => parsed.values.get(option.name)?.[0] as TValue | undefined,\n\t\t\tvalues: <TValue>(option: CommandOption<TValue>) => (parsed.values.get(option.name) ?? []) as readonly TValue[],\n\t\t};\n\t\tconst built = this.builder(input);\n\t\tconst errors = [...parsed.errors, ...(built.ok ? [] : built.errors)];\n\t\tif (errors.length > 0) return { ok: false, errors };\n\t\tif (!built.ok) throw new Error(`Command ${this.name} failed without an error`);\n\t\treturn { ok: true, command: built.command };\n\t}\n\n\tprivate parseOptions(argv: readonly string[]): MutableParsedCommandInput {\n\t\tconst parsed: MutableParsedCommandInput = {\n\t\t\tvalues: new Map(),\n\t\t\tremainingArgs: [],\n\t\t\terrors: [],\n\t\t};\n\t\tfor (let index = 0; index < argv.length; index++) {\n\t\t\tconst argument = argv[index]!;\n\t\t\tif (argument === \"--\") {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst equals = argument.indexOf(\"=\");\n\t\t\tconst name = equals === -1 ? argument : argument.slice(0, equals);\n\t\t\tconst option = this.options.get(name);\n\t\t\tif (!option) {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet value = equals === -1 ? undefined : argument.slice(equals + 1);\n\t\t\tif (value === undefined) {\n\t\t\t\tconst next = argv[index + 1];\n\t\t\t\tif (next !== undefined && !next.startsWith(\"-\")) {\n\t\t\t\t\tvalue = next;\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (value === undefined || value === \"\") {\n\t\t\t\tparsed.errors.push(`${name} requires a value`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst values = parsed.values.get(name) ?? [];\n\t\t\tif (values.length > 0) {\n\t\t\t\tparsed.errors.push(`${name} may only be specified once`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = option.parse(value);\n\t\t\tif (!result.ok) {\n\t\t\t\tparsed.errors.push(result.error);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalues.push(result.value);\n\t\t\tparsed.values.set(name, values);\n\t\t}\n\t\treturn parsed;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/cli/experimental/command.ts"],"names":[],"mappings":"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","sourcesContent":["import { t } from \"../../core/i18n/index.ts\";\n\nexport interface NamedCommandInvocation {\n\treadonly command: string;\n}\n\nexport type CommandParseResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandExecutionResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandOptionParseResult<TValue> =\n\t| { readonly ok: true; readonly value: TValue }\n\t| { readonly ok: false; readonly error: string };\n\nexport interface CommandOption<TValue> {\n\treadonly name: `--${string}`;\n\tparse(value: string): CommandOptionParseResult<TValue>;\n}\n\nexport function valueOption<TValue>(\n\tname: `--${string}`,\n\tparse: (value: string) => CommandOptionParseResult<TValue>,\n): CommandOption<TValue> {\n\treturn { name, parse };\n}\n\nexport function stringOption(name: `--${string}`): CommandOption<string> {\n\treturn valueOption(name, (value) => ({ ok: true, value }));\n}\n\nexport interface ParsedCommandInput {\n\treadonly remainingArgs: readonly string[];\n\tvalue<TValue>(option: CommandOption<TValue>): TValue | undefined;\n\tvalues<TValue>(option: CommandOption<TValue>): readonly TValue[];\n}\n\nexport type CommandBuildResult<TInvocation extends NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\ninterface MutableParsedCommandInput {\n\treadonly values: Map<string, unknown[]>;\n\treadonly remainingArgs: string[];\n\treadonly errors: string[];\n}\n\ntype CommandBuilder<TInvocation extends NamedCommandInvocation> = (\n\tinput: ParsedCommandInput,\n) => CommandBuildResult<TInvocation>;\n\ntype CommandAction<TInvocation extends NamedCommandInvocation, TContext> = (\n\tcommand: TInvocation,\n\tcontext: TContext,\n) => void | Promise<void>;\n\ninterface RegisteredCommand {\n\tparse(argv: readonly string[]): CommandParseResult;\n\texecute(argv: readonly string[], context: unknown): Promise<CommandExecutionResult>;\n}\n\nexport class Command<\n\tTOwnInvocation extends NamedCommandInvocation,\n\tTContext,\n\tTInvocation extends NamedCommandInvocation = TOwnInvocation,\n> {\n\treadonly name: string;\n\tprivate readonly options = new Map<string, CommandOption<unknown>>();\n\tprivate readonly subcommands = new Map<string, RegisteredCommand>();\n\tprivate builder?: CommandBuilder<TOwnInvocation>;\n\tprivate commandAction?: CommandAction<TOwnInvocation, TContext>;\n\n\tconstructor(name: string) {\n\t\tthis.name = name;\n\t}\n\n\toption<TValue>(option: CommandOption<TValue>): this {\n\t\tif (this.options.has(option.name)) {\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Option {option} is already registered for {name}\", { option: option.name, name: this.name }),\n\t\t\t);\n\t\t}\n\t\tthis.options.set(option.name, option);\n\t\treturn this;\n\t}\n\n\tbuild(builder: CommandBuilder<TOwnInvocation>): this {\n\t\tthis.builder = builder;\n\t\treturn this;\n\t}\n\n\taction(action: CommandAction<TOwnInvocation, TContext>): this {\n\t\tthis.commandAction = action;\n\t\treturn this;\n\t}\n\n\tcommand<\n\t\tTSubcommandOwnInvocation extends NamedCommandInvocation,\n\t\tTSubcommandContext,\n\t\tTSubcommandInvocation extends NamedCommandInvocation,\n\t>(\n\t\tcommand: Command<TSubcommandOwnInvocation, TSubcommandContext, TSubcommandInvocation>,\n\t): Command<TOwnInvocation, TContext & TSubcommandContext, TInvocation | TSubcommandInvocation> {\n\t\tif (this.subcommands.has(command.name))\n\t\t\tthrow new Error(t(\"Command {name} is already registered\", { name: command.name }));\n\t\tthis.subcommands.set(command.name, {\n\t\t\tparse: (argv) => command.parse(argv),\n\t\t\texecute: (argv, context) => command.execute(argv, context as TSubcommandContext),\n\t\t});\n\t\treturn this as unknown as Command<\n\t\t\tTOwnInvocation,\n\t\t\tTContext & TSubcommandContext,\n\t\t\tTInvocation | TSubcommandInvocation\n\t\t>;\n\t}\n\n\tparse(argv: readonly string[]): CommandParseResult<TInvocation> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) return selected.command.parse(selected.argv) as CommandParseResult<TInvocation>;\n\t\treturn this.parseOwn(argv) as CommandParseResult<TInvocation>;\n\t}\n\n\tasync execute(argv: readonly string[], context: TContext): Promise<CommandExecutionResult<TInvocation>> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) {\n\t\t\treturn selected.command.execute(selected.argv, context) as Promise<CommandExecutionResult<TInvocation>>;\n\t\t}\n\n\t\tconst parsed = this.parseOwn(argv);\n\t\tif (!parsed.ok) return parsed;\n\t\tif (!this.commandAction) throw new Error(t(\"Command {name} does not define an action\", { name: this.name }));\n\t\tawait this.commandAction(parsed.command, context);\n\t\treturn { ok: true, command: parsed.command as unknown as TInvocation };\n\t}\n\n\tprivate select(argv: readonly string[]): { command: RegisteredCommand; argv: readonly string[] } | undefined {\n\t\tconst candidate = argv[0];\n\t\tif (candidate === undefined) return undefined;\n\t\tconst command = this.subcommands.get(candidate);\n\t\treturn command ? { command, argv: argv.slice(1) } : undefined;\n\t}\n\n\tprivate parseOwn(argv: readonly string[]): CommandParseResult<TOwnInvocation> {\n\t\tif (!this.builder) throw new Error(t(\"Command {name} does not define a builder\", { name: this.name }));\n\t\tconst parsed = this.parseOptions(argv);\n\t\tconst input: ParsedCommandInput = {\n\t\t\tremainingArgs: parsed.remainingArgs,\n\t\t\tvalue: <TValue>(option: CommandOption<TValue>) => parsed.values.get(option.name)?.[0] as TValue | undefined,\n\t\t\tvalues: <TValue>(option: CommandOption<TValue>) => (parsed.values.get(option.name) ?? []) as readonly TValue[],\n\t\t};\n\t\tconst built = this.builder(input);\n\t\tconst errors = [...parsed.errors, ...(built.ok ? [] : built.errors)];\n\t\tif (errors.length > 0) return { ok: false, errors };\n\t\tif (!built.ok) throw new Error(t(\"Command {name} failed without an error\", { name: this.name }));\n\t\treturn { ok: true, command: built.command };\n\t}\n\n\tprivate parseOptions(argv: readonly string[]): MutableParsedCommandInput {\n\t\tconst parsed: MutableParsedCommandInput = {\n\t\t\tvalues: new Map(),\n\t\t\tremainingArgs: [],\n\t\t\terrors: [],\n\t\t};\n\t\tfor (let index = 0; index < argv.length; index++) {\n\t\t\tconst argument = argv[index]!;\n\t\t\tif (argument === \"--\") {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst equals = argument.indexOf(\"=\");\n\t\t\tconst name = equals === -1 ? argument : argument.slice(0, equals);\n\t\t\tconst option = this.options.get(name);\n\t\t\tif (!option) {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet value = equals === -1 ? undefined : argument.slice(equals + 1);\n\t\t\tif (value === undefined) {\n\t\t\t\tconst next = argv[index + 1];\n\t\t\t\tif (next !== undefined && !next.startsWith(\"-\")) {\n\t\t\t\t\tvalue = next;\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (value === undefined || value === \"\") {\n\t\t\t\tparsed.errors.push(`${name} requires a value`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst values = parsed.values.get(name) ?? [];\n\t\t\tif (values.length > 0) {\n\t\t\t\tparsed.errors.push(`${name} may only be specified once`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = option.parse(value);\n\t\t\tif (!result.ok) {\n\t\t\t\tparsed.errors.push(result.error);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalues.push(result.value);\n\t\t\tparsed.values.set(name, values);\n\t\t}\n\t\treturn parsed;\n\t}\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t } from "../../core/i18n/index.js";
|
|
1
2
|
export function valueOption(name, parse) {
|
|
2
3
|
return { name, parse };
|
|
3
4
|
}
|
|
@@ -15,7 +16,7 @@ export class Command {
|
|
|
15
16
|
}
|
|
16
17
|
option(option) {
|
|
17
18
|
if (this.options.has(option.name)) {
|
|
18
|
-
throw new Error(
|
|
19
|
+
throw new Error(t("Option {option} is already registered for {name}", { option: option.name, name: this.name }));
|
|
19
20
|
}
|
|
20
21
|
this.options.set(option.name, option);
|
|
21
22
|
return this;
|
|
@@ -30,7 +31,7 @@ export class Command {
|
|
|
30
31
|
}
|
|
31
32
|
command(command) {
|
|
32
33
|
if (this.subcommands.has(command.name))
|
|
33
|
-
throw new Error(
|
|
34
|
+
throw new Error(t("Command {name} is already registered", { name: command.name }));
|
|
34
35
|
this.subcommands.set(command.name, {
|
|
35
36
|
parse: (argv) => command.parse(argv),
|
|
36
37
|
execute: (argv, context) => command.execute(argv, context),
|
|
@@ -52,7 +53,7 @@ export class Command {
|
|
|
52
53
|
if (!parsed.ok)
|
|
53
54
|
return parsed;
|
|
54
55
|
if (!this.commandAction)
|
|
55
|
-
throw new Error(
|
|
56
|
+
throw new Error(t("Command {name} does not define an action", { name: this.name }));
|
|
56
57
|
await this.commandAction(parsed.command, context);
|
|
57
58
|
return { ok: true, command: parsed.command };
|
|
58
59
|
}
|
|
@@ -65,7 +66,7 @@ export class Command {
|
|
|
65
66
|
}
|
|
66
67
|
parseOwn(argv) {
|
|
67
68
|
if (!this.builder)
|
|
68
|
-
throw new Error(
|
|
69
|
+
throw new Error(t("Command {name} does not define a builder", { name: this.name }));
|
|
69
70
|
const parsed = this.parseOptions(argv);
|
|
70
71
|
const input = {
|
|
71
72
|
remainingArgs: parsed.remainingArgs,
|
|
@@ -77,7 +78,7 @@ export class Command {
|
|
|
77
78
|
if (errors.length > 0)
|
|
78
79
|
return { ok: false, errors };
|
|
79
80
|
if (!built.ok)
|
|
80
|
-
throw new Error(
|
|
81
|
+
throw new Error(t("Command {name} failed without an error", { name: this.name }));
|
|
81
82
|
return { ok: true, command: built.command };
|
|
82
83
|
}
|
|
83
84
|
parseOptions(argv) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/experimental/command.ts"],"names":[],"mappings":"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","sourcesContent":["export interface NamedCommandInvocation {\n\treadonly command: string;\n}\n\nexport type CommandParseResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandExecutionResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandOptionParseResult<TValue> =\n\t| { readonly ok: true; readonly value: TValue }\n\t| { readonly ok: false; readonly error: string };\n\nexport interface CommandOption<TValue> {\n\treadonly name: `--${string}`;\n\tparse(value: string): CommandOptionParseResult<TValue>;\n}\n\nexport function valueOption<TValue>(\n\tname: `--${string}`,\n\tparse: (value: string) => CommandOptionParseResult<TValue>,\n): CommandOption<TValue> {\n\treturn { name, parse };\n}\n\nexport function stringOption(name: `--${string}`): CommandOption<string> {\n\treturn valueOption(name, (value) => ({ ok: true, value }));\n}\n\nexport interface ParsedCommandInput {\n\treadonly remainingArgs: readonly string[];\n\tvalue<TValue>(option: CommandOption<TValue>): TValue | undefined;\n\tvalues<TValue>(option: CommandOption<TValue>): readonly TValue[];\n}\n\nexport type CommandBuildResult<TInvocation extends NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\ninterface MutableParsedCommandInput {\n\treadonly values: Map<string, unknown[]>;\n\treadonly remainingArgs: string[];\n\treadonly errors: string[];\n}\n\ntype CommandBuilder<TInvocation extends NamedCommandInvocation> = (\n\tinput: ParsedCommandInput,\n) => CommandBuildResult<TInvocation>;\n\ntype CommandAction<TInvocation extends NamedCommandInvocation, TContext> = (\n\tcommand: TInvocation,\n\tcontext: TContext,\n) => void | Promise<void>;\n\ninterface RegisteredCommand {\n\tparse(argv: readonly string[]): CommandParseResult;\n\texecute(argv: readonly string[], context: unknown): Promise<CommandExecutionResult>;\n}\n\nexport class Command<\n\tTOwnInvocation extends NamedCommandInvocation,\n\tTContext,\n\tTInvocation extends NamedCommandInvocation = TOwnInvocation,\n> {\n\treadonly name: string;\n\tprivate readonly options = new Map<string, CommandOption<unknown>>();\n\tprivate readonly subcommands = new Map<string, RegisteredCommand>();\n\tprivate builder?: CommandBuilder<TOwnInvocation>;\n\tprivate commandAction?: CommandAction<TOwnInvocation, TContext>;\n\n\tconstructor(name: string) {\n\t\tthis.name = name;\n\t}\n\n\toption<TValue>(option: CommandOption<TValue>): this {\n\t\tif (this.options.has(option.name)) {\n\t\t\tthrow new Error(`Option ${option.name} is already registered for ${this.name}`);\n\t\t}\n\t\tthis.options.set(option.name, option);\n\t\treturn this;\n\t}\n\n\tbuild(builder: CommandBuilder<TOwnInvocation>): this {\n\t\tthis.builder = builder;\n\t\treturn this;\n\t}\n\n\taction(action: CommandAction<TOwnInvocation, TContext>): this {\n\t\tthis.commandAction = action;\n\t\treturn this;\n\t}\n\n\tcommand<\n\t\tTSubcommandOwnInvocation extends NamedCommandInvocation,\n\t\tTSubcommandContext,\n\t\tTSubcommandInvocation extends NamedCommandInvocation,\n\t>(\n\t\tcommand: Command<TSubcommandOwnInvocation, TSubcommandContext, TSubcommandInvocation>,\n\t): Command<TOwnInvocation, TContext & TSubcommandContext, TInvocation | TSubcommandInvocation> {\n\t\tif (this.subcommands.has(command.name)) throw new Error(`Command ${command.name} is already registered`);\n\t\tthis.subcommands.set(command.name, {\n\t\t\tparse: (argv) => command.parse(argv),\n\t\t\texecute: (argv, context) => command.execute(argv, context as TSubcommandContext),\n\t\t});\n\t\treturn this as unknown as Command<\n\t\t\tTOwnInvocation,\n\t\t\tTContext & TSubcommandContext,\n\t\t\tTInvocation | TSubcommandInvocation\n\t\t>;\n\t}\n\n\tparse(argv: readonly string[]): CommandParseResult<TInvocation> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) return selected.command.parse(selected.argv) as CommandParseResult<TInvocation>;\n\t\treturn this.parseOwn(argv) as CommandParseResult<TInvocation>;\n\t}\n\n\tasync execute(argv: readonly string[], context: TContext): Promise<CommandExecutionResult<TInvocation>> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) {\n\t\t\treturn selected.command.execute(selected.argv, context) as Promise<CommandExecutionResult<TInvocation>>;\n\t\t}\n\n\t\tconst parsed = this.parseOwn(argv);\n\t\tif (!parsed.ok) return parsed;\n\t\tif (!this.commandAction) throw new Error(`Command ${this.name} does not define an action`);\n\t\tawait this.commandAction(parsed.command, context);\n\t\treturn { ok: true, command: parsed.command as unknown as TInvocation };\n\t}\n\n\tprivate select(argv: readonly string[]): { command: RegisteredCommand; argv: readonly string[] } | undefined {\n\t\tconst candidate = argv[0];\n\t\tif (candidate === undefined) return undefined;\n\t\tconst command = this.subcommands.get(candidate);\n\t\treturn command ? { command, argv: argv.slice(1) } : undefined;\n\t}\n\n\tprivate parseOwn(argv: readonly string[]): CommandParseResult<TOwnInvocation> {\n\t\tif (!this.builder) throw new Error(`Command ${this.name} does not define a builder`);\n\t\tconst parsed = this.parseOptions(argv);\n\t\tconst input: ParsedCommandInput = {\n\t\t\tremainingArgs: parsed.remainingArgs,\n\t\t\tvalue: <TValue>(option: CommandOption<TValue>) => parsed.values.get(option.name)?.[0] as TValue | undefined,\n\t\t\tvalues: <TValue>(option: CommandOption<TValue>) => (parsed.values.get(option.name) ?? []) as readonly TValue[],\n\t\t};\n\t\tconst built = this.builder(input);\n\t\tconst errors = [...parsed.errors, ...(built.ok ? [] : built.errors)];\n\t\tif (errors.length > 0) return { ok: false, errors };\n\t\tif (!built.ok) throw new Error(`Command ${this.name} failed without an error`);\n\t\treturn { ok: true, command: built.command };\n\t}\n\n\tprivate parseOptions(argv: readonly string[]): MutableParsedCommandInput {\n\t\tconst parsed: MutableParsedCommandInput = {\n\t\t\tvalues: new Map(),\n\t\t\tremainingArgs: [],\n\t\t\terrors: [],\n\t\t};\n\t\tfor (let index = 0; index < argv.length; index++) {\n\t\t\tconst argument = argv[index]!;\n\t\t\tif (argument === \"--\") {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst equals = argument.indexOf(\"=\");\n\t\t\tconst name = equals === -1 ? argument : argument.slice(0, equals);\n\t\t\tconst option = this.options.get(name);\n\t\t\tif (!option) {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet value = equals === -1 ? undefined : argument.slice(equals + 1);\n\t\t\tif (value === undefined) {\n\t\t\t\tconst next = argv[index + 1];\n\t\t\t\tif (next !== undefined && !next.startsWith(\"-\")) {\n\t\t\t\t\tvalue = next;\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (value === undefined || value === \"\") {\n\t\t\t\tparsed.errors.push(`${name} requires a value`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst values = parsed.values.get(name) ?? [];\n\t\t\tif (values.length > 0) {\n\t\t\t\tparsed.errors.push(`${name} may only be specified once`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = option.parse(value);\n\t\t\tif (!result.ok) {\n\t\t\t\tparsed.errors.push(result.error);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalues.push(result.value);\n\t\t\tparsed.values.set(name, values);\n\t\t}\n\t\treturn parsed;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/experimental/command.ts"],"names":[],"mappings":"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","sourcesContent":["import { t } from \"../../core/i18n/index.ts\";\n\nexport interface NamedCommandInvocation {\n\treadonly command: string;\n}\n\nexport type CommandParseResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandExecutionResult<TInvocation extends NamedCommandInvocation = NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\nexport type CommandOptionParseResult<TValue> =\n\t| { readonly ok: true; readonly value: TValue }\n\t| { readonly ok: false; readonly error: string };\n\nexport interface CommandOption<TValue> {\n\treadonly name: `--${string}`;\n\tparse(value: string): CommandOptionParseResult<TValue>;\n}\n\nexport function valueOption<TValue>(\n\tname: `--${string}`,\n\tparse: (value: string) => CommandOptionParseResult<TValue>,\n): CommandOption<TValue> {\n\treturn { name, parse };\n}\n\nexport function stringOption(name: `--${string}`): CommandOption<string> {\n\treturn valueOption(name, (value) => ({ ok: true, value }));\n}\n\nexport interface ParsedCommandInput {\n\treadonly remainingArgs: readonly string[];\n\tvalue<TValue>(option: CommandOption<TValue>): TValue | undefined;\n\tvalues<TValue>(option: CommandOption<TValue>): readonly TValue[];\n}\n\nexport type CommandBuildResult<TInvocation extends NamedCommandInvocation> =\n\t| { readonly ok: true; readonly command: TInvocation }\n\t| { readonly ok: false; readonly errors: readonly string[] };\n\ninterface MutableParsedCommandInput {\n\treadonly values: Map<string, unknown[]>;\n\treadonly remainingArgs: string[];\n\treadonly errors: string[];\n}\n\ntype CommandBuilder<TInvocation extends NamedCommandInvocation> = (\n\tinput: ParsedCommandInput,\n) => CommandBuildResult<TInvocation>;\n\ntype CommandAction<TInvocation extends NamedCommandInvocation, TContext> = (\n\tcommand: TInvocation,\n\tcontext: TContext,\n) => void | Promise<void>;\n\ninterface RegisteredCommand {\n\tparse(argv: readonly string[]): CommandParseResult;\n\texecute(argv: readonly string[], context: unknown): Promise<CommandExecutionResult>;\n}\n\nexport class Command<\n\tTOwnInvocation extends NamedCommandInvocation,\n\tTContext,\n\tTInvocation extends NamedCommandInvocation = TOwnInvocation,\n> {\n\treadonly name: string;\n\tprivate readonly options = new Map<string, CommandOption<unknown>>();\n\tprivate readonly subcommands = new Map<string, RegisteredCommand>();\n\tprivate builder?: CommandBuilder<TOwnInvocation>;\n\tprivate commandAction?: CommandAction<TOwnInvocation, TContext>;\n\n\tconstructor(name: string) {\n\t\tthis.name = name;\n\t}\n\n\toption<TValue>(option: CommandOption<TValue>): this {\n\t\tif (this.options.has(option.name)) {\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Option {option} is already registered for {name}\", { option: option.name, name: this.name }),\n\t\t\t);\n\t\t}\n\t\tthis.options.set(option.name, option);\n\t\treturn this;\n\t}\n\n\tbuild(builder: CommandBuilder<TOwnInvocation>): this {\n\t\tthis.builder = builder;\n\t\treturn this;\n\t}\n\n\taction(action: CommandAction<TOwnInvocation, TContext>): this {\n\t\tthis.commandAction = action;\n\t\treturn this;\n\t}\n\n\tcommand<\n\t\tTSubcommandOwnInvocation extends NamedCommandInvocation,\n\t\tTSubcommandContext,\n\t\tTSubcommandInvocation extends NamedCommandInvocation,\n\t>(\n\t\tcommand: Command<TSubcommandOwnInvocation, TSubcommandContext, TSubcommandInvocation>,\n\t): Command<TOwnInvocation, TContext & TSubcommandContext, TInvocation | TSubcommandInvocation> {\n\t\tif (this.subcommands.has(command.name))\n\t\t\tthrow new Error(t(\"Command {name} is already registered\", { name: command.name }));\n\t\tthis.subcommands.set(command.name, {\n\t\t\tparse: (argv) => command.parse(argv),\n\t\t\texecute: (argv, context) => command.execute(argv, context as TSubcommandContext),\n\t\t});\n\t\treturn this as unknown as Command<\n\t\t\tTOwnInvocation,\n\t\t\tTContext & TSubcommandContext,\n\t\t\tTInvocation | TSubcommandInvocation\n\t\t>;\n\t}\n\n\tparse(argv: readonly string[]): CommandParseResult<TInvocation> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) return selected.command.parse(selected.argv) as CommandParseResult<TInvocation>;\n\t\treturn this.parseOwn(argv) as CommandParseResult<TInvocation>;\n\t}\n\n\tasync execute(argv: readonly string[], context: TContext): Promise<CommandExecutionResult<TInvocation>> {\n\t\tconst selected = this.select(argv);\n\t\tif (selected) {\n\t\t\treturn selected.command.execute(selected.argv, context) as Promise<CommandExecutionResult<TInvocation>>;\n\t\t}\n\n\t\tconst parsed = this.parseOwn(argv);\n\t\tif (!parsed.ok) return parsed;\n\t\tif (!this.commandAction) throw new Error(t(\"Command {name} does not define an action\", { name: this.name }));\n\t\tawait this.commandAction(parsed.command, context);\n\t\treturn { ok: true, command: parsed.command as unknown as TInvocation };\n\t}\n\n\tprivate select(argv: readonly string[]): { command: RegisteredCommand; argv: readonly string[] } | undefined {\n\t\tconst candidate = argv[0];\n\t\tif (candidate === undefined) return undefined;\n\t\tconst command = this.subcommands.get(candidate);\n\t\treturn command ? { command, argv: argv.slice(1) } : undefined;\n\t}\n\n\tprivate parseOwn(argv: readonly string[]): CommandParseResult<TOwnInvocation> {\n\t\tif (!this.builder) throw new Error(t(\"Command {name} does not define a builder\", { name: this.name }));\n\t\tconst parsed = this.parseOptions(argv);\n\t\tconst input: ParsedCommandInput = {\n\t\t\tremainingArgs: parsed.remainingArgs,\n\t\t\tvalue: <TValue>(option: CommandOption<TValue>) => parsed.values.get(option.name)?.[0] as TValue | undefined,\n\t\t\tvalues: <TValue>(option: CommandOption<TValue>) => (parsed.values.get(option.name) ?? []) as readonly TValue[],\n\t\t};\n\t\tconst built = this.builder(input);\n\t\tconst errors = [...parsed.errors, ...(built.ok ? [] : built.errors)];\n\t\tif (errors.length > 0) return { ok: false, errors };\n\t\tif (!built.ok) throw new Error(t(\"Command {name} failed without an error\", { name: this.name }));\n\t\treturn { ok: true, command: built.command };\n\t}\n\n\tprivate parseOptions(argv: readonly string[]): MutableParsedCommandInput {\n\t\tconst parsed: MutableParsedCommandInput = {\n\t\t\tvalues: new Map(),\n\t\t\tremainingArgs: [],\n\t\t\terrors: [],\n\t\t};\n\t\tfor (let index = 0; index < argv.length; index++) {\n\t\t\tconst argument = argv[index]!;\n\t\t\tif (argument === \"--\") {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst equals = argument.indexOf(\"=\");\n\t\t\tconst name = equals === -1 ? argument : argument.slice(0, equals);\n\t\t\tconst option = this.options.get(name);\n\t\t\tif (!option) {\n\t\t\t\tparsed.remainingArgs.push(...argv.slice(index));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet value = equals === -1 ? undefined : argument.slice(equals + 1);\n\t\t\tif (value === undefined) {\n\t\t\t\tconst next = argv[index + 1];\n\t\t\t\tif (next !== undefined && !next.startsWith(\"-\")) {\n\t\t\t\t\tvalue = next;\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (value === undefined || value === \"\") {\n\t\t\t\tparsed.errors.push(`${name} requires a value`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst values = parsed.values.get(name) ?? [];\n\t\t\tif (values.length > 0) {\n\t\t\t\tparsed.errors.push(`${name} may only be specified once`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = option.parse(value);\n\t\t\tif (!result.ok) {\n\t\t\t\tparsed.errors.push(result.error);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalues.push(result.value);\n\t\t\tparsed.values.set(name, values);\n\t\t}\n\t\treturn parsed;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-models.d.ts","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"list-models.d.ts","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAiB7D;;GAEG;AACH,wBAAsB,UAAU,CAC/B,YAAY,EAAE,YAAY,EAC1B,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAkFf","sourcesContent":["/**\n * List available models with optional fuzzy search\n */\n\nimport type { Api, Model } from \"@agent-forge/ai\";\nimport { fuzzyFilter } from \"@agent-forge/tui\";\nimport chalk from \"chalk\";\nimport { formatNoModelsAvailableMessage } from \"../core/auth-guidance.ts\";\nimport { t } from \"../core/i18n/index.ts\";\nimport type { ModelRuntime } from \"../core/model-runtime.ts\";\n\n/**\n * Format a number as human-readable (e.g., 200000 -> \"200K\", 1000000 -> \"1M\")\n */\nfunction formatTokenCount(count: number): string {\n\tif (count >= 1_000_000) {\n\t\tconst millions = count / 1_000_000;\n\t\treturn millions % 1 === 0 ? `${millions}M` : `${millions.toFixed(1)}M`;\n\t}\n\tif (count >= 1_000) {\n\t\tconst thousands = count / 1_000;\n\t\treturn thousands % 1 === 0 ? `${thousands}K` : `${thousands.toFixed(1)}K`;\n\t}\n\treturn count.toString();\n}\n\n/**\n * List available models, optionally filtered by search pattern\n */\nexport async function listModels(\n\tmodelRuntime: ModelRuntime,\n\tsearchPattern?: string,\n\tsignal?: AbortSignal,\n): Promise<void> {\n\tconst loadError = modelRuntime.getError();\n\tif (loadError) {\n\t\tconsole.error(chalk.yellow(t(\"Warning: errors loading models.json:\\n{loadError}\", { loadError })));\n\t}\n\n\tconst models = [...(await modelRuntime.getAvailable(undefined, { signal }))];\n\n\tif (models.length === 0) {\n\t\tconsole.log(formatNoModelsAvailableMessage());\n\t\treturn;\n\t}\n\n\t// Apply fuzzy filter if search pattern provided\n\tlet filteredModels: Model<Api>[] = models;\n\tif (searchPattern) {\n\t\tfilteredModels = fuzzyFilter(models, searchPattern, (m) => `${m.provider} ${m.id}`);\n\t}\n\n\tif (filteredModels.length === 0) {\n\t\tconsole.log(t('No models matching \"{searchPattern}\"', { searchPattern: searchPattern ?? \"\" }));\n\t\treturn;\n\t}\n\n\t// Sort by provider, then by model id\n\tfilteredModels.sort((a, b) => {\n\t\tconst providerCmp = a.provider.localeCompare(b.provider);\n\t\tif (providerCmp !== 0) return providerCmp;\n\t\treturn a.id.localeCompare(b.id);\n\t});\n\n\t// Calculate column widths\n\tconst rows = filteredModels.map((m) => ({\n\t\tprovider: m.provider,\n\t\tmodel: m.id,\n\t\tcontext: formatTokenCount(m.contextWindow),\n\t\tmaxOut: formatTokenCount(m.maxTokens),\n\t\tthinking: m.reasoning ? \"yes\" : \"no\",\n\t\timages: m.input.includes(\"image\") ? \"yes\" : \"no\",\n\t}));\n\n\tconst headers = {\n\t\tprovider: t(\"provider\"),\n\t\tmodel: t(\"model\"),\n\t\tcontext: t(\"context\"),\n\t\tmaxOut: t(\"max-out\"),\n\t\tthinking: t(\"thinking\"),\n\t\timages: t(\"images\"),\n\t};\n\n\tconst widths = {\n\t\tprovider: Math.max(headers.provider.length, ...rows.map((r) => r.provider.length)),\n\t\tmodel: Math.max(headers.model.length, ...rows.map((r) => r.model.length)),\n\t\tcontext: Math.max(headers.context.length, ...rows.map((r) => r.context.length)),\n\t\tmaxOut: Math.max(headers.maxOut.length, ...rows.map((r) => r.maxOut.length)),\n\t\tthinking: Math.max(headers.thinking.length, ...rows.map((r) => r.thinking.length)),\n\t\timages: Math.max(headers.images.length, ...rows.map((r) => r.images.length)),\n\t};\n\n\t// Print header\n\tconst headerLine = [\n\t\theaders.provider.padEnd(widths.provider),\n\t\theaders.model.padEnd(widths.model),\n\t\theaders.context.padEnd(widths.context),\n\t\theaders.maxOut.padEnd(widths.maxOut),\n\t\theaders.thinking.padEnd(widths.thinking),\n\t\theaders.images.padEnd(widths.images),\n\t].join(\" \");\n\tconsole.log(headerLine);\n\n\t// Print rows\n\tfor (const row of rows) {\n\t\tconst line = [\n\t\t\trow.provider.padEnd(widths.provider),\n\t\t\trow.model.padEnd(widths.model),\n\t\t\trow.context.padEnd(widths.context),\n\t\t\trow.maxOut.padEnd(widths.maxOut),\n\t\t\trow.thinking.padEnd(widths.thinking),\n\t\t\trow.images.padEnd(widths.images),\n\t\t].join(\" \");\n\t\tconsole.log(line);\n\t}\n}\n"]}
|
package/dist/cli/list-models.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { fuzzyFilter } from "@agent-forge/tui";
|
|
5
5
|
import chalk from "chalk";
|
|
6
6
|
import { formatNoModelsAvailableMessage } from "../core/auth-guidance.js";
|
|
7
|
+
import { t } from "../core/i18n/index.js";
|
|
7
8
|
/**
|
|
8
9
|
* Format a number as human-readable (e.g., 200000 -> "200K", 1000000 -> "1M")
|
|
9
10
|
*/
|
|
@@ -24,7 +25,7 @@ function formatTokenCount(count) {
|
|
|
24
25
|
export async function listModels(modelRuntime, searchPattern, signal) {
|
|
25
26
|
const loadError = modelRuntime.getError();
|
|
26
27
|
if (loadError) {
|
|
27
|
-
console.error(chalk.yellow(
|
|
28
|
+
console.error(chalk.yellow(t("Warning: errors loading models.json:\n{loadError}", { loadError })));
|
|
28
29
|
}
|
|
29
30
|
const models = [...(await modelRuntime.getAvailable(undefined, { signal }))];
|
|
30
31
|
if (models.length === 0) {
|
|
@@ -37,7 +38,7 @@ export async function listModels(modelRuntime, searchPattern, signal) {
|
|
|
37
38
|
filteredModels = fuzzyFilter(models, searchPattern, (m) => `${m.provider} ${m.id}`);
|
|
38
39
|
}
|
|
39
40
|
if (filteredModels.length === 0) {
|
|
40
|
-
console.log(
|
|
41
|
+
console.log(t('No models matching "{searchPattern}"', { searchPattern: searchPattern ?? "" }));
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
44
|
// Sort by provider, then by model id
|
|
@@ -57,12 +58,12 @@ export async function listModels(modelRuntime, searchPattern, signal) {
|
|
|
57
58
|
images: m.input.includes("image") ? "yes" : "no",
|
|
58
59
|
}));
|
|
59
60
|
const headers = {
|
|
60
|
-
provider: "provider",
|
|
61
|
-
model: "model",
|
|
62
|
-
context: "context",
|
|
63
|
-
maxOut: "max-out",
|
|
64
|
-
thinking: "thinking",
|
|
65
|
-
images: "images",
|
|
61
|
+
provider: t("provider"),
|
|
62
|
+
model: t("model"),
|
|
63
|
+
context: t("context"),
|
|
64
|
+
maxOut: t("max-out"),
|
|
65
|
+
thinking: t("thinking"),
|
|
66
|
+
images: t("images"),
|
|
66
67
|
};
|
|
67
68
|
const widths = {
|
|
68
69
|
provider: Math.max(headers.provider.length, ...rows.map((r) => r.provider.length)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../src/cli/list-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * List available models with optional fuzzy search\n */\n\nimport type { Api, Model } from \"@agent-forge/ai\";\nimport { fuzzyFilter } from \"@agent-forge/tui\";\nimport chalk from \"chalk\";\nimport { formatNoModelsAvailableMessage } from \"../core/auth-guidance.ts\";\nimport { t } from \"../core/i18n/index.ts\";\nimport type { ModelRuntime } from \"../core/model-runtime.ts\";\n\n/**\n * Format a number as human-readable (e.g., 200000 -> \"200K\", 1000000 -> \"1M\")\n */\nfunction formatTokenCount(count: number): string {\n\tif (count >= 1_000_000) {\n\t\tconst millions = count / 1_000_000;\n\t\treturn millions % 1 === 0 ? `${millions}M` : `${millions.toFixed(1)}M`;\n\t}\n\tif (count >= 1_000) {\n\t\tconst thousands = count / 1_000;\n\t\treturn thousands % 1 === 0 ? `${thousands}K` : `${thousands.toFixed(1)}K`;\n\t}\n\treturn count.toString();\n}\n\n/**\n * List available models, optionally filtered by search pattern\n */\nexport async function listModels(\n\tmodelRuntime: ModelRuntime,\n\tsearchPattern?: string,\n\tsignal?: AbortSignal,\n): Promise<void> {\n\tconst loadError = modelRuntime.getError();\n\tif (loadError) {\n\t\tconsole.error(chalk.yellow(t(\"Warning: errors loading models.json:\\n{loadError}\", { loadError })));\n\t}\n\n\tconst models = [...(await modelRuntime.getAvailable(undefined, { signal }))];\n\n\tif (models.length === 0) {\n\t\tconsole.log(formatNoModelsAvailableMessage());\n\t\treturn;\n\t}\n\n\t// Apply fuzzy filter if search pattern provided\n\tlet filteredModels: Model<Api>[] = models;\n\tif (searchPattern) {\n\t\tfilteredModels = fuzzyFilter(models, searchPattern, (m) => `${m.provider} ${m.id}`);\n\t}\n\n\tif (filteredModels.length === 0) {\n\t\tconsole.log(t('No models matching \"{searchPattern}\"', { searchPattern: searchPattern ?? \"\" }));\n\t\treturn;\n\t}\n\n\t// Sort by provider, then by model id\n\tfilteredModels.sort((a, b) => {\n\t\tconst providerCmp = a.provider.localeCompare(b.provider);\n\t\tif (providerCmp !== 0) return providerCmp;\n\t\treturn a.id.localeCompare(b.id);\n\t});\n\n\t// Calculate column widths\n\tconst rows = filteredModels.map((m) => ({\n\t\tprovider: m.provider,\n\t\tmodel: m.id,\n\t\tcontext: formatTokenCount(m.contextWindow),\n\t\tmaxOut: formatTokenCount(m.maxTokens),\n\t\tthinking: m.reasoning ? \"yes\" : \"no\",\n\t\timages: m.input.includes(\"image\") ? \"yes\" : \"no\",\n\t}));\n\n\tconst headers = {\n\t\tprovider: t(\"provider\"),\n\t\tmodel: t(\"model\"),\n\t\tcontext: t(\"context\"),\n\t\tmaxOut: t(\"max-out\"),\n\t\tthinking: t(\"thinking\"),\n\t\timages: t(\"images\"),\n\t};\n\n\tconst widths = {\n\t\tprovider: Math.max(headers.provider.length, ...rows.map((r) => r.provider.length)),\n\t\tmodel: Math.max(headers.model.length, ...rows.map((r) => r.model.length)),\n\t\tcontext: Math.max(headers.context.length, ...rows.map((r) => r.context.length)),\n\t\tmaxOut: Math.max(headers.maxOut.length, ...rows.map((r) => r.maxOut.length)),\n\t\tthinking: Math.max(headers.thinking.length, ...rows.map((r) => r.thinking.length)),\n\t\timages: Math.max(headers.images.length, ...rows.map((r) => r.images.length)),\n\t};\n\n\t// Print header\n\tconst headerLine = [\n\t\theaders.provider.padEnd(widths.provider),\n\t\theaders.model.padEnd(widths.model),\n\t\theaders.context.padEnd(widths.context),\n\t\theaders.maxOut.padEnd(widths.maxOut),\n\t\theaders.thinking.padEnd(widths.thinking),\n\t\theaders.images.padEnd(widths.images),\n\t].join(\" \");\n\tconsole.log(headerLine);\n\n\t// Print rows\n\tfor (const row of rows) {\n\t\tconst line = [\n\t\t\trow.provider.padEnd(widths.provider),\n\t\t\trow.model.padEnd(widths.model),\n\t\t\trow.context.padEnd(widths.context),\n\t\t\trow.maxOut.padEnd(widths.maxOut),\n\t\t\trow.thinking.padEnd(widths.thinking),\n\t\t\trow.images.padEnd(widths.images),\n\t\t].join(\" \");\n\t\tconsole.log(line);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-manager-controller.d.ts","sourceRoot":"","sources":["../../src/cli/plugin-manager-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { comparePluginVersionsV1 } from \"../plugins/ecosystem/catalog.ts\";\nimport type { PluginEcosystemCliResponseV1, PluginEcosystemCliV1 } from \"../plugins/ecosystem/cli.ts\";\nimport type { PluginRegistrySnapshotV1, PluginRegistryV1 } from \"../plugins/ecosystem/registry.ts\";\nimport type {\n\tPluginStateReadResultV1,\n\tPluginStateRecordV1,\n\tPluginStateSnapshotV1,\n\tPluginStateStoreV1,\n} from \"../plugins/ecosystem/state.ts\";\n\nconst MAX_MANAGER_ENTRIES_V1 = 128;\nconst MAX_MANAGER_DIAGNOSTICS_V1 = 8;\nconst MAX_MANAGER_ID_CHARS_V1 = 256;\n\nexport type PluginManagerEntryStatusV1 = \"available\" | \"installed\" | \"update-available\" | \"unavailable\";\n\nexport interface PluginManagerEntryV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly status: PluginManagerEntryStatusV1;\n\treadonly signed: boolean;\n\treadonly installedVersion?: string;\n\treadonly lifecycle?: PluginStateRecordV1[\"state\"][\"lifecycle\"];\n\treadonly diagnosticCodes: readonly string[];\n}\n\nexport interface PluginManagerSnapshotV1 {\n\treadonly version: 1;\n\treadonly registrySource: string;\n\treadonly stateStatus: \"ok\" | \"missing\";\n\treadonly entries: readonly PluginManagerEntryV1[];\n\treadonly truncated: boolean;\n}\n\nexport type PluginManagerControllerErrorCodeV1 =\n\t| \"cancelled\"\n\t| \"registry-unavailable\"\n\t| \"state-invalid\"\n\t| \"state-unavailable\"\n\t| \"manager-operation-failed\"\n\t| \"manager-operation-unsupported\"\n\t| \"manager-operation-cancelled\"\n\t| \"confirmation-required\";\n\nexport type PluginManagerSnapshotResultV1 =\n\t| { readonly status: \"ok\"; readonly snapshot: PluginManagerSnapshotV1 }\n\t| { readonly status: \"error\"; readonly code: PluginManagerControllerErrorCodeV1 };\n\nexport type PluginManagerMutationStatusV1 = \"succeeded\" | \"failed\" | \"unsupported\" | \"cancelled\" | \"needs_confirmation\";\n\nexport interface PluginManagerMutationResultV1 {\n\treadonly status: PluginManagerMutationStatusV1;\n\treadonly code?: PluginManagerControllerErrorCodeV1;\n\treadonly snapshot?: PluginManagerSnapshotV1;\n}\n\nexport interface PluginManagerControllerV1 {\n\treadonly getSnapshot: (input?: { readonly signal?: AbortSignal }) => Promise<PluginManagerSnapshotResultV1>;\n\treadonly install: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly update: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly remove: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n}\n\nexport interface PluginManagerMutationInputV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion?: string;\n\treadonly confirmed: boolean;\n\treadonly signal?: AbortSignal;\n}\n\nfunction boundedId(value: string, label: string): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.trim() === \"\" ||\n\t\tvalue.length > MAX_MANAGER_ID_CHARS_V1 ||\n\t\t/[\\u0000-\\u001f\\s]/u.test(value)\n\t)\n\t\tthrow new Error(`${label} is invalid`);\n\treturn value;\n}\n\nfunction signalAborted(signal: AbortSignal | undefined): boolean {\n\treturn signal?.aborted === true;\n}\n\nfunction rejectionCodes(\n\tregistry: PluginRegistrySnapshotV1,\n\tpluginId: string,\n\tpluginVersion: string,\n): readonly string[] {\n\treturn Object.freeze(\n\t\tregistry.rejected\n\t\t\t.filter((entry) => entry.pluginId === pluginId && entry.pluginVersion === pluginVersion)\n\t\t\t.slice(0, MAX_MANAGER_DIAGNOSTICS_V1)\n\t\t\t.map((entry) => entry.code),\n\t);\n}\n\nfunction activeRecord(state: PluginStateSnapshotV1, pluginId: string): PluginStateRecordV1 | undefined {\n\treturn state.records\n\t\t.filter((record) => record.pluginId === pluginId && record.state.lifecycle === \"active\")\n\t\t.sort((left, right) => comparePluginVersionsV1(right.pluginVersion, left.pluginVersion))[0];\n}\n\nfunction makeSnapshot(\n\tregistry: PluginRegistrySnapshotV1,\n\tstateStatus: \"ok\" | \"missing\",\n\tstate: PluginStateSnapshotV1,\n): PluginManagerSnapshotV1 {\n\tconst identities = new Map<\n\t\tstring,\n\t\t{ readonly pluginId: string; readonly pluginVersion: string; readonly signed: boolean }\n\t>();\n\tfor (const entry of registry.entries) {\n\t\tidentities.set(`${entry.pluginId}@${entry.pluginVersion}`, entry);\n\t}\n\t// Source/digest/platform-rejected manifests are intentionally visible as\n\t// unavailable so the host UI can explain why an installed catalog item\n\t// cannot be enabled. Their source, reason and package bytes stay host-only.\n\tfor (const rejection of registry.rejected) {\n\t\tconst identity = `${rejection.pluginId}@${rejection.pluginVersion}`;\n\t\tif (!identities.has(identity)) {\n\t\t\tidentities.set(identity, {\n\t\t\t\tpluginId: rejection.pluginId,\n\t\t\t\tpluginVersion: rejection.pluginVersion,\n\t\t\t\tsigned: false,\n\t\t\t});\n\t\t}\n\t}\n\tconst entries = [...identities.values()]\n\t\t.map((entry) => {\n\t\t\tconst installed = activeRecord(state, entry.pluginId);\n\t\t\tconst diagnostics = rejectionCodes(registry, entry.pluginId, entry.pluginVersion);\n\t\t\tconst unavailable =\n\t\t\t\tdiagnostics.length > 0 ||\n\t\t\t\t!registry.verified.some(\n\t\t\t\t\t(candidate) => candidate.pluginId === entry.pluginId && candidate.pluginVersion === entry.pluginVersion,\n\t\t\t\t);\n\t\t\tconst isInstalled = installed?.pluginVersion === entry.pluginVersion;\n\t\t\treturn Object.freeze({\n\t\t\t\tpluginId: entry.pluginId,\n\t\t\t\tpluginVersion: entry.pluginVersion,\n\t\t\t\tstatus: unavailable\n\t\t\t\t\t? (\"unavailable\" as const)\n\t\t\t\t\t: isInstalled\n\t\t\t\t\t\t? (\"installed\" as const)\n\t\t\t\t\t\t: installed === undefined\n\t\t\t\t\t\t\t? (\"available\" as const)\n\t\t\t\t\t\t\t: (\"update-available\" as const),\n\t\t\t\tsigned: entry.signed,\n\t\t\t\t...(installed === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { installedVersion: installed.pluginVersion, lifecycle: installed.state.lifecycle }),\n\t\t\t\tdiagnosticCodes: diagnostics,\n\t\t\t});\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tconst idOrder = left.pluginId.localeCompare(right.pluginId);\n\t\t\treturn idOrder === 0 ? comparePluginVersionsV1(right.pluginVersion, left.pluginVersion) : idOrder;\n\t\t});\n\tconst boundedEntries = Object.freeze(entries.slice(0, MAX_MANAGER_ENTRIES_V1));\n\treturn Object.freeze({\n\t\tversion: 1,\n\t\tregistrySource: registry.source,\n\t\tstateStatus,\n\t\tentries: boundedEntries,\n\t\ttruncated: entries.length > boundedEntries.length,\n\t});\n}\n\nfunction stateResult(\n\tresult: PluginStateReadResultV1,\n): { readonly status: \"ok\" | \"missing\"; readonly snapshot: PluginStateSnapshotV1 } | undefined {\n\tif (result.status === \"ok\" || result.status === \"missing\") {\n\t\treturn { status: result.status, snapshot: result.snapshot };\n\t}\n\treturn undefined;\n}\n\nfunction responseCode(response: PluginEcosystemCliResponseV1): PluginManagerControllerErrorCodeV1 {\n\tif (response.status === \"unsupported\") return \"manager-operation-unsupported\";\n\tif (response.status === \"cancelled\") return \"manager-operation-cancelled\";\n\treturn \"manager-operation-failed\";\n}\n\n/**\n * Host-owned installation/update surface. The UI sees only bounded entries\n * and stable operation status; registry sources, installers, paths, package\n * bytes, signatures and credentials never cross this boundary.\n */\nexport function createPluginManagerControllerV1(options: {\n\treadonly registry: PluginRegistryV1;\n\treadonly stateStore: PluginStateStoreV1;\n\treadonly cli: PluginEcosystemCliV1;\n}): PluginManagerControllerV1 {\n\tconst getSnapshot = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<PluginManagerSnapshotResultV1> => {\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet registry: PluginRegistrySnapshotV1;\n\t\ttry {\n\t\t\tregistry = await options.registry.list({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"registry-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet state: PluginStateReadResultV1;\n\t\ttry {\n\t\t\tstate = await options.stateStore.read({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"state-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tconst checkedState = stateResult(state);\n\t\tif (checkedState === undefined)\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tcode: state.status === \"cancelled\" ? \"cancelled\" : \"state-invalid\",\n\t\t\t};\n\t\treturn {\n\t\t\tstatus: \"ok\",\n\t\t\tsnapshot: makeSnapshot(registry, checkedState.status, checkedState.snapshot),\n\t\t};\n\t};\n\n\tconst run = async (input: {\n\t\treadonly command: \"install\" | \"update\" | \"remove\";\n\t\treadonly pluginId: string;\n\t\treadonly pluginVersion?: string;\n\t\treadonly confirmed: boolean;\n\t\treadonly signal?: AbortSignal;\n\t}): Promise<PluginManagerMutationResultV1> => {\n\t\ttry {\n\t\t\tboundedId(input.pluginId, \"plugin ID\");\n\t\t\tif (input.pluginVersion !== undefined) boundedId(input.pluginVersion, \"plugin version\");\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (!input.confirmed) return { status: \"needs_confirmation\", code: \"confirmation-required\" };\n\t\tif (signalAborted(input.signal)) return { status: \"cancelled\", code: \"cancelled\" };\n\t\tlet response: PluginEcosystemCliResponseV1;\n\t\ttry {\n\t\t\tconst identity =\n\t\t\t\tinput.pluginVersion === undefined ? input.pluginId : `${input.pluginId}@${input.pluginVersion}`;\n\t\t\tresponse = await options.cli.execute({\n\t\t\t\targv: [input.command, identity, \"--json\"],\n\t\t\t\tsignal: input.signal,\n\t\t\t});\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (response.status !== \"succeeded\") {\n\t\t\treturn {\n\t\t\t\tstatus:\n\t\t\t\t\tresponse.status === \"unsupported\"\n\t\t\t\t\t\t? \"unsupported\"\n\t\t\t\t\t\t: response.status === \"cancelled\"\n\t\t\t\t\t\t\t? \"cancelled\"\n\t\t\t\t\t\t\t: \"failed\",\n\t\t\t\tcode: responseCode(response),\n\t\t\t};\n\t\t}\n\t\tconst refreshed = await getSnapshot({ signal: input.signal });\n\t\treturn refreshed.status === \"ok\"\n\t\t\t? { status: \"succeeded\", snapshot: refreshed.snapshot }\n\t\t\t: { status: \"succeeded\" };\n\t};\n\n\treturn Object.freeze({\n\t\tgetSnapshot,\n\t\tinstall: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"install\" }),\n\t\tupdate: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"update\" }),\n\t\tremove: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"remove\" }),\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"plugin-manager-controller.d.ts","sourceRoot":"","sources":["../../src/cli/plugin-manager-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { t } from \"../core/i18n/index.ts\";\nimport { comparePluginVersionsV1 } from \"../plugins/ecosystem/catalog.ts\";\nimport type { PluginEcosystemCliResponseV1, PluginEcosystemCliV1 } from \"../plugins/ecosystem/cli.ts\";\nimport type { PluginRegistrySnapshotV1, PluginRegistryV1 } from \"../plugins/ecosystem/registry.ts\";\nimport type {\n\tPluginStateReadResultV1,\n\tPluginStateRecordV1,\n\tPluginStateSnapshotV1,\n\tPluginStateStoreV1,\n} from \"../plugins/ecosystem/state.ts\";\n\nconst MAX_MANAGER_ENTRIES_V1 = 128;\nconst MAX_MANAGER_DIAGNOSTICS_V1 = 8;\nconst MAX_MANAGER_ID_CHARS_V1 = 256;\n\nexport type PluginManagerEntryStatusV1 = \"available\" | \"installed\" | \"update-available\" | \"unavailable\";\n\nexport interface PluginManagerEntryV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly status: PluginManagerEntryStatusV1;\n\treadonly signed: boolean;\n\treadonly installedVersion?: string;\n\treadonly lifecycle?: PluginStateRecordV1[\"state\"][\"lifecycle\"];\n\treadonly diagnosticCodes: readonly string[];\n}\n\nexport interface PluginManagerSnapshotV1 {\n\treadonly version: 1;\n\treadonly registrySource: string;\n\treadonly stateStatus: \"ok\" | \"missing\";\n\treadonly entries: readonly PluginManagerEntryV1[];\n\treadonly truncated: boolean;\n}\n\nexport type PluginManagerControllerErrorCodeV1 =\n\t| \"cancelled\"\n\t| \"registry-unavailable\"\n\t| \"state-invalid\"\n\t| \"state-unavailable\"\n\t| \"manager-operation-failed\"\n\t| \"manager-operation-unsupported\"\n\t| \"manager-operation-cancelled\"\n\t| \"confirmation-required\";\n\nexport type PluginManagerSnapshotResultV1 =\n\t| { readonly status: \"ok\"; readonly snapshot: PluginManagerSnapshotV1 }\n\t| { readonly status: \"error\"; readonly code: PluginManagerControllerErrorCodeV1 };\n\nexport type PluginManagerMutationStatusV1 = \"succeeded\" | \"failed\" | \"unsupported\" | \"cancelled\" | \"needs_confirmation\";\n\nexport interface PluginManagerMutationResultV1 {\n\treadonly status: PluginManagerMutationStatusV1;\n\treadonly code?: PluginManagerControllerErrorCodeV1;\n\treadonly snapshot?: PluginManagerSnapshotV1;\n}\n\nexport interface PluginManagerControllerV1 {\n\treadonly getSnapshot: (input?: { readonly signal?: AbortSignal }) => Promise<PluginManagerSnapshotResultV1>;\n\treadonly install: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly update: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly remove: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n}\n\nexport interface PluginManagerMutationInputV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion?: string;\n\treadonly confirmed: boolean;\n\treadonly signal?: AbortSignal;\n}\n\nfunction boundedId(value: string, label: string): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.trim() === \"\" ||\n\t\tvalue.length > MAX_MANAGER_ID_CHARS_V1 ||\n\t\t/[\\u0000-\\u001f\\s]/u.test(value)\n\t)\n\t\tthrow new Error(t(\"{label} is invalid\", { label }));\n\treturn value;\n}\n\nfunction signalAborted(signal: AbortSignal | undefined): boolean {\n\treturn signal?.aborted === true;\n}\n\nfunction rejectionCodes(\n\tregistry: PluginRegistrySnapshotV1,\n\tpluginId: string,\n\tpluginVersion: string,\n): readonly string[] {\n\treturn Object.freeze(\n\t\tregistry.rejected\n\t\t\t.filter((entry) => entry.pluginId === pluginId && entry.pluginVersion === pluginVersion)\n\t\t\t.slice(0, MAX_MANAGER_DIAGNOSTICS_V1)\n\t\t\t.map((entry) => entry.code),\n\t);\n}\n\nfunction activeRecord(state: PluginStateSnapshotV1, pluginId: string): PluginStateRecordV1 | undefined {\n\treturn state.records\n\t\t.filter((record) => record.pluginId === pluginId && record.state.lifecycle === \"active\")\n\t\t.sort((left, right) => comparePluginVersionsV1(right.pluginVersion, left.pluginVersion))[0];\n}\n\nfunction makeSnapshot(\n\tregistry: PluginRegistrySnapshotV1,\n\tstateStatus: \"ok\" | \"missing\",\n\tstate: PluginStateSnapshotV1,\n): PluginManagerSnapshotV1 {\n\tconst identities = new Map<\n\t\tstring,\n\t\t{ readonly pluginId: string; readonly pluginVersion: string; readonly signed: boolean }\n\t>();\n\tfor (const entry of registry.entries) {\n\t\tidentities.set(`${entry.pluginId}@${entry.pluginVersion}`, entry);\n\t}\n\t// Source/digest/platform-rejected manifests are intentionally visible as\n\t// unavailable so the host UI can explain why an installed catalog item\n\t// cannot be enabled. Their source, reason and package bytes stay host-only.\n\tfor (const rejection of registry.rejected) {\n\t\tconst identity = `${rejection.pluginId}@${rejection.pluginVersion}`;\n\t\tif (!identities.has(identity)) {\n\t\t\tidentities.set(identity, {\n\t\t\t\tpluginId: rejection.pluginId,\n\t\t\t\tpluginVersion: rejection.pluginVersion,\n\t\t\t\tsigned: false,\n\t\t\t});\n\t\t}\n\t}\n\tconst entries = [...identities.values()]\n\t\t.map((entry) => {\n\t\t\tconst installed = activeRecord(state, entry.pluginId);\n\t\t\tconst diagnostics = rejectionCodes(registry, entry.pluginId, entry.pluginVersion);\n\t\t\tconst unavailable =\n\t\t\t\tdiagnostics.length > 0 ||\n\t\t\t\t!registry.verified.some(\n\t\t\t\t\t(candidate) => candidate.pluginId === entry.pluginId && candidate.pluginVersion === entry.pluginVersion,\n\t\t\t\t);\n\t\t\tconst isInstalled = installed?.pluginVersion === entry.pluginVersion;\n\t\t\treturn Object.freeze({\n\t\t\t\tpluginId: entry.pluginId,\n\t\t\t\tpluginVersion: entry.pluginVersion,\n\t\t\t\tstatus: unavailable\n\t\t\t\t\t? (\"unavailable\" as const)\n\t\t\t\t\t: isInstalled\n\t\t\t\t\t\t? (\"installed\" as const)\n\t\t\t\t\t\t: installed === undefined\n\t\t\t\t\t\t\t? (\"available\" as const)\n\t\t\t\t\t\t\t: (\"update-available\" as const),\n\t\t\t\tsigned: entry.signed,\n\t\t\t\t...(installed === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { installedVersion: installed.pluginVersion, lifecycle: installed.state.lifecycle }),\n\t\t\t\tdiagnosticCodes: diagnostics,\n\t\t\t});\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tconst idOrder = left.pluginId.localeCompare(right.pluginId);\n\t\t\treturn idOrder === 0 ? comparePluginVersionsV1(right.pluginVersion, left.pluginVersion) : idOrder;\n\t\t});\n\tconst boundedEntries = Object.freeze(entries.slice(0, MAX_MANAGER_ENTRIES_V1));\n\treturn Object.freeze({\n\t\tversion: 1,\n\t\tregistrySource: registry.source,\n\t\tstateStatus,\n\t\tentries: boundedEntries,\n\t\ttruncated: entries.length > boundedEntries.length,\n\t});\n}\n\nfunction stateResult(\n\tresult: PluginStateReadResultV1,\n): { readonly status: \"ok\" | \"missing\"; readonly snapshot: PluginStateSnapshotV1 } | undefined {\n\tif (result.status === \"ok\" || result.status === \"missing\") {\n\t\treturn { status: result.status, snapshot: result.snapshot };\n\t}\n\treturn undefined;\n}\n\nfunction responseCode(response: PluginEcosystemCliResponseV1): PluginManagerControllerErrorCodeV1 {\n\tif (response.status === \"unsupported\") return \"manager-operation-unsupported\";\n\tif (response.status === \"cancelled\") return \"manager-operation-cancelled\";\n\treturn \"manager-operation-failed\";\n}\n\n/**\n * Host-owned installation/update surface. The UI sees only bounded entries\n * and stable operation status; registry sources, installers, paths, package\n * bytes, signatures and credentials never cross this boundary.\n */\nexport function createPluginManagerControllerV1(options: {\n\treadonly registry: PluginRegistryV1;\n\treadonly stateStore: PluginStateStoreV1;\n\treadonly cli: PluginEcosystemCliV1;\n}): PluginManagerControllerV1 {\n\tconst getSnapshot = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<PluginManagerSnapshotResultV1> => {\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet registry: PluginRegistrySnapshotV1;\n\t\ttry {\n\t\t\tregistry = await options.registry.list({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"registry-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet state: PluginStateReadResultV1;\n\t\ttry {\n\t\t\tstate = await options.stateStore.read({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"state-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tconst checkedState = stateResult(state);\n\t\tif (checkedState === undefined)\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tcode: state.status === \"cancelled\" ? \"cancelled\" : \"state-invalid\",\n\t\t\t};\n\t\treturn {\n\t\t\tstatus: \"ok\",\n\t\t\tsnapshot: makeSnapshot(registry, checkedState.status, checkedState.snapshot),\n\t\t};\n\t};\n\n\tconst run = async (input: {\n\t\treadonly command: \"install\" | \"update\" | \"remove\";\n\t\treadonly pluginId: string;\n\t\treadonly pluginVersion?: string;\n\t\treadonly confirmed: boolean;\n\t\treadonly signal?: AbortSignal;\n\t}): Promise<PluginManagerMutationResultV1> => {\n\t\ttry {\n\t\t\tboundedId(input.pluginId, \"plugin ID\");\n\t\t\tif (input.pluginVersion !== undefined) boundedId(input.pluginVersion, \"plugin version\");\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (!input.confirmed) return { status: \"needs_confirmation\", code: \"confirmation-required\" };\n\t\tif (signalAborted(input.signal)) return { status: \"cancelled\", code: \"cancelled\" };\n\t\tlet response: PluginEcosystemCliResponseV1;\n\t\ttry {\n\t\t\tconst identity =\n\t\t\t\tinput.pluginVersion === undefined ? input.pluginId : `${input.pluginId}@${input.pluginVersion}`;\n\t\t\tresponse = await options.cli.execute({\n\t\t\t\targv: [input.command, identity, \"--json\"],\n\t\t\t\tsignal: input.signal,\n\t\t\t});\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (response.status !== \"succeeded\") {\n\t\t\treturn {\n\t\t\t\tstatus:\n\t\t\t\t\tresponse.status === \"unsupported\"\n\t\t\t\t\t\t? \"unsupported\"\n\t\t\t\t\t\t: response.status === \"cancelled\"\n\t\t\t\t\t\t\t? \"cancelled\"\n\t\t\t\t\t\t\t: \"failed\",\n\t\t\t\tcode: responseCode(response),\n\t\t\t};\n\t\t}\n\t\tconst refreshed = await getSnapshot({ signal: input.signal });\n\t\treturn refreshed.status === \"ok\"\n\t\t\t? { status: \"succeeded\", snapshot: refreshed.snapshot }\n\t\t\t: { status: \"succeeded\" };\n\t};\n\n\treturn Object.freeze({\n\t\tgetSnapshot,\n\t\tinstall: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"install\" }),\n\t\tupdate: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"update\" }),\n\t\tremove: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"remove\" }),\n\t});\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t } from "../core/i18n/index.js";
|
|
1
2
|
import { comparePluginVersionsV1 } from "../plugins/ecosystem/catalog.js";
|
|
2
3
|
const MAX_MANAGER_ENTRIES_V1 = 128;
|
|
3
4
|
const MAX_MANAGER_DIAGNOSTICS_V1 = 8;
|
|
@@ -7,7 +8,7 @@ function boundedId(value, label) {
|
|
|
7
8
|
value.trim() === "" ||
|
|
8
9
|
value.length > MAX_MANAGER_ID_CHARS_V1 ||
|
|
9
10
|
/[\u0000-\u001f\s]/u.test(value))
|
|
10
|
-
throw new Error(
|
|
11
|
+
throw new Error(t("{label} is invalid", { label }));
|
|
11
12
|
return value;
|
|
12
13
|
}
|
|
13
14
|
function signalAborted(signal) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-manager-controller.js","sourceRoot":"","sources":["../../src/cli/plugin-manager-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { comparePluginVersionsV1 } from \"../plugins/ecosystem/catalog.ts\";\nimport type { PluginEcosystemCliResponseV1, PluginEcosystemCliV1 } from \"../plugins/ecosystem/cli.ts\";\nimport type { PluginRegistrySnapshotV1, PluginRegistryV1 } from \"../plugins/ecosystem/registry.ts\";\nimport type {\n\tPluginStateReadResultV1,\n\tPluginStateRecordV1,\n\tPluginStateSnapshotV1,\n\tPluginStateStoreV1,\n} from \"../plugins/ecosystem/state.ts\";\n\nconst MAX_MANAGER_ENTRIES_V1 = 128;\nconst MAX_MANAGER_DIAGNOSTICS_V1 = 8;\nconst MAX_MANAGER_ID_CHARS_V1 = 256;\n\nexport type PluginManagerEntryStatusV1 = \"available\" | \"installed\" | \"update-available\" | \"unavailable\";\n\nexport interface PluginManagerEntryV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly status: PluginManagerEntryStatusV1;\n\treadonly signed: boolean;\n\treadonly installedVersion?: string;\n\treadonly lifecycle?: PluginStateRecordV1[\"state\"][\"lifecycle\"];\n\treadonly diagnosticCodes: readonly string[];\n}\n\nexport interface PluginManagerSnapshotV1 {\n\treadonly version: 1;\n\treadonly registrySource: string;\n\treadonly stateStatus: \"ok\" | \"missing\";\n\treadonly entries: readonly PluginManagerEntryV1[];\n\treadonly truncated: boolean;\n}\n\nexport type PluginManagerControllerErrorCodeV1 =\n\t| \"cancelled\"\n\t| \"registry-unavailable\"\n\t| \"state-invalid\"\n\t| \"state-unavailable\"\n\t| \"manager-operation-failed\"\n\t| \"manager-operation-unsupported\"\n\t| \"manager-operation-cancelled\"\n\t| \"confirmation-required\";\n\nexport type PluginManagerSnapshotResultV1 =\n\t| { readonly status: \"ok\"; readonly snapshot: PluginManagerSnapshotV1 }\n\t| { readonly status: \"error\"; readonly code: PluginManagerControllerErrorCodeV1 };\n\nexport type PluginManagerMutationStatusV1 = \"succeeded\" | \"failed\" | \"unsupported\" | \"cancelled\" | \"needs_confirmation\";\n\nexport interface PluginManagerMutationResultV1 {\n\treadonly status: PluginManagerMutationStatusV1;\n\treadonly code?: PluginManagerControllerErrorCodeV1;\n\treadonly snapshot?: PluginManagerSnapshotV1;\n}\n\nexport interface PluginManagerControllerV1 {\n\treadonly getSnapshot: (input?: { readonly signal?: AbortSignal }) => Promise<PluginManagerSnapshotResultV1>;\n\treadonly install: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly update: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly remove: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n}\n\nexport interface PluginManagerMutationInputV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion?: string;\n\treadonly confirmed: boolean;\n\treadonly signal?: AbortSignal;\n}\n\nfunction boundedId(value: string, label: string): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.trim() === \"\" ||\n\t\tvalue.length > MAX_MANAGER_ID_CHARS_V1 ||\n\t\t/[\\u0000-\\u001f\\s]/u.test(value)\n\t)\n\t\tthrow new Error(`${label} is invalid`);\n\treturn value;\n}\n\nfunction signalAborted(signal: AbortSignal | undefined): boolean {\n\treturn signal?.aborted === true;\n}\n\nfunction rejectionCodes(\n\tregistry: PluginRegistrySnapshotV1,\n\tpluginId: string,\n\tpluginVersion: string,\n): readonly string[] {\n\treturn Object.freeze(\n\t\tregistry.rejected\n\t\t\t.filter((entry) => entry.pluginId === pluginId && entry.pluginVersion === pluginVersion)\n\t\t\t.slice(0, MAX_MANAGER_DIAGNOSTICS_V1)\n\t\t\t.map((entry) => entry.code),\n\t);\n}\n\nfunction activeRecord(state: PluginStateSnapshotV1, pluginId: string): PluginStateRecordV1 | undefined {\n\treturn state.records\n\t\t.filter((record) => record.pluginId === pluginId && record.state.lifecycle === \"active\")\n\t\t.sort((left, right) => comparePluginVersionsV1(right.pluginVersion, left.pluginVersion))[0];\n}\n\nfunction makeSnapshot(\n\tregistry: PluginRegistrySnapshotV1,\n\tstateStatus: \"ok\" | \"missing\",\n\tstate: PluginStateSnapshotV1,\n): PluginManagerSnapshotV1 {\n\tconst identities = new Map<\n\t\tstring,\n\t\t{ readonly pluginId: string; readonly pluginVersion: string; readonly signed: boolean }\n\t>();\n\tfor (const entry of registry.entries) {\n\t\tidentities.set(`${entry.pluginId}@${entry.pluginVersion}`, entry);\n\t}\n\t// Source/digest/platform-rejected manifests are intentionally visible as\n\t// unavailable so the host UI can explain why an installed catalog item\n\t// cannot be enabled. Their source, reason and package bytes stay host-only.\n\tfor (const rejection of registry.rejected) {\n\t\tconst identity = `${rejection.pluginId}@${rejection.pluginVersion}`;\n\t\tif (!identities.has(identity)) {\n\t\t\tidentities.set(identity, {\n\t\t\t\tpluginId: rejection.pluginId,\n\t\t\t\tpluginVersion: rejection.pluginVersion,\n\t\t\t\tsigned: false,\n\t\t\t});\n\t\t}\n\t}\n\tconst entries = [...identities.values()]\n\t\t.map((entry) => {\n\t\t\tconst installed = activeRecord(state, entry.pluginId);\n\t\t\tconst diagnostics = rejectionCodes(registry, entry.pluginId, entry.pluginVersion);\n\t\t\tconst unavailable =\n\t\t\t\tdiagnostics.length > 0 ||\n\t\t\t\t!registry.verified.some(\n\t\t\t\t\t(candidate) => candidate.pluginId === entry.pluginId && candidate.pluginVersion === entry.pluginVersion,\n\t\t\t\t);\n\t\t\tconst isInstalled = installed?.pluginVersion === entry.pluginVersion;\n\t\t\treturn Object.freeze({\n\t\t\t\tpluginId: entry.pluginId,\n\t\t\t\tpluginVersion: entry.pluginVersion,\n\t\t\t\tstatus: unavailable\n\t\t\t\t\t? (\"unavailable\" as const)\n\t\t\t\t\t: isInstalled\n\t\t\t\t\t\t? (\"installed\" as const)\n\t\t\t\t\t\t: installed === undefined\n\t\t\t\t\t\t\t? (\"available\" as const)\n\t\t\t\t\t\t\t: (\"update-available\" as const),\n\t\t\t\tsigned: entry.signed,\n\t\t\t\t...(installed === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { installedVersion: installed.pluginVersion, lifecycle: installed.state.lifecycle }),\n\t\t\t\tdiagnosticCodes: diagnostics,\n\t\t\t});\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tconst idOrder = left.pluginId.localeCompare(right.pluginId);\n\t\t\treturn idOrder === 0 ? comparePluginVersionsV1(right.pluginVersion, left.pluginVersion) : idOrder;\n\t\t});\n\tconst boundedEntries = Object.freeze(entries.slice(0, MAX_MANAGER_ENTRIES_V1));\n\treturn Object.freeze({\n\t\tversion: 1,\n\t\tregistrySource: registry.source,\n\t\tstateStatus,\n\t\tentries: boundedEntries,\n\t\ttruncated: entries.length > boundedEntries.length,\n\t});\n}\n\nfunction stateResult(\n\tresult: PluginStateReadResultV1,\n): { readonly status: \"ok\" | \"missing\"; readonly snapshot: PluginStateSnapshotV1 } | undefined {\n\tif (result.status === \"ok\" || result.status === \"missing\") {\n\t\treturn { status: result.status, snapshot: result.snapshot };\n\t}\n\treturn undefined;\n}\n\nfunction responseCode(response: PluginEcosystemCliResponseV1): PluginManagerControllerErrorCodeV1 {\n\tif (response.status === \"unsupported\") return \"manager-operation-unsupported\";\n\tif (response.status === \"cancelled\") return \"manager-operation-cancelled\";\n\treturn \"manager-operation-failed\";\n}\n\n/**\n * Host-owned installation/update surface. The UI sees only bounded entries\n * and stable operation status; registry sources, installers, paths, package\n * bytes, signatures and credentials never cross this boundary.\n */\nexport function createPluginManagerControllerV1(options: {\n\treadonly registry: PluginRegistryV1;\n\treadonly stateStore: PluginStateStoreV1;\n\treadonly cli: PluginEcosystemCliV1;\n}): PluginManagerControllerV1 {\n\tconst getSnapshot = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<PluginManagerSnapshotResultV1> => {\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet registry: PluginRegistrySnapshotV1;\n\t\ttry {\n\t\t\tregistry = await options.registry.list({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"registry-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet state: PluginStateReadResultV1;\n\t\ttry {\n\t\t\tstate = await options.stateStore.read({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"state-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tconst checkedState = stateResult(state);\n\t\tif (checkedState === undefined)\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tcode: state.status === \"cancelled\" ? \"cancelled\" : \"state-invalid\",\n\t\t\t};\n\t\treturn {\n\t\t\tstatus: \"ok\",\n\t\t\tsnapshot: makeSnapshot(registry, checkedState.status, checkedState.snapshot),\n\t\t};\n\t};\n\n\tconst run = async (input: {\n\t\treadonly command: \"install\" | \"update\" | \"remove\";\n\t\treadonly pluginId: string;\n\t\treadonly pluginVersion?: string;\n\t\treadonly confirmed: boolean;\n\t\treadonly signal?: AbortSignal;\n\t}): Promise<PluginManagerMutationResultV1> => {\n\t\ttry {\n\t\t\tboundedId(input.pluginId, \"plugin ID\");\n\t\t\tif (input.pluginVersion !== undefined) boundedId(input.pluginVersion, \"plugin version\");\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (!input.confirmed) return { status: \"needs_confirmation\", code: \"confirmation-required\" };\n\t\tif (signalAborted(input.signal)) return { status: \"cancelled\", code: \"cancelled\" };\n\t\tlet response: PluginEcosystemCliResponseV1;\n\t\ttry {\n\t\t\tconst identity =\n\t\t\t\tinput.pluginVersion === undefined ? input.pluginId : `${input.pluginId}@${input.pluginVersion}`;\n\t\t\tresponse = await options.cli.execute({\n\t\t\t\targv: [input.command, identity, \"--json\"],\n\t\t\t\tsignal: input.signal,\n\t\t\t});\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (response.status !== \"succeeded\") {\n\t\t\treturn {\n\t\t\t\tstatus:\n\t\t\t\t\tresponse.status === \"unsupported\"\n\t\t\t\t\t\t? \"unsupported\"\n\t\t\t\t\t\t: response.status === \"cancelled\"\n\t\t\t\t\t\t\t? \"cancelled\"\n\t\t\t\t\t\t\t: \"failed\",\n\t\t\t\tcode: responseCode(response),\n\t\t\t};\n\t\t}\n\t\tconst refreshed = await getSnapshot({ signal: input.signal });\n\t\treturn refreshed.status === \"ok\"\n\t\t\t? { status: \"succeeded\", snapshot: refreshed.snapshot }\n\t\t\t: { status: \"succeeded\" };\n\t};\n\n\treturn Object.freeze({\n\t\tgetSnapshot,\n\t\tinstall: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"install\" }),\n\t\tupdate: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"update\" }),\n\t\tremove: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"remove\" }),\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"plugin-manager-controller.js","sourceRoot":"","sources":["../../src/cli/plugin-manager-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { t } from \"../core/i18n/index.ts\";\nimport { comparePluginVersionsV1 } from \"../plugins/ecosystem/catalog.ts\";\nimport type { PluginEcosystemCliResponseV1, PluginEcosystemCliV1 } from \"../plugins/ecosystem/cli.ts\";\nimport type { PluginRegistrySnapshotV1, PluginRegistryV1 } from \"../plugins/ecosystem/registry.ts\";\nimport type {\n\tPluginStateReadResultV1,\n\tPluginStateRecordV1,\n\tPluginStateSnapshotV1,\n\tPluginStateStoreV1,\n} from \"../plugins/ecosystem/state.ts\";\n\nconst MAX_MANAGER_ENTRIES_V1 = 128;\nconst MAX_MANAGER_DIAGNOSTICS_V1 = 8;\nconst MAX_MANAGER_ID_CHARS_V1 = 256;\n\nexport type PluginManagerEntryStatusV1 = \"available\" | \"installed\" | \"update-available\" | \"unavailable\";\n\nexport interface PluginManagerEntryV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion: string;\n\treadonly status: PluginManagerEntryStatusV1;\n\treadonly signed: boolean;\n\treadonly installedVersion?: string;\n\treadonly lifecycle?: PluginStateRecordV1[\"state\"][\"lifecycle\"];\n\treadonly diagnosticCodes: readonly string[];\n}\n\nexport interface PluginManagerSnapshotV1 {\n\treadonly version: 1;\n\treadonly registrySource: string;\n\treadonly stateStatus: \"ok\" | \"missing\";\n\treadonly entries: readonly PluginManagerEntryV1[];\n\treadonly truncated: boolean;\n}\n\nexport type PluginManagerControllerErrorCodeV1 =\n\t| \"cancelled\"\n\t| \"registry-unavailable\"\n\t| \"state-invalid\"\n\t| \"state-unavailable\"\n\t| \"manager-operation-failed\"\n\t| \"manager-operation-unsupported\"\n\t| \"manager-operation-cancelled\"\n\t| \"confirmation-required\";\n\nexport type PluginManagerSnapshotResultV1 =\n\t| { readonly status: \"ok\"; readonly snapshot: PluginManagerSnapshotV1 }\n\t| { readonly status: \"error\"; readonly code: PluginManagerControllerErrorCodeV1 };\n\nexport type PluginManagerMutationStatusV1 = \"succeeded\" | \"failed\" | \"unsupported\" | \"cancelled\" | \"needs_confirmation\";\n\nexport interface PluginManagerMutationResultV1 {\n\treadonly status: PluginManagerMutationStatusV1;\n\treadonly code?: PluginManagerControllerErrorCodeV1;\n\treadonly snapshot?: PluginManagerSnapshotV1;\n}\n\nexport interface PluginManagerControllerV1 {\n\treadonly getSnapshot: (input?: { readonly signal?: AbortSignal }) => Promise<PluginManagerSnapshotResultV1>;\n\treadonly install: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly update: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n\treadonly remove: (input: PluginManagerMutationInputV1) => Promise<PluginManagerMutationResultV1>;\n}\n\nexport interface PluginManagerMutationInputV1 {\n\treadonly pluginId: string;\n\treadonly pluginVersion?: string;\n\treadonly confirmed: boolean;\n\treadonly signal?: AbortSignal;\n}\n\nfunction boundedId(value: string, label: string): string {\n\tif (\n\t\ttypeof value !== \"string\" ||\n\t\tvalue.trim() === \"\" ||\n\t\tvalue.length > MAX_MANAGER_ID_CHARS_V1 ||\n\t\t/[\\u0000-\\u001f\\s]/u.test(value)\n\t)\n\t\tthrow new Error(t(\"{label} is invalid\", { label }));\n\treturn value;\n}\n\nfunction signalAborted(signal: AbortSignal | undefined): boolean {\n\treturn signal?.aborted === true;\n}\n\nfunction rejectionCodes(\n\tregistry: PluginRegistrySnapshotV1,\n\tpluginId: string,\n\tpluginVersion: string,\n): readonly string[] {\n\treturn Object.freeze(\n\t\tregistry.rejected\n\t\t\t.filter((entry) => entry.pluginId === pluginId && entry.pluginVersion === pluginVersion)\n\t\t\t.slice(0, MAX_MANAGER_DIAGNOSTICS_V1)\n\t\t\t.map((entry) => entry.code),\n\t);\n}\n\nfunction activeRecord(state: PluginStateSnapshotV1, pluginId: string): PluginStateRecordV1 | undefined {\n\treturn state.records\n\t\t.filter((record) => record.pluginId === pluginId && record.state.lifecycle === \"active\")\n\t\t.sort((left, right) => comparePluginVersionsV1(right.pluginVersion, left.pluginVersion))[0];\n}\n\nfunction makeSnapshot(\n\tregistry: PluginRegistrySnapshotV1,\n\tstateStatus: \"ok\" | \"missing\",\n\tstate: PluginStateSnapshotV1,\n): PluginManagerSnapshotV1 {\n\tconst identities = new Map<\n\t\tstring,\n\t\t{ readonly pluginId: string; readonly pluginVersion: string; readonly signed: boolean }\n\t>();\n\tfor (const entry of registry.entries) {\n\t\tidentities.set(`${entry.pluginId}@${entry.pluginVersion}`, entry);\n\t}\n\t// Source/digest/platform-rejected manifests are intentionally visible as\n\t// unavailable so the host UI can explain why an installed catalog item\n\t// cannot be enabled. Their source, reason and package bytes stay host-only.\n\tfor (const rejection of registry.rejected) {\n\t\tconst identity = `${rejection.pluginId}@${rejection.pluginVersion}`;\n\t\tif (!identities.has(identity)) {\n\t\t\tidentities.set(identity, {\n\t\t\t\tpluginId: rejection.pluginId,\n\t\t\t\tpluginVersion: rejection.pluginVersion,\n\t\t\t\tsigned: false,\n\t\t\t});\n\t\t}\n\t}\n\tconst entries = [...identities.values()]\n\t\t.map((entry) => {\n\t\t\tconst installed = activeRecord(state, entry.pluginId);\n\t\t\tconst diagnostics = rejectionCodes(registry, entry.pluginId, entry.pluginVersion);\n\t\t\tconst unavailable =\n\t\t\t\tdiagnostics.length > 0 ||\n\t\t\t\t!registry.verified.some(\n\t\t\t\t\t(candidate) => candidate.pluginId === entry.pluginId && candidate.pluginVersion === entry.pluginVersion,\n\t\t\t\t);\n\t\t\tconst isInstalled = installed?.pluginVersion === entry.pluginVersion;\n\t\t\treturn Object.freeze({\n\t\t\t\tpluginId: entry.pluginId,\n\t\t\t\tpluginVersion: entry.pluginVersion,\n\t\t\t\tstatus: unavailable\n\t\t\t\t\t? (\"unavailable\" as const)\n\t\t\t\t\t: isInstalled\n\t\t\t\t\t\t? (\"installed\" as const)\n\t\t\t\t\t\t: installed === undefined\n\t\t\t\t\t\t\t? (\"available\" as const)\n\t\t\t\t\t\t\t: (\"update-available\" as const),\n\t\t\t\tsigned: entry.signed,\n\t\t\t\t...(installed === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { installedVersion: installed.pluginVersion, lifecycle: installed.state.lifecycle }),\n\t\t\t\tdiagnosticCodes: diagnostics,\n\t\t\t});\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tconst idOrder = left.pluginId.localeCompare(right.pluginId);\n\t\t\treturn idOrder === 0 ? comparePluginVersionsV1(right.pluginVersion, left.pluginVersion) : idOrder;\n\t\t});\n\tconst boundedEntries = Object.freeze(entries.slice(0, MAX_MANAGER_ENTRIES_V1));\n\treturn Object.freeze({\n\t\tversion: 1,\n\t\tregistrySource: registry.source,\n\t\tstateStatus,\n\t\tentries: boundedEntries,\n\t\ttruncated: entries.length > boundedEntries.length,\n\t});\n}\n\nfunction stateResult(\n\tresult: PluginStateReadResultV1,\n): { readonly status: \"ok\" | \"missing\"; readonly snapshot: PluginStateSnapshotV1 } | undefined {\n\tif (result.status === \"ok\" || result.status === \"missing\") {\n\t\treturn { status: result.status, snapshot: result.snapshot };\n\t}\n\treturn undefined;\n}\n\nfunction responseCode(response: PluginEcosystemCliResponseV1): PluginManagerControllerErrorCodeV1 {\n\tif (response.status === \"unsupported\") return \"manager-operation-unsupported\";\n\tif (response.status === \"cancelled\") return \"manager-operation-cancelled\";\n\treturn \"manager-operation-failed\";\n}\n\n/**\n * Host-owned installation/update surface. The UI sees only bounded entries\n * and stable operation status; registry sources, installers, paths, package\n * bytes, signatures and credentials never cross this boundary.\n */\nexport function createPluginManagerControllerV1(options: {\n\treadonly registry: PluginRegistryV1;\n\treadonly stateStore: PluginStateStoreV1;\n\treadonly cli: PluginEcosystemCliV1;\n}): PluginManagerControllerV1 {\n\tconst getSnapshot = async (\n\t\tinput: { readonly signal?: AbortSignal } = {},\n\t): Promise<PluginManagerSnapshotResultV1> => {\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet registry: PluginRegistrySnapshotV1;\n\t\ttry {\n\t\t\tregistry = await options.registry.list({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"registry-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tlet state: PluginStateReadResultV1;\n\t\ttry {\n\t\t\tstate = await options.stateStore.read({ signal: input.signal });\n\t\t} catch {\n\t\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\t\treturn { status: \"error\", code: \"state-unavailable\" };\n\t\t}\n\t\tif (signalAborted(input.signal)) return { status: \"error\", code: \"cancelled\" };\n\t\tconst checkedState = stateResult(state);\n\t\tif (checkedState === undefined)\n\t\t\treturn {\n\t\t\t\tstatus: \"error\",\n\t\t\t\tcode: state.status === \"cancelled\" ? \"cancelled\" : \"state-invalid\",\n\t\t\t};\n\t\treturn {\n\t\t\tstatus: \"ok\",\n\t\t\tsnapshot: makeSnapshot(registry, checkedState.status, checkedState.snapshot),\n\t\t};\n\t};\n\n\tconst run = async (input: {\n\t\treadonly command: \"install\" | \"update\" | \"remove\";\n\t\treadonly pluginId: string;\n\t\treadonly pluginVersion?: string;\n\t\treadonly confirmed: boolean;\n\t\treadonly signal?: AbortSignal;\n\t}): Promise<PluginManagerMutationResultV1> => {\n\t\ttry {\n\t\t\tboundedId(input.pluginId, \"plugin ID\");\n\t\t\tif (input.pluginVersion !== undefined) boundedId(input.pluginVersion, \"plugin version\");\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (!input.confirmed) return { status: \"needs_confirmation\", code: \"confirmation-required\" };\n\t\tif (signalAborted(input.signal)) return { status: \"cancelled\", code: \"cancelled\" };\n\t\tlet response: PluginEcosystemCliResponseV1;\n\t\ttry {\n\t\t\tconst identity =\n\t\t\t\tinput.pluginVersion === undefined ? input.pluginId : `${input.pluginId}@${input.pluginVersion}`;\n\t\t\tresponse = await options.cli.execute({\n\t\t\t\targv: [input.command, identity, \"--json\"],\n\t\t\t\tsignal: input.signal,\n\t\t\t});\n\t\t} catch {\n\t\t\treturn { status: \"failed\", code: \"manager-operation-failed\" };\n\t\t}\n\t\tif (response.status !== \"succeeded\") {\n\t\t\treturn {\n\t\t\t\tstatus:\n\t\t\t\t\tresponse.status === \"unsupported\"\n\t\t\t\t\t\t? \"unsupported\"\n\t\t\t\t\t\t: response.status === \"cancelled\"\n\t\t\t\t\t\t\t? \"cancelled\"\n\t\t\t\t\t\t\t: \"failed\",\n\t\t\t\tcode: responseCode(response),\n\t\t\t};\n\t\t}\n\t\tconst refreshed = await getSnapshot({ signal: input.signal });\n\t\treturn refreshed.status === \"ok\"\n\t\t\t? { status: \"succeeded\", snapshot: refreshed.snapshot }\n\t\t\t: { status: \"succeeded\" };\n\t};\n\n\treturn Object.freeze({\n\t\tgetSnapshot,\n\t\tinstall: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"install\" }),\n\t\tupdate: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"update\" }),\n\t\tremove: (input: PluginManagerMutationInputV1) => run({ ...input, command: \"remove\" }),\n\t});\n}\n"]}
|