voratiq 0.1.0-beta.2 → 0.1.0-beta.21
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/README.md +41 -29
- package/dist/agents/launch/chat.d.ts +23 -0
- package/dist/agents/launch/chat.js +44 -0
- package/dist/agents/launch/environment.d.ts +8 -0
- package/dist/{commands/run/agents/workspace-prep.js → agents/launch/environment.js} +5 -27
- package/dist/agents/launch/prompt.d.ts +6 -0
- package/dist/agents/launch/prompt.js +12 -0
- package/dist/agents/launch/provider-state.d.ts +39 -0
- package/dist/agents/launch/provider-state.js +103 -0
- package/dist/agents/runtime/auth.d.ts +27 -0
- package/dist/agents/runtime/auth.js +72 -0
- package/dist/agents/runtime/chat.d.ts +5 -0
- package/dist/agents/runtime/chat.js +7 -0
- package/dist/agents/runtime/errors.d.ts +27 -0
- package/dist/agents/runtime/errors.js +51 -0
- package/dist/{commands/run/agents → agents/runtime}/failures.d.ts +0 -1
- package/dist/agents/runtime/failures.js +136 -0
- package/dist/agents/runtime/harness.d.ts +2 -0
- package/dist/agents/runtime/harness.js +119 -0
- package/dist/{commands/run/agents/sandbox-launcher.d.ts → agents/runtime/launcher.d.ts} +18 -6
- package/dist/{commands/run/agents/sandbox-launcher.js → agents/runtime/launcher.js} +17 -39
- package/dist/{commands/run/agents/workspace-prep.d.ts → agents/runtime/manifest.d.ts} +6 -6
- package/dist/agents/runtime/manifest.js +34 -0
- package/dist/agents/runtime/policy.d.ts +32 -0
- package/dist/agents/runtime/policy.js +240 -0
- package/dist/agents/runtime/registry.d.ts +4 -0
- package/dist/agents/runtime/registry.js +54 -0
- package/dist/{commands/run → agents/runtime}/sandbox.d.ts +8 -2
- package/dist/{commands/run → agents/runtime}/sandbox.js +28 -67
- package/dist/agents/runtime/shim/run-agent-shim.d.ts +1 -0
- package/dist/agents/runtime/shim/run-agent-shim.js +276 -0
- package/dist/agents/runtime/types.d.ts +91 -0
- package/dist/{commands/run/agents → agents/runtime}/watchdog.d.ts +4 -3
- package/dist/{commands/run/agents → agents/runtime}/watchdog.js +155 -26
- package/dist/auth/providers/codex.js +7 -2
- package/dist/auth/providers/gemini.js +14 -6
- package/dist/auth/providers/types.d.ts +1 -0
- package/dist/auth/providers/utils.d.ts +0 -1
- package/dist/auth/providers/utils.js +1 -49
- package/dist/bin.js +369 -71
- package/dist/cli/apply.d.ts +4 -0
- package/dist/cli/apply.js +28 -9
- package/dist/cli/auto.d.ts +32 -0
- package/dist/cli/auto.js +232 -0
- package/dist/cli/contract.d.ts +328 -0
- package/dist/cli/contract.js +480 -0
- package/dist/cli/errors.d.ts +3 -0
- package/dist/cli/errors.js +21 -3
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.js +34 -6
- package/dist/cli/list.d.ts +6 -4
- package/dist/cli/list.js +39 -16
- package/dist/cli/mcp.d.ts +2 -0
- package/dist/cli/mcp.js +16 -0
- package/dist/cli/message.d.ts +28 -0
- package/dist/cli/message.js +147 -0
- package/dist/cli/operator-envelope.d.ts +180 -0
- package/dist/cli/operator-envelope.js +425 -0
- package/dist/cli/output.d.ts +15 -1
- package/dist/cli/output.js +153 -5
- package/dist/cli/prune.d.ts +7 -3
- package/dist/cli/prune.js +57 -12
- package/dist/cli/reduce.d.ts +29 -0
- package/dist/cli/reduce.js +211 -0
- package/dist/cli/root-launcher.d.ts +4 -0
- package/dist/cli/root-launcher.js +15 -0
- package/dist/cli/run.d.ts +27 -1
- package/dist/cli/run.js +108 -16
- package/dist/cli/spec.d.ts +31 -0
- package/dist/cli/spec.js +180 -0
- package/dist/cli/verify.d.ts +35 -0
- package/dist/cli/verify.js +297 -0
- package/dist/commands/apply/command.d.ts +2 -0
- package/dist/commands/apply/command.js +145 -6
- package/dist/commands/apply/errors.d.ts +43 -4
- package/dist/commands/apply/errors.js +100 -22
- package/dist/commands/apply/types.d.ts +2 -1
- package/dist/commands/auto/command.d.ts +145 -0
- package/dist/commands/auto/command.js +433 -0
- package/dist/commands/auto/errors.d.ts +19 -0
- package/dist/commands/auto/errors.js +19 -0
- package/dist/commands/auto/validation.d.ts +14 -0
- package/dist/commands/auto/validation.js +90 -0
- package/dist/commands/fetch.d.ts +2 -2
- package/dist/commands/fetch.js +4 -4
- package/dist/commands/init/agents.d.ts +2 -1
- package/dist/commands/init/agents.js +66 -63
- package/dist/commands/init/command.js +300 -16
- package/dist/commands/init/types.d.ts +18 -7
- package/dist/commands/interactive/lifecycle.d.ts +15 -0
- package/dist/commands/interactive/lifecycle.js +141 -0
- package/dist/commands/list/command.d.ts +10 -3
- package/dist/commands/list/command.js +597 -40
- package/dist/commands/message/command.d.ts +23 -0
- package/dist/commands/message/command.js +215 -0
- package/dist/commands/message/errors.d.ts +9 -0
- package/dist/commands/message/errors.js +20 -0
- package/dist/commands/message/lifecycle.d.ts +14 -0
- package/dist/commands/message/lifecycle.js +128 -0
- package/dist/commands/prune/command.d.ts +2 -1
- package/dist/commands/prune/command.js +61 -10
- package/dist/commands/prune/errors.d.ts +1 -1
- package/dist/commands/prune/errors.js +5 -5
- package/dist/commands/prune/types.d.ts +21 -0
- package/dist/commands/reduce/command.d.ts +26 -0
- package/dist/commands/reduce/command.js +145 -0
- package/dist/commands/reduce/errors.d.ts +17 -0
- package/dist/commands/reduce/errors.js +32 -0
- package/dist/commands/reduce/targets.d.ts +11 -0
- package/dist/commands/reduce/targets.js +271 -0
- package/dist/commands/root-launcher/command.d.ts +31 -0
- package/dist/commands/root-launcher/command.js +233 -0
- package/dist/commands/run/command.d.ts +6 -1
- package/dist/commands/run/command.js +70 -40
- package/dist/commands/run/lifecycle.d.ts +7 -5
- package/dist/commands/run/lifecycle.js +45 -23
- package/dist/commands/run/record-init.d.ts +4 -1
- package/dist/commands/run/record-init.js +5 -2
- package/dist/commands/run/shim/run-agent-shim.d.ts +2 -1
- package/dist/commands/run/shim/run-agent-shim.js +4 -219
- package/dist/commands/run/validation.d.ts +2 -3
- package/dist/commands/run/validation.js +54 -25
- package/dist/commands/shared/max-parallel.d.ts +5 -0
- package/dist/commands/shared/max-parallel.js +15 -0
- package/dist/commands/shared/preview.d.ts +10 -0
- package/dist/commands/shared/preview.js +60 -0
- package/dist/commands/shared/resolve-reduction-competitors.d.ts +15 -0
- package/dist/commands/shared/resolve-reduction-competitors.js +13 -0
- package/dist/commands/shared/resolve-stage-competitors.d.ts +19 -0
- package/dist/commands/shared/resolve-stage-competitors.js +171 -0
- package/dist/commands/shared/session-id.d.ts +1 -0
- package/dist/commands/shared/session-id.js +1 -0
- package/dist/commands/spec/command.d.ts +22 -0
- package/dist/commands/spec/command.js +330 -0
- package/dist/commands/spec/errors.d.ts +11 -0
- package/dist/commands/spec/errors.js +23 -0
- package/dist/commands/verify/agents.d.ts +8 -0
- package/dist/commands/verify/agents.js +29 -0
- package/dist/commands/verify/command.d.ts +23 -0
- package/dist/commands/verify/command.js +168 -0
- package/dist/commands/verify/lifecycle.d.ts +14 -0
- package/dist/commands/verify/lifecycle.js +229 -0
- package/dist/commands/verify/max-parallel.d.ts +7 -0
- package/dist/commands/verify/max-parallel.js +15 -0
- package/dist/commands/verify/targets.d.ts +18 -0
- package/dist/commands/verify/targets.js +420 -0
- package/dist/competition/command-adapter.d.ts +35 -0
- package/dist/competition/command-adapter.js +20 -0
- package/dist/competition/core.d.ts +41 -0
- package/dist/competition/core.js +181 -0
- package/dist/competition/shared/extra-context.d.ts +14 -0
- package/dist/competition/shared/extra-context.js +100 -0
- package/dist/competition/shared/preflight.d.ts +11 -0
- package/dist/competition/shared/preflight.js +39 -0
- package/dist/competition/shared/prompt-helpers.d.ts +16 -0
- package/dist/competition/shared/prompt-helpers.js +27 -0
- package/dist/competition/shared/prune.d.ts +1 -0
- package/dist/competition/shared/prune.js +4 -0
- package/dist/competition/shared/sandbox-policy.d.ts +9 -0
- package/dist/competition/shared/sandbox-policy.js +7 -0
- package/dist/competition/shared/teardown.d.ts +36 -0
- package/dist/competition/shared/teardown.js +101 -0
- package/dist/configs/agents/defaults.d.ts +31 -2
- package/dist/configs/agents/defaults.js +346 -30
- package/dist/configs/agents/errors.js +14 -11
- package/dist/configs/agents/loader.d.ts +11 -1
- package/dist/configs/agents/loader.js +71 -4
- package/dist/configs/agents/types.js +2 -2
- package/dist/configs/environment/detect.js +9 -4
- package/dist/configs/environment/errors.js +4 -4
- package/dist/configs/environment/loader.d.ts +1 -1
- package/dist/configs/environment/loader.js +3 -3
- package/dist/configs/orchestration/bootstrap.d.ts +16 -0
- package/dist/configs/orchestration/bootstrap.js +122 -0
- package/dist/configs/orchestration/errors.d.ts +15 -0
- package/dist/configs/orchestration/errors.js +28 -0
- package/dist/configs/orchestration/loader.d.ts +9 -0
- package/dist/configs/orchestration/loader.js +148 -0
- package/dist/configs/orchestration/types.d.ts +102 -0
- package/dist/configs/orchestration/types.js +65 -0
- package/dist/configs/sandbox/defaults.js +14 -4
- package/dist/configs/sandbox/errors.d.ts +1 -1
- package/dist/configs/sandbox/errors.js +1 -1
- package/dist/configs/sandbox/loader.js +6 -4
- package/dist/configs/sandbox/schemas.js +4 -2
- package/dist/configs/settings/loader.d.ts +7 -0
- package/dist/configs/settings/loader.js +81 -0
- package/dist/configs/settings/types.d.ts +47 -0
- package/dist/configs/settings/types.js +23 -0
- package/dist/configs/verification/errors.d.ts +11 -0
- package/dist/configs/verification/errors.js +21 -0
- package/dist/configs/verification/loader.d.ts +8 -0
- package/dist/configs/verification/loader.js +43 -0
- package/dist/configs/verification/methods.d.ts +35 -0
- package/dist/configs/verification/methods.js +41 -0
- package/dist/configs/verification/programmatic-defaults.d.ts +10 -0
- package/dist/configs/verification/programmatic-defaults.js +42 -0
- package/dist/configs/verification/programmatic-detect.d.ts +10 -0
- package/dist/configs/{evals/detect.js → verification/programmatic-detect.js} +22 -33
- package/dist/configs/verification/types.d.ts +49 -0
- package/dist/configs/verification/types.js +45 -0
- package/dist/contracts/list.d.ts +207 -0
- package/dist/contracts/list.js +154 -0
- package/dist/domain/interactive/model/types.d.ts +104 -0
- package/dist/domain/interactive/model/types.js +83 -0
- package/dist/domain/interactive/persistence/adapter.d.ts +39 -0
- package/dist/domain/interactive/persistence/adapter.js +144 -0
- package/dist/domain/interactive/prompt.d.ts +3 -0
- package/dist/domain/interactive/prompt.js +7 -0
- package/dist/domain/message/competition/adapter.d.ts +36 -0
- package/dist/domain/message/competition/adapter.js +197 -0
- package/dist/domain/message/competition/prompt.d.ts +8 -0
- package/dist/domain/message/competition/prompt.js +29 -0
- package/dist/domain/message/model/mutators.d.ts +17 -0
- package/dist/domain/message/model/mutators.js +107 -0
- package/dist/domain/message/model/types.d.ts +100 -0
- package/dist/domain/message/model/types.js +87 -0
- package/dist/domain/message/persistence/adapter.d.ts +43 -0
- package/dist/domain/message/persistence/adapter.js +124 -0
- package/dist/domain/reduce/competition/adapter.d.ts +42 -0
- package/dist/domain/reduce/competition/adapter.js +826 -0
- package/dist/domain/reduce/competition/output-validation.d.ts +4 -0
- package/dist/domain/reduce/competition/output-validation.js +18 -0
- package/dist/domain/reduce/competition/prompt.d.ts +10 -0
- package/dist/domain/reduce/competition/prompt.js +96 -0
- package/dist/domain/reduce/competition/reduction.d.ts +9 -0
- package/dist/domain/reduce/competition/reduction.js +32 -0
- package/dist/domain/reduce/model/types.d.ts +122 -0
- package/dist/domain/reduce/model/types.js +84 -0
- package/dist/domain/reduce/persistence/adapter.d.ts +43 -0
- package/dist/domain/reduce/persistence/adapter.js +126 -0
- package/dist/domain/run/competition/adapter.d.ts +30 -0
- package/dist/domain/run/competition/adapter.js +39 -0
- package/dist/domain/run/competition/agent-execution.d.ts +20 -0
- package/dist/domain/run/competition/agent-execution.js +45 -0
- package/dist/domain/run/competition/agent-preparation.d.ts +12 -0
- package/dist/domain/run/competition/agent-preparation.js +24 -0
- package/dist/domain/run/competition/agents/artifacts.d.ts +17 -0
- package/dist/domain/run/competition/agents/artifacts.js +173 -0
- package/dist/{commands/run → domain/run/competition}/agents/lifecycle.d.ts +3 -3
- package/dist/{commands/run → domain/run/competition}/agents/lifecycle.js +84 -64
- package/dist/domain/run/competition/agents/post-processing.d.ts +12 -0
- package/dist/domain/run/competition/agents/post-processing.js +4 -0
- package/dist/domain/run/competition/agents/preparation.js +64 -0
- package/dist/{commands/run → domain/run/competition}/agents/run-context.d.ts +9 -16
- package/dist/{commands/run → domain/run/competition}/agents/run-context.js +22 -70
- package/dist/{commands/run → domain/run/competition}/agents/types.d.ts +10 -13
- package/dist/domain/run/competition/agents/workspace.d.ts +21 -0
- package/dist/domain/run/competition/agents/workspace.js +47 -0
- package/dist/{commands/run → domain/run/competition}/errors.d.ts +8 -1
- package/dist/{commands/run → domain/run/competition}/errors.js +39 -9
- package/dist/{commands/run → domain/run/competition}/phases.d.ts +1 -2
- package/dist/domain/run/competition/phases.js +1 -0
- package/dist/domain/run/competition/prompt.d.ts +7 -0
- package/dist/domain/run/competition/prompt.js +27 -0
- package/dist/{commands/run → domain/run/competition}/reports.d.ts +5 -3
- package/dist/{commands/run → domain/run/competition}/reports.js +7 -19
- package/dist/domain/run/competition/termination-state.d.ts +4 -0
- package/dist/domain/run/competition/termination-state.js +12 -0
- package/dist/{records → domain/run/model}/enhanced.d.ts +6 -7
- package/dist/{records → domain/run/model}/enhanced.js +11 -11
- package/dist/{records → domain/run/model}/errors.d.ts +1 -1
- package/dist/{records → domain/run/model}/errors.js +5 -5
- package/dist/{records → domain/run/model}/mutators.d.ts +4 -3
- package/dist/{records → domain/run/model}/mutators.js +58 -36
- package/dist/domain/run/model/types.d.ts +376 -0
- package/dist/domain/run/model/types.js +192 -0
- package/dist/{records/persistence.d.ts → domain/run/persistence/adapter.d.ts} +9 -3
- package/dist/domain/run/persistence/adapter.js +340 -0
- package/dist/domain/run/persistence/error-mapping.d.ts +2 -0
- package/dist/domain/run/persistence/error-mapping.js +17 -0
- package/dist/domain/shared/lifecycle.d.ts +54 -0
- package/dist/domain/shared/lifecycle.js +165 -0
- package/dist/domain/shared/token-usage.d.ts +21 -0
- package/dist/domain/shared/token-usage.js +38 -0
- package/dist/domain/spec/competition/adapter.d.ts +31 -0
- package/dist/domain/spec/competition/adapter.js +196 -0
- package/dist/domain/spec/competition/prompt.d.ts +11 -0
- package/dist/domain/spec/competition/prompt.js +44 -0
- package/dist/domain/spec/model/output.d.ts +13 -0
- package/dist/domain/spec/model/output.js +36 -0
- package/dist/domain/spec/model/types.d.ts +98 -0
- package/dist/domain/spec/model/types.js +84 -0
- package/dist/domain/spec/persistence/adapter.d.ts +51 -0
- package/dist/domain/spec/persistence/adapter.js +140 -0
- package/dist/domain/verify/blinding/aliases.d.ts +7 -0
- package/dist/domain/verify/blinding/aliases.js +23 -0
- package/dist/domain/verify/competition/adapter.d.ts +54 -0
- package/dist/domain/verify/competition/adapter.js +444 -0
- package/dist/domain/verify/competition/artifacts.d.ts +6 -0
- package/dist/domain/verify/competition/artifacts.js +7 -0
- package/dist/domain/verify/competition/blinding.d.ts +24 -0
- package/dist/domain/verify/competition/blinding.js +109 -0
- package/dist/domain/verify/competition/finalize.d.ts +11 -0
- package/dist/domain/verify/competition/finalize.js +65 -0
- package/dist/domain/verify/competition/programmatic.d.ts +15 -0
- package/dist/domain/verify/competition/programmatic.js +352 -0
- package/dist/domain/verify/competition/prompt.d.ts +19 -0
- package/dist/domain/verify/competition/prompt.js +63 -0
- package/dist/domain/verify/competition/rubric.d.ts +23 -0
- package/dist/domain/verify/competition/rubric.js +77 -0
- package/dist/domain/verify/competition/shared-layout.d.ts +121 -0
- package/dist/domain/verify/competition/shared-layout.js +365 -0
- package/dist/domain/verify/competition/target.d.ts +47 -0
- package/dist/domain/verify/competition/target.js +1 -0
- package/dist/domain/verify/model/mutators.d.ts +16 -0
- package/dist/domain/verify/model/mutators.js +126 -0
- package/dist/domain/verify/model/types.d.ts +408 -0
- package/dist/domain/verify/model/types.js +289 -0
- package/dist/domain/verify/persistence/adapter.d.ts +43 -0
- package/dist/domain/verify/persistence/adapter.js +126 -0
- package/dist/domain/verify/programmatic/runner.d.ts +22 -0
- package/dist/domain/verify/programmatic/runner.js +209 -0
- package/dist/domain/verify/rubric-result.d.ts +28 -0
- package/dist/domain/verify/rubric-result.js +121 -0
- package/dist/extra-context/contract.d.ts +17 -0
- package/dist/extra-context/contract.js +60 -0
- package/dist/interactive/index.d.ts +2 -0
- package/dist/interactive/index.js +1 -0
- package/dist/interactive/providers/launch.d.ts +23 -0
- package/dist/interactive/providers/launch.js +203 -0
- package/dist/interactive/providers/mcp.d.ts +13 -0
- package/dist/interactive/providers/mcp.js +547 -0
- package/dist/interactive/providers/shared.d.ts +2 -0
- package/dist/interactive/providers/shared.js +1 -0
- package/dist/interactive/providers.d.ts +3 -0
- package/dist/interactive/providers.js +3 -0
- package/dist/interactive/records.d.ts +2 -0
- package/dist/interactive/records.js +1 -0
- package/dist/interactive/substrate.d.ts +21 -0
- package/dist/interactive/substrate.js +522 -0
- package/dist/interactive/types.d.ts +101 -0
- package/dist/interactive/types.js +1 -0
- package/dist/mcp/server.d.ts +88 -0
- package/dist/mcp/server.js +790 -0
- package/dist/persistence/error-mapping.d.ts +19 -0
- package/dist/persistence/error-mapping.js +44 -0
- package/dist/persistence/errors.d.ts +26 -0
- package/dist/persistence/errors.js +49 -0
- package/dist/persistence/extra-context.d.ts +9 -0
- package/dist/persistence/extra-context.js +60 -0
- package/dist/{records → persistence}/history-lock.js +2 -2
- package/dist/persistence/record-path-schema.d.ts +3 -0
- package/dist/persistence/record-path-schema.js +16 -0
- package/dist/persistence/session-store.d.ts +92 -0
- package/dist/persistence/session-store.js +412 -0
- package/dist/policy/auto.d.ts +13 -0
- package/dist/policy/auto.js +22 -0
- package/dist/policy/index.d.ts +5 -0
- package/dist/policy/index.js +5 -0
- package/dist/policy/resolution.d.ts +6 -0
- package/dist/policy/resolution.js +23 -0
- package/dist/policy/result.d.ts +53 -0
- package/dist/policy/result.js +15 -0
- package/dist/policy/selector.d.ts +11 -0
- package/dist/policy/selector.js +57 -0
- package/dist/policy/verification.d.ts +77 -0
- package/dist/policy/verification.js +365 -0
- package/dist/policy/verifier-selection.d.ts +13 -0
- package/dist/policy/verifier-selection.js +78 -0
- package/dist/preflight/branch.d.ts +9 -0
- package/dist/preflight/branch.js +48 -0
- package/dist/preflight/errors.d.ts +3 -0
- package/dist/preflight/errors.js +10 -3
- package/dist/preflight/index.d.ts +13 -0
- package/dist/preflight/index.js +43 -8
- package/dist/render/interactions/confirmation.js +4 -2
- package/dist/render/transcripts/apply.js +9 -10
- package/dist/render/transcripts/auto.d.ts +27 -0
- package/dist/render/transcripts/auto.js +21 -0
- package/dist/render/transcripts/init.d.ts +4 -15
- package/dist/render/transcripts/init.js +71 -72
- package/dist/render/transcripts/list.d.ts +10 -1
- package/dist/render/transcripts/list.js +121 -15
- package/dist/render/transcripts/message.d.ts +72 -0
- package/dist/render/transcripts/message.js +362 -0
- package/dist/render/transcripts/prune.d.ts +7 -2
- package/dist/render/transcripts/prune.js +64 -17
- package/dist/render/transcripts/reduce.d.ts +74 -0
- package/dist/render/transcripts/reduce.js +395 -0
- package/dist/render/transcripts/root-launcher.d.ts +19 -0
- package/dist/render/transcripts/root-launcher.js +40 -0
- package/dist/render/transcripts/run.d.ts +35 -6
- package/dist/render/transcripts/run.js +241 -165
- package/dist/render/transcripts/shared.d.ts +2 -0
- package/dist/render/transcripts/shared.js +11 -4
- package/dist/render/transcripts/spec.d.ts +74 -0
- package/dist/render/transcripts/spec.js +394 -0
- package/dist/render/transcripts/stage-progress.d.ts +22 -0
- package/dist/render/transcripts/stage-progress.js +6 -0
- package/dist/render/transcripts/update-check.d.ts +2 -0
- package/dist/render/transcripts/update-check.js +22 -0
- package/dist/render/transcripts/verify.d.ts +74 -0
- package/dist/render/transcripts/verify.js +409 -0
- package/dist/render/utils/agents.d.ts +10 -9
- package/dist/render/utils/agents.js +30 -82
- package/dist/render/utils/badges.d.ts +3 -20
- package/dist/render/utils/badges.js +3 -36
- package/dist/render/utils/duration.d.ts +12 -0
- package/dist/render/utils/duration.js +37 -0
- package/dist/render/utils/interactive-frame.d.ts +6 -0
- package/dist/render/utils/interactive-frame.js +38 -0
- package/dist/render/utils/records.js +4 -4
- package/dist/render/utils/runs.d.ts +3 -9
- package/dist/render/utils/runs.js +16 -48
- package/dist/render/utils/stage-output.d.ts +20 -0
- package/dist/render/utils/stage-output.js +44 -0
- package/dist/render/utils/timezone.d.ts +2 -0
- package/dist/render/utils/timezone.js +42 -0
- package/dist/render/utils/transcript-shell.d.ts +66 -0
- package/dist/render/utils/transcript-shell.js +155 -0
- package/dist/render/utils/transcript.d.ts +7 -1
- package/dist/render/utils/transcript.js +12 -2
- package/dist/render/utils/wrap.d.ts +1 -0
- package/dist/render/utils/wrap.js +20 -0
- package/dist/status/colors.d.ts +2 -3
- package/dist/status/colors.js +3 -3
- package/dist/status/index.d.ts +108 -8
- package/dist/status/index.js +164 -5
- package/dist/update-check/checker.d.ts +24 -0
- package/dist/update-check/checker.js +130 -0
- package/dist/update-check/prompt.d.ts +25 -0
- package/dist/update-check/prompt.js +62 -0
- package/dist/update-check/semver.d.ts +17 -0
- package/dist/update-check/semver.js +36 -0
- package/dist/update-check/state-path.d.ts +8 -0
- package/dist/update-check/state-path.js +18 -0
- package/dist/utils/binaries.js +14 -8
- package/dist/utils/errors.d.ts +3 -1
- package/dist/utils/errors.js +3 -1
- package/dist/utils/git.d.ts +10 -0
- package/dist/utils/git.js +15 -3
- package/dist/utils/output.d.ts +5 -1
- package/dist/utils/output.js +4 -2
- package/dist/utils/process.d.ts +2 -1
- package/dist/utils/process.js +7 -3
- package/dist/utils/session-id.d.ts +1 -0
- package/dist/utils/session-id.js +22 -0
- package/dist/utils/slug.d.ts +2 -0
- package/dist/utils/slug.js +15 -0
- package/dist/utils/voratiq-cli-target.d.ts +9 -0
- package/dist/utils/voratiq-cli-target.js +58 -0
- package/dist/workspace/agents.d.ts +13 -16
- package/dist/workspace/agents.js +22 -147
- package/dist/workspace/chat/artifacts.d.ts +9 -0
- package/dist/workspace/chat/artifacts.js +82 -12
- package/dist/workspace/chat/native-usage.d.ts +13 -0
- package/dist/workspace/chat/native-usage.js +60 -0
- package/dist/workspace/chat/sources.d.ts +9 -5
- package/dist/workspace/chat/sources.js +89 -23
- package/dist/workspace/chat/token-usage-result.d.ts +23 -0
- package/dist/workspace/chat/token-usage-result.js +7 -0
- package/dist/workspace/chat/usage-extractor.d.ts +30 -0
- package/dist/workspace/chat/usage-extractor.js +461 -0
- package/dist/workspace/chat/usage-mappings.d.ts +20 -0
- package/dist/workspace/chat/usage-mappings.js +136 -0
- package/dist/workspace/credential-guard.js +1 -1
- package/dist/workspace/dependencies.js +4 -4
- package/dist/workspace/errors.d.ts +5 -0
- package/dist/workspace/errors.js +13 -3
- package/dist/workspace/layout.d.ts +17 -6
- package/dist/workspace/layout.js +51 -32
- package/dist/workspace/promotion.d.ts +32 -0
- package/dist/workspace/promotion.js +34 -0
- package/dist/workspace/prune.d.ts +1 -1
- package/dist/workspace/run.d.ts +1 -3
- package/dist/workspace/run.js +6 -15
- package/dist/workspace/setup.d.ts +8 -0
- package/dist/workspace/setup.js +359 -56
- package/dist/workspace/shim.js +1 -1
- package/dist/workspace/structure.d.ts +91 -26
- package/dist/workspace/structure.js +227 -43
- package/dist/workspace/templates.d.ts +9 -3
- package/dist/workspace/templates.js +26 -15
- package/dist/workspace/verification-defaults.d.ts +12 -0
- package/dist/workspace/verification-defaults.js +1017 -0
- package/package.json +30 -24
- package/dist/cli/review.d.ts +0 -12
- package/dist/cli/review.js +0 -33
- package/dist/commands/errors.d.ts +0 -4
- package/dist/commands/errors.js +0 -7
- package/dist/commands/init/evals.d.ts +0 -4
- package/dist/commands/init/evals.js +0 -219
- package/dist/commands/review/command.d.ts +0 -10
- package/dist/commands/review/command.js +0 -26
- package/dist/commands/run/agent-execution.d.ts +0 -19
- package/dist/commands/run/agent-execution.js +0 -63
- package/dist/commands/run/agents/auth-stage.d.ts +0 -23
- package/dist/commands/run/agents/auth-stage.js +0 -108
- package/dist/commands/run/agents/chat-preserver.d.ts +0 -9
- package/dist/commands/run/agents/chat-preserver.js +0 -35
- package/dist/commands/run/agents/eval-runner.d.ts +0 -19
- package/dist/commands/run/agents/eval-runner.js +0 -27
- package/dist/commands/run/agents/failures.js +0 -32
- package/dist/commands/run/agents/preparation.js +0 -123
- package/dist/commands/run/agents.d.ts +0 -14
- package/dist/commands/run/agents.js +0 -47
- package/dist/commands/run/prompts.d.ts +0 -4
- package/dist/commands/run/prompts.js +0 -16
- package/dist/commands/run/sandbox-registry.d.ts +0 -4
- package/dist/commands/run/sandbox-registry.js +0 -54
- package/dist/configs/evals/defaults.d.ts +0 -8
- package/dist/configs/evals/defaults.js +0 -28
- package/dist/configs/evals/detect.d.ts +0 -10
- package/dist/configs/evals/errors.d.ts +0 -16
- package/dist/configs/evals/errors.js +0 -29
- package/dist/configs/evals/loader.d.ts +0 -9
- package/dist/configs/evals/loader.js +0 -46
- package/dist/configs/evals/types.d.ts +0 -42
- package/dist/configs/evals/types.js +0 -74
- package/dist/evals/runner.d.ts +0 -16
- package/dist/evals/runner.js +0 -132
- package/dist/records/persistence.js +0 -469
- package/dist/records/types.d.ts +0 -255
- package/dist/records/types.js +0 -160
- package/dist/render/transcripts/review.d.ts +0 -2
- package/dist/render/transcripts/review.js +0 -36
- /package/dist/{commands/run → agents/runtime}/shim/agent-manifest.d.ts +0 -0
- /package/dist/{commands/run → agents/runtime}/shim/agent-manifest.js +0 -0
- /package/dist/{commands/run → agents/runtime/shim}/argv.d.ts +0 -0
- /package/dist/{commands/run → agents/runtime/shim}/argv.js +0 -0
- /package/dist/{commands/run/agents → agents/runtime}/types.js +0 -0
- /package/dist/{commands/run → domain/run/competition}/agents/preparation.d.ts +0 -0
- /package/dist/{commands/run/phases.js → domain/run/competition/agents/types.js} +0 -0
- /package/dist/{commands/run → domain/run/model}/id.d.ts +0 -0
- /package/dist/{commands/run → domain/run/model}/id.js +0 -0
- /package/dist/{records → persistence}/history-lock.d.ts +0 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, isAbsolute, join, resolve as resolvePath } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { composeRestrictedEnvironment } from "../../../utils/env.js";
|
|
6
|
+
import { GIT_AUTHOR_EMAIL, GIT_AUTHOR_NAME, GIT_COMMITTER_EMAIL, GIT_COMMITTER_NAME, } from "../../../utils/git.js";
|
|
7
|
+
import { injectPromptArg } from "./argv.js";
|
|
8
|
+
class ShimError extends Error {
|
|
9
|
+
exitCode;
|
|
10
|
+
constructor(message, exitCode = 1) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "ShimError";
|
|
13
|
+
this.exitCode = exitCode;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function main(argv = process.argv.slice(2)) {
|
|
17
|
+
try {
|
|
18
|
+
const { configPath } = parseArguments(argv);
|
|
19
|
+
const resolvedConfigPath = resolvePath(process.cwd(), configPath);
|
|
20
|
+
const manifest = await loadManifest(resolvedConfigPath);
|
|
21
|
+
const agentRoot = resolveAgentRoot(resolvedConfigPath);
|
|
22
|
+
const prompt = await loadPrompt(agentRoot, manifest.promptPath, resolvedConfigPath);
|
|
23
|
+
let agentArgv;
|
|
24
|
+
try {
|
|
25
|
+
agentArgv = injectPromptArg(manifest.argv, prompt);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
throw new ShimError(`Failed to inject prompt into argv: ${error instanceof Error ? error.message : String(error)}`);
|
|
29
|
+
}
|
|
30
|
+
const exitCode = await launchAgent({
|
|
31
|
+
manifest,
|
|
32
|
+
agentRoot,
|
|
33
|
+
argv: agentArgv,
|
|
34
|
+
});
|
|
35
|
+
return exitCode;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error instanceof ShimError) {
|
|
39
|
+
logError(error.message);
|
|
40
|
+
return error.exitCode;
|
|
41
|
+
}
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
logError(`Unexpected error: ${message}`);
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function parseArguments(args) {
|
|
48
|
+
let configPath;
|
|
49
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
50
|
+
const token = args[index];
|
|
51
|
+
if (token === "--config") {
|
|
52
|
+
const next = args[index + 1];
|
|
53
|
+
if (!next) {
|
|
54
|
+
throw new ShimError("Missing value for --config option");
|
|
55
|
+
}
|
|
56
|
+
configPath = next;
|
|
57
|
+
index += 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
throw new ShimError(`Unknown argument: ${token}`);
|
|
61
|
+
}
|
|
62
|
+
if (!configPath) {
|
|
63
|
+
throw new ShimError("Missing required --config <path> argument");
|
|
64
|
+
}
|
|
65
|
+
return { configPath };
|
|
66
|
+
}
|
|
67
|
+
async function loadManifest(configPath) {
|
|
68
|
+
let raw;
|
|
69
|
+
try {
|
|
70
|
+
raw = await readFile(configPath, "utf8");
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
74
|
+
throw new ShimError(`Failed to read manifest at "${configPath}": ${detail}`);
|
|
75
|
+
}
|
|
76
|
+
let parsed;
|
|
77
|
+
try {
|
|
78
|
+
parsed = JSON.parse(raw);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
82
|
+
throw new ShimError(`Manifest JSON at "${configPath}" is invalid: ${detail}`);
|
|
83
|
+
}
|
|
84
|
+
return validateManifest(parsed, configPath);
|
|
85
|
+
}
|
|
86
|
+
function validateManifest(data, configPath) {
|
|
87
|
+
if (typeof data !== "object" || data === null) {
|
|
88
|
+
throw new ShimError(`Manifest at "${configPath}" must be a JSON object`);
|
|
89
|
+
}
|
|
90
|
+
const record = data;
|
|
91
|
+
const { binary, argv, promptPath, workspace, env } = record;
|
|
92
|
+
if (typeof binary !== "string" || binary.trim() === "") {
|
|
93
|
+
throw new ShimError(`Manifest at "${configPath}" is missing required string field "binary"`);
|
|
94
|
+
}
|
|
95
|
+
const manifestArgv = ensureStringArray({
|
|
96
|
+
value: argv,
|
|
97
|
+
field: "argv",
|
|
98
|
+
configPath,
|
|
99
|
+
});
|
|
100
|
+
if (typeof promptPath !== "string" || promptPath.trim() === "") {
|
|
101
|
+
throw new ShimError(`Manifest at "${configPath}" is missing required string field "promptPath"`);
|
|
102
|
+
}
|
|
103
|
+
if (typeof workspace !== "string" || workspace.trim() === "") {
|
|
104
|
+
throw new ShimError(`Manifest at "${configPath}" is missing required string field "workspace"`);
|
|
105
|
+
}
|
|
106
|
+
const manifestEnv = ensureEnvRecord({
|
|
107
|
+
value: env,
|
|
108
|
+
configPath,
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
binary,
|
|
112
|
+
argv: manifestArgv,
|
|
113
|
+
promptPath,
|
|
114
|
+
workspace,
|
|
115
|
+
env: manifestEnv,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function ensureStringArray(options) {
|
|
119
|
+
const { value, field, configPath } = options;
|
|
120
|
+
if (!Array.isArray(value)) {
|
|
121
|
+
throw new ShimError(`Manifest at "${configPath}" must provide "${field}" as an array of strings`);
|
|
122
|
+
}
|
|
123
|
+
const result = [];
|
|
124
|
+
for (const token of value) {
|
|
125
|
+
if (typeof token !== "string") {
|
|
126
|
+
throw new ShimError(`Manifest at "${configPath}" must provide "${field}" as an array of strings`);
|
|
127
|
+
}
|
|
128
|
+
result.push(token);
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
function ensureEnvRecord(options) {
|
|
133
|
+
const { value, configPath } = options;
|
|
134
|
+
if (value === undefined) {
|
|
135
|
+
return {};
|
|
136
|
+
}
|
|
137
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
138
|
+
throw new ShimError(`Manifest at "${configPath}" must provide "env" as an object of string values`);
|
|
139
|
+
}
|
|
140
|
+
const result = {};
|
|
141
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
142
|
+
if (typeof entry !== "string") {
|
|
143
|
+
throw new ShimError(`Manifest at "${configPath}" must provide "env" as an object of string values`);
|
|
144
|
+
}
|
|
145
|
+
result[key] = entry;
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
function resolveAgentRoot(configPath) {
|
|
150
|
+
return dirname(configPath);
|
|
151
|
+
}
|
|
152
|
+
async function loadPrompt(agentRoot, manifestPromptPath, configPath) {
|
|
153
|
+
const promptAbsolute = isAbsolute(manifestPromptPath)
|
|
154
|
+
? manifestPromptPath
|
|
155
|
+
: resolvePath(agentRoot, manifestPromptPath);
|
|
156
|
+
try {
|
|
157
|
+
return await readFile(promptAbsolute, "utf8");
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
161
|
+
throw new ShimError(`Failed to read prompt from "${promptAbsolute}" (manifest: "${configPath}", agentRoot: "${agentRoot}", promptPath: "${manifestPromptPath}"): ${detail}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function launchAgent(options) {
|
|
165
|
+
const { manifest, agentRoot, argv } = options;
|
|
166
|
+
const binaryPath = isAbsolute(manifest.binary)
|
|
167
|
+
? manifest.binary
|
|
168
|
+
: resolvePath(agentRoot, manifest.binary);
|
|
169
|
+
const workspacePath = isAbsolute(manifest.workspace)
|
|
170
|
+
? manifest.workspace
|
|
171
|
+
: resolvePath(agentRoot, manifest.workspace);
|
|
172
|
+
await writeShellProfiles(manifest.env);
|
|
173
|
+
const launchEnv = composeRestrictedEnvironment(manifest.env);
|
|
174
|
+
// Agent commits generated outside the sandbox reuse this persona via
|
|
175
|
+
// resolveSandboxPersona in src/commands/run/agents/lifecycle.ts.
|
|
176
|
+
const personaEnv = {
|
|
177
|
+
GIT_AUTHOR_NAME,
|
|
178
|
+
GIT_AUTHOR_EMAIL,
|
|
179
|
+
GIT_COMMITTER_NAME,
|
|
180
|
+
GIT_COMMITTER_EMAIL,
|
|
181
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
182
|
+
};
|
|
183
|
+
for (const [key, value] of Object.entries(personaEnv)) {
|
|
184
|
+
if (launchEnv[key] === undefined) {
|
|
185
|
+
launchEnv[key] = value;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return await new Promise((resolve) => {
|
|
189
|
+
let resolved = false;
|
|
190
|
+
const child = spawn(binaryPath, argv, {
|
|
191
|
+
cwd: workspacePath,
|
|
192
|
+
env: launchEnv,
|
|
193
|
+
stdio: "inherit",
|
|
194
|
+
});
|
|
195
|
+
child.once("error", (error) => {
|
|
196
|
+
if (resolved) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
resolved = true;
|
|
200
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
201
|
+
logError(`Failed to launch agent binary at "${binaryPath}": ${detail}`);
|
|
202
|
+
resolve(1);
|
|
203
|
+
});
|
|
204
|
+
child.once("exit", (code, signal) => {
|
|
205
|
+
if (resolved) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
resolved = true;
|
|
209
|
+
if (signal) {
|
|
210
|
+
logError(`Agent terminated by signal ${signal}`);
|
|
211
|
+
resolve(1);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
resolve(code ?? 0);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
async function writeShellProfiles(env) {
|
|
219
|
+
const homeDir = env.HOME;
|
|
220
|
+
if (!homeDir) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const bashrcPath = join(homeDir, ".bashrc");
|
|
224
|
+
const bashProfilePath = join(homeDir, ".bash_profile");
|
|
225
|
+
const exports = formatEnvExports(env);
|
|
226
|
+
const bashrcContents = `# Generated by Voratiq to preserve manifest env\n${exports}\n`;
|
|
227
|
+
const bashProfileContents = "# Generated by Voratiq to preserve manifest env\n" +
|
|
228
|
+
'if [ -f "$HOME/.bashrc" ]; then\n' +
|
|
229
|
+
' . "$HOME/.bashrc"\n' +
|
|
230
|
+
"fi\n";
|
|
231
|
+
try {
|
|
232
|
+
await mkdir(homeDir, { recursive: true });
|
|
233
|
+
await writeFile(bashrcPath, bashrcContents, { encoding: "utf8" });
|
|
234
|
+
await writeFile(bashProfilePath, bashProfileContents, {
|
|
235
|
+
encoding: "utf8",
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// Best-effort: shell profiles should not block agent startup.
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function formatEnvExports(env) {
|
|
243
|
+
const lines = [];
|
|
244
|
+
const keys = Object.keys(env).sort((a, b) => a.localeCompare(b));
|
|
245
|
+
for (const key of keys) {
|
|
246
|
+
const value = env[key];
|
|
247
|
+
if (value === undefined) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
lines.push(`export ${key}=${shellEscape(value)}`);
|
|
251
|
+
}
|
|
252
|
+
return lines.join("\n");
|
|
253
|
+
}
|
|
254
|
+
function shellEscape(value) {
|
|
255
|
+
if (value.length === 0) {
|
|
256
|
+
return "''";
|
|
257
|
+
}
|
|
258
|
+
const singleQuoteEscape = "'\"'\"'";
|
|
259
|
+
return `'${value.replace(/'/g, singleQuoteEscape)}'`;
|
|
260
|
+
}
|
|
261
|
+
function logError(message) {
|
|
262
|
+
console.error(`[voratiq] ${message}`);
|
|
263
|
+
}
|
|
264
|
+
const modulePath = fileURLToPath(import.meta.url);
|
|
265
|
+
const invokedScript = process.argv[1]
|
|
266
|
+
? resolvePath(process.argv[1])
|
|
267
|
+
: undefined;
|
|
268
|
+
if (invokedScript && modulePath === invokedScript) {
|
|
269
|
+
void main().then((exitCode) => {
|
|
270
|
+
process.exit(exitCode);
|
|
271
|
+
}, (error) => {
|
|
272
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
273
|
+
logError(`Unexpected error: ${detail}`);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { SandboxRuntimeConfig } from "@voratiq/sandbox-runtime";
|
|
2
|
+
import type { AgentDefinition } from "../../configs/agents/types.js";
|
|
3
|
+
import type { EnvironmentConfig } from "../../configs/environment/types.js";
|
|
4
|
+
import type { DenialBackoffConfig } from "../../configs/sandbox/types.js";
|
|
5
|
+
import type { WatchdogMetadata } from "../../domain/run/model/types.js";
|
|
6
|
+
import type { SandboxStageId } from "./policy.js";
|
|
7
|
+
import type { SandboxFailFastInfo } from "./sandbox.js";
|
|
8
|
+
import type { WatchdogTrigger } from "./watchdog.js";
|
|
9
|
+
export interface SandboxPolicyOverrides {
|
|
10
|
+
readonly allowWrite?: readonly string[];
|
|
11
|
+
readonly denyWrite?: readonly string[];
|
|
12
|
+
readonly denyRead?: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
export interface AgentRuntimePaths {
|
|
15
|
+
/** Base directory for the agent session (contains `runtime/` + `artifacts/`). */
|
|
16
|
+
readonly agentRoot: string;
|
|
17
|
+
/** Agent working directory (for example, a worktree or scratch workspace). */
|
|
18
|
+
readonly workspacePath: string;
|
|
19
|
+
/** Writable sandbox home directory for auth staging and HOME isolation. */
|
|
20
|
+
readonly sandboxHomePath: string;
|
|
21
|
+
/** Where to write runtime manifest (`runtime/manifest.json`). */
|
|
22
|
+
readonly runtimeManifestPath: string;
|
|
23
|
+
/** Where to write sandbox settings (`runtime/sandbox.json`). */
|
|
24
|
+
readonly sandboxSettingsPath: string;
|
|
25
|
+
/** Path to the runtime directory (`.../runtime`). Used for temp prompt. */
|
|
26
|
+
readonly runtimePath: string;
|
|
27
|
+
/** Path to the artifacts directory (`.../artifacts`). Used for read/write protection and stdout/stderr. */
|
|
28
|
+
readonly artifactsPath: string;
|
|
29
|
+
/** Process stdout capture. */
|
|
30
|
+
readonly stdoutPath: string;
|
|
31
|
+
/** Process stderr capture. */
|
|
32
|
+
readonly stderrPath: string;
|
|
33
|
+
}
|
|
34
|
+
export type SandboxSettings = SandboxRuntimeConfig;
|
|
35
|
+
export interface AgentRuntimeHarnessInput {
|
|
36
|
+
readonly root: string;
|
|
37
|
+
/** Optional caller-provided identifier for global teardown support. */
|
|
38
|
+
readonly sessionId?: string;
|
|
39
|
+
readonly agent: AgentDefinition;
|
|
40
|
+
readonly prompt: string;
|
|
41
|
+
readonly environment: EnvironmentConfig;
|
|
42
|
+
readonly paths: AgentRuntimePaths;
|
|
43
|
+
/** Stage intent used to compose shared baseline sandbox policy rules. */
|
|
44
|
+
readonly sandboxStageId?: SandboxStageId;
|
|
45
|
+
/**
|
|
46
|
+
* Override for sandbox provider used to load sandbox configuration. Defaults to `agent.provider`.
|
|
47
|
+
*/
|
|
48
|
+
readonly sandboxProviderId?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Filesystem policy overrides applied on top of the provider defaults.
|
|
51
|
+
* Reads are allowed by default; writes are restricted via allow/deny lists.
|
|
52
|
+
*/
|
|
53
|
+
readonly sandboxPolicyOverrides?: SandboxPolicyOverrides;
|
|
54
|
+
/**
|
|
55
|
+
* Extra paths that must be write-protected from the sandboxed process (e.g., run-specific verification dirs).
|
|
56
|
+
*/
|
|
57
|
+
readonly extraWriteProtectedPaths?: readonly string[];
|
|
58
|
+
/**
|
|
59
|
+
* Extra paths that must be read-protected from the sandboxed process (optional).
|
|
60
|
+
*/
|
|
61
|
+
readonly extraReadProtectedPaths?: readonly string[];
|
|
62
|
+
/** Denial backoff config used by watchdog; falls back to provider config or defaults. */
|
|
63
|
+
readonly denialBackoff?: DenialBackoffConfig;
|
|
64
|
+
/** Disable chat capture entirely. */
|
|
65
|
+
readonly captureChat?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* When false, defer auth teardown to session-level cleanup.
|
|
68
|
+
* Defaults to true.
|
|
69
|
+
*/
|
|
70
|
+
readonly teardownAuthOnExit?: boolean;
|
|
71
|
+
/** Optional hook for immediate watchdog UI updates. */
|
|
72
|
+
readonly onWatchdogTrigger?: (trigger: WatchdogTrigger, reason: string, failFast?: SandboxFailFastInfo) => void;
|
|
73
|
+
}
|
|
74
|
+
export interface AgentRuntimeChatResult {
|
|
75
|
+
readonly captured: boolean;
|
|
76
|
+
readonly format?: "json" | "jsonl";
|
|
77
|
+
readonly artifactPath?: string;
|
|
78
|
+
readonly sourceCount?: number;
|
|
79
|
+
readonly error?: unknown;
|
|
80
|
+
}
|
|
81
|
+
export interface AgentRuntimeHarnessResult {
|
|
82
|
+
readonly exitCode: number;
|
|
83
|
+
readonly errorMessage?: string;
|
|
84
|
+
readonly signal?: NodeJS.Signals | null;
|
|
85
|
+
readonly watchdog?: WatchdogMetadata;
|
|
86
|
+
readonly failFast?: SandboxFailFastInfo;
|
|
87
|
+
readonly sandboxSettings: SandboxSettings;
|
|
88
|
+
readonly chat?: AgentRuntimeChatResult;
|
|
89
|
+
/** The environment used by the sandboxed agent (includes PATH adjustments and staged auth vars). */
|
|
90
|
+
readonly manifestEnv: Record<string, string>;
|
|
91
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ChildProcess } from "node:child_process";
|
|
2
2
|
import type { Writable } from "node:stream";
|
|
3
|
-
import type { DenialBackoffConfig } from "
|
|
4
|
-
import { type SandboxFailFastInfo } from "
|
|
3
|
+
import type { DenialBackoffConfig } from "../../configs/sandbox/types.js";
|
|
4
|
+
import { type SandboxFailFastInfo } from "./sandbox.js";
|
|
5
5
|
/**
|
|
6
6
|
* Watchdog types and constants for enforcing per-agent process timeouts.
|
|
7
7
|
*
|
|
@@ -9,6 +9,7 @@ import { type SandboxFailFastInfo } from "../sandbox.js";
|
|
|
9
9
|
* voratiq run pipeline by enforcing silence, wall-clock, and fatal pattern limits.
|
|
10
10
|
*/
|
|
11
11
|
export type WatchdogTrigger = "silence" | "wall-clock" | "fatal-pattern" | "sandbox-denial";
|
|
12
|
+
export type WatchdogOutputSource = "stdout" | "stderr";
|
|
12
13
|
export declare const WATCHDOG_DEFAULTS: {
|
|
13
14
|
readonly silenceTimeoutMs: number;
|
|
14
15
|
readonly wallClockCapMs: number;
|
|
@@ -31,7 +32,7 @@ export interface WatchdogOptions {
|
|
|
31
32
|
}
|
|
32
33
|
export declare function createWatchdog(child: ChildProcess, stderrStream: Writable, options: WatchdogOptions): WatchdogController;
|
|
33
34
|
export interface WatchdogController {
|
|
34
|
-
handleOutput: (chunk: Buffer | string) => void;
|
|
35
|
+
handleOutput: (chunk: Buffer | string, source?: WatchdogOutputSource) => void;
|
|
35
36
|
cleanup: () => void;
|
|
36
37
|
getState: () => {
|
|
37
38
|
triggered: WatchdogTrigger | null;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DenialBackoffTracker, parseSandboxDenialLine, resolveDenialBackoffConfig, } from "
|
|
1
|
+
import { DenialBackoffTracker, parseSandboxDenialLine, resolveDenialBackoffConfig, } from "./sandbox.js";
|
|
2
2
|
export const WATCHDOG_DEFAULTS = {
|
|
3
3
|
silenceTimeoutMs: 15 * 60 * 1000,
|
|
4
4
|
wallClockCapMs: 120 * 60 * 1000,
|
|
@@ -7,10 +7,92 @@ export const WATCHDOG_DEFAULTS = {
|
|
|
7
7
|
/** Hard abort timeout after SIGKILL (ensures process promise resolves). */
|
|
8
8
|
hardAbortMs: 10 * 1000,
|
|
9
9
|
};
|
|
10
|
-
|
|
11
|
-
[
|
|
12
|
-
|
|
10
|
+
const FATAL_PATTERN_RULES = new Map([
|
|
11
|
+
[
|
|
12
|
+
"gemini",
|
|
13
|
+
[
|
|
14
|
+
{ pattern: /PERMISSION_DENIED/i },
|
|
15
|
+
{ pattern: /RESOURCE_EXHAUSTED/i },
|
|
16
|
+
{ pattern: /MODEL_CAPACITY_EXHAUSTED/i },
|
|
17
|
+
{ pattern: /No capacity available for model/i },
|
|
18
|
+
],
|
|
19
|
+
],
|
|
20
|
+
[
|
|
21
|
+
"codex",
|
|
22
|
+
[
|
|
23
|
+
{ pattern: /invalid_request_error/i, requiresProviderErrorContext: true },
|
|
24
|
+
{ pattern: /unsupported_value/i, requiresProviderErrorContext: true },
|
|
25
|
+
{
|
|
26
|
+
pattern: /^\s*thread\s+.+\s+panicked at\b/i,
|
|
27
|
+
allowedSources: ["stderr"],
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
],
|
|
31
|
+
[
|
|
32
|
+
"claude",
|
|
33
|
+
[
|
|
34
|
+
{ pattern: /OAuth token revoked/i },
|
|
35
|
+
{ pattern: /OAuth token has expired/i },
|
|
36
|
+
{ pattern: /Please run \/login/i },
|
|
37
|
+
{ pattern: /invalid.*api.*key/i },
|
|
38
|
+
{ pattern: /insufficient_quota/i },
|
|
39
|
+
],
|
|
40
|
+
],
|
|
13
41
|
]);
|
|
42
|
+
export const FATAL_PATTERNS = new Map(Array.from(FATAL_PATTERN_RULES, ([providerId, rules]) => [
|
|
43
|
+
providerId,
|
|
44
|
+
rules.map((rule) => rule.pattern),
|
|
45
|
+
]));
|
|
46
|
+
function hasCodexErrorContext(line) {
|
|
47
|
+
const trimmed = line.trim();
|
|
48
|
+
if (!trimmed) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
if (/^\s*(?:openai|codex)(?:\s+api)?\s+error\b/i.test(trimmed) ||
|
|
52
|
+
/^\s*api\s+error\b/i.test(trimmed)) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
if (/^\s*\{.*"error"\s*:/i.test(trimmed) ||
|
|
56
|
+
/^\s*"error"\s*:/i.test(trimmed)) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (/^\s*\{.*"type"\s*:\s*"invalid_request_error"/i.test(trimmed) ||
|
|
60
|
+
/^\s*"type"\s*:\s*"invalid_request_error"/i.test(trimmed)) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
if (/^\s*\{.*"code"\s*:\s*"unsupported_value"/i.test(trimmed) ||
|
|
64
|
+
/^\s*"code"\s*:\s*"unsupported_value"/i.test(trimmed)) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
function hasProviderErrorContext(providerId, line) {
|
|
70
|
+
if (providerId === "codex") {
|
|
71
|
+
return hasCodexErrorContext(line);
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
function findFatalPatternMatch(providerId, line, source, rules) {
|
|
76
|
+
const trimmedLine = line.trim();
|
|
77
|
+
if (!trimmedLine) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
for (const rule of rules) {
|
|
81
|
+
if (rule.allowedSources &&
|
|
82
|
+
!rule.allowedSources.some((allowedSource) => allowedSource === source)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (!rule.pattern.test(trimmedLine)) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (rule.requiresProviderErrorContext &&
|
|
89
|
+
!hasProviderErrorContext(providerId, trimmedLine)) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
return rule.pattern;
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
14
96
|
export function createWatchdog(child, stderrStream, options) {
|
|
15
97
|
const { silenceTimeoutMs, wallClockCapMs, killGraceMs, hardAbortMs } = WATCHDOG_DEFAULTS;
|
|
16
98
|
const denialBackoff = resolveDenialBackoffConfig(options.denialBackoff);
|
|
@@ -20,15 +102,26 @@ export function createWatchdog(child, stderrStream, options) {
|
|
|
20
102
|
killGraceTimer: null,
|
|
21
103
|
hardAbortTimer: null,
|
|
22
104
|
fatalPatternFirstSeen: null,
|
|
105
|
+
fatalLineBufferBySource: {
|
|
106
|
+
stdout: "",
|
|
107
|
+
stderr: "",
|
|
108
|
+
},
|
|
109
|
+
fatalCurrentLineMatchedBySource: {
|
|
110
|
+
stdout: false,
|
|
111
|
+
stderr: false,
|
|
112
|
+
},
|
|
23
113
|
triggered: null,
|
|
24
114
|
triggeredReason: null,
|
|
25
115
|
sandboxFailFast: null,
|
|
26
116
|
denialBackoff: new DenialBackoffTracker(denialBackoff),
|
|
27
|
-
|
|
117
|
+
sandboxLineBufferBySource: {
|
|
118
|
+
stdout: "",
|
|
119
|
+
stderr: "",
|
|
120
|
+
},
|
|
28
121
|
delayInProgress: false,
|
|
29
122
|
abortController: new AbortController(),
|
|
30
123
|
};
|
|
31
|
-
const
|
|
124
|
+
const fatalPatternRules = FATAL_PATTERN_RULES.get(options.providerId) ?? [];
|
|
32
125
|
const resetSilenceTimer = () => {
|
|
33
126
|
if (state.silenceTimer) {
|
|
34
127
|
clearTimeout(state.silenceTimer);
|
|
@@ -77,38 +170,74 @@ export function createWatchdog(child, stderrStream, options) {
|
|
|
77
170
|
}
|
|
78
171
|
terminateProcess(child, state, { killGraceMs, hardAbortMs });
|
|
79
172
|
};
|
|
80
|
-
const
|
|
81
|
-
|
|
173
|
+
const registerFatalPatternMatch = () => {
|
|
174
|
+
const now = Date.now();
|
|
175
|
+
if (state.fatalPatternFirstSeen === null) {
|
|
176
|
+
state.fatalPatternFirstSeen = now;
|
|
82
177
|
return;
|
|
83
178
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
179
|
+
const elapsed = now - state.fatalPatternFirstSeen;
|
|
180
|
+
if (elapsed <= WATCHDOG_DEFAULTS.fatalRetryWindowMs) {
|
|
181
|
+
triggerWatchdog("fatal-pattern", "Fatal provider error detected repeatedly. Inspect `stderr.log` for details.");
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
const checkFatalPatternLine = (line, source) => {
|
|
185
|
+
if (state.triggered || fatalPatternRules.length === 0) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
const pattern = findFatalPatternMatch(options.providerId, line, source, fatalPatternRules);
|
|
189
|
+
if (!pattern) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
registerFatalPatternMatch();
|
|
193
|
+
return true;
|
|
194
|
+
};
|
|
195
|
+
const checkFatalPattern = (text, source) => {
|
|
196
|
+
if (state.triggered || fatalPatternRules.length === 0) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
state.fatalLineBufferBySource[source] += text;
|
|
200
|
+
const lines = state.fatalLineBufferBySource[source].split(/\r?\n/);
|
|
201
|
+
state.fatalLineBufferBySource[source] = lines.pop() ?? "";
|
|
202
|
+
const hadMatchedTrailingPartial = state.fatalCurrentLineMatchedBySource[source];
|
|
203
|
+
for (const [index, line] of lines.entries()) {
|
|
204
|
+
if (state.triggered) {
|
|
95
205
|
return;
|
|
96
206
|
}
|
|
207
|
+
// If the trailing partial line was already matched in a prior chunk,
|
|
208
|
+
// skip exactly its completed replay on this chunk boundary.
|
|
209
|
+
if (hadMatchedTrailingPartial && index === 0) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
checkFatalPatternLine(line, source);
|
|
213
|
+
}
|
|
214
|
+
if (lines.length > 0) {
|
|
215
|
+
state.fatalCurrentLineMatchedBySource[source] = false;
|
|
216
|
+
}
|
|
217
|
+
if (state.triggered) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (!state.fatalLineBufferBySource[source]) {
|
|
221
|
+
state.fatalCurrentLineMatchedBySource[source] = false;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (!state.fatalCurrentLineMatchedBySource[source]) {
|
|
225
|
+
state.fatalCurrentLineMatchedBySource[source] = checkFatalPatternLine(state.fatalLineBufferBySource[source], source);
|
|
97
226
|
}
|
|
98
227
|
};
|
|
99
|
-
const handleOutput = (chunk) => {
|
|
228
|
+
const handleOutput = (chunk, source = "stderr") => {
|
|
100
229
|
resetSilenceTimer();
|
|
101
230
|
const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
102
|
-
checkFatalPattern(text);
|
|
103
|
-
handleSandboxDenialText(text);
|
|
231
|
+
checkFatalPattern(text, source);
|
|
232
|
+
handleSandboxDenialText(text, source);
|
|
104
233
|
};
|
|
105
|
-
const handleSandboxDenialText = (text) => {
|
|
234
|
+
const handleSandboxDenialText = (text, source) => {
|
|
106
235
|
if (state.triggered) {
|
|
107
236
|
return;
|
|
108
237
|
}
|
|
109
|
-
state.
|
|
110
|
-
const lines = state.
|
|
111
|
-
state.
|
|
238
|
+
state.sandboxLineBufferBySource[source] += text;
|
|
239
|
+
const lines = state.sandboxLineBufferBySource[source].split("\n");
|
|
240
|
+
state.sandboxLineBufferBySource[source] = lines.pop() ?? "";
|
|
112
241
|
for (const line of lines) {
|
|
113
242
|
if (state.triggered) {
|
|
114
243
|
return;
|
|
@@ -29,6 +29,7 @@ export const codexAuthProvider = {
|
|
|
29
29
|
codex: [".codex"],
|
|
30
30
|
logs: ["Library", "Logs", "Codex"],
|
|
31
31
|
support: ["Library", "Application Support", "Codex"],
|
|
32
|
+
tmp: ["tmp"],
|
|
32
33
|
});
|
|
33
34
|
await ensureDirectories(Object.values(sandboxPaths));
|
|
34
35
|
const secretHandles = [];
|
|
@@ -42,7 +43,9 @@ export const codexAuthProvider = {
|
|
|
42
43
|
fileLabel: CODEX_AUTH_FILENAME,
|
|
43
44
|
});
|
|
44
45
|
secretHandles.push(handle);
|
|
45
|
-
|
|
46
|
+
if (options.includeConfigToml !== false) {
|
|
47
|
+
await copyOptionalConfig(options, sandboxPaths.codex);
|
|
48
|
+
}
|
|
46
49
|
}
|
|
47
50
|
catch (error) {
|
|
48
51
|
await disposeHandles(secretHandles);
|
|
@@ -51,7 +54,9 @@ export const codexAuthProvider = {
|
|
|
51
54
|
registerSandboxSecrets(sandboxPaths.home, secretHandles);
|
|
52
55
|
const envResult = composeSandboxEnvResult(sandboxPaths.home, {
|
|
53
56
|
CODEX_HOME: sandboxPaths.codex,
|
|
54
|
-
|
|
57
|
+
TMPDIR: sandboxPaths.tmp,
|
|
58
|
+
TEMP: sandboxPaths.tmp,
|
|
59
|
+
TMP: sandboxPaths.tmp,
|
|
55
60
|
});
|
|
56
61
|
return envResult;
|
|
57
62
|
},
|