@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,177 @@
|
|
|
1
|
+
import { MAX_PENDING_REQUESTS } from './rpc-bounds';
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_OMP_RPC_DECODER_LIMITS,
|
|
4
|
+
OmpRpcProtocolError,
|
|
5
|
+
assertNoPreNegotiationRpcChunk,
|
|
6
|
+
type OmpRpcInboundFrame,
|
|
7
|
+
} from './rpc-protocol';
|
|
8
|
+
import { normalizeOmpRpcFrame } from './rpc-events';
|
|
9
|
+
import { getArray, getBoolean, getNumber, getRecord, getString } from '../json';
|
|
10
|
+
import type { OmpRpcChannel } from './rpc-driver-channel';
|
|
11
|
+
import {
|
|
12
|
+
OmpRpcTaskFailure,
|
|
13
|
+
sessionEvidenceFromState,
|
|
14
|
+
sessionFieldsFromRecord,
|
|
15
|
+
type DriverState,
|
|
16
|
+
type OmpRpcTaskHooks,
|
|
17
|
+
type OmpRpcTaskRequest,
|
|
18
|
+
} from './rpc-driver-state';
|
|
19
|
+
import type { OutputEvent } from '../types';
|
|
20
|
+
|
|
21
|
+
interface DispatchContext {
|
|
22
|
+
readonly request: OmpRpcTaskRequest;
|
|
23
|
+
readonly hooks: OmpRpcTaskHooks;
|
|
24
|
+
readonly state: DriverState;
|
|
25
|
+
readonly channel: OmpRpcChannel;
|
|
26
|
+
readonly spawnHook: Promise<void>;
|
|
27
|
+
readonly pushEvent: (event: OutputEvent) => void;
|
|
28
|
+
readonly fail: (stopReason: string, message: string) => void;
|
|
29
|
+
readonly agentEnd: () => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class OmpRpcDispatcher {
|
|
33
|
+
constructor(private readonly context: DispatchContext) {}
|
|
34
|
+
|
|
35
|
+
enqueue(frame: OmpRpcInboundFrame): void {
|
|
36
|
+
const { state } = this.context;
|
|
37
|
+
if (state.queuedFrames >= MAX_PENDING_REQUESTS) {
|
|
38
|
+
this.context.fail(
|
|
39
|
+
'pending-request-exceeded',
|
|
40
|
+
`More than ${MAX_PENDING_REQUESTS} RPC frames are queued awaiting dispatch.`
|
|
41
|
+
);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
state.queuedFrames += 1;
|
|
45
|
+
state.chain = state.chain
|
|
46
|
+
.then(() => this.dispatchFrame(frame))
|
|
47
|
+
.catch((error: unknown) => this.failFrom(error))
|
|
48
|
+
.finally(() => {
|
|
49
|
+
state.queuedFrames -= 1;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private failFrom(error: unknown): void {
|
|
54
|
+
if (error instanceof OmpRpcProtocolError) this.context.fail(error.code, error.message);
|
|
55
|
+
else if (error instanceof OmpRpcTaskFailure) {
|
|
56
|
+
this.context.fail(error.stopReason, error.message);
|
|
57
|
+
} else {
|
|
58
|
+
this.context.fail('driver-error', error instanceof Error ? error.message : String(error));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private dispatchReadyFrame(frame: OmpRpcInboundFrame): void {
|
|
63
|
+
const { state } = this.context;
|
|
64
|
+
state.readyReceived = true;
|
|
65
|
+
if (frame.type !== 'ready') {
|
|
66
|
+
throw new OmpRpcTaskFailure(
|
|
67
|
+
'unsupported-protocol',
|
|
68
|
+
`Expected an initial ready frame, got "${frame.type}".`
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
const supportedVersions = getArray(frame, 'supportedProtocolVersions');
|
|
72
|
+
if (!supportedVersions.includes(2)) {
|
|
73
|
+
throw new OmpRpcTaskFailure(
|
|
74
|
+
'unsupported-protocol',
|
|
75
|
+
`OMP ready frame did not advertise protocol v2 (supportedProtocolVersions=${JSON.stringify(supportedVersions)}).`
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
const maxFrameBytes = getNumber(frame, 'maxFrameBytes');
|
|
79
|
+
const maxReassembledFrameBytes = getNumber(frame, 'maxReassembledFrameBytes');
|
|
80
|
+
if (
|
|
81
|
+
maxFrameBytes === null ||
|
|
82
|
+
maxFrameBytes > DEFAULT_OMP_RPC_DECODER_LIMITS.maxPhysicalFrameBytes ||
|
|
83
|
+
maxReassembledFrameBytes === null ||
|
|
84
|
+
maxReassembledFrameBytes > DEFAULT_OMP_RPC_DECODER_LIMITS.maxReassembledFrameBytes
|
|
85
|
+
) {
|
|
86
|
+
throw new OmpRpcTaskFailure(
|
|
87
|
+
'unsupported-limits',
|
|
88
|
+
`OMP ready frame advertised limits above the pinned decoder caps (maxFrameBytes=${String(maxFrameBytes)}, maxReassembledFrameBytes=${String(maxReassembledFrameBytes)}).`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
void this.negotiateAndPrompt().catch((error: unknown) => this.failFrom(error));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private async negotiateAndPrompt(): Promise<void> {
|
|
95
|
+
const { state, request, hooks, channel } = this.context;
|
|
96
|
+
await this.context.spawnHook;
|
|
97
|
+
if (state.settled) return;
|
|
98
|
+
const negotiateResponse = await channel.sendCommand({
|
|
99
|
+
id: 'zs-1',
|
|
100
|
+
type: 'negotiate_protocol',
|
|
101
|
+
protocolVersion: 2,
|
|
102
|
+
});
|
|
103
|
+
channel.assertSuccessfulResponse(negotiateResponse, 'negotiate_protocol', 'zs-1');
|
|
104
|
+
state.negotiatedV2 = true;
|
|
105
|
+
|
|
106
|
+
const stateResponse = await channel
|
|
107
|
+
.sendCommand({ id: 'zs-state', type: 'get_state' })
|
|
108
|
+
.catch(() => null);
|
|
109
|
+
state.sessionEvidence = sessionEvidenceFromState(stateResponse);
|
|
110
|
+
await hooks.onSession({ ...state.sessionEvidence, phase: 'ready' });
|
|
111
|
+
|
|
112
|
+
state.promptSent = true;
|
|
113
|
+
const ack = await channel.sendCommand({ id: 'zs-2', type: 'prompt', message: request.prompt });
|
|
114
|
+
channel.assertSuccessfulResponse(ack, 'prompt', 'zs-2');
|
|
115
|
+
const data = getRecord(ack, 'data');
|
|
116
|
+
if (data !== null && getBoolean(data, 'agentInvoked') === false) {
|
|
117
|
+
throw new OmpRpcTaskFailure(
|
|
118
|
+
'local-only-prompt',
|
|
119
|
+
'OMP resolved the prompt without invoking the agent (no agent turn).'
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private handlePromptResultFrame(frame: OmpRpcInboundFrame): void {
|
|
125
|
+
if (getString(frame, 'id') !== 'zs-2') return;
|
|
126
|
+
if (getBoolean(frame, 'agentInvoked') === true) return;
|
|
127
|
+
throw new OmpRpcTaskFailure(
|
|
128
|
+
'local-only-prompt',
|
|
129
|
+
'OMP resolved the prompt without invoking the agent (no agent turn).'
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private handleSessionInfoUpdate(frame: OmpRpcInboundFrame): Promise<void> | void {
|
|
134
|
+
const updates = sessionFieldsFromRecord(frame);
|
|
135
|
+
if (Object.keys(updates).length === 0) return;
|
|
136
|
+
const { state, hooks } = this.context;
|
|
137
|
+
state.sessionEvidence = { ...state.sessionEvidence, ...updates };
|
|
138
|
+
return hooks.onSession({ ...state.sessionEvidence, phase: 'ready' });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private dispatchFrame(frame: OmpRpcInboundFrame): void | Promise<void> {
|
|
142
|
+
const { state, channel } = this.context;
|
|
143
|
+
if (state.terminal) return;
|
|
144
|
+
if (!state.readyReceived) return this.dispatchReadyFrame(frame);
|
|
145
|
+
assertNoPreNegotiationRpcChunk(frame.type, state.negotiatedV2);
|
|
146
|
+
switch (frame.type) {
|
|
147
|
+
case 'response':
|
|
148
|
+
return channel.handleResponse(frame);
|
|
149
|
+
case 'extension_ui_request':
|
|
150
|
+
return channel.handleExtensionUiRequest(frame);
|
|
151
|
+
case 'host_tool_call':
|
|
152
|
+
return channel.handleHostToolCall(frame);
|
|
153
|
+
case 'host_uri_request':
|
|
154
|
+
return channel.handleHostUriRequest(frame);
|
|
155
|
+
case 'host_tool_cancel':
|
|
156
|
+
case 'host_uri_cancel':
|
|
157
|
+
return;
|
|
158
|
+
case 'extension_error':
|
|
159
|
+
throw new OmpRpcTaskFailure(
|
|
160
|
+
'extension-error',
|
|
161
|
+
getString(frame, 'error') ?? 'OMP extension runner reported an error.'
|
|
162
|
+
);
|
|
163
|
+
case 'prompt_result':
|
|
164
|
+
return this.handlePromptResultFrame(frame);
|
|
165
|
+
case 'agent_end':
|
|
166
|
+
return this.context.agentEnd();
|
|
167
|
+
case 'session_info_update':
|
|
168
|
+
return this.handleSessionInfoUpdate(frame);
|
|
169
|
+
default:
|
|
170
|
+
if (state.promptSent) {
|
|
171
|
+
for (const event of normalizeOmpRpcFrame(frame, state.eventState)) {
|
|
172
|
+
this.context.pushEvent(event);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
|
|
3
|
+
import { omitProcessControlEnv, omitUnsafeProviderEnv } from '../env-safety';
|
|
4
|
+
import { MAX_STDERR_TAIL_BYTES } from './rpc-bounds';
|
|
5
|
+
import { OmpRpcProtocolError } from './rpc-protocol';
|
|
6
|
+
import { OmpRpcChannel } from './rpc-driver-channel';
|
|
7
|
+
import { OmpRpcDispatcher } from './rpc-driver-dispatch';
|
|
8
|
+
import {
|
|
9
|
+
OmpRpcTaskFailure,
|
|
10
|
+
createDriverState,
|
|
11
|
+
type OmpRpcTaskHooks,
|
|
12
|
+
type OmpRpcTaskRequest,
|
|
13
|
+
type OmpRpcTaskResult,
|
|
14
|
+
} from './rpc-driver-state';
|
|
15
|
+
import type { OutputEvent } from '../types';
|
|
16
|
+
|
|
17
|
+
export function runOmpRpcTask(
|
|
18
|
+
request: OmpRpcTaskRequest,
|
|
19
|
+
hooks: OmpRpcTaskHooks
|
|
20
|
+
): Promise<OmpRpcTaskResult> {
|
|
21
|
+
return new Promise<OmpRpcTaskResult>((resolvePromise, rejectPromise) => {
|
|
22
|
+
const { commandSpec } = request;
|
|
23
|
+
const state = createDriverState();
|
|
24
|
+
const child = spawn(commandSpec.binary, [...commandSpec.args], {
|
|
25
|
+
shell: false,
|
|
26
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
27
|
+
...(commandSpec.cwd === undefined ? {} : { cwd: commandSpec.cwd }),
|
|
28
|
+
detached: process.platform !== 'win32',
|
|
29
|
+
windowsHide: true,
|
|
30
|
+
env: { ...omitProcessControlEnv(process.env), ...omitUnsafeProviderEnv(commandSpec.env) },
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
let abortTimer: NodeJS.Timeout | undefined;
|
|
34
|
+
let timeoutTimer: NodeJS.Timeout | undefined;
|
|
35
|
+
const clearTimers = (): void => {
|
|
36
|
+
if (abortTimer !== undefined) clearTimeout(abortTimer);
|
|
37
|
+
if (timeoutTimer !== undefined) clearTimeout(timeoutTimer);
|
|
38
|
+
};
|
|
39
|
+
const deriveStopReason = (): string => {
|
|
40
|
+
const lastResult = [...state.events].reverse().find((event) => event.type === 'result');
|
|
41
|
+
return lastResult?.type === 'result' && lastResult.success === false
|
|
42
|
+
? 'turn-failed'
|
|
43
|
+
: 'completed';
|
|
44
|
+
};
|
|
45
|
+
const finish = (stopReason: string): void => {
|
|
46
|
+
if (state.settled) return;
|
|
47
|
+
state.settled = true;
|
|
48
|
+
clearTimers();
|
|
49
|
+
resolvePromise({
|
|
50
|
+
events: state.events,
|
|
51
|
+
text: state.textParts.join(''),
|
|
52
|
+
session: { ...state.sessionEvidence, phase: 'terminal' },
|
|
53
|
+
stopReason,
|
|
54
|
+
exitCode: state.processExit?.exitCode ?? null,
|
|
55
|
+
signal: state.processExit?.signal ?? null,
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const pushEvent = (event: OutputEvent): void => {
|
|
59
|
+
state.events.push(event);
|
|
60
|
+
if (event.type === 'text') state.textParts.push(event.text);
|
|
61
|
+
void hooks.onEvent(event).catch(() => {});
|
|
62
|
+
};
|
|
63
|
+
const hasExited = (): boolean => child.exitCode !== null || child.signalCode !== null;
|
|
64
|
+
const terminateOwnedBoundary = (): void => {
|
|
65
|
+
if (state.terminationStarted || child.pid === undefined || hasExited()) return;
|
|
66
|
+
state.terminationStarted = true;
|
|
67
|
+
const pid = child.pid;
|
|
68
|
+
try {
|
|
69
|
+
if (process.platform === 'win32') child.kill('SIGTERM');
|
|
70
|
+
else process.kill(-pid, 'SIGTERM');
|
|
71
|
+
} catch {
|
|
72
|
+
// Process may already be gone.
|
|
73
|
+
}
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
if (hasExited()) return;
|
|
76
|
+
try {
|
|
77
|
+
if (process.platform === 'win32') child.kill('SIGKILL');
|
|
78
|
+
else process.kill(-pid, 'SIGKILL');
|
|
79
|
+
} catch {
|
|
80
|
+
// Process may already be gone.
|
|
81
|
+
}
|
|
82
|
+
}, request.exitGraceMs);
|
|
83
|
+
};
|
|
84
|
+
const failPermanently = (stopReason: string, message: string): void => {
|
|
85
|
+
if (state.terminal) return;
|
|
86
|
+
state.terminal = true;
|
|
87
|
+
state.pendingStopReason = stopReason;
|
|
88
|
+
pushEvent({
|
|
89
|
+
type: 'result',
|
|
90
|
+
success: false,
|
|
91
|
+
result: null,
|
|
92
|
+
error: `${stopReason}: ${message}`,
|
|
93
|
+
});
|
|
94
|
+
terminateOwnedBoundary();
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const spawnHookPromise = new Promise<void>((resolveSpawnHook) => {
|
|
98
|
+
child.once('spawn', () => {
|
|
99
|
+
const pid = child.pid;
|
|
100
|
+
if (pid === undefined) {
|
|
101
|
+
failPermanently('spawn-hook-failed', 'Process spawned without a pid.');
|
|
102
|
+
resolveSpawnHook();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
hooks
|
|
106
|
+
.onSpawn({
|
|
107
|
+
pid,
|
|
108
|
+
processGroupId: process.platform === 'win32' ? null : pid,
|
|
109
|
+
terminationStrategy: process.platform === 'win32' ? 'process-tree' : 'process-group',
|
|
110
|
+
})
|
|
111
|
+
.then(resolveSpawnHook, (error: unknown) => {
|
|
112
|
+
failPermanently(
|
|
113
|
+
'spawn-hook-failed',
|
|
114
|
+
error instanceof Error ? error.message : String(error)
|
|
115
|
+
);
|
|
116
|
+
resolveSpawnHook();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const channel = new OmpRpcChannel(child, state);
|
|
122
|
+
const agentEnd = (): void => {
|
|
123
|
+
if (state.terminal) return;
|
|
124
|
+
state.terminal = true;
|
|
125
|
+
state.pendingStopReason = deriveStopReason();
|
|
126
|
+
child.stdin.end();
|
|
127
|
+
setTimeout(terminateOwnedBoundary, request.exitGraceMs);
|
|
128
|
+
};
|
|
129
|
+
const dispatcher = new OmpRpcDispatcher({
|
|
130
|
+
request,
|
|
131
|
+
hooks,
|
|
132
|
+
state,
|
|
133
|
+
channel,
|
|
134
|
+
spawnHook: spawnHookPromise,
|
|
135
|
+
pushEvent,
|
|
136
|
+
fail: failPermanently,
|
|
137
|
+
agentEnd,
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
child.stdout.on('data', (chunk: Buffer) => {
|
|
141
|
+
try {
|
|
142
|
+
for (const frame of state.decoder.push(chunk, state.negotiatedV2))
|
|
143
|
+
dispatcher.enqueue(frame);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
if (error instanceof OmpRpcProtocolError) failPermanently(error.code, error.message);
|
|
146
|
+
else
|
|
147
|
+
failPermanently('decoder-error', error instanceof Error ? error.message : String(error));
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
child.stderr.on('data', (chunk: Buffer) => {
|
|
151
|
+
state.stderrTail = (state.stderrTail + chunk.toString('utf8')).slice(-MAX_STDERR_TAIL_BYTES);
|
|
152
|
+
});
|
|
153
|
+
child.once('error', (error) => {
|
|
154
|
+
if (state.settled) return;
|
|
155
|
+
state.settled = true;
|
|
156
|
+
clearTimers();
|
|
157
|
+
rejectPromise(error);
|
|
158
|
+
});
|
|
159
|
+
child.once('close', (exitCode, signal) => {
|
|
160
|
+
state.processExit = { exitCode, signal: signal ?? null };
|
|
161
|
+
for (const command of state.pending.values()) {
|
|
162
|
+
command.reject(
|
|
163
|
+
new OmpRpcTaskFailure('process-closed', 'child process ended before a response arrived.')
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
state.pending.clear();
|
|
167
|
+
if (state.terminal) return finish(state.pendingStopReason ?? deriveStopReason());
|
|
168
|
+
state.terminal = true;
|
|
169
|
+
let detail: string;
|
|
170
|
+
try {
|
|
171
|
+
state.decoder.finish();
|
|
172
|
+
detail = `OMP process exited (code=${exitCode ?? 'null'}, signal=${signal ?? 'null'}) before a terminal RPC frame arrived.`;
|
|
173
|
+
} catch (error) {
|
|
174
|
+
detail = error instanceof OmpRpcProtocolError ? error.message : String(error);
|
|
175
|
+
}
|
|
176
|
+
if (state.stderrTail) detail += ` stderr: ${state.stderrTail}`;
|
|
177
|
+
const stopReason = state.abortStopReason ?? 'stream-ended-before-terminal';
|
|
178
|
+
pushEvent({
|
|
179
|
+
type: 'result',
|
|
180
|
+
success: false,
|
|
181
|
+
result: null,
|
|
182
|
+
error: `${stopReason}: ${detail}`,
|
|
183
|
+
});
|
|
184
|
+
finish(stopReason);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const beginAbort = (stopReason: string): void => {
|
|
188
|
+
if (state.settled || state.terminal || state.abortStopReason !== null) return;
|
|
189
|
+
state.abortStopReason = stopReason;
|
|
190
|
+
channel.writeFrame({ id: 'zs-abort', type: 'abort' });
|
|
191
|
+
abortTimer = setTimeout(() => {
|
|
192
|
+
if (!state.terminal) terminateOwnedBoundary();
|
|
193
|
+
}, request.abortGraceMs);
|
|
194
|
+
};
|
|
195
|
+
if (request.signal.aborted) beginAbort('cancelled');
|
|
196
|
+
else request.signal.addEventListener('abort', () => beginAbort('cancelled'), { once: true });
|
|
197
|
+
timeoutTimer = setTimeout(() => beginAbort('timeout'), request.timeoutMs);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_OMP_RPC_DECODER_LIMITS,
|
|
3
|
+
OmpRpcFrameDecoder,
|
|
4
|
+
type OmpRpcCommand,
|
|
5
|
+
} from './rpc-protocol';
|
|
6
|
+
import { createOmpRpcEventState } from './rpc-events';
|
|
7
|
+
import { getBoolean, getRecord, getString } from '../json';
|
|
8
|
+
import type { OmpSessionLaunch } from './rpc-session';
|
|
9
|
+
import type { CommandSpec, OutputEvent } from '../types';
|
|
10
|
+
|
|
11
|
+
export interface OmpRpcSpawnEvidence {
|
|
12
|
+
readonly pid: number;
|
|
13
|
+
readonly processGroupId: number | null;
|
|
14
|
+
readonly terminationStrategy: 'process-group' | 'process-tree';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface OmpRpcSessionEvidence {
|
|
18
|
+
readonly phase: 'ready' | 'terminal';
|
|
19
|
+
readonly sessionId: string | null;
|
|
20
|
+
readonly sessionFile: string | null;
|
|
21
|
+
readonly selectedProvider: string;
|
|
22
|
+
readonly selectedModel: string;
|
|
23
|
+
readonly thinkingLevel: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface OmpRpcTaskRequest {
|
|
27
|
+
readonly commandSpec: CommandSpec;
|
|
28
|
+
readonly prompt: string;
|
|
29
|
+
readonly expectedVersion: string;
|
|
30
|
+
readonly session: OmpSessionLaunch;
|
|
31
|
+
readonly signal: AbortSignal;
|
|
32
|
+
readonly timeoutMs: number;
|
|
33
|
+
readonly abortGraceMs: number;
|
|
34
|
+
readonly exitGraceMs: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface OmpRpcTaskHooks {
|
|
38
|
+
readonly onSpawn: (evidence: OmpRpcSpawnEvidence) => Promise<void>;
|
|
39
|
+
readonly onEvent: (event: OutputEvent) => Promise<void>;
|
|
40
|
+
readonly onSession: (evidence: OmpRpcSessionEvidence) => Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface OmpRpcTaskResult {
|
|
44
|
+
readonly events: readonly OutputEvent[];
|
|
45
|
+
readonly text: string;
|
|
46
|
+
readonly session: OmpRpcSessionEvidence;
|
|
47
|
+
readonly stopReason: string;
|
|
48
|
+
readonly exitCode: number | null;
|
|
49
|
+
readonly signal: string | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const UNKNOWN_SESSION_EVIDENCE: Omit<OmpRpcSessionEvidence, 'phase'> = {
|
|
53
|
+
sessionId: null,
|
|
54
|
+
sessionFile: null,
|
|
55
|
+
selectedProvider: '',
|
|
56
|
+
selectedModel: '',
|
|
57
|
+
thinkingLevel: '',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
type UiResponder = (id: string) => OmpRpcCommand;
|
|
61
|
+
|
|
62
|
+
// extension_ui_request method table (docs/rpc.md "Extension UI Sub-Protocol"). Zeroshot has no
|
|
63
|
+
// interactive host surface, so every method resolves to a cancelled/no-op response instead of
|
|
64
|
+
// blocking the child indefinitely.
|
|
65
|
+
export const UI_RESPONDERS: Readonly<Record<string, UiResponder>> = {
|
|
66
|
+
confirm: (id) => ({ type: 'extension_ui_response', id, confirmed: false, cancelled: true }),
|
|
67
|
+
select: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
|
|
68
|
+
input: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
|
|
69
|
+
editor: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
|
|
70
|
+
open_url: (id) => ({ type: 'extension_ui_response', id, cancelled: true }),
|
|
71
|
+
notify: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
|
|
72
|
+
setStatus: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
|
|
73
|
+
setWidget: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
|
|
74
|
+
setTitle: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
|
|
75
|
+
set_editor_text: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
|
|
76
|
+
cancel: (id) => ({ type: 'extension_ui_response', id, cancelled: false }),
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export class OmpRpcTaskFailure extends Error {
|
|
80
|
+
readonly stopReason: string;
|
|
81
|
+
|
|
82
|
+
constructor(stopReason: string, message: string) {
|
|
83
|
+
super(message);
|
|
84
|
+
this.name = 'OmpRpcTaskFailure';
|
|
85
|
+
this.stopReason = stopReason;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface PendingCommand {
|
|
90
|
+
readonly resolve: (frame: Record<string, unknown>) => void;
|
|
91
|
+
readonly reject: (error: Error) => void;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface DriverState {
|
|
95
|
+
readonly decoder: OmpRpcFrameDecoder;
|
|
96
|
+
readonly eventState: ReturnType<typeof createOmpRpcEventState>;
|
|
97
|
+
readonly pending: Map<string, PendingCommand>;
|
|
98
|
+
readonly lifetimeRequestIds: Set<string>;
|
|
99
|
+
queuedFrames: number;
|
|
100
|
+
readonly events: OutputEvent[];
|
|
101
|
+
readonly textParts: string[];
|
|
102
|
+
stderrTail: string;
|
|
103
|
+
negotiatedV2: boolean;
|
|
104
|
+
readyReceived: boolean;
|
|
105
|
+
promptSent: boolean;
|
|
106
|
+
terminal: boolean;
|
|
107
|
+
settled: boolean;
|
|
108
|
+
abortStopReason: string | null;
|
|
109
|
+
pendingStopReason: string | null;
|
|
110
|
+
terminationStarted: boolean;
|
|
111
|
+
sessionEvidence: Omit<OmpRpcSessionEvidence, 'phase'>;
|
|
112
|
+
processExit: { exitCode: number | null; signal: string | null } | null;
|
|
113
|
+
chain: Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function createDriverState(): DriverState {
|
|
117
|
+
return {
|
|
118
|
+
decoder: new OmpRpcFrameDecoder(DEFAULT_OMP_RPC_DECODER_LIMITS),
|
|
119
|
+
eventState: createOmpRpcEventState(),
|
|
120
|
+
pending: new Map(),
|
|
121
|
+
lifetimeRequestIds: new Set(),
|
|
122
|
+
queuedFrames: 0,
|
|
123
|
+
events: [],
|
|
124
|
+
textParts: [],
|
|
125
|
+
stderrTail: '',
|
|
126
|
+
negotiatedV2: false,
|
|
127
|
+
readyReceived: false,
|
|
128
|
+
promptSent: false,
|
|
129
|
+
terminal: false,
|
|
130
|
+
settled: false,
|
|
131
|
+
abortStopReason: null,
|
|
132
|
+
pendingStopReason: null,
|
|
133
|
+
terminationStarted: false,
|
|
134
|
+
sessionEvidence: UNKNOWN_SESSION_EVIDENCE,
|
|
135
|
+
processExit: null,
|
|
136
|
+
chain: Promise.resolve(),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function sessionFieldsFromRecord(
|
|
141
|
+
record: Record<string, unknown>
|
|
142
|
+
): Partial<Pick<OmpRpcSessionEvidence, 'sessionId' | 'sessionFile'>> {
|
|
143
|
+
const sessionId = getString(record, 'sessionId');
|
|
144
|
+
const sessionFile = getString(record, 'sessionFile');
|
|
145
|
+
return {
|
|
146
|
+
...(sessionId !== null ? { sessionId } : {}),
|
|
147
|
+
...(sessionFile !== null ? { sessionFile } : {}),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function sessionEvidenceFromState(
|
|
152
|
+
stateResponse: Record<string, unknown> | null
|
|
153
|
+
): Omit<OmpRpcSessionEvidence, 'phase'> {
|
|
154
|
+
if (stateResponse === null || getBoolean(stateResponse, 'success') !== true)
|
|
155
|
+
return UNKNOWN_SESSION_EVIDENCE;
|
|
156
|
+
const data = getRecord(stateResponse, 'data');
|
|
157
|
+
const model = data ? getRecord(data, 'model') : null;
|
|
158
|
+
return {
|
|
159
|
+
...UNKNOWN_SESSION_EVIDENCE,
|
|
160
|
+
...(data ? sessionFieldsFromRecord(data) : {}),
|
|
161
|
+
selectedProvider: (model ? getString(model, 'provider') : null) ?? '',
|
|
162
|
+
selectedModel: (model ? getString(model, 'id') : null) ?? '',
|
|
163
|
+
thinkingLevel: (data ? getString(data, 'thinkingLevel') : null) ?? '',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getNumber, getOptionalString, getString, isRecord, tryParseJson } from '../json';
|
|
2
|
+
import type { ProviderParseResult, ProviderParserState } from '../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Parse one line of the rpc-stdio lane's already-normalized OutputEvent JSON stream. The driver
|
|
6
|
+
* normalizes raw RPC frames once; this validating passthrough keeps generic log and attach tooling
|
|
7
|
+
* on the provider adapter contract without re-deriving events from raw frames.
|
|
8
|
+
*/
|
|
9
|
+
export function parseNormalizedOmpRpcEventLine(
|
|
10
|
+
line: string,
|
|
11
|
+
_state: ProviderParserState
|
|
12
|
+
): ProviderParseResult {
|
|
13
|
+
const parsed = tryParseJson(line);
|
|
14
|
+
if (!isRecord(parsed)) return null;
|
|
15
|
+
switch (parsed.type) {
|
|
16
|
+
case 'text':
|
|
17
|
+
case 'thinking': {
|
|
18
|
+
const text = getString(parsed, 'text');
|
|
19
|
+
return text === null ? null : { type: parsed.type, text };
|
|
20
|
+
}
|
|
21
|
+
case 'tool_call':
|
|
22
|
+
return {
|
|
23
|
+
type: 'tool_call',
|
|
24
|
+
toolName: getOptionalString(parsed, 'toolName'),
|
|
25
|
+
toolId: getOptionalString(parsed, 'toolId'),
|
|
26
|
+
input: parsed.input,
|
|
27
|
+
};
|
|
28
|
+
case 'tool_result':
|
|
29
|
+
return {
|
|
30
|
+
type: 'tool_result',
|
|
31
|
+
toolId: getOptionalString(parsed, 'toolId'),
|
|
32
|
+
content: parsed.content,
|
|
33
|
+
isError: parsed.isError,
|
|
34
|
+
};
|
|
35
|
+
case 'result': {
|
|
36
|
+
if (typeof parsed.success !== 'boolean') return null;
|
|
37
|
+
const inputTokens = getNumber(parsed, 'inputTokens');
|
|
38
|
+
const outputTokens = getNumber(parsed, 'outputTokens');
|
|
39
|
+
const cacheReadInputTokens = getNumber(parsed, 'cacheReadInputTokens');
|
|
40
|
+
const cacheCreationInputTokens = getNumber(parsed, 'cacheCreationInputTokens');
|
|
41
|
+
return {
|
|
42
|
+
type: 'result',
|
|
43
|
+
success: parsed.success,
|
|
44
|
+
result: parsed.result,
|
|
45
|
+
error: parsed.error,
|
|
46
|
+
cost: parsed.cost,
|
|
47
|
+
duration: parsed.duration,
|
|
48
|
+
...(inputTokens === null ? {} : { inputTokens }),
|
|
49
|
+
...(outputTokens === null ? {} : { outputTokens }),
|
|
50
|
+
...(cacheReadInputTokens === null ? {} : { cacheReadInputTokens }),
|
|
51
|
+
...(cacheCreationInputTokens === null ? {} : { cacheCreationInputTokens }),
|
|
52
|
+
modelUsage: parsed.modelUsage,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|