cordisx 0.1.0-beta.21 → 0.1.0-beta.23
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/THIRD_PARTY_NOTICES.md +10 -0
- package/dist/assets/launcher/native-app-server-intermediary.mjs +4 -0
- package/dist/assets/model-brands/aws-bedrock.svg +12 -0
- package/dist/assets/model-brands/azure-foundry.svg +1 -0
- package/dist/assets/model-brands/azure-openai.svg +1 -0
- package/dist/assets/model-brands/cerebras.png +0 -0
- package/dist/assets/model-brands/claude.svg +1 -0
- package/dist/assets/model-brands/dashscope.svg +45 -0
- package/dist/assets/model-brands/deepseek.svg +3 -0
- package/dist/assets/model-brands/fireworks.svg +5 -0
- package/dist/assets/model-brands/gemini.png +0 -0
- package/dist/assets/model-brands/google-vertex.svg +25 -0
- package/dist/assets/model-brands/huggingface.svg +8 -0
- package/dist/assets/model-brands/kimi-dark.svg +5 -0
- package/dist/assets/model-brands/kimi-light.svg +5 -0
- package/dist/assets/model-brands/minimax-dark.svg +1 -0
- package/dist/assets/model-brands/minimax-light.svg +1 -0
- package/dist/assets/model-brands/moonshot-dark.svg +1 -0
- package/dist/assets/model-brands/moonshot-light.svg +1 -0
- package/dist/assets/model-brands/openai.svg +1 -0
- package/dist/assets/model-brands/opencode-dark.svg +18 -0
- package/dist/assets/model-brands/opencode-light.svg +18 -0
- package/dist/assets/model-brands/openrouter-dark.svg +3 -0
- package/dist/assets/model-brands/openrouter-light.svg +3 -0
- package/dist/assets/model-brands/siliconflow.png +0 -0
- package/dist/assets/model-brands/together.svg +21 -0
- package/dist/assets/model-brands/xai-dark.svg +19 -0
- package/dist/assets/model-brands/xai-light.svg +19 -0
- package/dist/assets/model-brands/zai-dark.svg +35 -0
- package/dist/assets/model-brands/zai-light.svg +35 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/README.md +68 -33
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/README.zh-Hans.md +59 -25
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/THIRD_PARTY_NOTICES.md +6 -2
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/config/cli-proxy-api.yaml +7 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/cordisx-package.json +2 -2
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/extensions.mjs +427 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/gateway.mjs +600 -56
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/service.mjs +426 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/types/service/extension-context.d.ts +2 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/types/service/extension-registry.d.ts +163 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/types/service/gateway-definition.d.ts +7 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/types/service/gateway.d.ts +4 -1
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/dist/types/service/index.d.ts +1 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/package.json +10 -3
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/runtime/cli-proxy-plugins/darwin/arm64/cordisx-gateway-bridge.dylib +0 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/runtime/cli-proxy-plugins/linux/x64/cordisx-gateway-bridge.so +0 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/runtime-manifest.json +44 -2
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/schemas/cli-proxy-gateway-adapter.v1.schema.json +94 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/schemas/cli-proxy-gateway-connection.v1.schema.json +66 -0
- package/dist/bundled-plugins/@cordisx/plugin-cli-proxy-api/schemas/cli-proxy-gateway-extension-plan.v1.schema.json +71 -0
- package/dist/shortcut-presentation.js +19 -2
- package/dist/src/app-launcher/install.test.d.ts +2 -0
- package/dist/src/app-launcher/install.test.d.ts.map +1 -0
- package/dist/src/app-launcher/install.test.js +204 -0
- package/dist/src/app-launcher/install.test.js.map +1 -0
- package/dist/src/app-launcher/model.d.ts +23 -0
- package/dist/src/app-launcher/model.d.ts.map +1 -0
- package/dist/src/app-launcher/model.js +18 -0
- package/dist/src/app-launcher/model.js.map +1 -0
- package/dist/src/app-launcher/postinstall.d.ts +12 -0
- package/dist/src/app-launcher/postinstall.d.ts.map +1 -0
- package/dist/src/app-launcher/postinstall.js +39 -0
- package/dist/src/app-launcher/postinstall.js.map +1 -0
- package/dist/src/app-launcher/runtime-install.d.ts +16 -0
- package/dist/src/app-launcher/runtime-install.d.ts.map +1 -0
- package/dist/src/app-launcher/runtime-install.js +276 -0
- package/dist/src/app-launcher/runtime-install.js.map +1 -0
- package/dist/src/app-launcher/runtime.test.d.ts +2 -0
- package/dist/src/app-launcher/runtime.test.d.ts.map +1 -0
- package/dist/src/app-launcher/runtime.test.js +106 -0
- package/dist/src/app-launcher/runtime.test.js.map +1 -0
- package/dist/src/cli/activate-owned-host.d.ts +10 -0
- package/dist/src/cli/activate-owned-host.d.ts.map +1 -0
- package/dist/src/cli/activate-owned-host.js +29 -0
- package/dist/src/cli/activate-owned-host.js.map +1 -0
- package/dist/src/cli/app-command.d.ts +19 -0
- package/dist/src/cli/app-command.d.ts.map +1 -0
- package/dist/src/cli/app-command.js +246 -0
- package/dist/src/cli/app-command.js.map +1 -0
- package/dist/src/cli/app-entry.d.ts +13 -0
- package/dist/src/cli/app-entry.d.ts.map +1 -0
- package/dist/src/cli/app-entry.js +105 -0
- package/dist/src/cli/app-entry.js.map +1 -0
- package/dist/src/cli/help.d.ts +2 -0
- package/dist/src/cli/help.d.ts.map +1 -0
- package/dist/src/cli/help.js +30 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/host-lifecycle.d.ts +38 -0
- package/dist/src/cli/host-lifecycle.d.ts.map +1 -0
- package/dist/src/cli/host-lifecycle.js +57 -0
- package/dist/src/cli/host-lifecycle.js.map +1 -0
- package/dist/src/cli/native-submission-catalog-options.d.ts +17 -0
- package/dist/src/cli/native-submission-catalog-options.d.ts.map +1 -0
- package/dist/src/cli/native-submission-catalog-options.js +17 -0
- package/dist/src/cli/native-submission-catalog-options.js.map +1 -0
- package/dist/src/cli/parse.d.ts +6 -2
- package/dist/src/cli/parse.d.ts.map +1 -1
- package/dist/src/cli/parse.js +11 -4
- package/dist/src/cli/parse.js.map +1 -1
- package/dist/src/cli/production-host-bootstrap.d.ts +26 -0
- package/dist/src/cli/production-host-bootstrap.d.ts.map +1 -0
- package/dist/src/cli/production-host-bootstrap.js +115 -0
- package/dist/src/cli/production-host-bootstrap.js.map +1 -0
- package/dist/src/cli/production-plugin-management.d.ts +17 -0
- package/dist/src/cli/production-plugin-management.d.ts.map +1 -0
- package/dist/src/cli/production-plugin-management.js +52 -0
- package/dist/src/cli/production-plugin-management.js.map +1 -0
- package/dist/src/cli/renderer-composition.d.ts +2 -0
- package/dist/src/cli/renderer-composition.d.ts.map +1 -1
- package/dist/src/cli/renderer-composition.js +37 -17
- package/dist/src/cli/renderer-composition.js.map +1 -1
- package/dist/src/cli/run-command-dispatch.d.ts.map +1 -1
- package/dist/src/cli/run-command-dispatch.js +18 -2
- package/dist/src/cli/run-command-dispatch.js.map +1 -1
- package/dist/src/cli/run-command.d.ts +1 -16
- package/dist/src/cli/run-command.d.ts.map +1 -1
- package/dist/src/cli/run-command.js +96 -112
- package/dist/src/cli/run-command.js.map +1 -1
- package/dist/src/cli/run-support.d.ts +25 -13
- package/dist/src/cli/run-support.d.ts.map +1 -1
- package/dist/src/cli/run-support.js +86 -77
- package/dist/src/cli/run-support.js.map +1 -1
- package/dist/src/cli/shortcut-entry.d.ts +2 -6
- package/dist/src/cli/shortcut-entry.d.ts.map +1 -1
- package/dist/src/cli/shortcut-entry.js +2 -25
- package/dist/src/cli/shortcut-entry.js.map +1 -1
- package/dist/src/cli/shortcut-presentation-worker.d.ts +25 -0
- package/dist/src/cli/shortcut-presentation-worker.d.ts.map +1 -0
- package/dist/src/cli/shortcut-presentation-worker.js +125 -0
- package/dist/src/cli/shortcut-presentation-worker.js.map +1 -0
- package/dist/src/cli/startup-gate.d.ts +11 -0
- package/dist/src/cli/startup-gate.d.ts.map +1 -0
- package/dist/src/cli/startup-gate.js +156 -0
- package/dist/src/cli/startup-gate.js.map +1 -0
- package/dist/src/cli/supervisor-command.d.ts +7 -2
- package/dist/src/cli/supervisor-command.d.ts.map +1 -1
- package/dist/src/cli/supervisor-command.js +187 -46
- package/dist/src/cli/supervisor-command.js.map +1 -1
- package/dist/src/cli/supervisor-control.d.ts +1 -1
- package/dist/src/cli/supervisor-control.d.ts.map +1 -1
- package/dist/src/cli/supervisor-control.js +19 -4
- package/dist/src/cli/supervisor-control.js.map +1 -1
- package/dist/src/cli/supervisor-cwd.test.d.ts +2 -0
- package/dist/src/cli/supervisor-cwd.test.d.ts.map +1 -0
- package/dist/src/cli/supervisor-cwd.test.js +101 -0
- package/dist/src/cli/supervisor-cwd.test.js.map +1 -0
- package/dist/src/cli/supervisor-generation.test.d.ts +2 -0
- package/dist/src/cli/supervisor-generation.test.d.ts.map +1 -0
- package/dist/src/cli/supervisor-generation.test.js +91 -0
- package/dist/src/cli/supervisor-generation.test.js.map +1 -0
- package/dist/src/cli/supervisor-runtime.d.ts +6 -3
- package/dist/src/cli/supervisor-runtime.d.ts.map +1 -1
- package/dist/src/cli/supervisor-runtime.js +113 -32
- package/dist/src/cli/supervisor-runtime.js.map +1 -1
- package/dist/src/cli/supervisor-state.d.ts +8 -0
- package/dist/src/cli/supervisor-state.d.ts.map +1 -1
- package/dist/src/cli/supervisor-state.js +22 -33
- package/dist/src/cli/supervisor-state.js.map +1 -1
- package/dist/src/config/home-config-model-catalogs.d.ts +27 -0
- package/dist/src/config/home-config-model-catalogs.d.ts.map +1 -0
- package/dist/src/config/home-config-model-catalogs.js +168 -0
- package/dist/src/config/home-config-model-catalogs.js.map +1 -0
- package/dist/src/config/home-config.d.ts +5 -0
- package/dist/src/config/home-config.d.ts.map +1 -1
- package/dist/src/config/home-config.js +10 -8
- package/dist/src/config/home-config.js.map +1 -1
- package/dist/src/current-user-native-pins.d.ts +6 -0
- package/dist/src/current-user-native-pins.d.ts.map +1 -1
- package/dist/src/current-user-native-pins.js +7 -0
- package/dist/src/current-user-native-pins.js.map +1 -1
- package/dist/src/launcher/bundle.d.ts +4 -0
- package/dist/src/launcher/bundle.d.ts.map +1 -1
- package/dist/src/launcher/bundle.js +25 -0
- package/dist/src/launcher/bundle.js.map +1 -1
- package/dist/src/launcher/cdp-installation-bootstrap.d.ts.map +1 -1
- package/dist/src/launcher/cdp-installation-bootstrap.js +4 -2
- package/dist/src/launcher/cdp-installation-bootstrap.js.map +1 -1
- package/dist/src/launcher/cdp-installation-support.d.ts +3 -22
- package/dist/src/launcher/cdp-installation-support.d.ts.map +1 -1
- package/dist/src/launcher/cdp-installation-support.js +58 -131
- package/dist/src/launcher/cdp-installation-support.js.map +1 -1
- package/dist/src/launcher/cdp-installation.d.ts.map +1 -1
- package/dist/src/launcher/cdp-installation.js +18 -32
- package/dist/src/launcher/cdp-installation.js.map +1 -1
- package/dist/src/launcher/cdp-runtime-bindings.d.ts +4 -0
- package/dist/src/launcher/cdp-runtime-bindings.d.ts.map +1 -0
- package/dist/src/launcher/cdp-runtime-bindings.js +8 -0
- package/dist/src/launcher/cdp-runtime-bindings.js.map +1 -0
- package/dist/src/launcher/cdp.d.ts.map +1 -1
- package/dist/src/launcher/cdp.js +52 -3
- package/dist/src/launcher/cdp.js.map +1 -1
- package/dist/src/launcher/codex-config-model-providers.d.ts +25 -1
- package/dist/src/launcher/codex-config-model-providers.d.ts.map +1 -1
- package/dist/src/launcher/codex-config-model-providers.js +113 -23
- package/dist/src/launcher/codex-config-model-providers.js.map +1 -1
- package/dist/src/launcher/host-generation-bootloader.d.ts +3 -0
- package/dist/src/launcher/host-generation-bootloader.d.ts.map +1 -0
- package/dist/src/launcher/host-generation-bootloader.js +94 -0
- package/dist/src/launcher/host-generation-bootloader.js.map +1 -0
- package/dist/src/launcher/host-generation-graph.d.ts +11 -5
- package/dist/src/launcher/host-generation-graph.d.ts.map +1 -1
- package/dist/src/launcher/host-generation-graph.js +197 -29
- package/dist/src/launcher/host-generation-graph.js.map +1 -1
- package/dist/src/launcher/kernel-operation-lock.d.ts +5 -0
- package/dist/src/launcher/kernel-operation-lock.d.ts.map +1 -0
- package/dist/src/launcher/kernel-operation-lock.js +42 -0
- package/dist/src/launcher/kernel-operation-lock.js.map +1 -0
- package/dist/src/launcher/loopback-permissions.d.ts +25 -0
- package/dist/src/launcher/loopback-permissions.d.ts.map +1 -0
- package/dist/src/launcher/loopback-permissions.js +112 -0
- package/dist/src/launcher/loopback-permissions.js.map +1 -0
- package/dist/src/launcher/main-inspector.d.ts +22 -0
- package/dist/src/launcher/main-inspector.d.ts.map +1 -0
- package/dist/src/launcher/main-inspector.js +101 -0
- package/dist/src/launcher/main-inspector.js.map +1 -0
- package/dist/src/launcher/model-catalog/abort.d.ts +3 -0
- package/dist/src/launcher/model-catalog/abort.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/abort.js +16 -0
- package/dist/src/launcher/model-catalog/abort.js.map +1 -0
- package/dist/src/launcher/model-catalog/atomic-store.d.ts +13 -0
- package/dist/src/launcher/model-catalog/atomic-store.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/atomic-store.js +85 -0
- package/dist/src/launcher/model-catalog/atomic-store.js.map +1 -0
- package/dist/src/launcher/model-catalog/builtin-registry.d.ts +4 -0
- package/dist/src/launcher/model-catalog/builtin-registry.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/builtin-registry.js +13 -0
- package/dist/src/launcher/model-catalog/builtin-registry.js.map +1 -0
- package/dist/src/launcher/model-catalog/configured-source.d.ts +15 -0
- package/dist/src/launcher/model-catalog/configured-source.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/configured-source.js +99 -0
- package/dist/src/launcher/model-catalog/configured-source.js.map +1 -0
- package/dist/src/launcher/model-catalog/contracts.d.ts +95 -0
- package/dist/src/launcher/model-catalog/contracts.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/contracts.js +55 -0
- package/dist/src/launcher/model-catalog/contracts.js.map +1 -0
- package/dist/src/launcher/model-catalog/deepseek.d.ts +4 -0
- package/dist/src/launcher/model-catalog/deepseek.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/deepseek.js +47 -0
- package/dist/src/launcher/model-catalog/deepseek.js.map +1 -0
- package/dist/src/launcher/model-catalog/discovery-http.d.ts +3 -0
- package/dist/src/launcher/model-catalog/discovery-http.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/discovery-http.js +90 -0
- package/dist/src/launcher/model-catalog/discovery-http.js.map +1 -0
- package/dist/src/launcher/model-catalog/file-source.d.ts +10 -0
- package/dist/src/launcher/model-catalog/file-source.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/file-source.js +136 -0
- package/dist/src/launcher/model-catalog/file-source.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.d.ts +36 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.js +568 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.d.ts +16 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.js +130 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.d.ts +14 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.js +53 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.d.ts +4 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.js +71 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.d.ts +38 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.js +352 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.d.ts +28 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.js +71 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.js.map +1 -0
- package/dist/src/launcher/model-catalog/native-catalog-management.d.ts +60 -0
- package/dist/src/launcher/model-catalog/native-catalog-management.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/native-catalog-management.js +408 -0
- package/dist/src/launcher/model-catalog/native-catalog-management.js.map +1 -0
- package/dist/src/launcher/model-catalog/native-config-catalog-discovery.d.ts +28 -0
- package/dist/src/launcher/model-catalog/native-config-catalog-discovery.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/native-config-catalog-discovery.js +203 -0
- package/dist/src/launcher/model-catalog/native-config-catalog-discovery.js.map +1 -0
- package/dist/src/launcher/model-catalog/opencode-go.d.ts +4 -0
- package/dist/src/launcher/model-catalog/opencode-go.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/opencode-go.js +39 -0
- package/dist/src/launcher/model-catalog/opencode-go.js.map +1 -0
- package/dist/src/launcher/model-catalog/openrouter.d.ts +4 -0
- package/dist/src/launcher/model-catalog/openrouter.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/openrouter.js +71 -0
- package/dist/src/launcher/model-catalog/openrouter.js.map +1 -0
- package/dist/src/launcher/model-catalog/owner-projection.d.ts +20 -0
- package/dist/src/launcher/model-catalog/owner-projection.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/owner-projection.js +37 -0
- package/dist/src/launcher/model-catalog/owner-projection.js.map +1 -0
- package/dist/src/launcher/model-catalog/registry.d.ts +7 -0
- package/dist/src/launcher/model-catalog/registry.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/registry.js +19 -0
- package/dist/src/launcher/model-catalog/registry.js.map +1 -0
- package/dist/src/launcher/model-catalog/request-capability.d.ts +10 -0
- package/dist/src/launcher/model-catalog/request-capability.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/request-capability.js +74 -0
- package/dist/src/launcher/model-catalog/request-capability.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-composition.d.ts +21 -0
- package/dist/src/launcher/model-catalog/script-composition.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-composition.js +26 -0
- package/dist/src/launcher/model-catalog/script-composition.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-executor.d.ts +5 -0
- package/dist/src/launcher/model-catalog/script-executor.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-executor.js +140 -0
- package/dist/src/launcher/model-catalog/script-executor.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-management.d.ts +4 -0
- package/dist/src/launcher/model-catalog/script-management.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-management.js +29 -0
- package/dist/src/launcher/model-catalog/script-management.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-output-parser.d.ts +3 -0
- package/dist/src/launcher/model-catalog/script-output-parser.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-output-parser.js +59 -0
- package/dist/src/launcher/model-catalog/script-output-parser.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-runtime.d.ts +30 -0
- package/dist/src/launcher/model-catalog/script-runtime.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-runtime.js +164 -0
- package/dist/src/launcher/model-catalog/script-runtime.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-schema.d.ts +42 -0
- package/dist/src/launcher/model-catalog/script-schema.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-schema.js +129 -0
- package/dist/src/launcher/model-catalog/script-schema.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-types.d.ts +84 -0
- package/dist/src/launcher/model-catalog/script-types.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-types.js +9 -0
- package/dist/src/launcher/model-catalog/script-types.js.map +1 -0
- package/dist/src/launcher/model-catalog/service.d.ts +39 -0
- package/dist/src/launcher/model-catalog/service.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/service.js +292 -0
- package/dist/src/launcher/model-catalog/service.js.map +1 -0
- package/dist/src/launcher/model-catalog/supplement.d.ts +4 -0
- package/dist/src/launcher/model-catalog/supplement.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/supplement.js +59 -0
- package/dist/src/launcher/model-catalog/supplement.js.map +1 -0
- package/dist/src/launcher/native-account-structure.d.ts +3 -0
- package/dist/src/launcher/native-account-structure.d.ts.map +1 -1
- package/dist/src/launcher/native-account-structure.js +5 -2
- package/dist/src/launcher/native-account-structure.js.map +1 -1
- package/dist/src/launcher/native-model-provider-catalog.d.ts +6 -1
- package/dist/src/launcher/native-model-provider-catalog.d.ts.map +1 -1
- package/dist/src/launcher/native-model-provider-catalog.js +16 -3
- package/dist/src/launcher/native-model-provider-catalog.js.map +1 -1
- package/dist/src/launcher/native-predispatch-interception.d.ts +6 -2
- package/dist/src/launcher/native-predispatch-interception.d.ts.map +1 -1
- package/dist/src/launcher/native-predispatch-interception.js +5 -1
- package/dist/src/launcher/native-predispatch-interception.js.map +1 -1
- package/dist/src/launcher/native-submission-cdp-channel.d.ts +7 -0
- package/dist/src/launcher/native-submission-cdp-channel.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-cdp-channel.js +54 -7
- package/dist/src/launcher/native-submission-cdp-channel.js.map +1 -1
- package/dist/src/launcher/native-submission-composition.d.ts +25 -2
- package/dist/src/launcher/native-submission-composition.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-composition.js +378 -59
- package/dist/src/launcher/native-submission-composition.js.map +1 -1
- package/dist/src/launcher/native-submission-controller.d.ts +1 -0
- package/dist/src/launcher/native-submission-controller.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-controller.js +27 -3
- package/dist/src/launcher/native-submission-controller.js.map +1 -1
- package/dist/src/launcher/native-submission-structure.d.ts +7 -0
- package/dist/src/launcher/native-submission-structure.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-structure.js +25 -3
- package/dist/src/launcher/native-submission-structure.js.map +1 -1
- package/dist/src/launcher/process-identity.d.ts +25 -0
- package/dist/src/launcher/process-identity.d.ts.map +1 -0
- package/dist/src/launcher/process-identity.js +126 -0
- package/dist/src/launcher/process-identity.js.map +1 -0
- package/dist/src/launcher/process.d.ts +18 -6
- package/dist/src/launcher/process.d.ts.map +1 -1
- package/dist/src/launcher/process.js +186 -145
- package/dist/src/launcher/process.js.map +1 -1
- package/dist/src/launcher/production-graph-admission.d.ts +1 -1
- package/dist/src/launcher/production-graph-admission.d.ts.map +1 -1
- package/dist/src/launcher/production-graph-admission.js +8 -3
- package/dist/src/launcher/production-graph-admission.js.map +1 -1
- package/dist/src/launcher/profile-launch-lease.d.ts +17 -0
- package/dist/src/launcher/profile-launch-lease.d.ts.map +1 -0
- package/dist/src/launcher/profile-launch-lease.js +180 -0
- package/dist/src/launcher/profile-launch-lease.js.map +1 -0
- package/dist/src/launcher/provider-profile-sync-codex-target.d.ts +22 -0
- package/dist/src/launcher/provider-profile-sync-codex-target.d.ts.map +1 -0
- package/dist/src/launcher/provider-profile-sync-codex-target.js +213 -0
- package/dist/src/launcher/provider-profile-sync-codex-target.js.map +1 -0
- package/dist/src/launcher/provider-profile-sync-codex.d.ts +21 -0
- package/dist/src/launcher/provider-profile-sync-codex.d.ts.map +1 -0
- package/dist/src/launcher/provider-profile-sync-codex.js +589 -0
- package/dist/src/launcher/provider-profile-sync-codex.js.map +1 -0
- package/dist/src/launcher/provider-profile-sync-contracts.d.ts +134 -0
- package/dist/src/launcher/provider-profile-sync-contracts.d.ts.map +1 -0
- package/dist/src/launcher/provider-profile-sync-contracts.js +114 -0
- package/dist/src/launcher/provider-profile-sync-contracts.js.map +1 -0
- package/dist/src/launcher/provider-profile-sync-ledger.d.ts +82 -0
- package/dist/src/launcher/provider-profile-sync-ledger.d.ts.map +1 -0
- package/dist/src/launcher/provider-profile-sync-ledger.js +355 -0
- package/dist/src/launcher/provider-profile-sync-ledger.js.map +1 -0
- package/dist/src/launcher/provider-profile-sync-projection.d.ts +21 -0
- package/dist/src/launcher/provider-profile-sync-projection.d.ts.map +1 -0
- package/dist/src/launcher/provider-profile-sync-projection.js +120 -0
- package/dist/src/launcher/provider-profile-sync-projection.js.map +1 -0
- package/dist/src/launcher/secret-resolver.d.ts.map +1 -1
- package/dist/src/launcher/secret-resolver.js +3 -0
- package/dist/src/launcher/secret-resolver.js.map +1 -1
- package/dist/src/model-catalog/management-overlay.d.ts +67 -0
- package/dist/src/model-catalog/management-overlay.d.ts.map +1 -0
- package/dist/src/model-catalog/management-overlay.js +193 -0
- package/dist/src/model-catalog/management-overlay.js.map +1 -0
- package/dist/src/model-catalog-management.d.ts +132 -0
- package/dist/src/model-catalog-management.d.ts.map +1 -0
- package/dist/src/model-catalog-management.js +2 -0
- package/dist/src/model-catalog-management.js.map +1 -0
- package/dist/src/model-selector-branding.d.ts +24 -0
- package/dist/src/model-selector-branding.d.ts.map +1 -0
- package/dist/src/model-selector-branding.js +201 -0
- package/dist/src/model-selector-branding.js.map +1 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.d.ts +4 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.d.ts.map +1 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.js +45 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.js.map +1 -0
- package/dist/src/renderer/adapter/native-model-provider-seat.d.ts +2 -0
- package/dist/src/renderer/adapter/native-model-provider-seat.d.ts.map +1 -1
- package/dist/src/renderer/adapter/native-model-provider-seat.js +7 -7
- package/dist/src/renderer/adapter/native-model-provider-seat.js.map +1 -1
- package/dist/src/renderer/adapter/reasoning.d.ts.map +1 -1
- package/dist/src/renderer/adapter/reasoning.js +6 -3
- package/dist/src/renderer/adapter/reasoning.js.map +1 -1
- package/dist/src/renderer/adapter/startup-presentation.d.ts +17 -0
- package/dist/src/renderer/adapter/startup-presentation.d.ts.map +1 -0
- package/dist/src/renderer/adapter/startup-presentation.js +21 -0
- package/dist/src/renderer/adapter/startup-presentation.js.map +1 -0
- package/dist/src/renderer/adapter/startup-readiness.d.ts +21 -0
- package/dist/src/renderer/adapter/startup-readiness.d.ts.map +1 -0
- package/dist/src/renderer/adapter/startup-readiness.js +196 -0
- package/dist/src/renderer/adapter/startup-readiness.js.map +1 -0
- package/dist/src/renderer/current-user/native.d.ts +17 -1
- package/dist/src/renderer/current-user/native.d.ts.map +1 -1
- package/dist/src/renderer/current-user/native.js +20 -7
- package/dist/src/renderer/current-user/native.js.map +1 -1
- package/dist/src/renderer/host-ui/HostMenu.d.ts +2 -1
- package/dist/src/renderer/host-ui/HostMenu.d.ts.map +1 -1
- package/dist/src/renderer/host-ui/HostMenu.js +17 -5
- package/dist/src/renderer/host-ui/HostMenu.js.map +1 -1
- package/dist/src/renderer/host-ui/ModelBrandIcon.d.ts +8 -0
- package/dist/src/renderer/host-ui/ModelBrandIcon.d.ts.map +1 -0
- package/dist/src/renderer/host-ui/ModelBrandIcon.js +93 -0
- package/dist/src/renderer/host-ui/ModelBrandIcon.js.map +1 -0
- package/dist/src/renderer/host-ui/SelectField.d.ts +2 -1
- package/dist/src/renderer/host-ui/SelectField.d.ts.map +1 -1
- package/dist/src/renderer/host-ui/SelectField.js +2 -2
- package/dist/src/renderer/host-ui/SelectField.js.map +1 -1
- package/dist/src/renderer/install-model-provider-selector.d.ts.map +1 -1
- package/dist/src/renderer/install-model-provider-selector.js +24 -8
- package/dist/src/renderer/install-model-provider-selector.js.map +1 -1
- package/dist/src/renderer/manager/pages/ModelServicesPage.d.ts.map +1 -1
- package/dist/src/renderer/manager/pages/ModelServicesPage.js +47 -6
- package/dist/src/renderer/manager/pages/ModelServicesPage.js.map +1 -1
- package/dist/src/renderer/manager/pages/model-catalog/CatalogBinding.d.ts +16 -0
- package/dist/src/renderer/manager/pages/model-catalog/CatalogBinding.d.ts.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/CatalogBinding.js +131 -0
- package/dist/src/renderer/manager/pages/model-catalog/CatalogBinding.js.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/CatalogInput.d.ts +6 -0
- package/dist/src/renderer/manager/pages/model-catalog/CatalogInput.d.ts.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/CatalogInput.js +12 -0
- package/dist/src/renderer/manager/pages/model-catalog/CatalogInput.js.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/ConnectionEditor.d.ts +8 -0
- package/dist/src/renderer/manager/pages/model-catalog/ConnectionEditor.d.ts.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/ConnectionEditor.js +82 -0
- package/dist/src/renderer/manager/pages/model-catalog/ConnectionEditor.js.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/ModelEditor.d.ts +10 -0
- package/dist/src/renderer/manager/pages/model-catalog/ModelEditor.d.ts.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/ModelEditor.js +74 -0
- package/dist/src/renderer/manager/pages/model-catalog/ModelEditor.js.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/ScriptEditor.d.ts +9 -0
- package/dist/src/renderer/manager/pages/model-catalog/ScriptEditor.d.ts.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/ScriptEditor.js +82 -0
- package/dist/src/renderer/manager/pages/model-catalog/ScriptEditor.js.map +1 -0
- package/dist/src/renderer/manager/pages/model-catalog/model-catalog.css +254 -0
- package/dist/src/renderer/model-catalog-client.d.ts +26 -0
- package/dist/src/renderer/model-catalog-client.d.ts.map +1 -0
- package/dist/src/renderer/model-catalog-client.js +122 -0
- package/dist/src/renderer/model-catalog-client.js.map +1 -0
- package/dist/src/renderer/model-catalog-projection.d.ts +5 -0
- package/dist/src/renderer/model-catalog-projection.d.ts.map +1 -0
- package/dist/src/renderer/model-catalog-projection.js +176 -0
- package/dist/src/renderer/model-catalog-projection.js.map +1 -0
- package/dist/src/renderer/model-provider-selector.d.ts +2 -1
- package/dist/src/renderer/model-provider-selector.d.ts.map +1 -1
- package/dist/src/renderer/model-provider-selector.js +58 -18
- package/dist/src/renderer/model-provider-selector.js.map +1 -1
- package/dist/src/renderer/model-providers.css +14 -1
- package/dist/src/renderer/model-providers.d.ts +19 -2
- package/dist/src/renderer/model-providers.d.ts.map +1 -1
- package/dist/src/renderer/model-providers.js +62 -2
- package/dist/src/renderer/model-providers.js.map +1 -1
- package/dist/src/renderer/native-model-provider-transport.d.ts +2 -0
- package/dist/src/renderer/native-model-provider-transport.d.ts.map +1 -1
- package/dist/src/renderer/native-model-provider-transport.js +57 -9
- package/dist/src/renderer/native-model-provider-transport.js.map +1 -1
- package/dist/src/renderer/native-provider-selection-client.d.ts +8 -1
- package/dist/src/renderer/native-provider-selection-client.d.ts.map +1 -1
- package/dist/src/renderer/native-provider-selection-client.js.map +1 -1
- package/dist/src/renderer/runtime-install.d.ts +2 -2
- package/dist/src/renderer/runtime-install.d.ts.map +1 -1
- package/dist/src/renderer/runtime-install.js +27 -11
- package/dist/src/renderer/runtime-install.js.map +1 -1
- package/dist/src/renderer/runtime-plugin-mount.d.ts +1 -1
- package/dist/src/renderer/runtime-plugin-mount.d.ts.map +1 -1
- package/dist/src/renderer/runtime-plugin-mount.js +5 -1
- package/dist/src/renderer/runtime-plugin-mount.js.map +1 -1
- package/dist/src/renderer/runtime-shared.d.ts +1 -0
- package/dist/src/renderer/runtime-shared.d.ts.map +1 -1
- package/dist/src/renderer/runtime-shared.js.map +1 -1
- package/dist/src/renderer/runtime-start-completion.d.ts +3 -0
- package/dist/src/renderer/runtime-start-completion.d.ts.map +1 -0
- package/dist/src/renderer/runtime-start-completion.js +12 -0
- package/dist/src/renderer/runtime-start-completion.js.map +1 -0
- package/dist/src/renderer/runtime-start.d.ts.map +1 -1
- package/dist/src/renderer/runtime-start.js +7 -6
- package/dist/src/renderer/runtime-start.js.map +1 -1
- package/dist/src/renderer/ui-copy/model-catalog.d.ts +455 -0
- package/dist/src/renderer/ui-copy/model-catalog.d.ts.map +1 -0
- package/dist/src/renderer/ui-copy/model-catalog.js +158 -0
- package/dist/src/renderer/ui-copy/model-catalog.js.map +1 -0
- package/dist/src/renderer/ui-copy.d.ts +453 -1
- package/dist/src/renderer/ui-copy.d.ts.map +1 -1
- package/dist/src/renderer/ui-copy.js +2 -0
- package/dist/src/renderer/ui-copy.js.map +1 -1
- package/dist/src/shortcuts/create.d.ts +17 -1
- package/dist/src/shortcuts/create.d.ts.map +1 -1
- package/dist/src/shortcuts/create.js +37 -0
- package/dist/src/shortcuts/create.js.map +1 -1
- package/dist/src/shortcuts/create.test.js +22 -1
- package/dist/src/shortcuts/create.test.js.map +1 -1
- package/dist/src/shortcuts/dock.d.ts +22 -6
- package/dist/src/shortcuts/dock.d.ts.map +1 -1
- package/dist/src/shortcuts/dock.js +156 -33
- package/dist/src/shortcuts/dock.js.map +1 -1
- package/dist/src/shortcuts/model.d.ts +7 -0
- package/dist/src/shortcuts/model.d.ts.map +1 -1
- package/dist/src/shortcuts/model.js +5 -1
- package/dist/src/shortcuts/model.js.map +1 -1
- package/dist/src/shortcuts/native.d.ts +6 -2
- package/dist/src/shortcuts/native.d.ts.map +1 -1
- package/dist/src/shortcuts/native.js +18 -4
- package/dist/src/shortcuts/native.js.map +1 -1
- package/dist/src/shortcuts/presentation.test.js +45 -0
- package/dist/src/shortcuts/presentation.test.js.map +1 -1
- package/dist/src/shortcuts/startup-brand.d.ts +6 -0
- package/dist/src/shortcuts/startup-brand.d.ts.map +1 -0
- package/dist/src/shortcuts/startup-brand.js +32 -0
- package/dist/src/shortcuts/startup-brand.js.map +1 -0
- package/dist/src/shortcuts/startup-cover.d.ts +15 -0
- package/dist/src/shortcuts/startup-cover.d.ts.map +1 -0
- package/dist/src/shortcuts/startup-cover.js +202 -0
- package/dist/src/shortcuts/startup-cover.js.map +1 -0
- package/dist/src/shortcuts/startup-release.d.ts +7 -0
- package/dist/src/shortcuts/startup-release.d.ts.map +1 -0
- package/dist/src/shortcuts/startup-release.js +11 -0
- package/dist/src/shortcuts/startup-release.js.map +1 -0
- package/dist/src/shortcuts/startup-timing.d.ts +7 -0
- package/dist/src/shortcuts/startup-timing.d.ts.map +1 -0
- package/dist/src/shortcuts/startup-timing.js +77 -0
- package/dist/src/shortcuts/startup-timing.js.map +1 -0
- package/package.json +4 -2
- package/scripts/refresh-existing-app.mjs +11 -0
- package/third_party/lobe-icons-MIT.txt +21 -0
- package/third_party/openai-apps-sdk-ui-MIT.txt +19 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// src/service/gateway.ts
|
|
2
|
-
import { createHash as
|
|
2
|
+
import { createHash as createHash5 } from "node:crypto";
|
|
3
3
|
|
|
4
4
|
// src/service/gateway-definition.ts
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
6
|
var CLI_PROXY_GATEWAY_MODEL_CATALOG_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-gateway-model-catalog.v1.schema.json";
|
|
7
7
|
var CLI_PROXY_GATEWAY_CODEX_UPSTREAMS_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-gateway-codex-upstream.v1.schema.json";
|
|
8
8
|
var CLI_PROXY_GATEWAY_OPENAI_UPSTREAMS_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-gateway-openai-upstream.v1.schema.json";
|
|
9
|
+
var CLI_PROXY_GATEWAY_EXTENSION_PLAN_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-gateway-extension-plan.v1.schema.json";
|
|
9
10
|
var CLI_PROXY_MANAGEMENT_AUTH_FILES_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-management-auth-files.v1.schema.json";
|
|
10
11
|
var CLI_PROXY_MANAGEMENT_OPERATION_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-management-operation.v1.schema.json";
|
|
11
12
|
var CLI_PROXY_GATEWAY_SERVICE_ID = "gateway-runtime";
|
|
@@ -62,6 +63,13 @@ var cliProxyGatewayDefinition = {
|
|
|
62
63
|
target: "configuration",
|
|
63
64
|
pointer: "/openai-compatibility",
|
|
64
65
|
valueSchema: CLI_PROXY_GATEWAY_OPENAI_UPSTREAMS_SCHEMA_V1
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
slot: "gateway-extensions",
|
|
69
|
+
source: "composition",
|
|
70
|
+
target: "configuration",
|
|
71
|
+
pointer: "/plugins/configs/cordisx-gateway-bridge",
|
|
72
|
+
valueSchema: CLI_PROXY_GATEWAY_EXTENSION_PLAN_SCHEMA_V1
|
|
65
73
|
}
|
|
66
74
|
],
|
|
67
75
|
authentication: { mode: "none" },
|
|
@@ -161,8 +169,8 @@ function providerId(value) {
|
|
|
161
169
|
return `custom:${safe}`;
|
|
162
170
|
}
|
|
163
171
|
function revision(value) {
|
|
164
|
-
const
|
|
165
|
-
return Number.parseInt(
|
|
172
|
+
const digest3 = createHash2("sha256").update(JSON.stringify(value)).digest("hex").slice(0, 12);
|
|
173
|
+
return Number.parseInt(digest3, 16);
|
|
166
174
|
}
|
|
167
175
|
function bindingMatches(left, right) {
|
|
168
176
|
return left.bindingId === right.bindingId && left.identity.pluginId === right.identity.pluginId && left.identity.serviceId === right.identity.serviceId && left.scope.profileId === right.scope.profileId && left.scope.generation === right.scope.generation;
|
|
@@ -482,21 +490,486 @@ var managedServiceUI = Object.freeze({
|
|
|
482
490
|
}
|
|
483
491
|
});
|
|
484
492
|
|
|
485
|
-
// src/service/
|
|
493
|
+
// src/service/extension-registry.ts
|
|
486
494
|
import { createHash as createHash3 } from "node:crypto";
|
|
495
|
+
var CLI_PROXY_GATEWAY_ADAPTER_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-gateway-adapter.v1.schema.json";
|
|
496
|
+
var CLI_PROXY_GATEWAY_CONNECTION_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-gateway-connection.v1.schema.json";
|
|
497
|
+
var CLI_PROXY_GATEWAY_ADAPTER_CONTRACT_V1 = "cordisx.cli-proxy-gateway-adapter/v1";
|
|
498
|
+
var CLI_PROXY_GATEWAY_CONNECTION_CONTRACT_V1 = "cordisx.cli-proxy-gateway-connection/v1";
|
|
499
|
+
var CLI_PROXY_GATEWAY_EXTENSION_PLAN_CONTRACT_V1 = "cordisx.cli-proxy-gateway-extension-plan/v1";
|
|
500
|
+
var CLI_PROXY_GATEWAY_EXTENSION_REGISTRY_SERVICE_V1 = "cliProxyGatewayExtensions";
|
|
501
|
+
var ID_PATTERN = /^[a-z0-9][a-z0-9._-]{0,95}$/;
|
|
502
|
+
var HEADER_PATTERN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]{1,128}$/;
|
|
503
|
+
var POINTER_PATTERN = /^(?:\/(?:[^~/]|~0|~1)*)+$/;
|
|
504
|
+
var MAX_ADAPTERS = 64;
|
|
505
|
+
var MAX_CONNECTIONS = 128;
|
|
506
|
+
var MAX_MODELS = 256;
|
|
507
|
+
function isText(value, maximum) {
|
|
508
|
+
return value.length > 0 && value.length <= maximum && value === value.trim() && !/[\u0000-\u001f\u007f]/.test(value);
|
|
509
|
+
}
|
|
510
|
+
function stableValue(value) {
|
|
511
|
+
if (Array.isArray(value)) return value.map(stableValue);
|
|
512
|
+
if (value === null || typeof value !== "object") return value;
|
|
513
|
+
return Object.fromEntries(
|
|
514
|
+
Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(
|
|
515
|
+
([key, item]) => [key, stableValue(item)]
|
|
516
|
+
)
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
function stableStringify(value) {
|
|
520
|
+
return JSON.stringify(stableValue(value));
|
|
521
|
+
}
|
|
522
|
+
function digest(value) {
|
|
523
|
+
return `sha256:${createHash3("sha256").update(stableStringify(value)).digest("hex")}`;
|
|
524
|
+
}
|
|
525
|
+
function rejection(failure) {
|
|
526
|
+
return { status: "rejected", diagnostic: failure };
|
|
527
|
+
}
|
|
528
|
+
function validRevision(value) {
|
|
529
|
+
return Number.isSafeInteger(value) && value > 0;
|
|
530
|
+
}
|
|
531
|
+
function validTemplate(value, depth = 0) {
|
|
532
|
+
if (depth > 12) return false;
|
|
533
|
+
if (value === null || typeof value === "boolean") return true;
|
|
534
|
+
if (typeof value === "number") return Number.isFinite(value);
|
|
535
|
+
if (typeof value === "string") return value.length <= 8192 && !value.includes("\0");
|
|
536
|
+
if (Array.isArray(value)) return value.length <= 128 && value.every((item) => validTemplate(item, depth + 1));
|
|
537
|
+
const entries = Object.entries(value);
|
|
538
|
+
return entries.length <= 128 && entries.every(([key, item]) => isText(key, 256) && validTemplate(item, depth + 1));
|
|
539
|
+
}
|
|
540
|
+
function validateAdapter(adapter) {
|
|
541
|
+
if (adapter.$schema !== CLI_PROXY_GATEWAY_ADAPTER_SCHEMA_V1 || adapter.contract !== CLI_PROXY_GATEWAY_ADAPTER_CONTRACT_V1 || adapter.schemaVersion !== 1) return { code: "invalid-registration", field: "contract", message: "Unsupported gateway adapter contract" };
|
|
542
|
+
if (!ID_PATTERN.test(adapter.adapterId)) {
|
|
543
|
+
return { code: "invalid-registration", field: "adapterId", message: "Invalid adapter id" };
|
|
544
|
+
}
|
|
545
|
+
if (!validRevision(adapter.revision)) {
|
|
546
|
+
return { code: "invalid-registration", field: "revision", message: "Revision must be a positive safe integer" };
|
|
547
|
+
}
|
|
548
|
+
if (adapter.sessionSources.length > 16) {
|
|
549
|
+
return { code: "invalid-registration", field: "sessionSources", message: "Too many session sources" };
|
|
550
|
+
}
|
|
551
|
+
for (const source of adapter.sessionSources) {
|
|
552
|
+
if (source.kind === "header" ? !HEADER_PATTERN.test(source.name) : !POINTER_PATTERN.test(source.pointer) || source.pointer.length > 512) return { code: "invalid-registration", field: "sessionSources", message: "Invalid session source" };
|
|
553
|
+
}
|
|
554
|
+
for (const name of adapter.request.clearHeaders ?? []) {
|
|
555
|
+
if (!HEADER_PATTERN.test(name)) {
|
|
556
|
+
return { code: "invalid-registration", field: "request.clearHeaders", message: "Invalid header name" };
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
for (const [name, value] of Object.entries(adapter.request.setHeaders ?? {})) {
|
|
560
|
+
if (!HEADER_PATTERN.test(name) || !validTemplate(value)) {
|
|
561
|
+
return { code: "invalid-registration", field: "request.setHeaders", message: "Invalid header transform" };
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
for (const [pointer, value] of Object.entries(adapter.request.setBody ?? {})) {
|
|
565
|
+
if (!POINTER_PATTERN.test(pointer) || pointer.length > 512 || !validTemplate(value)) {
|
|
566
|
+
return { code: "invalid-registration", field: "request.setBody", message: "Invalid body transform" };
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
if (stableStringify(adapter).length > 64 * 1024) {
|
|
570
|
+
return { code: "invalid-registration", message: "Adapter exceeds the supported size" };
|
|
571
|
+
}
|
|
572
|
+
return void 0;
|
|
573
|
+
}
|
|
574
|
+
function validateConnection(connection) {
|
|
575
|
+
if (connection.$schema !== CLI_PROXY_GATEWAY_CONNECTION_SCHEMA_V1 || connection.contract !== CLI_PROXY_GATEWAY_CONNECTION_CONTRACT_V1 || connection.schemaVersion !== 1) return { code: "invalid-registration", field: "contract", message: "Unsupported gateway connection contract" };
|
|
576
|
+
if (!ID_PATTERN.test(connection.connectionId)) {
|
|
577
|
+
return { code: "invalid-registration", field: "connectionId", message: "Invalid connection id" };
|
|
578
|
+
}
|
|
579
|
+
if (!validRevision(connection.revision)) {
|
|
580
|
+
return { code: "invalid-registration", field: "revision", message: "Revision must be a positive safe integer" };
|
|
581
|
+
}
|
|
582
|
+
if (connection.wireApi !== "responses" && connection.wireApi !== "chat-completions") {
|
|
583
|
+
return { code: "invalid-registration", field: "wireApi", message: "Unsupported wire API" };
|
|
584
|
+
}
|
|
585
|
+
if (!connection.endpointPath.startsWith("/") || connection.endpointPath.startsWith("//") || connection.endpointPath.length > 512 || /[?#\u0000-\u001f\u007f]/.test(connection.endpointPath)) return { code: "invalid-registration", field: "endpointPath", message: "Invalid endpoint path" };
|
|
586
|
+
if (!ID_PATTERN.test(connection.adapter.adapterId) || !validRevision(connection.adapter.revision)) {
|
|
587
|
+
return { code: "invalid-registration", field: "adapter", message: "Invalid adapter reference" };
|
|
588
|
+
}
|
|
589
|
+
if (connection.models.length === 0 || connection.models.length > MAX_MODELS) {
|
|
590
|
+
return { code: "invalid-registration", field: "models", message: "Model routes are outside the supported range" };
|
|
591
|
+
}
|
|
592
|
+
const gatewayModels = /* @__PURE__ */ new Set();
|
|
593
|
+
const sourceModels = /* @__PURE__ */ new Set();
|
|
594
|
+
let defaults = 0;
|
|
595
|
+
for (const model of connection.models) {
|
|
596
|
+
if (!isText(model.sourceModelId, 256) || !isText(model.modelId, 256) || model.modelId.includes("/")) {
|
|
597
|
+
return { code: "invalid-registration", field: "models", message: "Invalid model identity" };
|
|
598
|
+
}
|
|
599
|
+
if (model.displayName !== void 0 && !isText(model.displayName, 200)) {
|
|
600
|
+
return { code: "invalid-registration", field: "models.displayName", message: "Invalid model display name" };
|
|
601
|
+
}
|
|
602
|
+
if (gatewayModels.has(model.modelId) || sourceModels.has(model.sourceModelId)) {
|
|
603
|
+
return { code: "conflicting-model", field: "models", message: "Duplicate connection model route" };
|
|
604
|
+
}
|
|
605
|
+
gatewayModels.add(model.modelId);
|
|
606
|
+
sourceModels.add(model.sourceModelId);
|
|
607
|
+
if (model.enabled && model.isDefault) defaults += 1;
|
|
608
|
+
}
|
|
609
|
+
if (!connection.models.some((model) => model.enabled)) {
|
|
610
|
+
return { code: "invalid-registration", field: "models", message: "At least one enabled model route is required" };
|
|
611
|
+
}
|
|
612
|
+
if (defaults > 1) {
|
|
613
|
+
return { code: "conflicting-model", field: "models.isDefault", message: "Only one default model is allowed" };
|
|
614
|
+
}
|
|
615
|
+
return void 0;
|
|
616
|
+
}
|
|
617
|
+
var CliProxyGatewayExtensionRegistryV1 = class {
|
|
618
|
+
constructor(pluginGeneration, sourceKey3) {
|
|
619
|
+
this.pluginGeneration = pluginGeneration;
|
|
620
|
+
this.sourceKey = sourceKey3;
|
|
621
|
+
if (!isText(pluginGeneration, 256)) throw new Error("Invalid plugin generation");
|
|
622
|
+
}
|
|
623
|
+
pluginGeneration;
|
|
624
|
+
sourceKey;
|
|
625
|
+
adapters = /* @__PURE__ */ new Map();
|
|
626
|
+
connections = /* @__PURE__ */ new Map();
|
|
627
|
+
producerGenerations = /* @__PURE__ */ new Map();
|
|
628
|
+
listeners = /* @__PURE__ */ new Set();
|
|
629
|
+
revision = 0;
|
|
630
|
+
disposed = false;
|
|
631
|
+
activateProducer(producer, registryGeneration) {
|
|
632
|
+
if (this.disposed || registryGeneration !== this.pluginGeneration) {
|
|
633
|
+
throw new Error("Gateway extension registry generation is stale");
|
|
634
|
+
}
|
|
635
|
+
if (!ID_PATTERN.test(producer.pluginId) || !isText(producer.pluginGeneration, 256)) {
|
|
636
|
+
throw new Error("Invalid gateway extension producer authority");
|
|
637
|
+
}
|
|
638
|
+
if (this.producerGenerations.get(producer.pluginId) === producer.pluginGeneration) return;
|
|
639
|
+
this.producerGenerations.set(producer.pluginId, producer.pluginGeneration);
|
|
640
|
+
if (this.removeProducerEntries(producer.pluginId)) this.changed();
|
|
641
|
+
}
|
|
642
|
+
registerAdapter(adapter, registryGeneration, producer) {
|
|
643
|
+
const generationFailure = this.generationFailure(registryGeneration, producer);
|
|
644
|
+
if (generationFailure !== void 0) return generationFailure;
|
|
645
|
+
const validation = validateAdapter(adapter);
|
|
646
|
+
if (validation !== void 0) return rejection(validation);
|
|
647
|
+
const current = this.adapters.get(adapter.adapterId);
|
|
648
|
+
const ownership = this.ownershipFailure(current?.producer, producer);
|
|
649
|
+
if (ownership !== void 0) return ownership;
|
|
650
|
+
if (current !== void 0) {
|
|
651
|
+
const revision2 = this.revisionResult(current.adapter.revision, adapter.revision, current.adapter, adapter);
|
|
652
|
+
if (revision2 !== void 0) return revision2;
|
|
653
|
+
} else if (this.adapters.size >= MAX_ADAPTERS) {
|
|
654
|
+
return rejection({ code: "capacity-exceeded", message: "Gateway adapter capacity was reached" });
|
|
655
|
+
}
|
|
656
|
+
this.adapters.set(adapter.adapterId, { producer, adapter: structuredClone(adapter) });
|
|
657
|
+
this.changed();
|
|
658
|
+
return { status: current === void 0 ? "registered" : "updated", registryRevision: this.revision };
|
|
659
|
+
}
|
|
660
|
+
registerConnection(connection, registryGeneration, producer) {
|
|
661
|
+
const generationFailure = this.generationFailure(registryGeneration, producer);
|
|
662
|
+
if (generationFailure !== void 0) return generationFailure;
|
|
663
|
+
const validation = validateConnection(connection);
|
|
664
|
+
if (validation !== void 0) return rejection(validation);
|
|
665
|
+
const current = this.connections.get(connection.connectionId);
|
|
666
|
+
const ownership = this.ownershipFailure(current?.producer, producer);
|
|
667
|
+
if (ownership !== void 0) return ownership;
|
|
668
|
+
const sourceKey3 = this.sourceKey(connection.source);
|
|
669
|
+
if (!isText(sourceKey3, 512)) {
|
|
670
|
+
return rejection({
|
|
671
|
+
code: "invalid-registration",
|
|
672
|
+
field: "source",
|
|
673
|
+
message: "Invalid connection source reference"
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
if (current !== void 0) {
|
|
677
|
+
const revision2 = this.revisionResult(
|
|
678
|
+
current.connection.revision,
|
|
679
|
+
connection.revision,
|
|
680
|
+
{ ...current.connection, source: current.sourceKey },
|
|
681
|
+
{ ...connection, source: sourceKey3 }
|
|
682
|
+
);
|
|
683
|
+
if (revision2 !== void 0) return revision2;
|
|
684
|
+
} else if (this.connections.size >= MAX_CONNECTIONS) {
|
|
685
|
+
return rejection({ code: "capacity-exceeded", message: "Gateway connection capacity was reached" });
|
|
686
|
+
}
|
|
687
|
+
for (const [connectionId, entry] of this.connections) {
|
|
688
|
+
if (connectionId === connection.connectionId) continue;
|
|
689
|
+
if (entry.sourceKey === sourceKey3) {
|
|
690
|
+
return rejection({
|
|
691
|
+
code: "conflicting-source",
|
|
692
|
+
field: "source",
|
|
693
|
+
message: "Connection source is already registered"
|
|
694
|
+
});
|
|
695
|
+
}
|
|
696
|
+
const existingModels = new Set(
|
|
697
|
+
entry.connection.models.filter((model) => entry.connection.enabled && model.enabled).map(
|
|
698
|
+
(model) => `${entry.connection.connectionId}/${model.modelId}`
|
|
699
|
+
)
|
|
700
|
+
);
|
|
701
|
+
if (connection.models.some(
|
|
702
|
+
(model) => connection.enabled && model.enabled && existingModels.has(
|
|
703
|
+
`${connection.connectionId}/${model.modelId}`
|
|
704
|
+
)
|
|
705
|
+
)) return rejection({ code: "conflicting-model", field: "models", message: "Gateway model is already registered" });
|
|
706
|
+
}
|
|
707
|
+
this.connections.set(connection.connectionId, {
|
|
708
|
+
producer,
|
|
709
|
+
sourceKey: sourceKey3,
|
|
710
|
+
connection: structuredClone(connection)
|
|
711
|
+
});
|
|
712
|
+
this.changed();
|
|
713
|
+
return { status: current === void 0 ? "registered" : "updated", registryRevision: this.revision };
|
|
714
|
+
}
|
|
715
|
+
revokeAdapter(input, registryGeneration, producer) {
|
|
716
|
+
const generationFailure = this.generationFailure(registryGeneration, producer);
|
|
717
|
+
if (generationFailure !== void 0) return generationFailure;
|
|
718
|
+
const current = this.adapters.get(input.adapterId);
|
|
719
|
+
if (current === void 0) {
|
|
720
|
+
return rejection({ code: "not-found", field: "adapterId", message: "Adapter is not registered" });
|
|
721
|
+
}
|
|
722
|
+
const ownership = this.ownershipFailure(current.producer, producer);
|
|
723
|
+
if (ownership !== void 0) return ownership;
|
|
724
|
+
if (current.adapter.revision !== input.expectedRevision) {
|
|
725
|
+
return rejection({ code: "stale-revision", field: "expectedRevision", message: "Adapter revision is stale" });
|
|
726
|
+
}
|
|
727
|
+
this.adapters.delete(input.adapterId);
|
|
728
|
+
this.changed();
|
|
729
|
+
return { status: "revoked", registryRevision: this.revision };
|
|
730
|
+
}
|
|
731
|
+
revokeConnection(input, registryGeneration, producer) {
|
|
732
|
+
const generationFailure = this.generationFailure(registryGeneration, producer);
|
|
733
|
+
if (generationFailure !== void 0) return generationFailure;
|
|
734
|
+
const current = this.connections.get(input.connectionId);
|
|
735
|
+
if (current === void 0) {
|
|
736
|
+
return rejection({ code: "not-found", field: "connectionId", message: "Connection is not registered" });
|
|
737
|
+
}
|
|
738
|
+
const ownership = this.ownershipFailure(current.producer, producer);
|
|
739
|
+
if (ownership !== void 0) return ownership;
|
|
740
|
+
if (current.connection.revision !== input.expectedRevision) {
|
|
741
|
+
return rejection({ code: "stale-revision", field: "expectedRevision", message: "Connection revision is stale" });
|
|
742
|
+
}
|
|
743
|
+
this.connections.delete(input.connectionId);
|
|
744
|
+
this.changed();
|
|
745
|
+
return { status: "revoked", registryRevision: this.revision };
|
|
746
|
+
}
|
|
747
|
+
disposeProducer(producer, registryGeneration) {
|
|
748
|
+
const generationFailure = this.generationFailure(registryGeneration, producer);
|
|
749
|
+
if (generationFailure !== void 0) return generationFailure;
|
|
750
|
+
this.producerGenerations.delete(producer.pluginId);
|
|
751
|
+
if (!this.removeProducerEntries(producer.pluginId, producer.pluginGeneration)) {
|
|
752
|
+
return { status: "unchanged", registryRevision: this.revision };
|
|
753
|
+
}
|
|
754
|
+
this.changed();
|
|
755
|
+
return { status: "revoked", registryRevision: this.revision };
|
|
756
|
+
}
|
|
757
|
+
subscribe(listener) {
|
|
758
|
+
if (this.disposed) throw new Error("Gateway extension registry generation is stale");
|
|
759
|
+
this.listeners.add(listener);
|
|
760
|
+
return () => this.listeners.delete(listener);
|
|
761
|
+
}
|
|
762
|
+
plan(pluginGeneration) {
|
|
763
|
+
if (this.disposed || pluginGeneration !== this.pluginGeneration) {
|
|
764
|
+
return { code: "stale-generation", message: "Gateway extension plan generation is stale" };
|
|
765
|
+
}
|
|
766
|
+
const adapters = [...this.adapters.values()].map((entry) => structuredClone(entry.adapter)).sort(
|
|
767
|
+
(left, right) => left.adapterId.localeCompare(right.adapterId)
|
|
768
|
+
);
|
|
769
|
+
const connections = [];
|
|
770
|
+
const composition = [];
|
|
771
|
+
for (const entry of [...this.connections.values()].sort(
|
|
772
|
+
(left, right) => left.connection.connectionId.localeCompare(right.connection.connectionId)
|
|
773
|
+
)) {
|
|
774
|
+
const connection = entry.connection;
|
|
775
|
+
const adapter = this.adapters.get(connection.adapter.adapterId)?.adapter;
|
|
776
|
+
const adapterAvailable = adapter?.enabled === true && adapter.revision === connection.adapter.revision;
|
|
777
|
+
const enabled = connection.enabled && (!connection.adapter.required || adapterAvailable);
|
|
778
|
+
const index = connections.length;
|
|
779
|
+
connections.push({
|
|
780
|
+
connectionId: connection.connectionId,
|
|
781
|
+
revision: connection.revision,
|
|
782
|
+
enabled,
|
|
783
|
+
adapterId: connection.adapter.adapterId,
|
|
784
|
+
adapterRevision: connection.adapter.revision,
|
|
785
|
+
adapterRequired: connection.adapter.required,
|
|
786
|
+
adapterAvailable,
|
|
787
|
+
wireApi: connection.wireApi,
|
|
788
|
+
endpointPath: connection.endpointPath,
|
|
789
|
+
endpoint: null,
|
|
790
|
+
authorization: connection.authorization,
|
|
791
|
+
credential: null,
|
|
792
|
+
models: connection.models.filter((model) => model.enabled).sort(
|
|
793
|
+
(left, right) => left.modelId.localeCompare(right.modelId)
|
|
794
|
+
).map((model) => ({
|
|
795
|
+
sourceModelId: model.sourceModelId,
|
|
796
|
+
gatewayModelId: `${connection.connectionId}/${model.modelId}`,
|
|
797
|
+
displayName: model.displayName ?? model.modelId,
|
|
798
|
+
isDefault: model.isDefault
|
|
799
|
+
}))
|
|
800
|
+
});
|
|
801
|
+
if (!enabled) continue;
|
|
802
|
+
const sourceAlias = `extension-${index}`;
|
|
803
|
+
composition.push({
|
|
804
|
+
connectionId: connection.connectionId,
|
|
805
|
+
sourceAlias,
|
|
806
|
+
source: connection.source,
|
|
807
|
+
originPointer: `/connections/${index}/endpoint`,
|
|
808
|
+
...connection.authorization === "bearer" ? { authorizationPointer: `/connections/${index}/credential` } : {}
|
|
809
|
+
});
|
|
810
|
+
}
|
|
811
|
+
const base = {
|
|
812
|
+
contract: CLI_PROXY_GATEWAY_EXTENSION_PLAN_CONTRACT_V1,
|
|
813
|
+
schemaVersion: 1,
|
|
814
|
+
pluginGeneration: this.pluginGeneration,
|
|
815
|
+
registryRevision: this.revision,
|
|
816
|
+
configuration: { adapters, connections },
|
|
817
|
+
composition
|
|
818
|
+
};
|
|
819
|
+
return { ...base, planDigest: digest({ ...base, composition: composition.map(({ source: _, ...item }) => item) }) };
|
|
820
|
+
}
|
|
821
|
+
dispose() {
|
|
822
|
+
if (this.disposed) return;
|
|
823
|
+
this.disposed = true;
|
|
824
|
+
this.adapters.clear();
|
|
825
|
+
this.connections.clear();
|
|
826
|
+
this.producerGenerations.clear();
|
|
827
|
+
this.listeners.clear();
|
|
828
|
+
this.revision += 1;
|
|
829
|
+
}
|
|
830
|
+
revisionResult(currentRevision, nextRevision, current, next) {
|
|
831
|
+
if (nextRevision < currentRevision) {
|
|
832
|
+
return rejection({ code: "stale-revision", field: "revision", message: "Extension revision is stale" });
|
|
833
|
+
}
|
|
834
|
+
if (nextRevision !== currentRevision) return void 0;
|
|
835
|
+
return stableStringify(current) === stableStringify(next) ? { status: "unchanged", registryRevision: this.revision } : rejection({ code: "stale-revision", field: "revision", message: "Revision was reused with different content" });
|
|
836
|
+
}
|
|
837
|
+
ownershipFailure(current, producer) {
|
|
838
|
+
if (current === void 0) return void 0;
|
|
839
|
+
if (current.pluginId !== producer.pluginId) {
|
|
840
|
+
return rejection({ code: "conflicting-producer", message: "Extension is owned by another producer" });
|
|
841
|
+
}
|
|
842
|
+
if (current.pluginGeneration !== producer.pluginGeneration) {
|
|
843
|
+
return {
|
|
844
|
+
status: "stale-generation",
|
|
845
|
+
diagnostic: { code: "stale-generation", message: "Extension producer generation is stale" }
|
|
846
|
+
};
|
|
847
|
+
}
|
|
848
|
+
return void 0;
|
|
849
|
+
}
|
|
850
|
+
generationFailure(registryGeneration, producer) {
|
|
851
|
+
if (this.disposed || registryGeneration !== this.pluginGeneration || this.producerGenerations.get(producer.pluginId) !== producer.pluginGeneration) {
|
|
852
|
+
return {
|
|
853
|
+
status: "stale-generation",
|
|
854
|
+
diagnostic: { code: "stale-generation", message: "Gateway extension registry generation is stale" }
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
return void 0;
|
|
858
|
+
}
|
|
859
|
+
removeProducerEntries(pluginId, pluginGeneration) {
|
|
860
|
+
let removed = false;
|
|
861
|
+
for (const [adapterId, entry] of this.adapters) {
|
|
862
|
+
if (entry.producer.pluginId !== pluginId || pluginGeneration !== void 0 && entry.producer.pluginGeneration !== pluginGeneration) continue;
|
|
863
|
+
this.adapters.delete(adapterId);
|
|
864
|
+
removed = true;
|
|
865
|
+
}
|
|
866
|
+
for (const [connectionId, entry] of this.connections) {
|
|
867
|
+
if (entry.producer.pluginId !== pluginId || pluginGeneration !== void 0 && entry.producer.pluginGeneration !== pluginGeneration) continue;
|
|
868
|
+
this.connections.delete(connectionId);
|
|
869
|
+
removed = true;
|
|
870
|
+
}
|
|
871
|
+
return removed;
|
|
872
|
+
}
|
|
873
|
+
changed() {
|
|
874
|
+
this.revision += 1;
|
|
875
|
+
for (const listener of this.listeners) listener(this.revision);
|
|
876
|
+
}
|
|
877
|
+
};
|
|
878
|
+
function createCliProxyGatewayExtensionRegistrarV1(registry, producer) {
|
|
879
|
+
registry.activateProducer(producer, registry.pluginGeneration);
|
|
880
|
+
let disposed = false;
|
|
881
|
+
const currentRevision = () => {
|
|
882
|
+
const plan = registry.plan(registry.pluginGeneration);
|
|
883
|
+
return "code" in plan ? 0 : plan.registryRevision;
|
|
884
|
+
};
|
|
885
|
+
return Object.freeze({
|
|
886
|
+
producer,
|
|
887
|
+
registerAdapter: (adapter) => disposed ? {
|
|
888
|
+
status: "stale-generation",
|
|
889
|
+
diagnostic: { code: "stale-generation", message: "Extension registrar is disposed" }
|
|
890
|
+
} : registry.registerAdapter(adapter, registry.pluginGeneration, producer),
|
|
891
|
+
revokeAdapter: (input) => disposed ? {
|
|
892
|
+
status: "stale-generation",
|
|
893
|
+
diagnostic: { code: "stale-generation", message: "Extension registrar is disposed" }
|
|
894
|
+
} : registry.revokeAdapter(input, registry.pluginGeneration, producer),
|
|
895
|
+
registerConnection: (connection) => disposed ? {
|
|
896
|
+
status: "stale-generation",
|
|
897
|
+
diagnostic: { code: "stale-generation", message: "Extension registrar is disposed" }
|
|
898
|
+
} : registry.registerConnection(connection, registry.pluginGeneration, producer),
|
|
899
|
+
revokeConnection: (input) => disposed ? {
|
|
900
|
+
status: "stale-generation",
|
|
901
|
+
diagnostic: { code: "stale-generation", message: "Extension registrar is disposed" }
|
|
902
|
+
} : registry.revokeConnection(input, registry.pluginGeneration, producer),
|
|
903
|
+
dispose: () => {
|
|
904
|
+
if (disposed) return { status: "unchanged", registryRevision: currentRevision() };
|
|
905
|
+
disposed = true;
|
|
906
|
+
return registry.disposeProducer(producer, registry.pluginGeneration);
|
|
907
|
+
}
|
|
908
|
+
});
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
// src/service/extension-context.ts
|
|
912
|
+
function sourceKey(source) {
|
|
913
|
+
return JSON.stringify([source.source, source.pluginId, source.serviceId]);
|
|
914
|
+
}
|
|
915
|
+
function createCliProxyGatewayExtensionContextProviderV1() {
|
|
916
|
+
return Object.freeze({
|
|
917
|
+
service: CLI_PROXY_GATEWAY_EXTENSION_REGISTRY_SERVICE_V1,
|
|
918
|
+
create: ({ target, signal }) => {
|
|
919
|
+
const registry = new CliProxyGatewayExtensionRegistryV1(
|
|
920
|
+
target.pluginGeneration,
|
|
921
|
+
sourceKey
|
|
922
|
+
);
|
|
923
|
+
const bindings = /* @__PURE__ */ new Set();
|
|
924
|
+
let disposed = false;
|
|
925
|
+
const dispose = () => {
|
|
926
|
+
if (disposed) return;
|
|
927
|
+
disposed = true;
|
|
928
|
+
for (const binding of [...bindings]) binding.dispose();
|
|
929
|
+
bindings.clear();
|
|
930
|
+
registry.dispose();
|
|
931
|
+
};
|
|
932
|
+
signal.addEventListener("abort", dispose, { once: true });
|
|
933
|
+
return Object.freeze({
|
|
934
|
+
providerValue: registry,
|
|
935
|
+
bind: ({ producer, target: bindingTarget, signal: bindingSignal }) => {
|
|
936
|
+
if (disposed || bindingSignal.aborted || bindingTarget.pluginId !== target.pluginId || bindingTarget.pluginGeneration !== target.pluginGeneration || bindingTarget.serviceId !== target.serviceId || bindingTarget.serviceGeneration !== target.serviceGeneration) throw new Error("CLIProxyAPI gateway extension context generation is stale");
|
|
937
|
+
const registrar = createCliProxyGatewayExtensionRegistrarV1(registry, producer);
|
|
938
|
+
let bindingDisposed = false;
|
|
939
|
+
const binding = Object.freeze({
|
|
940
|
+
value: registrar,
|
|
941
|
+
dispose: () => {
|
|
942
|
+
if (bindingDisposed) return;
|
|
943
|
+
bindingDisposed = true;
|
|
944
|
+
bindings.delete(binding);
|
|
945
|
+
registrar.dispose();
|
|
946
|
+
}
|
|
947
|
+
});
|
|
948
|
+
bindings.add(binding);
|
|
949
|
+
bindingSignal.addEventListener("abort", () => binding.dispose(), { once: true });
|
|
950
|
+
return binding;
|
|
951
|
+
},
|
|
952
|
+
dispose
|
|
953
|
+
});
|
|
954
|
+
}
|
|
955
|
+
});
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
// src/service/upstream-registry.ts
|
|
959
|
+
import { createHash as createHash4 } from "node:crypto";
|
|
487
960
|
var CLI_PROXY_UPSTREAM_DESCRIPTOR_SCHEMA_V1 = "https://raw.githubusercontent.com/cordisx/plugin-cli-proxy-api/main/schemas/cli-proxy-upstream-descriptor.v1.schema.json";
|
|
488
961
|
var CLI_PROXY_UPSTREAM_DESCRIPTOR_CONTRACT_V1 = "cordisx.cli-proxy-upstream-descriptor/v1";
|
|
489
962
|
var CLI_PROXY_MODEL_CATALOG_CONTRACT_V1 = "cordisx.cli-proxy-model-catalog/v1";
|
|
490
963
|
var CLI_PROXY_GATEWAY_PLAN_CONTRACT_V1 = "cordisx.cli-proxy-gateway-plan/v1";
|
|
491
964
|
var CLI_PROXY_UPSTREAM_REGISTRY_SERVICE_V1 = "cliProxyUpstreams";
|
|
492
|
-
var
|
|
965
|
+
var ID_PATTERN2 = /^[a-z0-9][a-z0-9._-]{0,95}$/;
|
|
493
966
|
var PREFIX_PATTERN = /^[a-z0-9][a-z0-9._-]{0,95}$/;
|
|
494
|
-
var
|
|
967
|
+
var MAX_MODELS2 = 256;
|
|
495
968
|
var MAX_REGISTRATIONS = 64;
|
|
496
|
-
function
|
|
969
|
+
function rejection2(failure) {
|
|
497
970
|
return { status: "rejected", diagnostic: failure };
|
|
498
971
|
}
|
|
499
|
-
function
|
|
972
|
+
function isText2(value, maximum) {
|
|
500
973
|
return value.length > 0 && value.length <= maximum && value === value.trim() && !/[\u0000-\u001f\u007f]/.test(value);
|
|
501
974
|
}
|
|
502
975
|
function sameStrings(left, right) {
|
|
@@ -509,10 +982,10 @@ function validateDescriptor(descriptor) {
|
|
|
509
982
|
if (descriptor.$schema !== CLI_PROXY_UPSTREAM_DESCRIPTOR_SCHEMA_V1 || descriptor.contract !== CLI_PROXY_UPSTREAM_DESCRIPTOR_CONTRACT_V1 || descriptor.schemaVersion !== 1) {
|
|
510
983
|
return { code: "invalid-registration", field: "contract", message: "Unsupported upstream descriptor contract" };
|
|
511
984
|
}
|
|
512
|
-
if (!
|
|
985
|
+
if (!ID_PATTERN2.test(descriptor.upstreamId)) {
|
|
513
986
|
return { code: "invalid-registration", field: "upstreamId", message: "Invalid upstream id" };
|
|
514
987
|
}
|
|
515
|
-
if (!
|
|
988
|
+
if (!isText2(descriptor.displayName, 200)) {
|
|
516
989
|
return { code: "invalid-registration", field: "displayName", message: "Invalid upstream display name" };
|
|
517
990
|
}
|
|
518
991
|
if (descriptor.wireApi !== "responses" && descriptor.wireApi !== "chat-completions") {
|
|
@@ -531,7 +1004,7 @@ function validateDescriptor(descriptor) {
|
|
|
531
1004
|
message: "Request timeout is outside the supported range"
|
|
532
1005
|
};
|
|
533
1006
|
}
|
|
534
|
-
if (!
|
|
1007
|
+
if (!ID_PATTERN2.test(descriptor.group.groupId) || !isText2(descriptor.group.displayName, 200)) {
|
|
535
1008
|
return { code: "invalid-registration", field: "group", message: "Invalid upstream group" };
|
|
536
1009
|
}
|
|
537
1010
|
if (!Number.isSafeInteger(descriptor.group.order) || descriptor.group.order < -1e3 || descriptor.group.order > 1e3) {
|
|
@@ -541,17 +1014,17 @@ function validateDescriptor(descriptor) {
|
|
|
541
1014
|
if (!PREFIX_PATTERN.test(prefix)) {
|
|
542
1015
|
return { code: "invalid-registration", field: "prefix", message: "Invalid gateway prefix" };
|
|
543
1016
|
}
|
|
544
|
-
if (descriptor.models.length === 0 || descriptor.models.length >
|
|
1017
|
+
if (descriptor.models.length === 0 || descriptor.models.length > MAX_MODELS2) {
|
|
545
1018
|
return { code: "invalid-registration", field: "models", message: "Model routes are outside the supported range" };
|
|
546
1019
|
}
|
|
547
1020
|
const sourceModels = /* @__PURE__ */ new Set();
|
|
548
1021
|
const aliases = /* @__PURE__ */ new Map();
|
|
549
1022
|
const defaults = /* @__PURE__ */ new Set();
|
|
550
1023
|
for (const route of descriptor.models) {
|
|
551
|
-
if (!
|
|
1024
|
+
if (!isText2(route.sourceModelId, 256) || !isText2(route.modelId, 256)) {
|
|
552
1025
|
return { code: "invalid-registration", field: "models", message: "Invalid model identity" };
|
|
553
1026
|
}
|
|
554
|
-
if (route.displayName !== void 0 && !
|
|
1027
|
+
if (route.displayName !== void 0 && !isText2(route.displayName, 200)) {
|
|
555
1028
|
return { code: "invalid-registration", field: "models.displayName", message: "Invalid model display name" };
|
|
556
1029
|
}
|
|
557
1030
|
if (sourceModels.has(route.sourceModelId)) {
|
|
@@ -589,26 +1062,26 @@ function validateDescriptor(descriptor) {
|
|
|
589
1062
|
function compareOrderThenId(left, right) {
|
|
590
1063
|
return left.order - right.order || left.id.localeCompare(right.id);
|
|
591
1064
|
}
|
|
592
|
-
function
|
|
593
|
-
if (Array.isArray(value)) return value.map(
|
|
1065
|
+
function stableValue2(value) {
|
|
1066
|
+
if (Array.isArray(value)) return value.map(stableValue2);
|
|
594
1067
|
if (value === null || typeof value !== "object") return value;
|
|
595
1068
|
return Object.fromEntries(
|
|
596
1069
|
Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(
|
|
597
|
-
([key, item]) => [key,
|
|
1070
|
+
([key, item]) => [key, stableValue2(item)]
|
|
598
1071
|
)
|
|
599
1072
|
);
|
|
600
1073
|
}
|
|
601
|
-
function
|
|
602
|
-
return JSON.stringify(
|
|
1074
|
+
function stableStringify2(value) {
|
|
1075
|
+
return JSON.stringify(stableValue2(value));
|
|
603
1076
|
}
|
|
604
|
-
function
|
|
605
|
-
return `sha256:${
|
|
1077
|
+
function digest2(value) {
|
|
1078
|
+
return `sha256:${createHash4("sha256").update(stableStringify2(value)).digest("hex")}`;
|
|
606
1079
|
}
|
|
607
1080
|
var CliProxyUpstreamRegistryV1 = class {
|
|
608
|
-
constructor(pluginGeneration,
|
|
1081
|
+
constructor(pluginGeneration, sourceKey3) {
|
|
609
1082
|
this.pluginGeneration = pluginGeneration;
|
|
610
|
-
this.sourceKey =
|
|
611
|
-
if (!
|
|
1083
|
+
this.sourceKey = sourceKey3;
|
|
1084
|
+
if (!isText2(pluginGeneration, 256)) throw new Error("Invalid plugin generation");
|
|
612
1085
|
}
|
|
613
1086
|
pluginGeneration;
|
|
614
1087
|
sourceKey;
|
|
@@ -622,7 +1095,7 @@ var CliProxyUpstreamRegistryV1 = class {
|
|
|
622
1095
|
if (generationFailure !== void 0) return generationFailure;
|
|
623
1096
|
const current = this.entries.get(registration.descriptor.upstreamId);
|
|
624
1097
|
if (current !== void 0 && current.producer.pluginId !== producer.pluginId) {
|
|
625
|
-
return
|
|
1098
|
+
return rejection2({
|
|
626
1099
|
code: "conflicting-producer",
|
|
627
1100
|
field: "upstreamId",
|
|
628
1101
|
message: "Upstream is owned by another producer"
|
|
@@ -635,29 +1108,29 @@ var CliProxyUpstreamRegistryV1 = class {
|
|
|
635
1108
|
};
|
|
636
1109
|
}
|
|
637
1110
|
const validation = validateDescriptor(registration.descriptor);
|
|
638
|
-
if (validation !== void 0) return
|
|
639
|
-
const
|
|
640
|
-
if (!
|
|
641
|
-
return
|
|
1111
|
+
if (validation !== void 0) return rejection2(validation);
|
|
1112
|
+
const sourceKey3 = this.sourceKey(registration.source);
|
|
1113
|
+
if (!isText2(sourceKey3, 512)) {
|
|
1114
|
+
return rejection2({ code: "invalid-registration", field: "source", message: "Invalid upstream source reference" });
|
|
642
1115
|
}
|
|
643
1116
|
if (current !== void 0) {
|
|
644
1117
|
if (registration.descriptor.revision < current.descriptor.revision) {
|
|
645
|
-
return
|
|
1118
|
+
return rejection2({ code: "stale-revision", field: "revision", message: "Upstream revision is stale" });
|
|
646
1119
|
}
|
|
647
1120
|
if (registration.descriptor.revision === current.descriptor.revision) {
|
|
648
|
-
return
|
|
1121
|
+
return stableStringify2(registration.descriptor) === stableStringify2(current.descriptor) && sourceKey3 === current.sourceKey ? { status: "unchanged", registryRevision: this.revision } : rejection2({
|
|
649
1122
|
code: "stale-revision",
|
|
650
1123
|
field: "revision",
|
|
651
1124
|
message: "Revision was reused with different content"
|
|
652
1125
|
});
|
|
653
1126
|
}
|
|
654
1127
|
} else if (this.entries.size >= MAX_REGISTRATIONS) {
|
|
655
|
-
return
|
|
1128
|
+
return rejection2({ code: "capacity-exceeded", message: "Upstream registry capacity was reached" });
|
|
656
1129
|
}
|
|
657
1130
|
for (const [upstreamId, entry] of this.entries) {
|
|
658
1131
|
if (upstreamId === registration.descriptor.upstreamId) continue;
|
|
659
|
-
if (entry.sourceKey ===
|
|
660
|
-
return
|
|
1132
|
+
if (entry.sourceKey === sourceKey3) {
|
|
1133
|
+
return rejection2({
|
|
661
1134
|
code: "conflicting-source",
|
|
662
1135
|
field: "source",
|
|
663
1136
|
message: "Upstream source is already registered"
|
|
@@ -665,20 +1138,20 @@ var CliProxyUpstreamRegistryV1 = class {
|
|
|
665
1138
|
}
|
|
666
1139
|
if (entry.descriptor.enabled && registration.descriptor.enabled) {
|
|
667
1140
|
if ((entry.descriptor.prefix ?? entry.descriptor.upstreamId) === (registration.descriptor.prefix ?? registration.descriptor.upstreamId)) {
|
|
668
|
-
return
|
|
1141
|
+
return rejection2({
|
|
669
1142
|
code: "conflicting-prefix",
|
|
670
1143
|
field: "prefix",
|
|
671
1144
|
message: "Gateway prefix is already registered"
|
|
672
1145
|
});
|
|
673
1146
|
}
|
|
674
1147
|
if (entry.descriptor.group.groupId === registration.descriptor.group.groupId && (entry.descriptor.group.displayName !== registration.descriptor.group.displayName || entry.descriptor.group.order !== registration.descriptor.group.order)) {
|
|
675
|
-
return
|
|
1148
|
+
return rejection2({ code: "conflicting-group", field: "group", message: "Group metadata is inconsistent" });
|
|
676
1149
|
}
|
|
677
1150
|
}
|
|
678
1151
|
}
|
|
679
1152
|
this.entries.set(registration.descriptor.upstreamId, {
|
|
680
1153
|
source: registration.source,
|
|
681
|
-
sourceKey:
|
|
1154
|
+
sourceKey: sourceKey3,
|
|
682
1155
|
producer,
|
|
683
1156
|
descriptor: structuredClone(registration.descriptor)
|
|
684
1157
|
});
|
|
@@ -691,10 +1164,10 @@ var CliProxyUpstreamRegistryV1 = class {
|
|
|
691
1164
|
if (generationFailure !== void 0) return generationFailure;
|
|
692
1165
|
const current = this.entries.get(input.upstreamId);
|
|
693
1166
|
if (current === void 0) {
|
|
694
|
-
return
|
|
1167
|
+
return rejection2({ code: "not-found", field: "upstreamId", message: "Upstream is not registered" });
|
|
695
1168
|
}
|
|
696
1169
|
if (current.producer.pluginId !== producer.pluginId) {
|
|
697
|
-
return
|
|
1170
|
+
return rejection2({
|
|
698
1171
|
code: "conflicting-producer",
|
|
699
1172
|
field: "upstreamId",
|
|
700
1173
|
message: "Upstream is owned by another producer"
|
|
@@ -707,7 +1180,7 @@ var CliProxyUpstreamRegistryV1 = class {
|
|
|
707
1180
|
};
|
|
708
1181
|
}
|
|
709
1182
|
if (input.expectedRevision !== current.descriptor.revision) {
|
|
710
|
-
return
|
|
1183
|
+
return rejection2({ code: "stale-revision", field: "expectedRevision", message: "Upstream revision is stale" });
|
|
711
1184
|
}
|
|
712
1185
|
this.entries.delete(input.upstreamId);
|
|
713
1186
|
this.revision += 1;
|
|
@@ -718,7 +1191,7 @@ var CliProxyUpstreamRegistryV1 = class {
|
|
|
718
1191
|
if (this.disposed || registryGeneration !== this.pluginGeneration) {
|
|
719
1192
|
throw new Error("Upstream registry generation is stale");
|
|
720
1193
|
}
|
|
721
|
-
if (!
|
|
1194
|
+
if (!ID_PATTERN2.test(producer.pluginId) || !isText2(producer.pluginGeneration, 256)) {
|
|
722
1195
|
throw new Error("Invalid upstream producer authority");
|
|
723
1196
|
}
|
|
724
1197
|
const currentGeneration = this.producerGenerations.get(producer.pluginId);
|
|
@@ -816,7 +1289,7 @@ var CliProxyUpstreamRegistryV1 = class {
|
|
|
816
1289
|
),
|
|
817
1290
|
groups: orderedGroups
|
|
818
1291
|
};
|
|
819
|
-
return { ...base, catalogDigest:
|
|
1292
|
+
return { ...base, catalogDigest: digest2(base) };
|
|
820
1293
|
}
|
|
821
1294
|
gatewayPlan(pluginGeneration) {
|
|
822
1295
|
const catalog = this.catalog(pluginGeneration);
|
|
@@ -943,7 +1416,7 @@ function createCliProxyUpstreamRegistrarV1(registry, producer) {
|
|
|
943
1416
|
}
|
|
944
1417
|
|
|
945
1418
|
// src/service/upstream-context.ts
|
|
946
|
-
function
|
|
1419
|
+
function sourceKey2(source) {
|
|
947
1420
|
return JSON.stringify([source.source, source.pluginId, source.serviceId]);
|
|
948
1421
|
}
|
|
949
1422
|
function createCliProxyUpstreamContextProviderV1() {
|
|
@@ -952,7 +1425,7 @@ function createCliProxyUpstreamContextProviderV1() {
|
|
|
952
1425
|
create: ({ target, signal }) => {
|
|
953
1426
|
const registry = new CliProxyUpstreamRegistryV1(
|
|
954
1427
|
target.pluginGeneration,
|
|
955
|
-
|
|
1428
|
+
sourceKey2
|
|
956
1429
|
);
|
|
957
1430
|
const bindings = /* @__PURE__ */ new Set();
|
|
958
1431
|
let disposed = false;
|
|
@@ -991,7 +1464,8 @@ function createCliProxyUpstreamContextProviderV1() {
|
|
|
991
1464
|
|
|
992
1465
|
// src/service/gateway.ts
|
|
993
1466
|
var contextServices = Object.freeze([
|
|
994
|
-
createCliProxyUpstreamContextProviderV1()
|
|
1467
|
+
createCliProxyUpstreamContextProviderV1(),
|
|
1468
|
+
createCliProxyGatewayExtensionContextProviderV1()
|
|
995
1469
|
]);
|
|
996
1470
|
var CLI_PROXY_NATIVE_PROVIDER_ID = "cli-proxy-api";
|
|
997
1471
|
function activationError(stage, result) {
|
|
@@ -1000,6 +1474,15 @@ function activationError(stage, result) {
|
|
|
1000
1474
|
function assertPlan(value) {
|
|
1001
1475
|
if ("code" in value) throw new Error(`CLIProxyAPI gateway plan failed: ${value.code}`);
|
|
1002
1476
|
}
|
|
1477
|
+
function assertExtensionPlan(value) {
|
|
1478
|
+
if ("code" in value) throw new Error(`CLIProxyAPI gateway extension plan failed: ${value.code}`);
|
|
1479
|
+
}
|
|
1480
|
+
function combinedRevision(upstreamDigest, extensionDigest) {
|
|
1481
|
+
return `sha256:${createHash5("sha256").update(JSON.stringify([upstreamDigest, extensionDigest])).digest("hex")}`;
|
|
1482
|
+
}
|
|
1483
|
+
function safeValue(value) {
|
|
1484
|
+
return JSON.parse(JSON.stringify(value));
|
|
1485
|
+
}
|
|
1003
1486
|
function modelIds(value) {
|
|
1004
1487
|
if (value === null || typeof value !== "object" || Array.isArray(value)) return /* @__PURE__ */ new Set();
|
|
1005
1488
|
const data = value.data;
|
|
@@ -1023,11 +1506,11 @@ function nativeProviderCatalog(models) {
|
|
|
1023
1506
|
const routes = [...models].map((model) => ({ alias: model, gatewayModelId: model })).sort((left, right) => compareUtf8Json([left.alias], [right.alias]));
|
|
1024
1507
|
const defaultAlias = routes[0]?.alias;
|
|
1025
1508
|
if (defaultAlias === void 0) return void 0;
|
|
1026
|
-
const generation = `sha256:${
|
|
1027
|
-
const
|
|
1509
|
+
const generation = `sha256:${createHash5("sha256").update(JSON.stringify(routes.map((route) => route.gatewayModelId))).digest("hex")}`;
|
|
1510
|
+
const digest3 = `sha256:${createHash5("sha256").update(
|
|
1028
1511
|
JSON.stringify([generation, defaultAlias, routes.map((route) => [route.alias, route.gatewayModelId])])
|
|
1029
1512
|
).digest("hex")}`;
|
|
1030
|
-
return { generation, digest:
|
|
1513
|
+
return { generation, digest: digest3, defaultAlias, routes };
|
|
1031
1514
|
}
|
|
1032
1515
|
function relativePointer(collection, pointer) {
|
|
1033
1516
|
const prefix = `/${collection}`;
|
|
@@ -1036,9 +1519,11 @@ function relativePointer(collection, pointer) {
|
|
|
1036
1519
|
}
|
|
1037
1520
|
async function activateCliProxyGateway(context, input) {
|
|
1038
1521
|
const registry = context.cliProxyUpstreams;
|
|
1522
|
+
const extensionRegistry = context.cliProxyGatewayExtensions;
|
|
1039
1523
|
let active;
|
|
1040
1524
|
let transition = Promise.resolve();
|
|
1041
1525
|
let unsubscribe = () => void 0;
|
|
1526
|
+
let unsubscribeExtensions = () => void 0;
|
|
1042
1527
|
let disposePromise;
|
|
1043
1528
|
let gatewayHandle;
|
|
1044
1529
|
let publication;
|
|
@@ -1059,9 +1544,9 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1059
1544
|
refreshGatewayModels: () => scheduleModelRefresh()
|
|
1060
1545
|
};
|
|
1061
1546
|
const unbindGatewayUIState = bindGatewayUIState(uiState);
|
|
1062
|
-
const activate = async (catalog, plan) => {
|
|
1547
|
+
const activate = async (catalog, plan, extensionPlan, revision2) => {
|
|
1063
1548
|
gatewayHandle ??= await context.managedServices.register(cliProxyGatewayDefinition, {
|
|
1064
|
-
revision:
|
|
1549
|
+
revision: revision2
|
|
1065
1550
|
});
|
|
1066
1551
|
const handle = gatewayHandle;
|
|
1067
1552
|
const leases = [];
|
|
@@ -1106,6 +1591,14 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1106
1591
|
);
|
|
1107
1592
|
}
|
|
1108
1593
|
}
|
|
1594
|
+
for (const composition of extensionPlan.composition) {
|
|
1595
|
+
const acquired = await input.client.acquire(composition.source, { signal: input.signal });
|
|
1596
|
+
if (acquired.status !== "ready") {
|
|
1597
|
+
throw activationError(`${composition.connectionId} extension acquisition`, acquired);
|
|
1598
|
+
}
|
|
1599
|
+
leases.push(acquired.lease);
|
|
1600
|
+
sources.push({ source: composition.sourceAlias, lease: acquired.lease });
|
|
1601
|
+
}
|
|
1109
1602
|
const bindings = [
|
|
1110
1603
|
{
|
|
1111
1604
|
targetSlot: "codex-upstreams",
|
|
@@ -1114,6 +1607,19 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1114
1607
|
{
|
|
1115
1608
|
targetSlot: "openai-upstreams",
|
|
1116
1609
|
source: { kind: "safe-literal", value: plan.configuration["openai-compatibility"] }
|
|
1610
|
+
},
|
|
1611
|
+
{
|
|
1612
|
+
targetSlot: "gateway-extensions",
|
|
1613
|
+
source: {
|
|
1614
|
+
kind: "safe-literal",
|
|
1615
|
+
value: safeValue({
|
|
1616
|
+
enabled: true,
|
|
1617
|
+
active: extensionPlan.composition.length > 0,
|
|
1618
|
+
revision: extensionPlan.planDigest,
|
|
1619
|
+
adapters: extensionPlan.configuration.adapters,
|
|
1620
|
+
connections: extensionPlan.configuration.connections
|
|
1621
|
+
})
|
|
1622
|
+
}
|
|
1117
1623
|
}
|
|
1118
1624
|
];
|
|
1119
1625
|
for (const composition of plan.composition) {
|
|
@@ -1131,9 +1637,23 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1131
1637
|
});
|
|
1132
1638
|
}
|
|
1133
1639
|
}
|
|
1640
|
+
for (const composition of extensionPlan.composition) {
|
|
1641
|
+
bindings.push({
|
|
1642
|
+
targetSlot: "gateway-extensions",
|
|
1643
|
+
targetPointer: composition.originPointer,
|
|
1644
|
+
source: { kind: "source-origin", source: composition.sourceAlias, origin: "api" }
|
|
1645
|
+
});
|
|
1646
|
+
if (composition.authorizationPointer !== void 0) {
|
|
1647
|
+
bindings.push({
|
|
1648
|
+
targetSlot: "gateway-extensions",
|
|
1649
|
+
targetPointer: composition.authorizationPointer,
|
|
1650
|
+
source: { kind: "source-authorization", source: composition.sourceAlias }
|
|
1651
|
+
});
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1134
1654
|
const materialized = await input.client.materialize({
|
|
1135
1655
|
target: handle.binding,
|
|
1136
|
-
revision:
|
|
1656
|
+
revision: revision2,
|
|
1137
1657
|
sources,
|
|
1138
1658
|
bindings
|
|
1139
1659
|
}, { signal: input.signal });
|
|
@@ -1149,6 +1669,10 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1149
1669
|
const actualGatewayModels = await readGatewayModels();
|
|
1150
1670
|
const expectedGatewayModels = catalog.groups.flatMap(
|
|
1151
1671
|
(group) => group.providers.flatMap((provider) => provider.models.map((model) => model.gatewayModelId))
|
|
1672
|
+
).concat(
|
|
1673
|
+
extensionPlan.configuration.connections.flatMap(
|
|
1674
|
+
(connection) => connection.enabled ? connection.models.map((model) => model.gatewayModelId) : []
|
|
1675
|
+
)
|
|
1152
1676
|
);
|
|
1153
1677
|
const missingGatewayModels = expectedGatewayModels.filter((model) => !actualGatewayModels.has(model));
|
|
1154
1678
|
if (missingGatewayModels.length > 0) {
|
|
@@ -1215,7 +1739,10 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1215
1739
|
if (input.signal.aborted) return;
|
|
1216
1740
|
const catalog = registry.catalog(input.owner.pluginGeneration);
|
|
1217
1741
|
if ("code" in catalog) throw new Error(`CLIProxyAPI catalog failed: ${catalog.code}`);
|
|
1218
|
-
|
|
1742
|
+
const extensionPlan = extensionRegistry.plan(input.owner.pluginGeneration);
|
|
1743
|
+
assertExtensionPlan(extensionPlan);
|
|
1744
|
+
const revision2 = combinedRevision(catalog.catalogDigest, extensionPlan.planDigest);
|
|
1745
|
+
if (active?.revision === revision2) return;
|
|
1219
1746
|
const previous = active;
|
|
1220
1747
|
active = void 0;
|
|
1221
1748
|
activeRevision = void 0;
|
|
@@ -1224,16 +1751,16 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1224
1751
|
assertPlan(plan);
|
|
1225
1752
|
if (gatewayHandle === void 0) {
|
|
1226
1753
|
gatewayHandle = await context.managedServices.register(cliProxyGatewayDefinition, {
|
|
1227
|
-
revision:
|
|
1754
|
+
revision: revision2
|
|
1228
1755
|
});
|
|
1229
1756
|
}
|
|
1230
1757
|
if (input.signal.aborted) return;
|
|
1231
|
-
const cleanup = await activate(catalog, plan);
|
|
1758
|
+
const cleanup = await activate(catalog, plan, extensionPlan, revision2);
|
|
1232
1759
|
if (input.signal.aborted) {
|
|
1233
1760
|
await cleanup();
|
|
1234
1761
|
return;
|
|
1235
1762
|
}
|
|
1236
|
-
active = { revision:
|
|
1763
|
+
active = { revision: revision2, dispose: cleanup };
|
|
1237
1764
|
};
|
|
1238
1765
|
const schedule = () => {
|
|
1239
1766
|
const pending = transition.then(reconcile);
|
|
@@ -1252,6 +1779,7 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1252
1779
|
if (disposePromise !== void 0) return disposePromise;
|
|
1253
1780
|
disposePromise = (async () => {
|
|
1254
1781
|
unsubscribe();
|
|
1782
|
+
unsubscribeExtensions();
|
|
1255
1783
|
unbindGatewayUIState();
|
|
1256
1784
|
await transition;
|
|
1257
1785
|
const failures = [];
|
|
@@ -1282,6 +1810,9 @@ async function activateCliProxyGateway(context, input) {
|
|
|
1282
1810
|
unsubscribe = registry.subscribe(() => {
|
|
1283
1811
|
void schedule().catch(() => void 0);
|
|
1284
1812
|
});
|
|
1813
|
+
unsubscribeExtensions = extensionRegistry.subscribe(() => {
|
|
1814
|
+
void schedule().catch(() => void 0);
|
|
1815
|
+
});
|
|
1285
1816
|
const onAbort = () => {
|
|
1286
1817
|
void dispose().catch(() => void 0);
|
|
1287
1818
|
};
|
|
@@ -1312,10 +1843,21 @@ var gatewayApply = async (context, input) => {
|
|
|
1312
1843
|
await activateCliProxyGateway(context, input);
|
|
1313
1844
|
};
|
|
1314
1845
|
var apply = Object.assign(gatewayApply, {
|
|
1315
|
-
inject: [
|
|
1846
|
+
inject: [
|
|
1847
|
+
"managedServices",
|
|
1848
|
+
CLI_PROXY_UPSTREAM_REGISTRY_SERVICE_V1,
|
|
1849
|
+
CLI_PROXY_GATEWAY_EXTENSION_REGISTRY_SERVICE_V1
|
|
1850
|
+
]
|
|
1316
1851
|
});
|
|
1317
1852
|
export {
|
|
1853
|
+
CLI_PROXY_GATEWAY_ADAPTER_CONTRACT_V1,
|
|
1854
|
+
CLI_PROXY_GATEWAY_ADAPTER_SCHEMA_V1,
|
|
1318
1855
|
CLI_PROXY_GATEWAY_CODEX_UPSTREAMS_SCHEMA_V1,
|
|
1856
|
+
CLI_PROXY_GATEWAY_CONNECTION_CONTRACT_V1,
|
|
1857
|
+
CLI_PROXY_GATEWAY_CONNECTION_SCHEMA_V1,
|
|
1858
|
+
CLI_PROXY_GATEWAY_EXTENSION_PLAN_CONTRACT_V1,
|
|
1859
|
+
CLI_PROXY_GATEWAY_EXTENSION_PLAN_SCHEMA_V1,
|
|
1860
|
+
CLI_PROXY_GATEWAY_EXTENSION_REGISTRY_SERVICE_V1,
|
|
1319
1861
|
CLI_PROXY_GATEWAY_MANAGEMENT_V1,
|
|
1320
1862
|
CLI_PROXY_GATEWAY_MODEL_CATALOG_SCHEMA_V1,
|
|
1321
1863
|
CLI_PROXY_GATEWAY_OPENAI_UPSTREAMS_SCHEMA_V1,
|
|
@@ -1326,12 +1868,14 @@ export {
|
|
|
1326
1868
|
CLI_PROXY_UPSTREAM_DESCRIPTOR_CONTRACT_V1,
|
|
1327
1869
|
CLI_PROXY_UPSTREAM_DESCRIPTOR_SCHEMA_V1,
|
|
1328
1870
|
CLI_PROXY_UPSTREAM_REGISTRY_SERVICE_V1,
|
|
1871
|
+
CliProxyGatewayExtensionRegistryV1,
|
|
1329
1872
|
CliProxyUpstreamRegistryV1,
|
|
1330
1873
|
activateCliProxyGateway,
|
|
1331
1874
|
apply,
|
|
1332
1875
|
cliProxyGatewayDefinition,
|
|
1333
1876
|
cliProxyGatewayDefinitionRevision,
|
|
1334
1877
|
contextServices,
|
|
1878
|
+
createCliProxyGatewayExtensionRegistrarV1,
|
|
1335
1879
|
createCliProxyUpstreamRegistrarV1,
|
|
1336
1880
|
managedServiceUI
|
|
1337
1881
|
};
|