@the-open-engine/zeroshot 6.30.1 → 6.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/agent-cli-provider/adapters/acp.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/acp.js +7 -11
- package/lib/agent-cli-provider/adapters/acp.js.map +1 -1
- package/lib/agent-cli-provider/adapters/omp-policy.d.ts +4 -0
- package/lib/agent-cli-provider/adapters/omp-policy.d.ts.map +1 -0
- package/lib/agent-cli-provider/adapters/omp-policy.js +47 -0
- package/lib/agent-cli-provider/adapters/omp-policy.js.map +1 -0
- package/lib/agent-cli-provider/adapters/omp.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/omp.js +8 -158
- package/lib/agent-cli-provider/adapters/omp.js.map +1 -1
- package/lib/agent-cli-provider/adapters/pi.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/pi.js +12 -124
- package/lib/agent-cli-provider/adapters/pi.js.map +1 -1
- package/lib/agent-cli-provider/assistant-stream.d.ts +27 -0
- package/lib/agent-cli-provider/assistant-stream.d.ts.map +1 -0
- package/lib/agent-cli-provider/assistant-stream.js +119 -0
- package/lib/agent-cli-provider/assistant-stream.js.map +1 -0
- package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-actions.js +42 -1
- package/lib/agent-cli-provider/contract-actions.js.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.js +68 -38
- package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
- package/lib/agent-cli-provider/contract-support.d.ts +5 -6
- package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-support.js +99 -6
- package/lib/agent-cli-provider/contract-support.js.map +1 -1
- package/lib/agent-cli-provider/index.d.ts +8 -6
- package/lib/agent-cli-provider/index.d.ts.map +1 -1
- package/lib/agent-cli-provider/index.js +34 -10
- package/lib/agent-cli-provider/index.js.map +1 -1
- package/lib/agent-cli-provider/omp/auth-policy.d.ts +31 -0
- package/lib/agent-cli-provider/omp/auth-policy.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/auth-policy.js +98 -0
- package/lib/agent-cli-provider/omp/auth-policy.js.map +1 -0
- package/lib/agent-cli-provider/{omp-release.d.ts → omp/release.d.ts} +1 -1
- package/lib/agent-cli-provider/omp/release.d.ts.map +1 -0
- package/lib/agent-cli-provider/{omp-release.js → omp/release.js} +1 -1
- package/lib/agent-cli-provider/omp/release.js.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-bounds.d.ts → omp/rpc-bounds.d.ts} +1 -1
- package/lib/agent-cli-provider/omp/rpc-bounds.d.ts.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-bounds.js → omp/rpc-bounds.js} +1 -1
- package/lib/agent-cli-provider/omp/rpc-bounds.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.d.ts +19 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.js +109 -0
- package/lib/agent-cli-provider/omp/rpc-driver-channel.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.d.ts +27 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.js +135 -0
- package/lib/agent-cli-provider/omp/rpc-driver-dispatch.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.d.ts +3 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.js +205 -0
- package/lib/agent-cli-provider/omp/rpc-driver-runner.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.d.ts +80 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.js +86 -0
- package/lib/agent-cli-provider/omp/rpc-driver-state.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver.d.ts +3 -0
- package/lib/agent-cli-provider/omp/rpc-driver.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-driver.js +6 -0
- package/lib/agent-cli-provider/omp/rpc-driver.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.d.ts +8 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.js +59 -0
- package/lib/agent-cli-provider/omp/rpc-event-lines.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-events.d.ts +16 -0
- package/lib/agent-cli-provider/omp/rpc-events.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-events.js +115 -0
- package/lib/agent-cli-provider/omp/rpc-events.js.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-protocol.d.ts → omp/rpc-protocol-contract.d.ts} +1 -13
- package/lib/agent-cli-provider/omp/rpc-protocol-contract.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-protocol-contract.js +54 -0
- package/lib/agent-cli-provider/omp/rpc-protocol-contract.js.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.d.ts +15 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.js +208 -0
- package/lib/agent-cli-provider/omp/rpc-protocol.js.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-session.d.ts → omp/rpc-session.d.ts} +1 -1
- package/lib/agent-cli-provider/omp/rpc-session.d.ts.map +1 -0
- package/lib/agent-cli-provider/{omp-rpc-session.js → omp/rpc-session.js} +1 -1
- package/lib/agent-cli-provider/omp/rpc-session.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-contract.d.ts +34 -0
- package/lib/agent-cli-provider/omp/sdk-contract.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-contract.js +81 -0
- package/lib/agent-cli-provider/omp/sdk-contract.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.d.ts +6 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.js +44 -0
- package/lib/agent-cli-provider/omp/sdk-process-credentials.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.js +13 -0
- package/lib/agent-cli-provider/omp/sdk-process-error.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.d.ts +18 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.js +80 -0
- package/lib/agent-cli-provider/omp/sdk-process-io.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.d.ts +51 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.js +154 -0
- package/lib/agent-cli-provider/omp/sdk-process-private-runtime.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.d.ts +26 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.js +117 -0
- package/lib/agent-cli-provider/omp/sdk-process-result.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.d.ts +7 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.js +204 -0
- package/lib/agent-cli-provider/omp/sdk-process-runner.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.d.ts +3 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.js +145 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-collector.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.d.ts +4 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.js +183 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-frame.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.d.ts +8 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.js +170 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-request.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.js +74 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-result.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.d.ts +94 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.js +54 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-types.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.d.ts +18 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.js +229 -0
- package/lib/agent-cli-provider/omp/sdk-protocol-value.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.d.ts +7 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.js +28 -0
- package/lib/agent-cli-provider/omp/sdk-protocol.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.d.ts +29 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.js +110 -0
- package/lib/agent-cli-provider/omp/sdk-runtime.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.d.ts +3 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.js +86 -0
- package/lib/agent-cli-provider/omp/sdk-settings-auth.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.d.ts +26 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.js +148 -0
- package/lib/agent-cli-provider/omp/sdk-settings-constants.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.js +198 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model-fields.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.d.ts +4 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.js +163 -0
- package/lib/agent-cli-provider/omp/sdk-settings-model.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.d.ts +18 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.js +148 -0
- package/lib/agent-cli-provider/omp/sdk-settings-normalize.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.d.ts +3 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.js +22 -0
- package/lib/agent-cli-provider/omp/sdk-settings-selector.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.d.ts +68 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.js +19 -0
- package/lib/agent-cli-provider/omp/sdk-settings-types.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.d.ts +14 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.js +112 -0
- package/lib/agent-cli-provider/omp/sdk-settings-values.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-settings.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-settings.js +16 -0
- package/lib/agent-cli-provider/omp/sdk-settings.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.d.ts +11 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.js +171 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-context.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.js +94 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-credentials.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.js +175 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-execute.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.d.ts +5 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.js +216 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-output.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.d.ts +11 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.js +265 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-runtime.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.d.ts +148 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.js +84 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar-types.js.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.d.ts +4 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.d.ts.map +1 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.js +9 -0
- package/lib/agent-cli-provider/omp/sdk-sidecar.js.map +1 -0
- package/lib/agent-cli-provider/process-runner.d.ts +1 -0
- package/lib/agent-cli-provider/process-runner.d.ts.map +1 -1
- package/lib/agent-cli-provider/process-runner.js +19 -6
- package/lib/agent-cli-provider/process-runner.js.map +1 -1
- package/lib/agent-cli-provider/provider-registry.d.ts +18 -4
- package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -1
- package/lib/agent-cli-provider/provider-registry.js +21 -7
- package/lib/agent-cli-provider/provider-registry.js.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.d.ts +10 -1
- package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.js +378 -11
- package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
- package/lib/agent-cli-provider/types.d.ts +110 -2
- package/lib/agent-cli-provider/types.d.ts.map +1 -1
- package/lib/agent-cli-provider/types.js.map +1 -1
- package/npm-shrinkwrap.json +18116 -0
- package/package.json +16 -3
- package/scripts/omp/bun-ffi.d.ts +28 -0
- package/scripts/omp/host-supervisor-cleanup.ts +100 -0
- package/scripts/omp/host-supervisor-launch.ts +38 -0
- package/scripts/omp/host-supervisor-native.ts +181 -0
- package/scripts/omp/host-supervisor-tracker.ts +258 -0
- package/scripts/omp/host-supervisor.ts +298 -0
- package/scripts/omp/promise-gate.ts +13 -0
- package/scripts/omp/runtime-identities.js +283 -0
- package/scripts/omp/runtime-lock.js +232 -0
- package/scripts/omp/runtime-release.js +105 -0
- package/scripts/omp/runtime.js +33 -0
- package/scripts/omp/sidecar.ts +124 -0
- package/scripts/opcore-introduced-check.js +5 -0
- package/scripts/release-preflight.js +19 -0
- package/src/agent-cli-provider/adapters/acp.ts +18 -17
- package/src/agent-cli-provider/adapters/omp-policy.ts +45 -0
- package/src/agent-cli-provider/adapters/omp.ts +9 -155
- package/src/agent-cli-provider/adapters/pi.ts +15 -145
- package/src/agent-cli-provider/assistant-stream.ts +155 -0
- package/src/agent-cli-provider/contract-actions.ts +14 -2
- package/src/agent-cli-provider/contract-invoke.ts +77 -40
- package/src/agent-cli-provider/contract-support.ts +83 -12
- package/src/agent-cli-provider/index.ts +60 -5
- package/src/agent-cli-provider/omp/auth-policy.ts +126 -0
- package/src/agent-cli-provider/omp/rpc-driver-channel.ts +144 -0
- package/src/agent-cli-provider/omp/rpc-driver-dispatch.ts +177 -0
- package/src/agent-cli-provider/omp/rpc-driver-runner.ts +199 -0
- package/src/agent-cli-provider/omp/rpc-driver-state.ts +165 -0
- package/src/agent-cli-provider/omp/rpc-driver.ts +8 -0
- package/src/agent-cli-provider/omp/rpc-event-lines.ts +58 -0
- package/src/agent-cli-provider/omp/rpc-events.ts +154 -0
- package/src/agent-cli-provider/omp/rpc-protocol-contract.ts +77 -0
- package/src/agent-cli-provider/{omp-rpc-protocol.ts → omp/rpc-protocol.ts} +9 -111
- package/src/agent-cli-provider/omp/sdk-contract.ts +123 -0
- package/src/agent-cli-provider/omp/sdk-process-credentials.ts +55 -0
- package/src/agent-cli-provider/omp/sdk-process-error.ts +9 -0
- package/src/agent-cli-provider/omp/sdk-process-io.ts +92 -0
- package/src/agent-cli-provider/omp/sdk-process-private-runtime.ts +249 -0
- package/src/agent-cli-provider/omp/sdk-process-result.ts +181 -0
- package/src/agent-cli-provider/omp/sdk-process-runner.ts +281 -0
- package/src/agent-cli-provider/omp/sdk-protocol-collector.ts +140 -0
- package/src/agent-cli-provider/omp/sdk-protocol-frame.ts +260 -0
- package/src/agent-cli-provider/omp/sdk-protocol-request.ts +181 -0
- package/src/agent-cli-provider/omp/sdk-protocol-result.ts +80 -0
- package/src/agent-cli-provider/omp/sdk-protocol-types.ts +156 -0
- package/src/agent-cli-provider/omp/sdk-protocol-value.ts +234 -0
- package/src/agent-cli-provider/omp/sdk-protocol.ts +46 -0
- package/src/agent-cli-provider/omp/sdk-runtime.ts +159 -0
- package/src/agent-cli-provider/omp/sdk-settings-auth.ts +78 -0
- package/src/agent-cli-provider/omp/sdk-settings-constants.ts +147 -0
- package/src/agent-cli-provider/omp/sdk-settings-model-fields.ts +233 -0
- package/src/agent-cli-provider/omp/sdk-settings-model.ts +238 -0
- package/src/agent-cli-provider/omp/sdk-settings-normalize.ts +242 -0
- package/src/agent-cli-provider/omp/sdk-settings-selector.ts +28 -0
- package/src/agent-cli-provider/omp/sdk-settings-types.ts +88 -0
- package/src/agent-cli-provider/omp/sdk-settings-values.ts +118 -0
- package/src/agent-cli-provider/omp/sdk-settings.ts +33 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-context.ts +199 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-credentials.ts +100 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-execute.ts +201 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-output.ts +235 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-runtime.ts +244 -0
- package/src/agent-cli-provider/omp/sdk-sidecar-types.ts +173 -0
- package/src/agent-cli-provider/omp/sdk-sidecar.ts +3 -0
- package/src/agent-cli-provider/process-runner.ts +22 -8
- package/src/agent-cli-provider/provider-registry.ts +29 -10
- package/src/agent-cli-provider/single-agent-runtime.ts +444 -18
- package/src/agent-cli-provider/types.ts +131 -3
- package/src/command-cleanup-ownership.js +15 -0
- package/task-lib/omp-sdk-runtime.js +8 -0
- package/task-lib/runner.js +121 -40
- package/task-lib/sdk-watcher.js +154 -0
- package/lib/agent-cli-provider/omp-release.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-release.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-bounds.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-bounds.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-driver.d.ts +0 -40
- package/lib/agent-cli-provider/omp-rpc-driver.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-driver.js +0 -519
- package/lib/agent-cli-provider/omp-rpc-driver.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-events.d.ts +0 -28
- package/lib/agent-cli-provider/omp-rpc-events.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-events.js +0 -264
- package/lib/agent-cli-provider/omp-rpc-events.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-protocol.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-protocol.js +0 -272
- package/lib/agent-cli-provider/omp-rpc-protocol.js.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-session.d.ts.map +0 -1
- package/lib/agent-cli-provider/omp-rpc-session.js.map +0 -1
- package/src/agent-cli-provider/omp-rpc-driver.ts +0 -639
- package/src/agent-cli-provider/omp-rpc-events.ts +0 -318
- /package/src/agent-cli-provider/{omp-release.ts → omp/release.ts} +0 -0
- /package/src/agent-cli-provider/{omp-rpc-bounds.ts → omp/rpc-bounds.ts} +0 -0
- /package/src/agent-cli-provider/{omp-rpc-session.ts → omp/rpc-session.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@the-open-engine/zeroshot",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.31.0",
|
|
4
4
|
"description": "Multi-agent orchestration engine for Claude, Codex, and Gemini",
|
|
5
5
|
"main": "src/orchestrator.js",
|
|
6
6
|
"bin": {
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"build:target": "tsc --project tsconfig.target.build.json",
|
|
54
54
|
"build:cluster": "npm run protocol:generate && tsc --project tsconfig.cluster.cjs.json && tsc --project tsconfig.cluster.esm.json && tsc --project tsconfig.hosted-target.cjs.json && tsc --project tsconfig.hosted-target.esm.json && tsc --project tsconfig.hosted-session.cjs.json && tsc --project tsconfig.hosted-session.esm.json && node scripts/build-cluster.js",
|
|
55
55
|
"test:agent-cli-provider": "node --test tests/agent-cli-provider/*.test.js",
|
|
56
|
-
"test:omp": "npm run build:agent-cli-provider && node --test tests/agent-cli-provider/omp-*.test.js && node tests/run-tests.js tests/omp-rpc-watcher
|
|
56
|
+
"test:omp": "npm run build:agent-cli-provider && node --test tests/agent-cli-provider/omp-*.test.js && node tests/run-tests.js 'tests/omp-rpc-watcher*.test.js' tests/omp-isolation-capability.test.js tests/omp-docker-auth.test.js tests/omp-docker-fresh-only.test.js",
|
|
57
57
|
"test:providers:live": "npm run build:agent-cli-provider && node scripts/live-provider-smoke.js",
|
|
58
58
|
"check:agent-cli-provider": "npm run check:agent-cli-provider:ci",
|
|
59
59
|
"check:agent-cli-provider:ci": "npm run typecheck:agent-cli-provider && npm run lint:agent-cli-provider && npm run build:agent-cli-provider && npm run test:agent-cli-provider",
|
|
@@ -134,6 +134,14 @@
|
|
|
134
134
|
"engines": {
|
|
135
135
|
"node": ">=22.0.0"
|
|
136
136
|
},
|
|
137
|
+
"ompSdkHostContainment": {
|
|
138
|
+
"platforms": [
|
|
139
|
+
"linux:arm64",
|
|
140
|
+
"linux:x64"
|
|
141
|
+
],
|
|
142
|
+
"supervisor": "scripts/omp/host-supervisor.ts",
|
|
143
|
+
"protocolVersion": 1
|
|
144
|
+
},
|
|
137
145
|
"publishConfig": {
|
|
138
146
|
"access": "public",
|
|
139
147
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -178,12 +186,15 @@
|
|
|
178
186
|
"docs/openengine-cluster-protocol/v1/legacy-worker.md",
|
|
179
187
|
"README.md",
|
|
180
188
|
"LICENSE",
|
|
181
|
-
"CHANGELOG.md"
|
|
189
|
+
"CHANGELOG.md",
|
|
190
|
+
"npm-shrinkwrap.json"
|
|
182
191
|
],
|
|
183
192
|
"dependencies": {
|
|
193
|
+
"@oh-my-pi/pi-coding-agent": "17.2.1",
|
|
184
194
|
"ajv": "^8.18.0",
|
|
185
195
|
"ansi-to-html": "^0.7.2",
|
|
186
196
|
"better-sqlite3": "^12.6.2",
|
|
197
|
+
"bun": "1.3.14",
|
|
187
198
|
"chalk": "^4.1.2",
|
|
188
199
|
"commander": "^14.0.2",
|
|
189
200
|
"node-pty": "^1.1.0",
|
|
@@ -228,6 +239,8 @@
|
|
|
228
239
|
"cosmiconfig": {
|
|
229
240
|
"js-yaml": "4.2.0"
|
|
230
241
|
},
|
|
242
|
+
"adm-zip": "0.6.0",
|
|
243
|
+
"sharp": "0.35.3",
|
|
231
244
|
"xml2js": "^0.5.0",
|
|
232
245
|
"diff": ">=8.0.3",
|
|
233
246
|
"tar": ">=7.5.8",
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
declare module 'bun:ffi' {
|
|
2
|
+
type FfiArgument = number | bigint | ArrayBufferView;
|
|
3
|
+
type FfiReturn<Definition> = Definition extends { readonly returns: 'ptr' }
|
|
4
|
+
? number
|
|
5
|
+
: Definition extends { readonly returns: 'i64' }
|
|
6
|
+
? bigint
|
|
7
|
+
: number;
|
|
8
|
+
type FfiSymbols<Definitions extends Readonly<Record<string, unknown>>> = {
|
|
9
|
+
readonly [Name in keyof Definitions]: (
|
|
10
|
+
...arguments_: FfiArgument[]
|
|
11
|
+
) => FfiReturn<Definitions[Name]>;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function dlopen<Definitions extends Readonly<Record<string, unknown>>>(
|
|
15
|
+
library: string,
|
|
16
|
+
definitions: Definitions
|
|
17
|
+
): {
|
|
18
|
+
readonly symbols: FfiSymbols<Definitions>;
|
|
19
|
+
close(): void;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function ptr(value: ArrayBufferView): number;
|
|
23
|
+
export function toArrayBuffer(
|
|
24
|
+
pointer: number,
|
|
25
|
+
byteOffset?: number,
|
|
26
|
+
byteLength?: number
|
|
27
|
+
): ArrayBuffer;
|
|
28
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {
|
|
2
|
+
discoverOwnedProcesses,
|
|
3
|
+
ownershipEmpty,
|
|
4
|
+
reapExitedOwned,
|
|
5
|
+
signalOwned,
|
|
6
|
+
signalTracked,
|
|
7
|
+
} from './host-supervisor-tracker';
|
|
8
|
+
import { promiseGate } from './promise-gate';
|
|
9
|
+
|
|
10
|
+
const DISCOVERY_INTERVAL_MS = 5;
|
|
11
|
+
const SIGTERM = 15;
|
|
12
|
+
const SIGKILL = 9;
|
|
13
|
+
|
|
14
|
+
export interface SemanticOutcome {
|
|
15
|
+
readonly exitCode: number | null;
|
|
16
|
+
readonly signal: NodeJS.Signals | null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function delay(milliseconds: number): Promise<void> {
|
|
20
|
+
const gate = promiseGate<void>();
|
|
21
|
+
setTimeout(() => gate.resolve(), milliseconds);
|
|
22
|
+
return gate.promise;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function awaitOutcome(
|
|
26
|
+
outcome: Promise<SemanticOutcome>,
|
|
27
|
+
deadline: number
|
|
28
|
+
): Promise<SemanticOutcome | undefined> {
|
|
29
|
+
const remaining = deadline - Date.now();
|
|
30
|
+
if (remaining <= 0) return undefined;
|
|
31
|
+
const timeoutGate = promiseGate<undefined>();
|
|
32
|
+
const timer = setTimeout(() => timeoutGate.resolve(undefined), remaining);
|
|
33
|
+
try {
|
|
34
|
+
return await Promise.race([outcome, timeoutGate.promise]);
|
|
35
|
+
} finally {
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function cleanupOwned(
|
|
41
|
+
rootPid: number,
|
|
42
|
+
outcomePromise: Promise<SemanticOutcome>,
|
|
43
|
+
graceMs: number,
|
|
44
|
+
reapTimeoutMs: number
|
|
45
|
+
): Promise<SemanticOutcome> {
|
|
46
|
+
signalOwned(SIGTERM);
|
|
47
|
+
const gracefulDeadline = Date.now() + graceMs;
|
|
48
|
+
let outcome = await awaitOutcome(outcomePromise, gracefulDeadline);
|
|
49
|
+
while (outcome === undefined && Date.now() < gracefulDeadline) {
|
|
50
|
+
discoverOwnedProcesses();
|
|
51
|
+
reapExitedOwned(rootPid);
|
|
52
|
+
await delay(DISCOVERY_INTERVAL_MS);
|
|
53
|
+
outcome = await awaitOutcome(
|
|
54
|
+
outcomePromise,
|
|
55
|
+
Math.min(gracefulDeadline, Date.now() + DISCOVERY_INTERVAL_MS)
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
signalOwned(SIGKILL);
|
|
60
|
+
const reapDeadline = Date.now() + reapTimeoutMs;
|
|
61
|
+
let cleanupDeadlineExceeded = false;
|
|
62
|
+
while (outcome === undefined) {
|
|
63
|
+
discoverOwnedProcesses();
|
|
64
|
+
signalOwned(SIGKILL);
|
|
65
|
+
outcome = await awaitOutcome(outcomePromise, Date.now() + DISCOVERY_INTERVAL_MS);
|
|
66
|
+
if (Date.now() >= reapDeadline) cleanupDeadlineExceeded = true;
|
|
67
|
+
}
|
|
68
|
+
for (;;) {
|
|
69
|
+
discoverOwnedProcesses();
|
|
70
|
+
signalOwned(SIGKILL);
|
|
71
|
+
if (ownershipEmpty()) {
|
|
72
|
+
if (cleanupDeadlineExceeded) {
|
|
73
|
+
throw new Error('descendant cleanup exceeded its attestation deadline');
|
|
74
|
+
}
|
|
75
|
+
return outcome;
|
|
76
|
+
}
|
|
77
|
+
if (Date.now() >= reapDeadline) cleanupDeadlineExceeded = true;
|
|
78
|
+
await delay(DISCOVERY_INTERVAL_MS);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export async function holdOwnershipUntilEmpty(): Promise<void> {
|
|
82
|
+
for (;;) {
|
|
83
|
+
try {
|
|
84
|
+
discoverOwnedProcesses();
|
|
85
|
+
} catch {
|
|
86
|
+
// Capacity/relationship transitions cannot suppress signals to known identities.
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
signalTracked(SIGKILL);
|
|
90
|
+
} catch {
|
|
91
|
+
// Pidfd signaling is retried while ownership is retained.
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
if (ownershipEmpty()) return;
|
|
95
|
+
} catch {
|
|
96
|
+
// Kernel ownership is retried until ECHILD is authoritative.
|
|
97
|
+
}
|
|
98
|
+
await delay(DISCOVERY_INTERVAL_MS);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { spawn, type ChildProcess } from 'node:child_process';
|
|
2
|
+
|
|
3
|
+
import type { SemanticOutcome } from './host-supervisor-cleanup';
|
|
4
|
+
import { installSupervisorProtection } from './host-supervisor-native';
|
|
5
|
+
import { promiseGate } from './promise-gate';
|
|
6
|
+
|
|
7
|
+
export function childOutcome(child: ChildProcess): Promise<SemanticOutcome> {
|
|
8
|
+
const gate = promiseGate<SemanticOutcome>();
|
|
9
|
+
child.once('error', (error) => gate.reject(error));
|
|
10
|
+
child.once('close', (exitCode, signal) => gate.resolve({ exitCode, signal }));
|
|
11
|
+
return gate.promise;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function launchProtectedSidecar(): Promise<void> {
|
|
15
|
+
const supervisorPid = Number(process.argv[3]);
|
|
16
|
+
const sidecarPath = process.argv[4];
|
|
17
|
+
const requestPath = process.argv[5];
|
|
18
|
+
if (
|
|
19
|
+
!Number.isSafeInteger(supervisorPid) ||
|
|
20
|
+
supervisorPid <= 1 ||
|
|
21
|
+
sidecarPath === undefined ||
|
|
22
|
+
requestPath === undefined
|
|
23
|
+
) {
|
|
24
|
+
process.exitCode = 64;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
installSupervisorProtection(supervisorPid);
|
|
28
|
+
const child = spawn(process.execPath, [sidecarPath, requestPath], {
|
|
29
|
+
cwd: process.cwd(),
|
|
30
|
+
detached: false,
|
|
31
|
+
env: process.env,
|
|
32
|
+
shell: false,
|
|
33
|
+
stdio: ['ignore', 'inherit', 'inherit', 3],
|
|
34
|
+
windowsHide: true,
|
|
35
|
+
});
|
|
36
|
+
const outcome = await childOutcome(child);
|
|
37
|
+
process.exitCode = outcome.exitCode ?? 128;
|
|
38
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/// <reference path="./bun-ffi.d.ts" />
|
|
2
|
+
|
|
3
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
4
|
+
import { dlopen, ptr, toArrayBuffer } from 'bun:ffi';
|
|
5
|
+
|
|
6
|
+
export const PR_SET_DUMPABLE = 4;
|
|
7
|
+
export const PR_SET_SECCOMP = 22;
|
|
8
|
+
export const PR_SET_CHILD_SUBREAPER = 36;
|
|
9
|
+
export const PR_GET_CHILD_SUBREAPER = 37;
|
|
10
|
+
export const PR_SET_NO_NEW_PRIVS = 38;
|
|
11
|
+
export const SECCOMP_MODE_FILTER = 2;
|
|
12
|
+
export const SECCOMP_RET_ALLOW = 0x7fff0000;
|
|
13
|
+
export const SECCOMP_RET_ERRNO = 0x00050001;
|
|
14
|
+
export const BPF_LD_W_ABS = 0x20;
|
|
15
|
+
export const BPF_JMP_JEQ_K = 0x15;
|
|
16
|
+
export const BPF_JMP_JSET_K = 0x45;
|
|
17
|
+
export const BPF_RET_K = 0x06;
|
|
18
|
+
export const WNOHANG = 1;
|
|
19
|
+
export const ECHILD = 10;
|
|
20
|
+
export const ESRCH = 3;
|
|
21
|
+
export const SYS_PIDFD_SEND_SIGNAL = 424;
|
|
22
|
+
export const SYS_PIDFD_OPEN = 434;
|
|
23
|
+
export const EINTR = 4;
|
|
24
|
+
export const POLLIN = 0x0001;
|
|
25
|
+
export const POLLERR = 0x0008;
|
|
26
|
+
export const POLLHUP = 0x0010;
|
|
27
|
+
export const POLLNVAL = 0x0020;
|
|
28
|
+
|
|
29
|
+
interface FilterInstruction {
|
|
30
|
+
readonly code: number;
|
|
31
|
+
readonly jt: number;
|
|
32
|
+
readonly jf: number;
|
|
33
|
+
readonly k: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const libc = dlopen('libc.so.6', {
|
|
37
|
+
prctl: { args: ['i32', 'u64', 'u64', 'u64', 'u64'], returns: 'i32' },
|
|
38
|
+
syscall: {
|
|
39
|
+
args: ['i64', 'i64', 'i64', 'i64', 'i64', 'i64', 'i64'],
|
|
40
|
+
returns: 'i64',
|
|
41
|
+
},
|
|
42
|
+
waitpid: { args: ['i32', 'ptr', 'i32'], returns: 'i32' },
|
|
43
|
+
close: { args: ['i32'], returns: 'i32' },
|
|
44
|
+
__errno_location: { args: [], returns: 'ptr' },
|
|
45
|
+
poll: { args: ['ptr', 'u64', 'i32'], returns: 'i32' },
|
|
46
|
+
});
|
|
47
|
+
export const native = libc.symbols;
|
|
48
|
+
export function errno(): number {
|
|
49
|
+
const address = native.__errno_location();
|
|
50
|
+
return new Int32Array(toArrayBuffer(address, 0, 4))[0] ?? 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function pidfdOpen(pid: number): number {
|
|
54
|
+
return Number(native.syscall(SYS_PIDFD_OPEN, pid, 0, 0, 0, 0, 0));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function pidfdSendSignal(pidfd: number, signal: number): number {
|
|
58
|
+
return Number(native.syscall(SYS_PIDFD_SEND_SIGNAL, pidfd, signal, 0, 0, 0, 0));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function pidfdAlive(pidfd: number): boolean {
|
|
62
|
+
const result = pidfdSendSignal(pidfd, 0);
|
|
63
|
+
if (result === 0) return true;
|
|
64
|
+
if (errno() === ESRCH) return false;
|
|
65
|
+
throw new Error('pidfd identity liveness probe failed');
|
|
66
|
+
}
|
|
67
|
+
export function installSupervisorProtection(supervisorPid: number): void {
|
|
68
|
+
const profile =
|
|
69
|
+
process.arch === 'x64'
|
|
70
|
+
? {
|
|
71
|
+
auditArch: 0xc000003e,
|
|
72
|
+
kill: 62,
|
|
73
|
+
tkill: 200,
|
|
74
|
+
tgkill: 234,
|
|
75
|
+
rtSigqueueinfo: 129,
|
|
76
|
+
rtTgsigqueueinfo: 297,
|
|
77
|
+
prlimit64: 302,
|
|
78
|
+
schedulerControls: [141, 142, 144, 203, 251, 314],
|
|
79
|
+
}
|
|
80
|
+
: {
|
|
81
|
+
auditArch: 0xc00000b7,
|
|
82
|
+
kill: 129,
|
|
83
|
+
tkill: 130,
|
|
84
|
+
tgkill: 131,
|
|
85
|
+
rtSigqueueinfo: 138,
|
|
86
|
+
rtTgsigqueueinfo: 240,
|
|
87
|
+
prlimit64: 261,
|
|
88
|
+
schedulerControls: [140, 118, 119, 122, 30, 274],
|
|
89
|
+
};
|
|
90
|
+
const allow: FilterInstruction = { code: BPF_RET_K, jt: 0, jf: 0, k: SECCOMP_RET_ALLOW };
|
|
91
|
+
const deny: FilterInstruction = { code: BPF_RET_K, jt: 0, jf: 0, k: SECCOMP_RET_ERRNO };
|
|
92
|
+
const exactTarget = (): FilterInstruction[] => [
|
|
93
|
+
{ code: BPF_LD_W_ABS, jt: 0, jf: 0, k: 16 },
|
|
94
|
+
{ code: BPF_JMP_JEQ_K, jt: 1, jf: 0, k: supervisorPid },
|
|
95
|
+
allow,
|
|
96
|
+
deny,
|
|
97
|
+
];
|
|
98
|
+
const supervisorTids = readdirSync(`/proc/${supervisorPid}/task`)
|
|
99
|
+
.map(Number)
|
|
100
|
+
.filter((tid) => Number.isSafeInteger(tid) && tid > 1);
|
|
101
|
+
if (!supervisorTids.includes(supervisorPid) || supervisorTids.length > 240) {
|
|
102
|
+
throw new Error('supervisor thread identities unavailable');
|
|
103
|
+
}
|
|
104
|
+
const exactThreadTarget: FilterInstruction[] = [
|
|
105
|
+
{ code: BPF_LD_W_ABS, jt: 0, jf: 0, k: 16 },
|
|
106
|
+
...supervisorTids.map((tid, index) => ({
|
|
107
|
+
code: BPF_JMP_JEQ_K,
|
|
108
|
+
jt: supervisorTids.length - index,
|
|
109
|
+
jf: 0,
|
|
110
|
+
k: tid,
|
|
111
|
+
})),
|
|
112
|
+
allow,
|
|
113
|
+
deny,
|
|
114
|
+
];
|
|
115
|
+
const supervisorStat = readFileSync(`/proc/${supervisorPid}/stat`, 'utf8');
|
|
116
|
+
const close = supervisorStat.lastIndexOf(')');
|
|
117
|
+
const supervisorProcessGroup = Number(
|
|
118
|
+
close < 0
|
|
119
|
+
? undefined
|
|
120
|
+
: supervisorStat
|
|
121
|
+
.slice(close + 2)
|
|
122
|
+
.trim()
|
|
123
|
+
.split(/\s+/)[2]
|
|
124
|
+
);
|
|
125
|
+
if (!Number.isSafeInteger(supervisorProcessGroup) || supervisorProcessGroup <= 1) {
|
|
126
|
+
throw new Error('supervisor process-group identity unavailable');
|
|
127
|
+
}
|
|
128
|
+
const killTargets = [0xffffffff, -supervisorProcessGroup >>> 0, ...supervisorTids];
|
|
129
|
+
const killTarget: FilterInstruction[] = [
|
|
130
|
+
{ code: BPF_LD_W_ABS, jt: 0, jf: 0, k: 16 },
|
|
131
|
+
...killTargets.map((target, index) => ({
|
|
132
|
+
code: BPF_JMP_JEQ_K,
|
|
133
|
+
jt: killTargets.length - index,
|
|
134
|
+
jf: 0,
|
|
135
|
+
k: target,
|
|
136
|
+
})),
|
|
137
|
+
allow,
|
|
138
|
+
deny,
|
|
139
|
+
];
|
|
140
|
+
const instructions: FilterInstruction[] = [
|
|
141
|
+
{ code: BPF_LD_W_ABS, jt: 0, jf: 0, k: 4 },
|
|
142
|
+
{ code: BPF_JMP_JEQ_K, jt: 1, jf: 0, k: profile.auditArch },
|
|
143
|
+
deny,
|
|
144
|
+
{ code: BPF_LD_W_ABS, jt: 0, jf: 0, k: 0 },
|
|
145
|
+
{ code: BPF_JMP_JSET_K, jt: 0, jf: 1, k: 0x40000000 },
|
|
146
|
+
deny,
|
|
147
|
+
];
|
|
148
|
+
for (const [syscall, block] of [
|
|
149
|
+
[profile.kill, killTarget],
|
|
150
|
+
[profile.tkill, [deny]],
|
|
151
|
+
[profile.tgkill, exactTarget()],
|
|
152
|
+
[profile.rtSigqueueinfo, exactThreadTarget],
|
|
153
|
+
[profile.rtTgsigqueueinfo, exactTarget()],
|
|
154
|
+
[profile.prlimit64, exactThreadTarget],
|
|
155
|
+
[SYS_PIDFD_OPEN, exactThreadTarget],
|
|
156
|
+
] as const) {
|
|
157
|
+
instructions.push({ code: BPF_JMP_JEQ_K, jt: 0, jf: block.length, k: syscall }, ...block);
|
|
158
|
+
}
|
|
159
|
+
for (const syscall of profile.schedulerControls) {
|
|
160
|
+
instructions.push({ code: BPF_JMP_JEQ_K, jt: 0, jf: 1, k: syscall }, deny);
|
|
161
|
+
}
|
|
162
|
+
instructions.push(allow);
|
|
163
|
+
|
|
164
|
+
const filter = Buffer.alloc(instructions.length * 8);
|
|
165
|
+
instructions.forEach((instruction, index) => {
|
|
166
|
+
const offset = index * 8;
|
|
167
|
+
filter.writeUInt16LE(instruction.code, offset);
|
|
168
|
+
filter.writeUInt8(instruction.jt, offset + 2);
|
|
169
|
+
filter.writeUInt8(instruction.jf, offset + 3);
|
|
170
|
+
filter.writeUInt32LE(instruction.k >>> 0, offset + 4);
|
|
171
|
+
});
|
|
172
|
+
const program = Buffer.alloc(16);
|
|
173
|
+
program.writeUInt16LE(instructions.length, 0);
|
|
174
|
+
program.writeBigUInt64LE(BigInt(ptr(filter)), 8);
|
|
175
|
+
if (
|
|
176
|
+
native.prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) !== 0 ||
|
|
177
|
+
native.prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, ptr(program), 0, 0) !== 0
|
|
178
|
+
) {
|
|
179
|
+
throw new Error('seccomp supervisor protection unavailable');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/// <reference path="./bun-ffi.d.ts" />
|
|
2
|
+
|
|
3
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
4
|
+
import { ptr } from 'bun:ffi';
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
ECHILD,
|
|
8
|
+
ESRCH,
|
|
9
|
+
WNOHANG,
|
|
10
|
+
errno,
|
|
11
|
+
native,
|
|
12
|
+
pidfdAlive,
|
|
13
|
+
pidfdOpen,
|
|
14
|
+
pidfdSendSignal,
|
|
15
|
+
} from './host-supervisor-native';
|
|
16
|
+
|
|
17
|
+
type StableIdentity = {
|
|
18
|
+
pid: number;
|
|
19
|
+
startTime: string;
|
|
20
|
+
parentPid: number;
|
|
21
|
+
parentStartTime: string;
|
|
22
|
+
pidfd: number;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const identities = new Map<number, StableIdentity>();
|
|
26
|
+
let maxTrackedIdentities = 4_096;
|
|
27
|
+
let semanticRootPid: number | undefined;
|
|
28
|
+
let supervisorStartTime: string | undefined;
|
|
29
|
+
|
|
30
|
+
interface ProcIdentity {
|
|
31
|
+
readonly state: string;
|
|
32
|
+
readonly parentPid: number;
|
|
33
|
+
readonly startTime: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function processIdentity(pid: number): ProcIdentity | undefined {
|
|
37
|
+
try {
|
|
38
|
+
const source = readFileSync(`/proc/${pid}/stat`, 'utf8');
|
|
39
|
+
const close = source.lastIndexOf(')');
|
|
40
|
+
if (close < 0) return undefined;
|
|
41
|
+
const fields = source
|
|
42
|
+
.slice(close + 2)
|
|
43
|
+
.trim()
|
|
44
|
+
.split(/\s+/);
|
|
45
|
+
const state = fields[0];
|
|
46
|
+
const parentPid = Number(fields[1]);
|
|
47
|
+
const startTime = fields[19];
|
|
48
|
+
if (
|
|
49
|
+
state === undefined ||
|
|
50
|
+
!Number.isSafeInteger(parentPid) ||
|
|
51
|
+
parentPid < 0 ||
|
|
52
|
+
startTime === undefined
|
|
53
|
+
)
|
|
54
|
+
return undefined;
|
|
55
|
+
return { state, parentPid, startTime };
|
|
56
|
+
} catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function processStartTime(pid: number): string | undefined {
|
|
62
|
+
return processIdentity(pid)?.startTime;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function childPids(pid: number): number[] {
|
|
66
|
+
const children = new Set<number>();
|
|
67
|
+
let tasks: string[];
|
|
68
|
+
try {
|
|
69
|
+
tasks = readdirSync(`/proc/${pid}/task`);
|
|
70
|
+
} catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
for (const task of tasks) {
|
|
74
|
+
try {
|
|
75
|
+
for (const token of readFileSync(`/proc/${pid}/task/${task}/children`, 'utf8')
|
|
76
|
+
.trim()
|
|
77
|
+
.split(/\s+/)) {
|
|
78
|
+
const childPid = Number(token);
|
|
79
|
+
if (Number.isSafeInteger(childPid) && childPid > 1) children.add(childPid);
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
// A thread may exit between listing and reading; kernel child ownership remains authoritative.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return [...children];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function openStableIdentity(
|
|
89
|
+
pid: number,
|
|
90
|
+
owner: {
|
|
91
|
+
readonly pid: number;
|
|
92
|
+
readonly startTime: string;
|
|
93
|
+
readonly pidfd?: number;
|
|
94
|
+
}
|
|
95
|
+
): StableIdentity | undefined {
|
|
96
|
+
if (owner.pidfd !== undefined && !pidfdAlive(owner.pidfd)) return undefined;
|
|
97
|
+
const ownerBefore = processIdentity(owner.pid);
|
|
98
|
+
const before = processIdentity(pid);
|
|
99
|
+
if (
|
|
100
|
+
ownerBefore?.startTime !== owner.startTime ||
|
|
101
|
+
before === undefined ||
|
|
102
|
+
before.state === 'Z' ||
|
|
103
|
+
before.parentPid !== owner.pid
|
|
104
|
+
)
|
|
105
|
+
return undefined;
|
|
106
|
+
const pidfd = pidfdOpen(pid);
|
|
107
|
+
if (pidfd < 0) {
|
|
108
|
+
if (errno() === ESRCH && processIdentity(pid) === undefined) return undefined;
|
|
109
|
+
throw new Error('pidfd_open unavailable for an owned process');
|
|
110
|
+
}
|
|
111
|
+
const ownerAfter = processIdentity(owner.pid);
|
|
112
|
+
if (owner.pidfd !== undefined && !pidfdAlive(owner.pidfd)) {
|
|
113
|
+
native.close(pidfd);
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
const after = processIdentity(pid);
|
|
117
|
+
if (
|
|
118
|
+
ownerAfter?.startTime !== owner.startTime ||
|
|
119
|
+
after?.startTime !== before.startTime ||
|
|
120
|
+
after.state === 'Z' ||
|
|
121
|
+
after.parentPid !== owner.pid
|
|
122
|
+
) {
|
|
123
|
+
native.close(pidfd);
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
pid,
|
|
128
|
+
startTime: before.startTime,
|
|
129
|
+
parentPid: owner.pid,
|
|
130
|
+
parentStartTime: owner.startTime,
|
|
131
|
+
pidfd,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function retireExitedIdentities(): void {
|
|
136
|
+
const status = new Int32Array(1);
|
|
137
|
+
for (const identity of identities.values()) {
|
|
138
|
+
if (identity.pid !== semanticRootPid) {
|
|
139
|
+
const reaped = native.waitpid(identity.pid, ptr(status), WNOHANG);
|
|
140
|
+
if (reaped < 0 && errno() !== ECHILD) {
|
|
141
|
+
throw new Error('waitpid failed while retiring an owned identity');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const probe = pidfdSendSignal(identity.pidfd, 0);
|
|
145
|
+
if (probe < 0 && errno() === ESRCH) {
|
|
146
|
+
native.close(identity.pidfd);
|
|
147
|
+
identities.delete(identity.pid);
|
|
148
|
+
} else if (probe < 0) {
|
|
149
|
+
throw new Error('pidfd identity liveness probe failed');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function discoverOwnedProcesses(): void {
|
|
155
|
+
retireExitedIdentities();
|
|
156
|
+
if (supervisorStartTime === undefined) throw new Error('supervisor identity unavailable');
|
|
157
|
+
const queue: Array<{ pid: number; startTime: string; pidfd?: number }> = [
|
|
158
|
+
{ pid: process.pid, startTime: supervisorStartTime },
|
|
159
|
+
];
|
|
160
|
+
for (const identity of identities.values()) {
|
|
161
|
+
queue.push({
|
|
162
|
+
pid: identity.pid,
|
|
163
|
+
startTime: identity.startTime,
|
|
164
|
+
pidfd: identity.pidfd,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const visited = new Set<number>();
|
|
168
|
+
while (queue.length > 0) {
|
|
169
|
+
const owner = queue.shift();
|
|
170
|
+
if (owner === undefined || visited.has(owner.pid)) continue;
|
|
171
|
+
visited.add(owner.pid);
|
|
172
|
+
if (processStartTime(owner.pid) !== owner.startTime) continue;
|
|
173
|
+
if (owner.pidfd !== undefined && !pidfdAlive(owner.pidfd)) continue;
|
|
174
|
+
for (const childPid of childPids(owner.pid)) {
|
|
175
|
+
let identity = identities.get(childPid);
|
|
176
|
+
if (identity !== undefined && processStartTime(childPid) !== identity.startTime) {
|
|
177
|
+
native.close(identity.pidfd);
|
|
178
|
+
identities.delete(childPid);
|
|
179
|
+
identity = undefined;
|
|
180
|
+
}
|
|
181
|
+
if (identity === undefined) {
|
|
182
|
+
if (identities.size >= maxTrackedIdentities) {
|
|
183
|
+
throw new Error('owned process identity capacity exceeded');
|
|
184
|
+
}
|
|
185
|
+
identity = openStableIdentity(childPid, owner);
|
|
186
|
+
if (identity !== undefined) identities.set(childPid, identity);
|
|
187
|
+
}
|
|
188
|
+
if (identity !== undefined) {
|
|
189
|
+
queue.push({
|
|
190
|
+
pid: identity.pid,
|
|
191
|
+
startTime: identity.startTime,
|
|
192
|
+
pidfd: identity.pidfd,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
retireExitedIdentities();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function signalTracked(signal: number): void {
|
|
201
|
+
for (const identity of identities.values()) {
|
|
202
|
+
const result = pidfdSendSignal(identity.pidfd, signal);
|
|
203
|
+
if (result < 0 && errno() === ESRCH) {
|
|
204
|
+
native.close(identity.pidfd);
|
|
205
|
+
identities.delete(identity.pid);
|
|
206
|
+
} else if (result < 0) {
|
|
207
|
+
throw new Error('pidfd_send_signal failed for an owned process');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function signalOwned(signal: number): void {
|
|
213
|
+
discoverOwnedProcesses();
|
|
214
|
+
signalTracked(signal);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function reapExitedOwned(rootPid: number): void {
|
|
218
|
+
const status = new Int32Array(1);
|
|
219
|
+
for (const identity of identities.values()) {
|
|
220
|
+
if (identity.pid === rootPid) continue;
|
|
221
|
+
const result = native.waitpid(identity.pid, ptr(status), WNOHANG);
|
|
222
|
+
if (result < 0 && errno() !== ECHILD) {
|
|
223
|
+
throw new Error('waitpid failed for an owned process');
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function ownershipEmpty(): boolean {
|
|
229
|
+
const status = new Int32Array(1);
|
|
230
|
+
for (;;) {
|
|
231
|
+
const result = native.waitpid(-1, ptr(status), WNOHANG);
|
|
232
|
+
if (result > 0) continue;
|
|
233
|
+
if (result === 0) return false;
|
|
234
|
+
if (errno() === ECHILD) return true;
|
|
235
|
+
throw new Error('kernel child ownership could not be determined');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
export function initializeProcessTracker(startTime: string, identityCap: number): void {
|
|
239
|
+
supervisorStartTime = startTime;
|
|
240
|
+
maxTrackedIdentities = identityCap;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export function trackSemanticRoot(pid: number): boolean {
|
|
244
|
+
semanticRootPid = pid;
|
|
245
|
+
if (supervisorStartTime === undefined) throw new Error('supervisor identity unavailable');
|
|
246
|
+
const rootIdentity = openStableIdentity(pid, {
|
|
247
|
+
pid: process.pid,
|
|
248
|
+
startTime: supervisorStartTime,
|
|
249
|
+
});
|
|
250
|
+
if (rootIdentity === undefined) return false;
|
|
251
|
+
identities.set(rootIdentity.pid, rootIdentity);
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function closeTrackedIdentities(): void {
|
|
256
|
+
for (const identity of identities.values()) native.close(identity.pidfd);
|
|
257
|
+
identities.clear();
|
|
258
|
+
}
|