@the-open-engine/zeroshot 6.30.2 → 6.31.1
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/cli/index.js +1 -2
- 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/cli/lib/first-run.js +0 -223
- 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,154 @@
|
|
|
1
|
+
import {
|
|
2
|
+
emitAssistantSnapshot,
|
|
3
|
+
parseAssistantDelta,
|
|
4
|
+
parseToolExecutionEnd,
|
|
5
|
+
parseToolExecutionStart,
|
|
6
|
+
parseToolExecutionUpdate,
|
|
7
|
+
parseTurnEndResult,
|
|
8
|
+
resetAssistantSnapshot,
|
|
9
|
+
} from '../assistant-stream';
|
|
10
|
+
import { getRecord, getString, stringifyContent } from '../json';
|
|
11
|
+
import type { OutputEvent } from '../types';
|
|
12
|
+
import { MAX_NORMALIZED_OUTPUT_BYTES } from './rpc-bounds';
|
|
13
|
+
import { OmpRpcProtocolError, type OmpRpcInboundFrame } from './rpc-protocol';
|
|
14
|
+
|
|
15
|
+
export interface OmpRpcEventState {
|
|
16
|
+
lastAssistantText: string;
|
|
17
|
+
lastAssistantThinking: string;
|
|
18
|
+
lastToolId: string | null | undefined;
|
|
19
|
+
normalizedBytes: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function createOmpRpcEventState(): OmpRpcEventState {
|
|
23
|
+
return {
|
|
24
|
+
lastAssistantText: '',
|
|
25
|
+
lastAssistantThinking: '',
|
|
26
|
+
lastToolId: undefined,
|
|
27
|
+
normalizedBytes: 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function chargeBytes(state: OmpRpcEventState, value: unknown): void {
|
|
32
|
+
state.normalizedBytes += Buffer.byteLength(stringifyContent(value), 'utf8');
|
|
33
|
+
if (state.normalizedBytes > MAX_NORMALIZED_OUTPUT_BYTES) {
|
|
34
|
+
throw new OmpRpcProtocolError(
|
|
35
|
+
'output-bound-exceeded',
|
|
36
|
+
`Normalized OMP RPC output exceeded the ${MAX_NORMALIZED_OUTPUT_BYTES}-byte cap for this task.`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function chargeEvent(state: OmpRpcEventState, event: OutputEvent): void {
|
|
42
|
+
switch (event.type) {
|
|
43
|
+
case 'text':
|
|
44
|
+
case 'thinking':
|
|
45
|
+
chargeBytes(state, event.text);
|
|
46
|
+
break;
|
|
47
|
+
case 'tool_call':
|
|
48
|
+
chargeBytes(state, event.input);
|
|
49
|
+
break;
|
|
50
|
+
case 'tool_result':
|
|
51
|
+
chargeBytes(state, event.content);
|
|
52
|
+
break;
|
|
53
|
+
case 'result':
|
|
54
|
+
chargeBytes(state, { result: event.result, error: event.error });
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function chargeEvents(
|
|
62
|
+
state: OmpRpcEventState,
|
|
63
|
+
events: readonly OutputEvent[]
|
|
64
|
+
): readonly OutputEvent[] {
|
|
65
|
+
for (const event of events) chargeEvent(state, event);
|
|
66
|
+
return events;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function normalizeMessageUpdate(
|
|
70
|
+
frame: OmpRpcInboundFrame,
|
|
71
|
+
state: OmpRpcEventState
|
|
72
|
+
): readonly OutputEvent[] {
|
|
73
|
+
const assistantMessageEvent = getRecord(frame, 'assistantMessageEvent');
|
|
74
|
+
if (assistantMessageEvent !== null) {
|
|
75
|
+
const event = parseAssistantDelta(assistantMessageEvent, state);
|
|
76
|
+
if (event !== null) {
|
|
77
|
+
chargeEvent(state, event);
|
|
78
|
+
return [event];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const message = getRecord(frame, 'message');
|
|
82
|
+
return message === null
|
|
83
|
+
? []
|
|
84
|
+
: chargeEvents(state, emitAssistantSnapshot(message, state, { retainPreviousOnEmpty: true }));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function normalizeMessageSnapshot(
|
|
88
|
+
frame: OmpRpcInboundFrame,
|
|
89
|
+
state: OmpRpcEventState
|
|
90
|
+
): readonly OutputEvent[] {
|
|
91
|
+
const message = getRecord(frame, 'message');
|
|
92
|
+
return message === null
|
|
93
|
+
? []
|
|
94
|
+
: chargeEvents(state, emitAssistantSnapshot(message, state, { retainPreviousOnEmpty: true }));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function normalizeToolEvent(
|
|
98
|
+
frame: OmpRpcInboundFrame,
|
|
99
|
+
state: OmpRpcEventState
|
|
100
|
+
): readonly OutputEvent[] {
|
|
101
|
+
const event =
|
|
102
|
+
frame.type === 'tool_execution_start'
|
|
103
|
+
? parseToolExecutionStart(frame, state)
|
|
104
|
+
: frame.type === 'tool_execution_update'
|
|
105
|
+
? parseToolExecutionUpdate(frame, state)
|
|
106
|
+
: parseToolExecutionEnd(frame, state);
|
|
107
|
+
if (event === null) return [];
|
|
108
|
+
chargeEvent(state, event);
|
|
109
|
+
return [event];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function normalizeTurnEnd(
|
|
113
|
+
frame: OmpRpcInboundFrame,
|
|
114
|
+
state: OmpRpcEventState
|
|
115
|
+
): readonly OutputEvent[] {
|
|
116
|
+
const event = parseTurnEndResult(frame, {
|
|
117
|
+
failureMessage: 'OMP turn failed',
|
|
118
|
+
resultFallback: state.lastAssistantText,
|
|
119
|
+
});
|
|
120
|
+
const message = getRecord(frame, 'message');
|
|
121
|
+
const stopReason = message === null ? null : getString(message, 'stopReason');
|
|
122
|
+
const errorMessage = message === null ? null : getString(message, 'errorMessage');
|
|
123
|
+
chargeBytes(state, { result: event.result, error: errorMessage ?? stopReason ?? null });
|
|
124
|
+
return [event];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Normalize one decoded OMP RPC v2 event frame into zero or more OutputEvents. Control frames never
|
|
129
|
+
* leak into log, attach, or ledger output.
|
|
130
|
+
*/
|
|
131
|
+
export function normalizeOmpRpcFrame(
|
|
132
|
+
frame: OmpRpcInboundFrame,
|
|
133
|
+
state: OmpRpcEventState
|
|
134
|
+
): readonly OutputEvent[] {
|
|
135
|
+
switch (frame.type) {
|
|
136
|
+
case 'message_start':
|
|
137
|
+
resetAssistantSnapshot(getRecord(frame, 'message'), state);
|
|
138
|
+
return [];
|
|
139
|
+
case 'message_update':
|
|
140
|
+
return normalizeMessageUpdate(frame, state);
|
|
141
|
+
case 'message_end':
|
|
142
|
+
return normalizeMessageSnapshot(frame, state);
|
|
143
|
+
case 'tool_execution_start':
|
|
144
|
+
case 'tool_execution_update':
|
|
145
|
+
case 'tool_execution_end':
|
|
146
|
+
return normalizeToolEvent(frame, state);
|
|
147
|
+
case 'turn_end':
|
|
148
|
+
return normalizeTurnEnd(frame, state);
|
|
149
|
+
default:
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export { parseNormalizedOmpRpcEventLine } from './rpc-event-lines';
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { OMP_SUPPORTED_VERSION } from './release';
|
|
2
|
+
|
|
3
|
+
export const OMP_RPC_CONTRACT_RELEASE = OMP_SUPPORTED_VERSION;
|
|
4
|
+
|
|
5
|
+
export interface OmpRpcDecoderLimits {
|
|
6
|
+
readonly maxPhysicalFrameBytes: number;
|
|
7
|
+
readonly maxReassembledFrameBytes: number;
|
|
8
|
+
readonly maxConcurrentReassemblies: number;
|
|
9
|
+
readonly maxChunksPerFrame: number;
|
|
10
|
+
readonly maxInflightReassemblyBytes: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const DEFAULT_OMP_RPC_DECODER_LIMITS: OmpRpcDecoderLimits = {
|
|
14
|
+
maxPhysicalFrameBytes: 1024 * 1024,
|
|
15
|
+
maxReassembledFrameBytes: 64 * 1024 * 1024,
|
|
16
|
+
maxConcurrentReassemblies: 1,
|
|
17
|
+
maxChunksPerFrame: 256,
|
|
18
|
+
maxInflightReassemblyBytes: 64 * 1024 * 1024,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export interface OmpRpcInboundFrame {
|
|
22
|
+
readonly type: string;
|
|
23
|
+
readonly [key: string]: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface OmpRpcCommand {
|
|
27
|
+
readonly id?: string;
|
|
28
|
+
readonly type: string;
|
|
29
|
+
readonly [key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class OmpRpcProtocolError extends Error {
|
|
33
|
+
readonly code: string;
|
|
34
|
+
|
|
35
|
+
constructor(code: string, message: string) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = 'OmpRpcProtocolError';
|
|
38
|
+
this.code = code;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const KNOWN_PRE_NEGOTIATION_FRAME_TYPES: Readonly<Record<string, true>> = Object.freeze(Object.fromEntries([
|
|
43
|
+
'ready', 'available_commands_update', 'response', 'extension_error', 'agent_start', 'agent_end',
|
|
44
|
+
'turn_start', 'turn_end', 'message_start', 'message_update', 'message_end', 'tool_execution_start',
|
|
45
|
+
'tool_execution_update', 'tool_execution_end', 'auto_compaction_start', 'auto_compaction_end',
|
|
46
|
+
'auto_retry_start', 'auto_retry_end', 'ttsr_triggered', 'todo_reminder', 'todo_auto_clear',
|
|
47
|
+
'extension_ui_request', 'host_tool_call', 'host_tool_cancel', 'host_uri_request', 'host_uri_cancel',
|
|
48
|
+
'prompt_result', 'command_output', 'session_info_update', 'config_update', 'subagent_lifecycle',
|
|
49
|
+
'subagent_progress', 'subagent_event',
|
|
50
|
+
].map((type) => [type, true] as const)));
|
|
51
|
+
|
|
52
|
+
export function classifyOmpRpcFrameType(type: string): 'known-pre-negotiation' | 'v2-only' | 'unknown' {
|
|
53
|
+
if (type === 'rpc_chunk') return 'v2-only';
|
|
54
|
+
if (KNOWN_PRE_NEGOTIATION_FRAME_TYPES[type] === true) return 'known-pre-negotiation';
|
|
55
|
+
return 'unknown';
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function assertNoPreNegotiationRpcChunk(frameType: string, negotiatedV2: boolean): void {
|
|
59
|
+
if (frameType === 'rpc_chunk' && !negotiatedV2) {
|
|
60
|
+
throw new OmpRpcProtocolError(
|
|
61
|
+
'pre-negotiation-rpc-chunk',
|
|
62
|
+
'rpc_chunk frame received before protocol v2 negotiation succeeded.'
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function encodeOmpRpcCommand(command: OmpRpcCommand, maxFrameBytes: number): Buffer {
|
|
68
|
+
const line = `${JSON.stringify(command)}\n`;
|
|
69
|
+
const byteLength = Buffer.byteLength(line, 'utf8');
|
|
70
|
+
if (byteLength > maxFrameBytes) {
|
|
71
|
+
throw new OmpRpcProtocolError(
|
|
72
|
+
'outbound-frame-too-large',
|
|
73
|
+
`Outbound command of ${byteLength} bytes exceeds the ${maxFrameBytes}-byte limit.`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
return Buffer.from(line, 'utf8');
|
|
77
|
+
}
|
|
@@ -1,104 +1,13 @@
|
|
|
1
|
-
import { getNumber, getString, isRecord } from '
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
readonly maxConcurrentReassemblies: number;
|
|
11
|
-
readonly maxChunksPerFrame: number;
|
|
12
|
-
readonly maxInflightReassemblyBytes: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Verified against the pinned OMP release's rpc-frame.ts: MAX_RPC_FRAME_BYTES=1MiB, MAX_RPC_REASSEMBLED_BYTES=64MiB,
|
|
16
|
-
// RPC_CHUNK_PAYLOAD_BYTES=256KiB -> ceil(64MiB/256KiB)=256 chunks max. The real decoder tracks exactly one
|
|
17
|
-
// pending sequence at a time, so maxConcurrentReassemblies/maxInflightReassemblyBytes mirror that ceiling.
|
|
18
|
-
export const DEFAULT_OMP_RPC_DECODER_LIMITS: OmpRpcDecoderLimits = {
|
|
19
|
-
maxPhysicalFrameBytes: 1024 * 1024,
|
|
20
|
-
maxReassembledFrameBytes: 64 * 1024 * 1024,
|
|
21
|
-
maxConcurrentReassemblies: 1,
|
|
22
|
-
maxChunksPerFrame: 256,
|
|
23
|
-
maxInflightReassemblyBytes: 64 * 1024 * 1024,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export interface OmpRpcInboundFrame {
|
|
27
|
-
readonly type: string;
|
|
28
|
-
readonly [key: string]: unknown;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface OmpRpcCommand {
|
|
32
|
-
readonly id?: string;
|
|
33
|
-
readonly type: string;
|
|
34
|
-
readonly [key: string]: unknown;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export class OmpRpcProtocolError extends Error {
|
|
38
|
-
readonly code: string;
|
|
39
|
-
|
|
40
|
-
constructor(code: string, message: string) {
|
|
41
|
-
super(message);
|
|
42
|
-
this.name = 'OmpRpcProtocolError';
|
|
43
|
-
this.code = code;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const KNOWN_PRE_NEGOTIATION_FRAME_TYPES: ReadonlySet<string> = new Set([
|
|
48
|
-
'ready',
|
|
49
|
-
'available_commands_update',
|
|
50
|
-
'response',
|
|
51
|
-
'extension_error',
|
|
52
|
-
'agent_start',
|
|
53
|
-
'agent_end',
|
|
54
|
-
'turn_start',
|
|
55
|
-
'turn_end',
|
|
56
|
-
'message_start',
|
|
57
|
-
'message_update',
|
|
58
|
-
'message_end',
|
|
59
|
-
'tool_execution_start',
|
|
60
|
-
'tool_execution_update',
|
|
61
|
-
'tool_execution_end',
|
|
62
|
-
'auto_compaction_start',
|
|
63
|
-
'auto_compaction_end',
|
|
64
|
-
'auto_retry_start',
|
|
65
|
-
'auto_retry_end',
|
|
66
|
-
'ttsr_triggered',
|
|
67
|
-
'todo_reminder',
|
|
68
|
-
'todo_auto_clear',
|
|
69
|
-
'extension_ui_request',
|
|
70
|
-
'host_tool_call',
|
|
71
|
-
'host_tool_cancel',
|
|
72
|
-
'host_uri_request',
|
|
73
|
-
'host_uri_cancel',
|
|
74
|
-
'prompt_result',
|
|
75
|
-
'command_output',
|
|
76
|
-
'session_info_update',
|
|
77
|
-
'config_update',
|
|
78
|
-
'subagent_lifecycle',
|
|
79
|
-
'subagent_progress',
|
|
80
|
-
'subagent_event',
|
|
81
|
-
]);
|
|
82
|
-
|
|
83
|
-
export function classifyOmpRpcFrameType(
|
|
84
|
-
type: string
|
|
85
|
-
): 'known-pre-negotiation' | 'v2-only' | 'unknown' {
|
|
86
|
-
if (type === 'rpc_chunk') return 'v2-only';
|
|
87
|
-
if (KNOWN_PRE_NEGOTIATION_FRAME_TYPES.has(type)) return 'known-pre-negotiation';
|
|
88
|
-
return 'unknown';
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export function assertNoPreNegotiationRpcChunk(frameType: string, negotiatedV2: boolean): void {
|
|
92
|
-
if (frameType === 'rpc_chunk' && !negotiatedV2) {
|
|
93
|
-
throw new OmpRpcProtocolError(
|
|
94
|
-
'pre-negotiation-rpc-chunk',
|
|
95
|
-
'rpc_chunk frame received before protocol v2 negotiation succeeded.'
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
1
|
+
import { getNumber, getString, isRecord } from '../json';
|
|
2
|
+
import {
|
|
3
|
+
OmpRpcProtocolError,
|
|
4
|
+
assertNoPreNegotiationRpcChunk,
|
|
5
|
+
type OmpRpcDecoderLimits,
|
|
6
|
+
type OmpRpcInboundFrame,
|
|
7
|
+
} from './rpc-protocol-contract';
|
|
8
|
+
|
|
9
|
+
export * from './rpc-protocol-contract';
|
|
100
10
|
const STRICT_BASE64_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
|
|
101
|
-
|
|
102
11
|
function decodeStrictBase64(data: unknown): Buffer {
|
|
103
12
|
if (typeof data !== 'string' || data.length === 0 || !STRICT_BASE64_PATTERN.test(data)) {
|
|
104
13
|
throw new OmpRpcProtocolError(
|
|
@@ -388,14 +297,3 @@ export class OmpRpcFrameDecoder {
|
|
|
388
297
|
}
|
|
389
298
|
}
|
|
390
299
|
|
|
391
|
-
export function encodeOmpRpcCommand(command: OmpRpcCommand, maxFrameBytes: number): Buffer {
|
|
392
|
-
const line = `${JSON.stringify(command)}\n`;
|
|
393
|
-
const byteLength = Buffer.byteLength(line, 'utf8');
|
|
394
|
-
if (byteLength > maxFrameBytes) {
|
|
395
|
-
throw new OmpRpcProtocolError(
|
|
396
|
-
'outbound-frame-too-large',
|
|
397
|
-
`Outbound command of ${byteLength} bytes exceeds the ${maxFrameBytes}-byte limit.`
|
|
398
|
-
);
|
|
399
|
-
}
|
|
400
|
-
return Buffer.from(line, 'utf8');
|
|
401
|
-
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { isRecord } from '../json';
|
|
2
|
+
import type { OmpSdkErrorCategory } from './sdk-protocol';
|
|
3
|
+
import type { ProcessResult } from '../process-runner';
|
|
4
|
+
import type { ErrorClassification } from '../types';
|
|
5
|
+
|
|
6
|
+
export type ContractOmpSdkTerminal =
|
|
7
|
+
| {
|
|
8
|
+
readonly type: 'result';
|
|
9
|
+
readonly frame: Readonly<Record<string, unknown>>;
|
|
10
|
+
readonly event: Readonly<Record<string, unknown>> & {
|
|
11
|
+
readonly type: 'result';
|
|
12
|
+
readonly success: boolean;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
| {
|
|
16
|
+
readonly type: 'error';
|
|
17
|
+
readonly frame: Readonly<Record<string, unknown>> & {
|
|
18
|
+
readonly error: {
|
|
19
|
+
readonly category: OmpSdkErrorCategory;
|
|
20
|
+
readonly retryable: boolean;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export interface ContractOmpSdkProcessResult extends ProcessResult {
|
|
26
|
+
readonly terminal: ContractOmpSdkTerminal;
|
|
27
|
+
readonly progress: readonly unknown[];
|
|
28
|
+
readonly diagnosticStderr: string;
|
|
29
|
+
readonly cleanupAttestation: Readonly<Record<string, unknown>>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function isOmpSdkErrorCategory(value: unknown): value is OmpSdkErrorCategory {
|
|
33
|
+
switch (value) {
|
|
34
|
+
case 'request':
|
|
35
|
+
case 'model':
|
|
36
|
+
case 'auth':
|
|
37
|
+
case 'rate-limit':
|
|
38
|
+
case 'timeout':
|
|
39
|
+
case 'provider':
|
|
40
|
+
case 'schema':
|
|
41
|
+
case 'cancelled':
|
|
42
|
+
case 'sdk':
|
|
43
|
+
case 'cleanup':
|
|
44
|
+
case 'internal':
|
|
45
|
+
return true;
|
|
46
|
+
default:
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function isContractOmpSdkTerminal(value: unknown): value is ContractOmpSdkTerminal {
|
|
52
|
+
if (!isRecord(value) || !isRecord(value.frame) || value.frame.type !== value.type) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (value.type === 'result') {
|
|
56
|
+
return (
|
|
57
|
+
isRecord(value.event) &&
|
|
58
|
+
value.event.type === 'result' &&
|
|
59
|
+
typeof value.event.success === 'boolean'
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
if (value.type !== 'error' || !isRecord(value.frame.error)) return false;
|
|
63
|
+
return (
|
|
64
|
+
isOmpSdkErrorCategory(value.frame.error.category) &&
|
|
65
|
+
typeof value.frame.error.retryable === 'boolean'
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function isContractOmpSdkProcessResult(
|
|
70
|
+
result: ProcessResult
|
|
71
|
+
): result is ContractOmpSdkProcessResult {
|
|
72
|
+
return (
|
|
73
|
+
'terminal' in result &&
|
|
74
|
+
isContractOmpSdkTerminal(result.terminal) &&
|
|
75
|
+
'progress' in result &&
|
|
76
|
+
Array.isArray(result.progress) &&
|
|
77
|
+
'diagnosticStderr' in result &&
|
|
78
|
+
typeof result.diagnosticStderr === 'string' &&
|
|
79
|
+
'cleanupAttestation' in result &&
|
|
80
|
+
isRecord(result.cleanupAttestation)
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type OmpSdkErrorClassification = ErrorClassification & {
|
|
85
|
+
readonly category: OmpSdkErrorCategory;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export function ompSdkFailureClassification(
|
|
89
|
+
result: ContractOmpSdkProcessResult
|
|
90
|
+
): OmpSdkErrorClassification | null {
|
|
91
|
+
if (result.terminal.type !== 'error') return null;
|
|
92
|
+
const { category, retryable } = result.terminal.frame.error;
|
|
93
|
+
return {
|
|
94
|
+
category,
|
|
95
|
+
retryable,
|
|
96
|
+
kind:
|
|
97
|
+
category === 'cancelled'
|
|
98
|
+
? 'cancelled'
|
|
99
|
+
: retryable
|
|
100
|
+
? 'unknown-retryable'
|
|
101
|
+
: 'permanent-pattern',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function invokeEvidence(
|
|
106
|
+
result: ProcessResult,
|
|
107
|
+
timeoutMs: number | undefined
|
|
108
|
+
): Record<string, unknown> {
|
|
109
|
+
const sdkResult = isContractOmpSdkProcessResult(result) ? result : null;
|
|
110
|
+
return {
|
|
111
|
+
exitCode: result.exitCode,
|
|
112
|
+
signal: result.signal,
|
|
113
|
+
durationMs: result.durationMs,
|
|
114
|
+
timedOut: result.timedOut ?? false,
|
|
115
|
+
timeoutMs: result.timeoutMs ?? timeoutMs ?? null,
|
|
116
|
+
...(sdkResult === null
|
|
117
|
+
? {}
|
|
118
|
+
: {
|
|
119
|
+
terminal: sdkResult.terminal.frame,
|
|
120
|
+
cleanupAttestation: sdkResult.cleanupAttestation,
|
|
121
|
+
}),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { OMP_SDK_MAX_CREDENTIAL_BYTES } from './sdk-protocol';
|
|
2
|
+
import { OmpSdkProcessRunnerError } from './sdk-process-error';
|
|
3
|
+
|
|
4
|
+
const CREDENTIAL_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
5
|
+
const MAX_CREDENTIAL_COUNT = 32;
|
|
6
|
+
const MAX_CREDENTIAL_NAME_BYTES = 128;
|
|
7
|
+
const MAX_CREDENTIAL_VALUE_BYTES = 16 * 1024;
|
|
8
|
+
|
|
9
|
+
export function credentialPayload(
|
|
10
|
+
names: readonly string[],
|
|
11
|
+
source: Readonly<Record<string, string | undefined>>
|
|
12
|
+
): { readonly payload: Buffer; readonly secretValues: readonly string[] } {
|
|
13
|
+
if (names.length > MAX_CREDENTIAL_COUNT || new Set(names).size !== names.length) {
|
|
14
|
+
throw new OmpSdkProcessRunnerError(
|
|
15
|
+
'credential-error',
|
|
16
|
+
'OMP SDK credential name set is invalid.'
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
const values: Record<string, string> = {};
|
|
20
|
+
const secretValues: string[] = [];
|
|
21
|
+
for (const name of names) {
|
|
22
|
+
const value = source[name];
|
|
23
|
+
if (
|
|
24
|
+
!CREDENTIAL_NAME.test(name) ||
|
|
25
|
+
Buffer.byteLength(name) > MAX_CREDENTIAL_NAME_BYTES ||
|
|
26
|
+
typeof value !== 'string' ||
|
|
27
|
+
value.length === 0 ||
|
|
28
|
+
Buffer.byteLength(value) > MAX_CREDENTIAL_VALUE_BYTES
|
|
29
|
+
) {
|
|
30
|
+
throw new OmpSdkProcessRunnerError(
|
|
31
|
+
'credential-error',
|
|
32
|
+
`OMP SDK credential ${name} is missing or invalid.`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
values[name] = value;
|
|
36
|
+
secretValues.push(value);
|
|
37
|
+
}
|
|
38
|
+
const payload = Buffer.from(JSON.stringify({ protocolVersion: 1, values }), 'utf8');
|
|
39
|
+
if (payload.byteLength > OMP_SDK_MAX_CREDENTIAL_BYTES) {
|
|
40
|
+
payload.fill(0);
|
|
41
|
+
throw new OmpSdkProcessRunnerError(
|
|
42
|
+
'credential-error',
|
|
43
|
+
'OMP SDK credential document is oversized.'
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return { payload, secretValues };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function redactDiagnostic(value: string, secrets: readonly string[]): string {
|
|
50
|
+
let redacted = value;
|
|
51
|
+
for (const secret of secrets) {
|
|
52
|
+
if (secret.length > 0) redacted = redacted.split(secret).join('[REDACTED]');
|
|
53
|
+
}
|
|
54
|
+
return redacted;
|
|
55
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export class OmpSdkProcessRunnerError extends Error {
|
|
2
|
+
readonly code: 'cleanup-error' | 'containment-error' | 'credential-error' | 'protocol-error';
|
|
3
|
+
|
|
4
|
+
constructor(code: OmpSdkProcessRunnerError['code'], message: string, options?: ErrorOptions) {
|
|
5
|
+
super(message, options);
|
|
6
|
+
this.name = 'OmpSdkProcessRunnerError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
import { Writable } from 'node:stream';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
OMP_SDK_BACKEND_VERSION,
|
|
6
|
+
OMP_SDK_BUN_VERSION,
|
|
7
|
+
parseOmpSdkProtocolFrame,
|
|
8
|
+
type OmpSdkCollectedTerminal,
|
|
9
|
+
type OmpSdkSidecarRequest,
|
|
10
|
+
} from './sdk-protocol';
|
|
11
|
+
import { OmpSdkProcessRunnerError } from './sdk-process-private-runtime';
|
|
12
|
+
|
|
13
|
+
export const MAX_STDERR_BYTES = 64 * 1024;
|
|
14
|
+
export const DEFAULT_TERMINATION_GRACE_MS = 250;
|
|
15
|
+
export const DEFAULT_REAP_TIMEOUT_MS = 2_000;
|
|
16
|
+
const TEST_IDENTITY_CAP_ENV = 'ZEROSHOT_OMP_TEST_IDENTITY_CAP';
|
|
17
|
+
export interface ChildOutcome {
|
|
18
|
+
readonly exitCode: number | null;
|
|
19
|
+
readonly signal: NodeJS.Signals | null;
|
|
20
|
+
readonly spawnError?: Error;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function cancelledTerminal(request: OmpSdkSidecarRequest): OmpSdkCollectedTerminal {
|
|
24
|
+
const frame = parseOmpSdkProtocolFrame({
|
|
25
|
+
protocolVersion: 1,
|
|
26
|
+
type: 'error',
|
|
27
|
+
runId: request.runId,
|
|
28
|
+
backend: { id: 'omp-sdk', version: OMP_SDK_BACKEND_VERSION },
|
|
29
|
+
runtime: { name: 'bun', version: OMP_SDK_BUN_VERSION },
|
|
30
|
+
error: { code: 'cancelled', category: 'cancelled', retryable: false, redacted: true },
|
|
31
|
+
});
|
|
32
|
+
if (frame.type !== 'error') throw new Error('cancelled terminal construction failed');
|
|
33
|
+
return { type: 'error', frame };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function childClose(child: ChildProcess): Promise<ChildOutcome> {
|
|
37
|
+
return new Promise((resolveClose) => {
|
|
38
|
+
const spawned = child.pid !== undefined;
|
|
39
|
+
let spawnError: Error | undefined;
|
|
40
|
+
child.once('error', (error) => {
|
|
41
|
+
if (!spawned) spawnError = error;
|
|
42
|
+
});
|
|
43
|
+
child.once('close', (exitCode, signal) => {
|
|
44
|
+
resolveClose({ exitCode, signal, ...(spawnError === undefined ? {} : { spawnError }) });
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function credentialWriter(child: ChildProcess): Writable {
|
|
50
|
+
const channel = child.stdio[3];
|
|
51
|
+
if (!(channel instanceof Writable)) {
|
|
52
|
+
throw new OmpSdkProcessRunnerError(
|
|
53
|
+
'protocol-error',
|
|
54
|
+
'OMP SDK credential channel was not created.'
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
channel.on('error', () => {
|
|
58
|
+
// Keep late peer-reset errors observed after the one-shot write callback from becoming uncaught.
|
|
59
|
+
});
|
|
60
|
+
return channel;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function writeCredentials(channel: Writable, payload: Buffer): Promise<void> {
|
|
64
|
+
try {
|
|
65
|
+
await new Promise<void>((resolveWrite, rejectWrite) => {
|
|
66
|
+
channel.once('error', rejectWrite);
|
|
67
|
+
channel.end(payload, () => {
|
|
68
|
+
channel.removeListener('error', rejectWrite);
|
|
69
|
+
resolveWrite();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
} finally {
|
|
73
|
+
payload.fill(0);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function duration(value: number | undefined, fallback: number): number {
|
|
78
|
+
return value !== undefined && Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function testIdentityCapArgument(): readonly string[] {
|
|
82
|
+
const source = process.env.NODE_ENV === 'test' ? process.env[TEST_IDENTITY_CAP_ENV] : undefined;
|
|
83
|
+
if (source === undefined) return [];
|
|
84
|
+
const cap = Number(source);
|
|
85
|
+
if (!Number.isSafeInteger(cap) || cap < 8 || cap > 4_096) {
|
|
86
|
+
throw new OmpSdkProcessRunnerError(
|
|
87
|
+
'protocol-error',
|
|
88
|
+
'OMP SDK private test identity cap is invalid.'
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return [String(cap)];
|
|
92
|
+
}
|