humanish 0.106.1 → 0.108.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/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -2,12 +2,13 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { chmod, lstat, mkdir, mkdtemp, readdir, realpath, rm, unlink, writeFile, } from "node:fs/promises";
|
|
3
3
|
import { homedir, tmpdir } from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { admitsCodexCliVersion, supportsIsolatedCodex } from "./codex-admission.js";
|
|
6
6
|
import { launchAdmittedAppServer, } from "./restricted-launch.js";
|
|
7
7
|
import { CODEX_IMAGE, CODEX_MAX_OUTPUT_BYTES, CODEX_MAX_REQUEST_BYTES, RESTRICTED_CODEX_ANALYSIS_MODELS, codexRecord, restrictedCodexFailure, restrictedCodexRequestError, } from "./restricted-policy.js";
|
|
8
|
-
import { RestrictedCodexDeadline, RestrictedCodexStop,
|
|
8
|
+
import { RestrictedCodexDeadline, RestrictedCodexStop, hasUnclosedChildren, retainUnclosedChild, } from "./restricted-transport.js";
|
|
9
9
|
import { checkVersion, childEnvironment, resolveExecutable, restrictedCodexNpmTarget, } from "./restricted-executable.js";
|
|
10
10
|
import { RestrictedCodexTurn } from "./restricted-turn.js";
|
|
11
|
+
import { countUnknownNotification, detachTurn, idleNotifications, installSessionHandlers, notificationPolicyOf, refuseSession, } from "./restricted-notifications.js";
|
|
11
12
|
function validParticipant(options) {
|
|
12
13
|
if (!options)
|
|
13
14
|
return true;
|
|
@@ -34,12 +35,29 @@ function validParticipant(options) {
|
|
|
34
35
|
export async function runRestrictedCodexSession(request, options = {}, readinessOnly = false) {
|
|
35
36
|
const session = createRestrictedCodexSession(options);
|
|
36
37
|
const result = await session.run(request, readinessOnly);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const closed = await session.close();
|
|
39
|
+
const unknownNotifications = session.unknownNotifications ?? {};
|
|
40
|
+
const truncatedFrameBytes = session.truncatedFrameBytes;
|
|
41
|
+
const { protocolIncompatibilities, protocolAdditions } = session;
|
|
42
|
+
const noted = {
|
|
43
|
+
...(Object.keys(unknownNotifications).length === 0 ? {} : { unknownNotifications }),
|
|
44
|
+
...(truncatedFrameBytes === undefined ? {} : { truncatedFrameBytes }),
|
|
45
|
+
...(protocolIncompatibilities === undefined ? {} : { protocolIncompatibilities }),
|
|
46
|
+
...(protocolAdditions === undefined || protocolAdditions.length === 0
|
|
47
|
+
? {}
|
|
48
|
+
: { protocolAdditions }),
|
|
49
|
+
};
|
|
50
|
+
if (!closed)
|
|
51
|
+
return {
|
|
40
52
|
...restrictedCodexFailure("codex_cleanup_failed", result.dispatched, result.usage),
|
|
41
53
|
failurePhase: "cleanup",
|
|
54
|
+
...noted,
|
|
42
55
|
};
|
|
56
|
+
// A disallowed item while the app-server shut down fails a request that had completed.
|
|
57
|
+
const refusal = session.policyRefusal;
|
|
58
|
+
return refusal !== undefined && result.errorCode === null
|
|
59
|
+
? { ...restrictedCodexFailure(refusal, result.dispatched, result.usage), ...noted }
|
|
60
|
+
: { ...result, ...noted };
|
|
43
61
|
}
|
|
44
62
|
async function writeRecoveryMarker(work, sourceEnv, reason) {
|
|
45
63
|
const cache = sourceEnv.XDG_CACHE_HOME ?? path.join(sourceEnv.HOME ?? homedir(), ".cache");
|
|
@@ -200,17 +218,12 @@ function newTurn(settings, state, deadline) {
|
|
|
200
218
|
turnStarted: (turnId) => {
|
|
201
219
|
state.interrupt = { threadId: state.threadId, turnId };
|
|
202
220
|
},
|
|
221
|
+
policy: notificationPolicyOf(participant),
|
|
222
|
+
idle: (method, params) => idleNotifications(participant, state)(method, params),
|
|
223
|
+
recordUnknown: (method) => countUnknownNotification(state.unknownNotifications, method),
|
|
224
|
+
refuse: (code) => refuseSession(state, code),
|
|
203
225
|
});
|
|
204
226
|
}
|
|
205
|
-
/** After a request: the turn's handlers come off the transport. */
|
|
206
|
-
function detachTurn(transport) {
|
|
207
|
-
if (transport)
|
|
208
|
-
transport.onNotification = () => undefined;
|
|
209
|
-
if (transport)
|
|
210
|
-
transport.onRequest = undefined;
|
|
211
|
-
if (transport)
|
|
212
|
-
transport.onRequestComplete = undefined;
|
|
213
|
-
}
|
|
214
227
|
/** Request dispatch: launch on the first request, then one turn; a failed request tears down. */
|
|
215
228
|
async function runTurn(settings, state, dispose, request, readinessOnly) {
|
|
216
229
|
const participant = settings.participant;
|
|
@@ -228,13 +241,13 @@ async function runTurn(settings, state, dispose, request, readinessOnly) {
|
|
|
228
241
|
if (!state.transport) {
|
|
229
242
|
state.transport = await launchAdmittedAppServer(settings, state, request, deadline, frameLimit, (next) => {
|
|
230
243
|
phase = next;
|
|
231
|
-
});
|
|
244
|
+
}, (transport) => installSessionHandlers(participant, state, transport));
|
|
232
245
|
selectedModel = state.identity.model;
|
|
233
246
|
}
|
|
234
247
|
else
|
|
235
248
|
state.transport.beginRequest(deadline, frameLimit);
|
|
236
|
-
//
|
|
237
|
-
// callback, so wiring both
|
|
249
|
+
// Before dispatch the turn passes notifications to the idle handler the launch installed,
|
|
250
|
+
// and onRequestComplete follows only a host callback, so wiring both here loses nothing.
|
|
238
251
|
state.transport.onNotification = turn.onNotification;
|
|
239
252
|
state.transport.onRequestComplete = turn.onRequestComplete;
|
|
240
253
|
if (readinessOnly)
|
|
@@ -269,7 +282,7 @@ async function runTurn(settings, state, dispose, request, readinessOnly) {
|
|
|
269
282
|
state.pendingInferenceUsage = undefined;
|
|
270
283
|
deadline.close();
|
|
271
284
|
state.activeDeadline = undefined;
|
|
272
|
-
detachTurn(state
|
|
285
|
+
detachTurn(participant, state);
|
|
273
286
|
if (result.errorCode !== null) {
|
|
274
287
|
if (result.errorCode === "codex_cleanup_failed")
|
|
275
288
|
state.cleanupTrusted = false;
|
|
@@ -299,11 +312,16 @@ function refusedRun(settings, state, request, busy) {
|
|
|
299
312
|
return restrictedCodexFailure("codex_busy");
|
|
300
313
|
const supportedPlatform = operatorAuth
|
|
301
314
|
? restrictedCodexNpmTarget(platform, arch) !== undefined
|
|
302
|
-
: (platform
|
|
315
|
+
: supportsIsolatedCodex(platform, arch);
|
|
303
316
|
if (!supportedPlatform)
|
|
304
317
|
return restrictedCodexFailure("codex_unsupported_platform");
|
|
305
318
|
return undefined;
|
|
306
319
|
}
|
|
320
|
+
/** Which releases a session starts: launch admission, or the qualifier's exact list. */
|
|
321
|
+
function launchAdmission(options) {
|
|
322
|
+
const exact = options.cliVersions;
|
|
323
|
+
return exact === undefined ? admitsCodexCliVersion : (version) => exact.includes(version);
|
|
324
|
+
}
|
|
307
325
|
export function createRestrictedCodexSession(options = {}) {
|
|
308
326
|
// Option reads keep their old order: platform, arch, env, participant, spawnFn, cliVersions.
|
|
309
327
|
const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
|
|
@@ -318,7 +336,7 @@ export function createRestrictedCodexSession(options = {}) {
|
|
|
318
336
|
operatorAuth: participant?.authMode === "operator",
|
|
319
337
|
reasoningEffort: participant?.reasoningEffort ?? "low",
|
|
320
338
|
spawnFn: options.spawnFn ?? ((file, args, spawnOptions) => spawn(file, args, spawnOptions)),
|
|
321
|
-
|
|
339
|
+
admits: launchAdmission(options),
|
|
322
340
|
};
|
|
323
341
|
const state = {
|
|
324
342
|
work: undefined,
|
|
@@ -335,10 +353,15 @@ export function createRestrictedCodexSession(options = {}) {
|
|
|
335
353
|
resolvedModel: undefined,
|
|
336
354
|
authentication: undefined,
|
|
337
355
|
cliVersion: undefined,
|
|
356
|
+
unknownNotifications: new Map(),
|
|
357
|
+
protocolIncompatibilities: undefined,
|
|
358
|
+
protocolAdditions: undefined,
|
|
338
359
|
activeDeadline: undefined,
|
|
339
360
|
interrupt: undefined,
|
|
340
361
|
closed: false,
|
|
341
362
|
cleanupTrusted: true,
|
|
363
|
+
policyRefusal: undefined,
|
|
364
|
+
truncatedFrameBytes: undefined,
|
|
342
365
|
};
|
|
343
366
|
let pending, closing, disposing;
|
|
344
367
|
const dispose = () => {
|
|
@@ -361,6 +384,21 @@ export function createRestrictedCodexSession(options = {}) {
|
|
|
361
384
|
get cliVersion() {
|
|
362
385
|
return state.cliVersion;
|
|
363
386
|
},
|
|
387
|
+
get unknownNotifications() {
|
|
388
|
+
return Object.fromEntries(state.unknownNotifications);
|
|
389
|
+
},
|
|
390
|
+
get policyRefusal() {
|
|
391
|
+
return state.policyRefusal;
|
|
392
|
+
},
|
|
393
|
+
get truncatedFrameBytes() {
|
|
394
|
+
return state.truncatedFrameBytes;
|
|
395
|
+
},
|
|
396
|
+
get protocolIncompatibilities() {
|
|
397
|
+
return state.protocolIncompatibilities;
|
|
398
|
+
},
|
|
399
|
+
get protocolAdditions() {
|
|
400
|
+
return state.protocolAdditions;
|
|
401
|
+
},
|
|
364
402
|
run(request, readinessOnly = false) {
|
|
365
403
|
const refusal = refusedRun(settings, state, request, () => pending !== undefined);
|
|
366
404
|
if (refusal)
|
|
@@ -401,7 +439,7 @@ export async function checkRestrictedCodexSessionReadiness(input = {}, options =
|
|
|
401
439
|
* `--version` runs with a private temporary home, removed afterwards. */
|
|
402
440
|
export async function detectRestrictedCodexCliVersion(input = {}, options = {}) {
|
|
403
441
|
const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
|
|
404
|
-
if (!(
|
|
442
|
+
if (!supportsIsolatedCodex(platform, arch))
|
|
405
443
|
return { cliVersion: null, errorCode: "codex_unsupported_platform" };
|
|
406
444
|
const sourceEnv = options.env ?? process.env;
|
|
407
445
|
const deadline = new RestrictedCodexDeadline(input.timeoutMs ?? 15_000, input.signal);
|
|
@@ -411,7 +449,7 @@ export async function detectRestrictedCodexCliVersion(input = {}, options = {})
|
|
|
411
449
|
work = await realpath(await mkdtemp(path.join(options.tempRoot ?? tmpdir(), "humanish-codex-version-")));
|
|
412
450
|
const home = path.join(work, "home");
|
|
413
451
|
await mkdir(home, { mode: 0o700 });
|
|
414
|
-
const cliVersion = await checkVersion(file, childEnvironment(sourceEnv, home, work), work, options.spawnFn ?? ((command, args, settings) => spawn(command, args, settings)), deadline, options
|
|
452
|
+
const cliVersion = await checkVersion(file, childEnvironment(sourceEnv, home, work), work, options.spawnFn ?? ((command, args, settings) => spawn(command, args, settings)), deadline, launchAdmission(options), options.cliVersion);
|
|
415
453
|
return { cliVersion, errorCode: null };
|
|
416
454
|
}
|
|
417
455
|
catch (error) {
|
|
@@ -34,11 +34,21 @@ export declare class RestrictedCodexDeadline {
|
|
|
34
34
|
}
|
|
35
35
|
export declare function retainUnclosedChild(closed: Promise<void>): void;
|
|
36
36
|
export declare const hasUnclosedChildren: () => boolean;
|
|
37
|
+
/** How the process exited: its exit code, or the signal that ended it. */
|
|
38
|
+
interface OwnedCodexExit {
|
|
39
|
+
code: number | null;
|
|
40
|
+
signal: NodeJS.Signals | null;
|
|
41
|
+
}
|
|
37
42
|
export interface OwnedCodexProcess {
|
|
38
43
|
child: ChildProcessWithoutNullStreams;
|
|
39
44
|
closed: Promise<void>;
|
|
40
45
|
isClosed(): boolean;
|
|
41
46
|
hasExited(): boolean;
|
|
47
|
+
/** Resolves with the 'exit' event's code and signal. */
|
|
48
|
+
readonly exit: Promise<OwnedCodexExit>;
|
|
49
|
+
/** The signals humanish delivered while the process was still running (signalOwnedChild). */
|
|
50
|
+
signalsSent(): readonly NodeJS.Signals[];
|
|
51
|
+
recordSignal(signal: NodeJS.Signals): void;
|
|
42
52
|
}
|
|
43
53
|
export declare function ownCodexProcess(child: ChildProcessWithoutNullStreams): OwnedCodexProcess;
|
|
44
54
|
export declare function closeOwnedCodexProcess(owned: OwnedCodexProcess): Promise<boolean>;
|
|
@@ -55,11 +65,29 @@ export declare class RestrictedCodexTransport {
|
|
|
55
65
|
private eventCount;
|
|
56
66
|
private closing;
|
|
57
67
|
onNotification: (method: string, params: Record<string, unknown>) => void;
|
|
68
|
+
/** Notifications after the deadline stopped or close began: no turn handles them, only the policy. */
|
|
69
|
+
onPolicyOnlyNotification: (method: string, params: Record<string, unknown>) => void;
|
|
70
|
+
/** A server request with no handler, or output that could not be checked (failUninspected). */
|
|
71
|
+
onPolicyFailure: (code: RestrictedCodexAnalysisErrorCode) => void;
|
|
72
|
+
/** The size of a last frame cut off after humanish stopped the process: a warning only. */
|
|
73
|
+
onTruncatedFrame: (bytes: number) => void;
|
|
58
74
|
onRequest: ((method: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>) | undefined;
|
|
59
75
|
onRequestComplete: (() => void) | undefined;
|
|
60
76
|
constructor(owned: OwnedCodexProcess, deadline: RestrictedCodexDeadline, frameLimit?: number);
|
|
61
77
|
/** A completed turn releases its deadline and wire budget, not its conversation. */
|
|
62
78
|
beginRequest(deadline: RestrictedCodexDeadline, frameLimit: number): void;
|
|
79
|
+
/** One line of output: a malformed line could not be checked. */
|
|
80
|
+
private frame;
|
|
81
|
+
/**
|
|
82
|
+
* Output that could not be checked: past a byte, frame or event limit, malformed, or cut off.
|
|
83
|
+
* The session records it through onPolicyFailure, whatever state the transport is in.
|
|
84
|
+
*/
|
|
85
|
+
private failUninspected;
|
|
86
|
+
/**
|
|
87
|
+
* Refuses the session with `code`: stops the current deadline and rejects pending requests.
|
|
88
|
+
* Between requests the stopped deadline makes the next beginRequest throw the code.
|
|
89
|
+
*/
|
|
90
|
+
refuse(code: RestrictedCodexAnalysisErrorCode): void;
|
|
63
91
|
private fail;
|
|
64
92
|
private message;
|
|
65
93
|
private write;
|
|
@@ -71,3 +99,4 @@ export declare class RestrictedCodexTransport {
|
|
|
71
99
|
turnId: string;
|
|
72
100
|
}): Promise<boolean>;
|
|
73
101
|
}
|
|
102
|
+
export {};
|
|
@@ -91,8 +91,12 @@ export function retainUnclosedChild(closed) {
|
|
|
91
91
|
export const hasUnclosedChildren = () => unclosedChildren.size > 0;
|
|
92
92
|
export function ownCodexProcess(child) {
|
|
93
93
|
let closed = false, exited = false;
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
const sent = [];
|
|
95
|
+
const exit = new Promise((resolve) => {
|
|
96
|
+
child.once("exit", (code, signal) => {
|
|
97
|
+
exited = true;
|
|
98
|
+
resolve({ code, signal });
|
|
99
|
+
});
|
|
96
100
|
});
|
|
97
101
|
const completion = new Promise((resolve) => {
|
|
98
102
|
child.once("close", () => {
|
|
@@ -100,7 +104,17 @@ export function ownCodexProcess(child) {
|
|
|
100
104
|
resolve();
|
|
101
105
|
});
|
|
102
106
|
});
|
|
103
|
-
return {
|
|
107
|
+
return {
|
|
108
|
+
child,
|
|
109
|
+
closed: completion,
|
|
110
|
+
isClosed: () => closed,
|
|
111
|
+
hasExited: () => exited,
|
|
112
|
+
exit,
|
|
113
|
+
signalsSent: () => sent,
|
|
114
|
+
recordSignal: (signal) => {
|
|
115
|
+
sent.push(signal);
|
|
116
|
+
},
|
|
117
|
+
};
|
|
104
118
|
}
|
|
105
119
|
async function settlesWithin(promise, ms) {
|
|
106
120
|
let timer;
|
|
@@ -122,7 +136,9 @@ function signalOwnedChild(owned, signal) {
|
|
|
122
136
|
if (owned.hasExited() || owned.isClosed())
|
|
123
137
|
return;
|
|
124
138
|
try {
|
|
125
|
-
|
|
139
|
+
// kill() is true when the signal was delivered.
|
|
140
|
+
if (owned.child.kill(signal))
|
|
141
|
+
owned.recordSignal(signal);
|
|
126
142
|
}
|
|
127
143
|
catch {
|
|
128
144
|
/* Closing is still checked below. */
|
|
@@ -142,6 +158,15 @@ export async function closeOwnedCodexProcess(owned) {
|
|
|
142
158
|
owned.child.stderr.destroy();
|
|
143
159
|
return closed;
|
|
144
160
|
}
|
|
161
|
+
function isJson(text) {
|
|
162
|
+
try {
|
|
163
|
+
JSON.parse(text);
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
145
170
|
export class RestrictedCodexTransport {
|
|
146
171
|
owned;
|
|
147
172
|
deadline;
|
|
@@ -155,6 +180,12 @@ export class RestrictedCodexTransport {
|
|
|
155
180
|
eventCount = 0;
|
|
156
181
|
closing = false;
|
|
157
182
|
onNotification = () => undefined;
|
|
183
|
+
/** Notifications after the deadline stopped or close began: no turn handles them, only the policy. */
|
|
184
|
+
onPolicyOnlyNotification = () => undefined;
|
|
185
|
+
/** A server request with no handler, or output that could not be checked (failUninspected). */
|
|
186
|
+
onPolicyFailure = () => undefined;
|
|
187
|
+
/** The size of a last frame cut off after humanish stopped the process: a warning only. */
|
|
188
|
+
onTruncatedFrame = () => undefined;
|
|
158
189
|
onRequest;
|
|
159
190
|
onRequestComplete;
|
|
160
191
|
constructor(owned, deadline, frameLimit = CODEX_MAX_OUTPUT_BYTES) {
|
|
@@ -165,38 +196,59 @@ export class RestrictedCodexTransport {
|
|
|
165
196
|
child.on("error", () => this.fail("codex_process_failed"));
|
|
166
197
|
child.stdin.on("error", () => this.fail("codex_process_failed"));
|
|
167
198
|
child.on("close", () => this.fail("codex_process_failed"));
|
|
199
|
+
// Output is read until the process exits. Once the deadline stops or close begins, it is read
|
|
200
|
+
// for the item policy only (message); only the byte and frame limits stop reading, and they
|
|
201
|
+
// count as unchecked output.
|
|
168
202
|
child.stdout.on("data", (chunk) => {
|
|
169
|
-
if ((!this.closing && this.deadline.code !== null) ||
|
|
170
|
-
(this.closing && this.pending.size === 0))
|
|
171
|
-
return;
|
|
172
203
|
this.stdoutBytes += chunk.length;
|
|
173
204
|
if (this.stdoutBytes >
|
|
174
205
|
Math.max(CODEX_MAX_STDOUT_BYTES, this.frameLimit * 2 + CODEX_MAX_OUTPUT_BYTES * 2)) {
|
|
175
|
-
this.
|
|
206
|
+
this.failUninspected("response_too_large");
|
|
176
207
|
return;
|
|
177
208
|
}
|
|
178
209
|
this.line += this.decoder.write(chunk);
|
|
179
210
|
if (Buffer.byteLength(this.line) > this.frameLimit) {
|
|
180
|
-
this.
|
|
211
|
+
this.failUninspected("response_too_large");
|
|
181
212
|
return;
|
|
182
213
|
}
|
|
183
214
|
while (this.line.includes("\n")) {
|
|
184
|
-
const split = this.line.indexOf("\n")
|
|
215
|
+
const split = this.line.indexOf("\n");
|
|
216
|
+
const line = this.line.slice(0, split);
|
|
185
217
|
this.line = this.line.slice(split + 1);
|
|
186
|
-
|
|
187
|
-
this.fail("codex_protocol_error");
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
try {
|
|
191
|
-
this.message(JSON.parse(line));
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
this.fail("codex_protocol_error");
|
|
195
|
-
}
|
|
196
|
-
if (this.deadline.code !== null && !this.closing)
|
|
197
|
-
return;
|
|
218
|
+
this.frame(line);
|
|
198
219
|
}
|
|
199
220
|
});
|
|
221
|
+
// A last frame without its newline is parsed when it is whole JSON. A cut-off frame is a
|
|
222
|
+
// warning with its size only when humanish's own signal cut it: the signal reached the running
|
|
223
|
+
// process before its output ended, and the process then exited by that signal or with a code.
|
|
224
|
+
// Any other cut-off frame (an exit on its own, a crash, a signal humanish did not send) went
|
|
225
|
+
// unchecked.
|
|
226
|
+
child.stdout.on("end", () => {
|
|
227
|
+
const rest = this.line + this.decoder.end();
|
|
228
|
+
this.line = "";
|
|
229
|
+
const lines = rest.split("\n").filter((line) => line.length > 0);
|
|
230
|
+
const last = lines.pop();
|
|
231
|
+
for (const line of lines)
|
|
232
|
+
this.frame(line);
|
|
233
|
+
if (last === undefined)
|
|
234
|
+
return;
|
|
235
|
+
if (isJson(last)) {
|
|
236
|
+
this.frame(last);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (this.owned.signalsSent().length === 0) {
|
|
240
|
+
this.failUninspected("codex_protocol_error");
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const bytes = Buffer.byteLength(last);
|
|
244
|
+
void this.owned.exit.then(({ code, signal }) => {
|
|
245
|
+
const ours = signal === null ? code !== null : this.owned.signalsSent().includes(signal);
|
|
246
|
+
if (ours)
|
|
247
|
+
this.onTruncatedFrame(bytes);
|
|
248
|
+
else
|
|
249
|
+
this.failUninspected("codex_protocol_error");
|
|
250
|
+
});
|
|
251
|
+
});
|
|
200
252
|
child.stderr.on("data", (chunk) => {
|
|
201
253
|
this.stderrBytes += chunk.length;
|
|
202
254
|
if (this.stderrBytes > CODEX_MAX_OUTPUT_BYTES)
|
|
@@ -215,6 +267,41 @@ export class RestrictedCodexTransport {
|
|
|
215
267
|
this.stderrBytes = 0;
|
|
216
268
|
this.eventCount = 0;
|
|
217
269
|
}
|
|
270
|
+
/** One line of output: a malformed line could not be checked. */
|
|
271
|
+
frame(line) {
|
|
272
|
+
let parsed;
|
|
273
|
+
try {
|
|
274
|
+
parsed = line.length === 0 ? undefined : JSON.parse(line);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
parsed = undefined;
|
|
278
|
+
}
|
|
279
|
+
if (parsed === undefined) {
|
|
280
|
+
this.failUninspected("codex_protocol_error");
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
this.message(parsed);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
this.fail("codex_protocol_error");
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Output that could not be checked: past a byte, frame or event limit, malformed, or cut off.
|
|
292
|
+
* The session records it through onPolicyFailure, whatever state the transport is in.
|
|
293
|
+
*/
|
|
294
|
+
failUninspected(code) {
|
|
295
|
+
this.onPolicyFailure(code);
|
|
296
|
+
this.fail(code);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Refuses the session with `code`: stops the current deadline and rejects pending requests.
|
|
300
|
+
* Between requests the stopped deadline makes the next beginRequest throw the code.
|
|
301
|
+
*/
|
|
302
|
+
refuse(code) {
|
|
303
|
+
this.fail(code);
|
|
304
|
+
}
|
|
218
305
|
fail(code) {
|
|
219
306
|
if (!this.closing)
|
|
220
307
|
this.deadline.stop(code);
|
|
@@ -225,13 +312,31 @@ export class RestrictedCodexTransport {
|
|
|
225
312
|
message(raw) {
|
|
226
313
|
const value = codexRecord(raw);
|
|
227
314
|
if (Object.keys(value).length === 0) {
|
|
228
|
-
this.
|
|
315
|
+
this.failUninspected("codex_protocol_error");
|
|
229
316
|
return;
|
|
230
317
|
}
|
|
318
|
+
// After the deadline stopped or close began, output is read for the item policy only.
|
|
319
|
+
const policyOnly = this.closing || this.deadline.code !== null;
|
|
231
320
|
if (value.id !== undefined && typeof value.method === "string") {
|
|
321
|
+
// A server request is then declined unhandled: its turn is over or being interrupted, so a
|
|
322
|
+
// tool call that crossed the stop runs nothing and is not a policy refusal.
|
|
323
|
+
if (policyOnly) {
|
|
324
|
+
try {
|
|
325
|
+
this.write({
|
|
326
|
+
id: value.id,
|
|
327
|
+
error: { code: -32601, message: "Host request is disabled" },
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
/* The process is already closing. */
|
|
332
|
+
}
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
232
335
|
if (!this.onRequest || ++this.eventCount > CODEX_MAX_EVENTS) {
|
|
336
|
+
const code = this.eventCount > CODEX_MAX_EVENTS ? "response_too_large" : "codex_tool_call";
|
|
337
|
+
this.onPolicyFailure(code);
|
|
233
338
|
this.write({ id: value.id, error: { code: -32601, message: "Host request is disabled" } });
|
|
234
|
-
this.fail(
|
|
339
|
+
this.fail(code);
|
|
235
340
|
return;
|
|
236
341
|
}
|
|
237
342
|
const id = value.id;
|
|
@@ -263,7 +368,9 @@ export class RestrictedCodexTransport {
|
|
|
263
368
|
if (typeof value.id === "number" && value.method === undefined) {
|
|
264
369
|
const pending = this.pending.get(value.id);
|
|
265
370
|
if (!pending) {
|
|
266
|
-
|
|
371
|
+
// A late reply, such as an interrupt's after its wait, carries no item.
|
|
372
|
+
if (!policyOnly)
|
|
373
|
+
this.fail("codex_protocol_error");
|
|
267
374
|
return;
|
|
268
375
|
}
|
|
269
376
|
this.pending.delete(value.id);
|
|
@@ -280,10 +387,12 @@ export class RestrictedCodexTransport {
|
|
|
280
387
|
if (typeof value.method !== "string" ||
|
|
281
388
|
value.id !== undefined ||
|
|
282
389
|
++this.eventCount > CODEX_MAX_EVENTS) {
|
|
283
|
-
this.
|
|
390
|
+
this.failUninspected(this.eventCount > CODEX_MAX_EVENTS ? "response_too_large" : "codex_protocol_error");
|
|
284
391
|
return;
|
|
285
392
|
}
|
|
286
|
-
if (
|
|
393
|
+
if (policyOnly)
|
|
394
|
+
this.onPolicyOnlyNotification(value.method, codexRecord(value.params));
|
|
395
|
+
else
|
|
287
396
|
this.onNotification(value.method, codexRecord(value.params));
|
|
288
397
|
}
|
|
289
398
|
write(value) {
|
|
@@ -324,6 +433,9 @@ export class RestrictedCodexTransport {
|
|
|
324
433
|
}
|
|
325
434
|
async close(interrupt) {
|
|
326
435
|
this.closing = true;
|
|
436
|
+
// Shutdown output gets its own byte and event budget.
|
|
437
|
+
this.stdoutBytes = 0;
|
|
438
|
+
this.eventCount = 0;
|
|
327
439
|
if (interrupt && !this.owned.isClosed()) {
|
|
328
440
|
const { id, result } = this.request("turn/interrupt", interrupt);
|
|
329
441
|
await settlesWithin(result, 1000);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { type RestrictedCodexResult, type RestrictedCodexUsage } from "./restricted-policy.js";
|
|
1
|
+
import { type RestrictedCodexAnalysisErrorCode, type RestrictedCodexResult, type RestrictedCodexUsage } from "./restricted-policy.js";
|
|
2
2
|
import { type RestrictedCodexDeadline, type RestrictedCodexTransport } from "./restricted-transport.js";
|
|
3
|
+
import { type NotificationPolicy } from "./restricted-notifications.js";
|
|
3
4
|
/** What a turn reads from and reports to its session. */
|
|
4
5
|
export interface RestrictedCodexTurnContext {
|
|
5
6
|
readonly deadline: RestrictedCodexDeadline;
|
|
@@ -23,11 +24,23 @@ export interface RestrictedCodexTurnContext {
|
|
|
23
24
|
reportUsage(usage: RestrictedCodexUsage | undefined, inference: RestrictedCodexUsage[] | undefined): void;
|
|
24
25
|
/** The turn the session interrupts if it closes now. */
|
|
25
26
|
turnStarted(turnId: string): void;
|
|
27
|
+
/** The item policy every notification's item passes, whatever its method. */
|
|
28
|
+
readonly policy: NotificationPolicy;
|
|
29
|
+
/** The session's handler for notifications that arrive before this turn is dispatched. */
|
|
30
|
+
idle(method: string, params: Record<string, unknown>): void;
|
|
31
|
+
/** Counts a notification method this humanish does not know that carried no item. */
|
|
32
|
+
recordUnknown(method: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* A policy refusal: stops this request with `code`, and the session records it when the
|
|
35
|
+
* request already stopped for another reason, such as a close.
|
|
36
|
+
*/
|
|
37
|
+
refuse(code: RestrictedCodexAnalysisErrorCode): void;
|
|
26
38
|
}
|
|
27
39
|
/**
|
|
28
|
-
* Drain: every notification and tool request of one turn.
|
|
29
|
-
* events that arrive before turn/start's reply
|
|
30
|
-
*
|
|
40
|
+
* Drain: every notification and tool request of one turn. Before `dispatched`, notifications go
|
|
41
|
+
* to the session's idle handler; events that arrive after dispatch but before turn/start's reply
|
|
42
|
+
* pass the item policy at once, then wait until acknowledge() and are checked in order.
|
|
43
|
+
* `finished` resolves only with a completed, validated final answer.
|
|
31
44
|
*/
|
|
32
45
|
export declare class RestrictedCodexTurn {
|
|
33
46
|
private readonly context;
|
|
@@ -53,6 +66,8 @@ export declare class RestrictedCodexTurn {
|
|
|
53
66
|
acknowledge(returnedTurnId: unknown): void;
|
|
54
67
|
readonly onNotification: RestrictedCodexTransport["onNotification"];
|
|
55
68
|
readonly onRequest: NonNullable<RestrictedCodexTransport["onRequest"]>;
|
|
69
|
+
/** Refuses a tool request: the session records the refusal, and the transport answers it. */
|
|
70
|
+
private refuseRequest;
|
|
56
71
|
readonly onRequestComplete: () => void;
|
|
57
72
|
private handleTurnEvent;
|
|
58
73
|
private recordUsage;
|