@the-open-engine/zeroshot 6.30.2 → 6.31.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/lib/agent-cli-provider/adapters/acp.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/acp.js +7 -11
- package/lib/agent-cli-provider/adapters/acp.js.map +1 -1
- package/lib/agent-cli-provider/adapters/omp-policy.d.ts +4 -0
- package/lib/agent-cli-provider/adapters/omp-policy.d.ts.map +1 -0
- package/lib/agent-cli-provider/adapters/omp-policy.js +47 -0
- package/lib/agent-cli-provider/adapters/omp-policy.js.map +1 -0
- package/lib/agent-cli-provider/adapters/omp.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/omp.js +8 -158
- package/lib/agent-cli-provider/adapters/omp.js.map +1 -1
- package/lib/agent-cli-provider/adapters/pi.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/pi.js +12 -124
- package/lib/agent-cli-provider/adapters/pi.js.map +1 -1
- package/lib/agent-cli-provider/assistant-stream.d.ts +27 -0
- package/lib/agent-cli-provider/assistant-stream.d.ts.map +1 -0
- package/lib/agent-cli-provider/assistant-stream.js +119 -0
- package/lib/agent-cli-provider/assistant-stream.js.map +1 -0
- package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-actions.js +42 -1
- package/lib/agent-cli-provider/contract-actions.js.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.js +68 -38
- package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
- package/lib/agent-cli-provider/contract-support.d.ts +5 -6
- package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-support.js +99 -6
- package/lib/agent-cli-provider/contract-support.js.map +1 -1
- package/lib/agent-cli-provider/index.d.ts +8 -6
- package/lib/agent-cli-provider/index.d.ts.map +1 -1
- package/lib/agent-cli-provider/index.js +34 -10
- package/lib/agent-cli-provider/index.js.map +1 -1
- package/lib/agent-cli-provider/omp/auth-policy.d.ts +31 -0
- package/lib/agent-cli-provider/omp/auth-policy.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/auth-policy.js +98 -0
- package/lib/agent-cli-provider/omp/auth-policy.js.map +1 -0
- package/lib/agent-cli-provider/{omp-release.d.ts → omp/release.d.ts} +1 -1
- package/lib/agent-cli-provider/omp/release.d.ts.map +1 -0
- package/lib/agent-cli-provider/{omp-release.js → omp/release.js} +1 -1
- package/lib/agent-cli-provider/omp/release.js.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-bounds.d.ts → omp/rpc-bounds.d.ts} +1 -1
- package/lib/agent-cli-provider/omp/rpc-bounds.d.ts.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-bounds.js → omp/rpc-bounds.js} +1 -1
- package/lib/agent-cli-provider/omp/rpc-bounds.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.d.ts +19 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.js +109 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.d.ts +27 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.js +135 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.d.ts +3 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.js +205 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.d.ts +80 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.js +86 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver.d.ts +3 -0
- package/lib/agent-cli-provider/omp/rpc-driver.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver.js +6 -0
- package/lib/agent-cli-provider/omp/rpc-driver.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.d.ts +8 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.js +59 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-events.d.ts +16 -0
- package/lib/agent-cli-provider/omp/rpc-events.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-events.js +115 -0
- package/lib/agent-cli-provider/omp/rpc-events.js.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-protocol.d.ts → omp/rpc-protocol-contract.d.ts} +1 -13
- package/lib/agent-cli-provider/omp/rpc-protocol-contract.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-protocol-contract.js +54 -0
- package/lib/agent-cli-provider/omp/rpc-protocol-contract.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.d.ts +15 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.js +208 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.js.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-session.d.ts → omp/rpc-session.d.ts} +1 -1
- package/lib/agent-cli-provider/omp/rpc-session.d.ts.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-session.js → omp/rpc-session.js} +1 -1
- package/lib/agent-cli-provider/omp/rpc-session.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-contract.d.ts +34 -0
- package/lib/agent-cli-provider/omp/sdk-contract.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-contract.js +81 -0
- package/lib/agent-cli-provider/omp/sdk-contract.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.d.ts +6 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.js +44 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.js +13 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.d.ts +18 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.js +80 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.d.ts +51 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.js +154 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.d.ts +26 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.js +117 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.d.ts +7 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.js +204 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.d.ts +3 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.js +145 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.d.ts +4 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.js +183 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.d.ts +8 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.js +170 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.js +74 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.d.ts +94 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.js +54 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.d.ts +18 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.js +229 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.d.ts +7 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.js +28 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.d.ts +29 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.js +110 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.d.ts +3 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.js +86 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.d.ts +26 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.js +148 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.js +198 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.d.ts +4 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.js +163 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.d.ts +18 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.js +148 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.d.ts +3 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.js +22 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.d.ts +68 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.js +19 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.d.ts +14 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.js +112 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-settings.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings.js +16 -0
- package/lib/agent-cli-provider/omp/sdk-settings.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.d.ts +11 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.js +171 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.js +94 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.js +175 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.js +216 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.d.ts +11 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.js +265 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.d.ts +148 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.js +84 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.d.ts +4 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.js +9 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.js.map +1 -0
- package/lib/agent-cli-provider/process-runner.d.ts +1 -0
- package/lib/agent-cli-provider/process-runner.d.ts.map +1 -1
- package/lib/agent-cli-provider/process-runner.js +19 -6
- package/lib/agent-cli-provider/process-runner.js.map +1 -1
- package/lib/agent-cli-provider/provider-registry.d.ts +18 -4
- package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -1
- package/lib/agent-cli-provider/provider-registry.js +21 -7
- package/lib/agent-cli-provider/provider-registry.js.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.d.ts +10 -1
- package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.js +378 -11
- package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
- package/lib/agent-cli-provider/types.d.ts +110 -2
- package/lib/agent-cli-provider/types.d.ts.map +1 -1
- package/lib/agent-cli-provider/types.js.map +1 -1
- package/npm-shrinkwrap.json +18116 -0
- package/package.json +16 -3
- package/scripts/omp/bun-ffi.d.ts +28 -0
- package/scripts/omp/host-supervisor-cleanup.ts +100 -0
- package/scripts/omp/host-supervisor-launch.ts +38 -0
- package/scripts/omp/host-supervisor-native.ts +181 -0
- package/scripts/omp/host-supervisor-tracker.ts +258 -0
- package/scripts/omp/host-supervisor.ts +298 -0
- package/scripts/omp/promise-gate.ts +13 -0
- package/scripts/omp/runtime-identities.js +283 -0
- package/scripts/omp/runtime-lock.js +232 -0
- package/scripts/omp/runtime-release.js +105 -0
- package/scripts/omp/runtime.js +33 -0
- package/scripts/omp/sidecar.ts +124 -0
- package/scripts/opcore-introduced-check.js +5 -0
- package/scripts/release-preflight.js +19 -0
- package/src/agent-cli-provider/adapters/acp.ts +18 -17
- package/src/agent-cli-provider/adapters/omp-policy.ts +45 -0
- package/src/agent-cli-provider/adapters/omp.ts +9 -155
- package/src/agent-cli-provider/adapters/pi.ts +15 -145
- package/src/agent-cli-provider/assistant-stream.ts +155 -0
- package/src/agent-cli-provider/contract-actions.ts +14 -2
- package/src/agent-cli-provider/contract-invoke.ts +77 -40
- package/src/agent-cli-provider/contract-support.ts +83 -12
- package/src/agent-cli-provider/index.ts +60 -5
- package/src/agent-cli-provider/omp/auth-policy.ts +126 -0
- package/src/agent-cli-provider/omp/rpc-driver-channel.ts +144 -0
- package/src/agent-cli-provider/omp/rpc-driver-dispatch.ts +177 -0
- package/src/agent-cli-provider/omp/rpc-driver-runner.ts +199 -0
- package/src/agent-cli-provider/omp/rpc-driver-state.ts +165 -0
- package/src/agent-cli-provider/omp/rpc-driver.ts +8 -0
- package/src/agent-cli-provider/omp/rpc-event-lines.ts +58 -0
- package/src/agent-cli-provider/omp/rpc-events.ts +154 -0
- package/src/agent-cli-provider/omp/rpc-protocol-contract.ts +77 -0
- package/src/agent-cli-provider/{omp-rpc-protocol.ts → omp/rpc-protocol.ts} +9 -111
- package/src/agent-cli-provider/omp/sdk-contract.ts +123 -0
- package/src/agent-cli-provider/omp/sdk-process-credentials.ts +55 -0
- package/src/agent-cli-provider/omp/sdk-process-error.ts +9 -0
- package/src/agent-cli-provider/omp/sdk-process-io.ts +92 -0
- package/src/agent-cli-provider/omp/sdk-process-private-runtime.ts +249 -0
- package/src/agent-cli-provider/omp/sdk-process-result.ts +181 -0
- package/src/agent-cli-provider/omp/sdk-process-runner.ts +281 -0
- package/src/agent-cli-provider/omp/sdk-protocol-collector.ts +140 -0
- package/src/agent-cli-provider/omp/sdk-protocol-frame.ts +260 -0
- package/src/agent-cli-provider/omp/sdk-protocol-request.ts +181 -0
- package/src/agent-cli-provider/omp/sdk-protocol-result.ts +80 -0
- package/src/agent-cli-provider/omp/sdk-protocol-types.ts +156 -0
- package/src/agent-cli-provider/omp/sdk-protocol-value.ts +234 -0
- package/src/agent-cli-provider/omp/sdk-protocol.ts +46 -0
- package/src/agent-cli-provider/omp/sdk-runtime.ts +159 -0
- package/src/agent-cli-provider/omp/sdk-settings-auth.ts +78 -0
- package/src/agent-cli-provider/omp/sdk-settings-constants.ts +147 -0
- package/src/agent-cli-provider/omp/sdk-settings-model-fields.ts +233 -0
- package/src/agent-cli-provider/omp/sdk-settings-model.ts +238 -0
- package/src/agent-cli-provider/omp/sdk-settings-normalize.ts +242 -0
- package/src/agent-cli-provider/omp/sdk-settings-selector.ts +28 -0
- package/src/agent-cli-provider/omp/sdk-settings-types.ts +88 -0
- package/src/agent-cli-provider/omp/sdk-settings-values.ts +118 -0
- package/src/agent-cli-provider/omp/sdk-settings.ts +33 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-context.ts +199 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-credentials.ts +100 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-execute.ts +201 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-output.ts +235 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-runtime.ts +244 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-types.ts +173 -0
- package/src/agent-cli-provider/omp/sdk-sidecar.ts +3 -0
- package/src/agent-cli-provider/process-runner.ts +22 -8
- package/src/agent-cli-provider/provider-registry.ts +29 -10
- package/src/agent-cli-provider/single-agent-runtime.ts +444 -18
- package/src/agent-cli-provider/types.ts +131 -3
- package/src/command-cleanup-ownership.js +15 -0
- package/task-lib/omp-sdk-runtime.js +8 -0
- package/task-lib/runner.js +121 -40
- package/task-lib/sdk-watcher.js +154 -0
- package/lib/agent-cli-provider/omp-release.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-release.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-bounds.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-bounds.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-driver.d.ts +0 -40
- package/lib/agent-cli-provider/omp-rpc-driver.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-driver.js +0 -519
- package/lib/agent-cli-provider/omp-rpc-driver.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-events.d.ts +0 -28
- package/lib/agent-cli-provider/omp-rpc-events.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-events.js +0 -264
- package/lib/agent-cli-provider/omp-rpc-events.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-protocol.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-protocol.js +0 -272
- package/lib/agent-cli-provider/omp-rpc-protocol.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-session.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-session.js.map +0 -1
- package/src/agent-cli-provider/omp-rpc-driver.ts +0 -639
- package/src/agent-cli-provider/omp-rpc-events.ts +0 -318
- /package/src/agent-cli-provider/{omp-release.ts → omp/release.ts} +0 -0
- /package/src/agent-cli-provider/{omp-rpc-bounds.ts → omp/rpc-bounds.ts} +0 -0
- /package/src/agent-cli-provider/{omp-rpc-session.ts → omp/rpc-session.ts} +0 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { OMP_SDK_REASONING_EFFORTS } from './sdk-settings-types';
|
|
2
|
+
|
|
3
|
+
export const LEVELS = ['level1', 'level2', 'level3'] as const;
|
|
4
|
+
export const EFFORTS = OMP_SDK_REASONING_EFFORTS;
|
|
5
|
+
export const APIS = [
|
|
6
|
+
'openai-completions',
|
|
7
|
+
'openai-responses',
|
|
8
|
+
'openai-codex-responses',
|
|
9
|
+
'azure-openai-responses',
|
|
10
|
+
'anthropic-messages',
|
|
11
|
+
'bedrock-converse-stream',
|
|
12
|
+
'google-generative-ai',
|
|
13
|
+
'google-gemini-cli',
|
|
14
|
+
'google-vertex',
|
|
15
|
+
] as const;
|
|
16
|
+
export const INPUT_TYPES = ['text', 'image'] as const;
|
|
17
|
+
export const THINKING_MODES = [
|
|
18
|
+
'effort',
|
|
19
|
+
'budget',
|
|
20
|
+
'google-level',
|
|
21
|
+
'anthropic-adaptive',
|
|
22
|
+
'anthropic-budget-effort',
|
|
23
|
+
] as const;
|
|
24
|
+
export const COMPAT_FIELDS = new Set([
|
|
25
|
+
'supportsStore',
|
|
26
|
+
'supportsDeveloperRole',
|
|
27
|
+
'supportsMultipleSystemMessages',
|
|
28
|
+
'supportsReasoningEffort',
|
|
29
|
+
'reasoningEffortMap',
|
|
30
|
+
'maxTokensField',
|
|
31
|
+
'supportsUsageInStreaming',
|
|
32
|
+
'requiresToolResultName',
|
|
33
|
+
'requiresMistralToolIds',
|
|
34
|
+
'requiresAssistantAfterToolResult',
|
|
35
|
+
'requiresThinkingAsText',
|
|
36
|
+
'reasoningContentField',
|
|
37
|
+
'requiresReasoningContentForToolCalls',
|
|
38
|
+
'allowsSyntheticReasoningContentForToolCalls',
|
|
39
|
+
'requiresAssistantContentForToolCalls',
|
|
40
|
+
'supportsToolChoice',
|
|
41
|
+
'supportsForcedToolChoice',
|
|
42
|
+
'disableReasoningOnForcedToolChoice',
|
|
43
|
+
'disableReasoningOnToolChoice',
|
|
44
|
+
'thinkingFormat',
|
|
45
|
+
'openRouterRouting',
|
|
46
|
+
'vercelGatewayRouting',
|
|
47
|
+
'cacheControlFormat',
|
|
48
|
+
'supportsStrictMode',
|
|
49
|
+
'toolStrictMode',
|
|
50
|
+
'streamIdleTimeoutMs',
|
|
51
|
+
'supportsLongPromptCacheRetention',
|
|
52
|
+
'supportsReasoningParams',
|
|
53
|
+
'alwaysSendMaxTokens',
|
|
54
|
+
'strictResponsesPairing',
|
|
55
|
+
'supportsImageDetailOriginal',
|
|
56
|
+
'supportsEagerToolInputStreaming',
|
|
57
|
+
'allowAnthropicHeaderOverrides',
|
|
58
|
+
'requiresToolResultId',
|
|
59
|
+
'replayUnsignedThinking',
|
|
60
|
+
'promptCacheMode',
|
|
61
|
+
'promptCacheMinimumTokens',
|
|
62
|
+
'promptCacheMaximumCheckpoints',
|
|
63
|
+
'whenThinking',
|
|
64
|
+
'extraBody',
|
|
65
|
+
]);
|
|
66
|
+
export const COMPAT_STRING_ENUMS = {
|
|
67
|
+
maxTokensField: ['max_completion_tokens', 'max_tokens'],
|
|
68
|
+
reasoningContentField: ['reasoning_content', 'reasoning', 'reasoning_text'],
|
|
69
|
+
thinkingFormat: ['openai', 'openrouter', 'zai', 'qwen', 'qwen-chat-template'],
|
|
70
|
+
cacheControlFormat: ['anthropic'],
|
|
71
|
+
toolStrictMode: ['all_strict', 'none'],
|
|
72
|
+
promptCacheMode: ['none', 'automatic', 'explicit'],
|
|
73
|
+
} as const;
|
|
74
|
+
export const COMPAT_NUMBER_FIELDS = new Set([
|
|
75
|
+
'streamIdleTimeoutMs',
|
|
76
|
+
'promptCacheMinimumTokens',
|
|
77
|
+
'promptCacheMaximumCheckpoints',
|
|
78
|
+
]);
|
|
79
|
+
export const COMPAT_RECORD_FIELDS = new Set([
|
|
80
|
+
'reasoningEffortMap',
|
|
81
|
+
'openRouterRouting',
|
|
82
|
+
'vercelGatewayRouting',
|
|
83
|
+
]);
|
|
84
|
+
export const PROVIDER_FIELDS = new Set([
|
|
85
|
+
'baseUrl',
|
|
86
|
+
'apiKey',
|
|
87
|
+
'api',
|
|
88
|
+
'headers',
|
|
89
|
+
'compat',
|
|
90
|
+
'remoteCompaction',
|
|
91
|
+
'authHeader',
|
|
92
|
+
'auth',
|
|
93
|
+
'discovery',
|
|
94
|
+
'models',
|
|
95
|
+
'modelOverrides',
|
|
96
|
+
'disableStrictTools',
|
|
97
|
+
'transport',
|
|
98
|
+
]);
|
|
99
|
+
export const MODEL_FIELDS = new Set([
|
|
100
|
+
'id',
|
|
101
|
+
'name',
|
|
102
|
+
'api',
|
|
103
|
+
'baseUrl',
|
|
104
|
+
'reasoning',
|
|
105
|
+
'thinking',
|
|
106
|
+
'input',
|
|
107
|
+
'supportsTools',
|
|
108
|
+
'cost',
|
|
109
|
+
'premiumMultiplier',
|
|
110
|
+
'contextWindow',
|
|
111
|
+
'maxTokens',
|
|
112
|
+
'omitMaxOutputTokens',
|
|
113
|
+
'headers',
|
|
114
|
+
'compat',
|
|
115
|
+
'contextPromotionTarget',
|
|
116
|
+
'compactionModel',
|
|
117
|
+
'remoteCompaction',
|
|
118
|
+
]);
|
|
119
|
+
export const MODEL_OVERRIDE_FIELDS = new Set(
|
|
120
|
+
[...MODEL_FIELDS].filter((field) => field !== 'id' && field !== 'api' && field !== 'baseUrl')
|
|
121
|
+
);
|
|
122
|
+
export const THINKING_FIELDS = new Set([
|
|
123
|
+
'mode',
|
|
124
|
+
'efforts',
|
|
125
|
+
'defaultLevel',
|
|
126
|
+
'effortMap',
|
|
127
|
+
'supportsDisplay',
|
|
128
|
+
'minLevel',
|
|
129
|
+
'maxLevel',
|
|
130
|
+
'levels',
|
|
131
|
+
]);
|
|
132
|
+
export const COST_FIELDS = new Set(['input', 'output', 'cacheRead', 'cacheWrite']);
|
|
133
|
+
export const TOP_LEVEL_FIELDS = new Set([
|
|
134
|
+
'transport',
|
|
135
|
+
'minLevel',
|
|
136
|
+
'defaultLevel',
|
|
137
|
+
'maxLevel',
|
|
138
|
+
'levelOverrides',
|
|
139
|
+
'modelsConfig',
|
|
140
|
+
'auth',
|
|
141
|
+
'tools',
|
|
142
|
+
'nestedAgents',
|
|
143
|
+
'mcp',
|
|
144
|
+
]);
|
|
145
|
+
export const ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
146
|
+
export const PROVIDER_ID = /^[a-z0-9][a-z0-9._-]*$/;
|
|
147
|
+
export const MODEL_COMPONENT = /^\S+$/;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { invalidField } from '../contract-errors';
|
|
2
|
+
import { isRecord } from '../json';
|
|
3
|
+
import {
|
|
4
|
+
APIS,
|
|
5
|
+
COMPAT_FIELDS,
|
|
6
|
+
COMPAT_NUMBER_FIELDS,
|
|
7
|
+
COMPAT_RECORD_FIELDS,
|
|
8
|
+
COMPAT_STRING_ENUMS,
|
|
9
|
+
COST_FIELDS,
|
|
10
|
+
EFFORTS,
|
|
11
|
+
INPUT_TYPES,
|
|
12
|
+
MODEL_FIELDS,
|
|
13
|
+
MODEL_OVERRIDE_FIELDS,
|
|
14
|
+
MODEL_COMPONENT,
|
|
15
|
+
THINKING_FIELDS,
|
|
16
|
+
THINKING_MODES,
|
|
17
|
+
} from './sdk-settings-constants';
|
|
18
|
+
import type { OmpModelDefinition } from './sdk-settings-types';
|
|
19
|
+
import {
|
|
20
|
+
booleanValue,
|
|
21
|
+
emptyHeaders,
|
|
22
|
+
enumValue,
|
|
23
|
+
nonEmptyString,
|
|
24
|
+
nonNegativeNumber,
|
|
25
|
+
rejectUnknown,
|
|
26
|
+
safeUrl,
|
|
27
|
+
} from './sdk-settings-values';
|
|
28
|
+
|
|
29
|
+
export function normalizeModelDefinition(value: unknown, field: string): OmpModelDefinition {
|
|
30
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
31
|
+
rejectUnknown(value, MODEL_FIELDS, field);
|
|
32
|
+
if (typeof value.id !== 'string' || value.id.length === 0 || !MODEL_COMPONENT.test(value.id)) {
|
|
33
|
+
invalidField(`${field}.id`, 'Custom model id must be a non-empty string without whitespace.');
|
|
34
|
+
}
|
|
35
|
+
const result: { [field: string]: unknown; id: string } = { id: value.id };
|
|
36
|
+
copyModelFields(value, result, field, true);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function normalizeModelOverride(value: unknown, field: string): Record<string, unknown> {
|
|
41
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
42
|
+
rejectUnknown(value, MODEL_OVERRIDE_FIELDS, field);
|
|
43
|
+
const result: Record<string, unknown> = {};
|
|
44
|
+
copyModelFields(value, result, field, false);
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function copyModelFields(
|
|
49
|
+
value: Record<string, unknown>,
|
|
50
|
+
result: Record<string, unknown>,
|
|
51
|
+
field: string,
|
|
52
|
+
allowApiAndBaseUrl: boolean
|
|
53
|
+
): void {
|
|
54
|
+
if (value.name !== undefined) result.name = nonEmptyString(value.name, `${field}.name`);
|
|
55
|
+
if (allowApiAndBaseUrl && value.api !== undefined) {
|
|
56
|
+
result.api = enumValue(value.api, APIS, `${field}.api`);
|
|
57
|
+
}
|
|
58
|
+
if (allowApiAndBaseUrl && value.baseUrl !== undefined) {
|
|
59
|
+
result.baseUrl = safeUrl(value.baseUrl, `${field}.baseUrl`);
|
|
60
|
+
}
|
|
61
|
+
for (const key of ['reasoning', 'supportsTools', 'omitMaxOutputTokens'] as const) {
|
|
62
|
+
if (value[key] !== undefined) result[key] = booleanValue(value[key], `${field}.${key}`);
|
|
63
|
+
}
|
|
64
|
+
for (const key of ['premiumMultiplier', 'contextWindow', 'maxTokens'] as const) {
|
|
65
|
+
if (value[key] !== undefined) {
|
|
66
|
+
result[key] = nonNegativeNumber(value[key], `${field}.${key}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const key of ['contextPromotionTarget', 'compactionModel'] as const) {
|
|
70
|
+
if (value[key] !== undefined) result[key] = nonEmptyString(value[key], `${field}.${key}`);
|
|
71
|
+
}
|
|
72
|
+
if (value.input !== undefined) {
|
|
73
|
+
if (!Array.isArray(value.input) || value.input.length === 0) {
|
|
74
|
+
invalidField(`${field}.input`, 'input must be a non-empty text/image array.');
|
|
75
|
+
}
|
|
76
|
+
result.input = value.input.map((item, index) =>
|
|
77
|
+
enumValue(item, INPUT_TYPES, `${field}.input[${index}]`)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
if (value.thinking !== undefined) {
|
|
81
|
+
result.thinking = normalizeThinking(value.thinking, `${field}.thinking`);
|
|
82
|
+
}
|
|
83
|
+
if (value.cost !== undefined) {
|
|
84
|
+
result.cost = normalizeCost(value.cost, `${field}.cost`, allowApiAndBaseUrl);
|
|
85
|
+
}
|
|
86
|
+
if (value.headers !== undefined) result.headers = emptyHeaders(value.headers, `${field}.headers`);
|
|
87
|
+
if (value.compat !== undefined) result.compat = normalizeCompat(value.compat, `${field}.compat`);
|
|
88
|
+
if (value.remoteCompaction !== undefined) {
|
|
89
|
+
invalidField(`${field}.remoteCompaction`, 'Remote compaction config is not accepted.');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function normalizeThinking(value: unknown, field: string): Record<string, unknown> {
|
|
94
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
95
|
+
rejectUnknown(value, THINKING_FIELDS, field);
|
|
96
|
+
const result: Record<string, unknown> = {
|
|
97
|
+
mode: enumValue(value.mode, THINKING_MODES, `${field}.mode`),
|
|
98
|
+
};
|
|
99
|
+
for (const key of ['efforts', 'levels'] as const) {
|
|
100
|
+
if (value[key] !== undefined) {
|
|
101
|
+
if (!Array.isArray(value[key]) || value[key].length === 0) {
|
|
102
|
+
invalidField(`${field}.${key}`, `${key} must be a non-empty effort array.`);
|
|
103
|
+
}
|
|
104
|
+
result[key] = value[key].map((item, index) =>
|
|
105
|
+
enumValue(item, EFFORTS, `${field}.${key}[${index}]`)
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const key of ['defaultLevel', 'minLevel', 'maxLevel'] as const) {
|
|
110
|
+
if (value[key] !== undefined) {
|
|
111
|
+
result[key] = enumValue(value[key], EFFORTS, `${field}.${key}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (value.supportsDisplay !== undefined) {
|
|
115
|
+
result.supportsDisplay = booleanValue(value.supportsDisplay, `${field}.supportsDisplay`);
|
|
116
|
+
}
|
|
117
|
+
if (value.effortMap !== undefined) {
|
|
118
|
+
result.effortMap = normalizeEffortMap(value.effortMap, `${field}.effortMap`);
|
|
119
|
+
}
|
|
120
|
+
const hasEfforts = result.efforts !== undefined || result.levels !== undefined;
|
|
121
|
+
if (!hasEfforts && (result.minLevel === undefined || result.maxLevel === undefined)) {
|
|
122
|
+
invalidField(field, 'thinking requires efforts, levels, or both minLevel and maxLevel.');
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function normalizeEffortMap(value: unknown, field: string): Record<string, string> {
|
|
128
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
129
|
+
rejectUnknown(value, new Set(EFFORTS), field);
|
|
130
|
+
const result: Record<string, string> = {};
|
|
131
|
+
for (const [effort, mapped] of Object.entries(value)) {
|
|
132
|
+
result[effort] = nonEmptyString(mapped, `${field}.${effort}`);
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function normalizeCost(
|
|
138
|
+
value: unknown,
|
|
139
|
+
field: string,
|
|
140
|
+
requireAllFields: boolean
|
|
141
|
+
): Record<string, number> {
|
|
142
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
143
|
+
rejectUnknown(value, COST_FIELDS, field);
|
|
144
|
+
if (requireAllFields) {
|
|
145
|
+
const missing = [...COST_FIELDS].find((key) => value[key] === undefined);
|
|
146
|
+
if (missing !== undefined) {
|
|
147
|
+
invalidField(`${field}.${missing}`, `${field}.${missing} is required.`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const result: Record<string, number> = {};
|
|
151
|
+
for (const key of COST_FIELDS) {
|
|
152
|
+
if (value[key] !== undefined) {
|
|
153
|
+
result[key] = nonNegativeNumber(value[key], `${field}.${key}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function normalizeCompat(
|
|
160
|
+
value: unknown,
|
|
161
|
+
field: string,
|
|
162
|
+
allowWhenThinking = true
|
|
163
|
+
): Record<string, unknown> {
|
|
164
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
165
|
+
rejectUnknown(value, COMPAT_FIELDS, field);
|
|
166
|
+
if (Object.prototype.hasOwnProperty.call(value, 'extraBody')) {
|
|
167
|
+
invalidField(
|
|
168
|
+
`${field}.extraBody`,
|
|
169
|
+
'Arbitrary request bodies may contain persisted secrets and are not accepted.'
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
const result: Record<string, unknown> = {};
|
|
173
|
+
for (const [key, item] of Object.entries(value)) {
|
|
174
|
+
if (key === 'whenThinking') {
|
|
175
|
+
if (!allowWhenThinking) {
|
|
176
|
+
invalidField(
|
|
177
|
+
`${field}.whenThinking`,
|
|
178
|
+
'Nested compat.whenThinking is not a native OMP field.'
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
result[key] = normalizeCompat(item, `${field}.whenThinking`, false);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (COMPAT_RECORD_FIELDS.has(key)) {
|
|
185
|
+
result[key] =
|
|
186
|
+
key === 'reasoningEffortMap'
|
|
187
|
+
? normalizeEffortMap(item, `${field}.${key}`)
|
|
188
|
+
: normalizeRouting(item, `${field}.${key}`);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (COMPAT_NUMBER_FIELDS.has(key)) {
|
|
192
|
+
result[key] = nonNegativeNumber(item, `${field}.${key}`);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (key === 'maxTokensField') {
|
|
196
|
+
result[key] = enumValue(item, COMPAT_STRING_ENUMS.maxTokensField, `${field}.${key}`);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (key === 'reasoningContentField') {
|
|
200
|
+
result[key] = enumValue(item, COMPAT_STRING_ENUMS.reasoningContentField, `${field}.${key}`);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (key === 'thinkingFormat') {
|
|
204
|
+
result[key] = enumValue(item, COMPAT_STRING_ENUMS.thinkingFormat, `${field}.${key}`);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (key === 'cacheControlFormat') {
|
|
208
|
+
result[key] = enumValue(item, COMPAT_STRING_ENUMS.cacheControlFormat, `${field}.${key}`);
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (key === 'toolStrictMode') {
|
|
212
|
+
result[key] = enumValue(item, COMPAT_STRING_ENUMS.toolStrictMode, `${field}.${key}`);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (key === 'promptCacheMode') {
|
|
216
|
+
result[key] = enumValue(item, COMPAT_STRING_ENUMS.promptCacheMode, `${field}.${key}`);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
result[key] = booleanValue(item, `${field}.${key}`);
|
|
220
|
+
}
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function normalizeRouting(value: unknown, field: string): Record<string, readonly string[]> {
|
|
225
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
226
|
+
rejectUnknown(value, new Set(['only', 'order']), field);
|
|
227
|
+
const result: Record<string, readonly string[]> = {};
|
|
228
|
+
for (const [key, item] of Object.entries(value)) {
|
|
229
|
+
if (!Array.isArray(item)) invalidField(`${field}.${key}`, `${field}.${key} must be an array.`);
|
|
230
|
+
result[key] = item.map((entry, index) => nonEmptyString(entry, `${field}.${key}[${index}]`));
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { invalidField } from '../contract-errors';
|
|
2
|
+
import { isRecord } from '../json';
|
|
3
|
+
import { APIS, ENV_NAME, LEVELS, MODEL_COMPONENT, PROVIDER_FIELDS } from './sdk-settings-constants';
|
|
4
|
+
import {
|
|
5
|
+
normalizeCompat,
|
|
6
|
+
normalizeModelDefinition,
|
|
7
|
+
normalizeModelOverride,
|
|
8
|
+
} from './sdk-settings-model-fields';
|
|
9
|
+
import { parseExactOmpModelSelector } from './sdk-settings-selector';
|
|
10
|
+
import type {
|
|
11
|
+
OmpModelsConfig,
|
|
12
|
+
OmpModelLevel,
|
|
13
|
+
OmpLevelOverride,
|
|
14
|
+
OmpProviderConfig,
|
|
15
|
+
OmpSdkAuth,
|
|
16
|
+
} from './sdk-settings-types';
|
|
17
|
+
import {
|
|
18
|
+
assertProviderId,
|
|
19
|
+
booleanValue,
|
|
20
|
+
emptyHeaders,
|
|
21
|
+
enumValue,
|
|
22
|
+
rejectUnknown,
|
|
23
|
+
safeUrl,
|
|
24
|
+
} from './sdk-settings-values';
|
|
25
|
+
|
|
26
|
+
export function normalizeModelsConfig(value: unknown, auth?: OmpSdkAuth): OmpModelsConfig {
|
|
27
|
+
if (!isRecord(value)) {
|
|
28
|
+
invalidField('providerSettings.omp.modelsConfig', 'OMP modelsConfig must be an object.');
|
|
29
|
+
}
|
|
30
|
+
rejectUnknown(value, new Set(['providers']), 'providerSettings.omp.modelsConfig');
|
|
31
|
+
const providerInput = value.providers ?? {};
|
|
32
|
+
if (!isRecord(providerInput)) {
|
|
33
|
+
invalidField(
|
|
34
|
+
'providerSettings.omp.modelsConfig.providers',
|
|
35
|
+
'OMP modelsConfig.providers must be an object.'
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
const providers: Record<string, OmpProviderConfig> = {};
|
|
39
|
+
for (const [provider, config] of Object.entries(providerInput)) {
|
|
40
|
+
const field = `providerSettings.omp.modelsConfig.providers.${provider}`;
|
|
41
|
+
assertProviderId(provider, field);
|
|
42
|
+
providers[provider] = normalizeProviderConfig(provider, config, auth, field);
|
|
43
|
+
}
|
|
44
|
+
return { providers };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function normalizeProviderConfig(
|
|
48
|
+
provider: string,
|
|
49
|
+
value: unknown,
|
|
50
|
+
auth: OmpSdkAuth | undefined,
|
|
51
|
+
field: string
|
|
52
|
+
): OmpProviderConfig {
|
|
53
|
+
if (!isRecord(value)) invalidField(field, `${field} must be an object.`);
|
|
54
|
+
rejectUnknown(value, PROVIDER_FIELDS, field);
|
|
55
|
+
const result: Record<string, unknown> = {};
|
|
56
|
+
|
|
57
|
+
if (value.baseUrl !== undefined) result.baseUrl = safeUrl(value.baseUrl, `${field}.baseUrl`);
|
|
58
|
+
if (value.api !== undefined) result.api = enumValue(value.api, APIS, `${field}.api`);
|
|
59
|
+
if (value.auth !== undefined) {
|
|
60
|
+
const providerAuth = enumValue(
|
|
61
|
+
value.auth,
|
|
62
|
+
['apiKey', 'none', 'oauth'] as const,
|
|
63
|
+
`${field}.auth`
|
|
64
|
+
);
|
|
65
|
+
if (providerAuth === 'oauth') {
|
|
66
|
+
invalidField(
|
|
67
|
+
`${field}.auth`,
|
|
68
|
+
'Custom provider OAuth would read ambient state and is not accepted.'
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
result.auth = providerAuth;
|
|
72
|
+
}
|
|
73
|
+
if (value.transport !== undefined) {
|
|
74
|
+
invalidField(
|
|
75
|
+
`${field}.transport`,
|
|
76
|
+
'Command/gateway-backed custom provider transports are not accepted.'
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (value.discovery !== undefined) {
|
|
80
|
+
invalidField(`${field}.discovery`, 'Dynamic custom provider discovery is not accepted.');
|
|
81
|
+
}
|
|
82
|
+
if (value.remoteCompaction !== undefined) {
|
|
83
|
+
invalidField(`${field}.remoteCompaction`, 'Remote compaction config is not accepted.');
|
|
84
|
+
}
|
|
85
|
+
if (value.headers !== undefined) result.headers = emptyHeaders(value.headers, `${field}.headers`);
|
|
86
|
+
if (value.compat !== undefined) result.compat = normalizeCompat(value.compat, `${field}.compat`);
|
|
87
|
+
if (value.authHeader !== undefined) {
|
|
88
|
+
result.authHeader = booleanValue(value.authHeader, `${field}.authHeader`);
|
|
89
|
+
}
|
|
90
|
+
if (value.disableStrictTools !== undefined) {
|
|
91
|
+
result.disableStrictTools = booleanValue(
|
|
92
|
+
value.disableStrictTools,
|
|
93
|
+
`${field}.disableStrictTools`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (value.models !== undefined) {
|
|
98
|
+
if (!Array.isArray(value.models) || value.models.length === 0) {
|
|
99
|
+
invalidField(`${field}.models`, 'Custom provider models must be a non-empty array.');
|
|
100
|
+
}
|
|
101
|
+
const models = value.models.map((model, index) =>
|
|
102
|
+
normalizeModelDefinition(model, `${field}.models[${index}]`)
|
|
103
|
+
);
|
|
104
|
+
result.models = models;
|
|
105
|
+
if (result.baseUrl === undefined) {
|
|
106
|
+
invalidField(`${field}.baseUrl`, 'baseUrl is required when defining custom models.');
|
|
107
|
+
}
|
|
108
|
+
const hasProviderApi = result.api !== undefined;
|
|
109
|
+
const seenModelIds = new Set<string>();
|
|
110
|
+
for (const { id: modelId } of models) {
|
|
111
|
+
if (seenModelIds.has(modelId)) {
|
|
112
|
+
invalidField(`${field}.models`, `Custom model id ${modelId} is duplicated.`);
|
|
113
|
+
}
|
|
114
|
+
seenModelIds.add(modelId);
|
|
115
|
+
}
|
|
116
|
+
if (!hasProviderApi && models.some((model) => model.api === undefined)) {
|
|
117
|
+
invalidField(
|
|
118
|
+
`${field}.api`,
|
|
119
|
+
'api is required at provider or every model when defining custom models.'
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (value.modelOverrides !== undefined) {
|
|
125
|
+
if (!isRecord(value.modelOverrides)) {
|
|
126
|
+
invalidField(`${field}.modelOverrides`, 'modelOverrides must be an object.');
|
|
127
|
+
}
|
|
128
|
+
const overrides: Record<string, unknown> = {};
|
|
129
|
+
for (const [model, override] of Object.entries(value.modelOverrides)) {
|
|
130
|
+
if (model.length === 0 || !MODEL_COMPONENT.test(model)) {
|
|
131
|
+
invalidField(`${field}.modelOverrides`, 'modelOverrides keys must be non-empty model IDs.');
|
|
132
|
+
}
|
|
133
|
+
overrides[model] = normalizeModelOverride(override, `${field}.modelOverrides.${model}`);
|
|
134
|
+
}
|
|
135
|
+
result.modelOverrides = overrides;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const credentialEnv = auth?.mode === 'environment' ? auth.credentials[provider]?.env : undefined;
|
|
139
|
+
if (value.apiKey !== undefined) {
|
|
140
|
+
if (typeof value.apiKey !== 'string' || !ENV_NAME.test(value.apiKey)) {
|
|
141
|
+
invalidField(
|
|
142
|
+
`${field}.apiKey`,
|
|
143
|
+
'apiKey must be an environment variable name; literals and command-backed values are forbidden.'
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
if (auth?.mode === 'environment' && credentialEnv === undefined) {
|
|
147
|
+
invalidField(
|
|
148
|
+
`${field}.apiKey`,
|
|
149
|
+
'apiKey must match a declared environment credential reference for this provider.'
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
if (credentialEnv !== undefined && value.apiKey !== credentialEnv) {
|
|
153
|
+
invalidField(
|
|
154
|
+
`${field}.apiKey`,
|
|
155
|
+
'apiKey must match the declared environment credential reference.'
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
if (auth !== undefined && auth.mode !== 'environment') {
|
|
159
|
+
invalidField(`${field}.apiKey`, `${auth.mode} auth forbids provider apiKey configuration.`);
|
|
160
|
+
}
|
|
161
|
+
result.apiKey = value.apiKey;
|
|
162
|
+
} else if (value.models !== undefined && result.auth !== 'none') {
|
|
163
|
+
if (auth?.mode === 'environment' && credentialEnv !== undefined) {
|
|
164
|
+
result.apiKey = credentialEnv;
|
|
165
|
+
} else if (auth !== undefined) {
|
|
166
|
+
invalidField(
|
|
167
|
+
`${field}.apiKey`,
|
|
168
|
+
'Authenticated custom models require an environment credential reference; broker and omp-home custom-provider credentials cannot be materialized safely.'
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (auth?.mode === 'none' && result.auth !== 'none') {
|
|
173
|
+
invalidField(
|
|
174
|
+
`${field}.auth`,
|
|
175
|
+
'Keyless settings require custom providers to declare auth: none.'
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function validateSelectedProviderAuth(
|
|
182
|
+
levels: Readonly<Record<OmpModelLevel, OmpLevelOverride>>,
|
|
183
|
+
modelsConfig: OmpModelsConfig,
|
|
184
|
+
auth: OmpSdkAuth
|
|
185
|
+
): void {
|
|
186
|
+
const selectors = LEVELS.map((level) => parseExactOmpModelSelector(levels[level].model));
|
|
187
|
+
const providers = new Set(selectors.map(({ provider }) => provider));
|
|
188
|
+
for (const { provider, model } of selectors) {
|
|
189
|
+
const configuredModels = modelsConfig.providers[provider]?.models;
|
|
190
|
+
if (
|
|
191
|
+
Array.isArray(configuredModels) &&
|
|
192
|
+
!configuredModels.some((configured) => isRecord(configured) && configured.id === model)
|
|
193
|
+
) {
|
|
194
|
+
invalidField(
|
|
195
|
+
`providerSettings.omp.levelOverrides`,
|
|
196
|
+
`Selected custom model ${provider}/${model} is not declared in modelsConfig.`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (auth.mode === 'environment') {
|
|
201
|
+
for (const provider of providers) {
|
|
202
|
+
const custom = modelsConfig.providers[provider];
|
|
203
|
+
if (custom?.auth === 'none') {
|
|
204
|
+
invalidField(
|
|
205
|
+
`providerSettings.omp.auth.mode`,
|
|
206
|
+
`Selected keyless provider ${provider} requires auth mode none.`
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
if (auth.credentials[provider] === undefined) {
|
|
210
|
+
invalidField(
|
|
211
|
+
`providerSettings.omp.auth.credentials.${provider}`,
|
|
212
|
+
`Environment auth is missing a credential reference for selected provider ${provider}.`
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (auth.mode === 'none') {
|
|
218
|
+
for (const provider of providers) {
|
|
219
|
+
const custom = modelsConfig.providers[provider];
|
|
220
|
+
if (custom !== undefined && custom.auth !== 'none') {
|
|
221
|
+
invalidField(
|
|
222
|
+
`providerSettings.omp.modelsConfig.providers.${provider}.auth`,
|
|
223
|
+
`Selected custom provider ${provider} must declare auth: none for keyless execution.`
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (auth.mode === 'broker') {
|
|
229
|
+
for (const provider of providers) {
|
|
230
|
+
if (modelsConfig.providers[provider]?.models !== undefined) {
|
|
231
|
+
invalidField(
|
|
232
|
+
`providerSettings.omp.modelsConfig.providers.${provider}`,
|
|
233
|
+
'Broker auth cannot safely satisfy OMP custom-provider apiKey config; use environment auth.'
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|