humanish 0.107.0 → 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 +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +8 -6
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- 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 +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- 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 +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- 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 +78 -43
- 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/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- 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.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- 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 +147 -108
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +137 -138
- 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 +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -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 +41 -6
- package/dist/cli/io.js +97 -22
- 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 +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- 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/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 +3 -3
- 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 +4 -4
- package/dist/feedback/draft.js +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- 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 +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- 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 +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- 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 +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- 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 +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +1 -1
- package/dist/observer/serve.js +7 -3
- 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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +36 -35
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- 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/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- 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 +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- 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 +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- 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 +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +1 -1
- 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 +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- 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 +82 -82
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- 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 +16 -16
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- 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 +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- 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/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 +7 -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 +60 -58
- 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 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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 -295
- 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/TELEMETRY.md
CHANGED
|
@@ -6,26 +6,28 @@ disclosed the first time it happens, and you can switch it off in one command.
|
|
|
6
6
|
|
|
7
7
|
This follows the convention the Next.js and Vercel CLIs established, with one
|
|
8
8
|
difference: humanish is stricter about what may be collected, because a study's
|
|
9
|
-
subject is your product and a
|
|
9
|
+
subject is your product and a study id can name something you have not announced.
|
|
10
10
|
|
|
11
11
|
## Why
|
|
12
12
|
|
|
13
13
|
humanish shipped sixty-one releases without being able to answer _"does anyone
|
|
14
14
|
get to a working first run?"_. The answer, when it finally arrived, came from an
|
|
15
15
|
adoption post-mortem: the first live run had been impossible for months, because
|
|
16
|
-
the starter
|
|
16
|
+
the starter studies shipped with a placeholder URL. Nobody reported it. Without
|
|
17
17
|
telemetry, humanish cannot tell whether new users reach a working first run.
|
|
18
18
|
|
|
19
19
|
## What is collected
|
|
20
20
|
|
|
21
|
-
- which command ran (`run`, `
|
|
21
|
+
- which command ran (`run`, `init`, …)
|
|
22
22
|
- the humanish version, your OS, your Node major version, whether you are in CI
|
|
23
23
|
- whether the command succeeded (its exit code), and roughly how long it took
|
|
24
24
|
(a bucket such as `1-5m`, never an exact duration)
|
|
25
25
|
- for a study: whether it was a dry run or live, its outcome (one of a fixed
|
|
26
26
|
set of words such as `passed`, `abandoned`, `all_passed`), which brain route
|
|
27
|
-
ran it (`provider-key`, `local-agent`, or `none` for a dry run), and which
|
|
28
|
-
ran, **only if it is one of the starter
|
|
27
|
+
ran it (`provider-key`, `local-agent`, or `none` for a dry run), and which study
|
|
28
|
+
ran, **only if it is one of the starter studies `humanish init` writes**. That id is sent as
|
|
29
|
+
`study`, and also as `lab` (the property's earlier name) with the same value until 0.109.0
|
|
30
|
+
removes `lab`
|
|
29
31
|
- when a command fails: humanish's own error code (`HUMANISH_…`), never the
|
|
30
32
|
message. Which failure ends a first run is the question this exists to answer.
|
|
31
33
|
- for CUA results with diagnostics: `diagnostic_category` is exactly one of
|
|
@@ -58,7 +60,7 @@ HUMANISH_TELEMETRY_DEBUG=1 humanish run first-run
|
|
|
58
60
|
|
|
59
61
|
## What is never collected
|
|
60
62
|
|
|
61
|
-
Your own
|
|
63
|
+
Your own study ids and titles. Your subjects: repos, URLs, app names. Personas,
|
|
62
64
|
missions, or any prompt text. Paths, working directories, hostnames, usernames.
|
|
63
65
|
Run ids, evidence, screenshots, traces. Credential names or values. There is no
|
|
64
66
|
field in the payload that could carry any of these. `src/cli/telemetry.ts` enforces
|
|
@@ -6,7 +6,7 @@ export declare const AFFORDANCE_CLASS_SCHEMA = "humanish.affordance-use.v1";
|
|
|
6
6
|
* direct navigation, "shortcut" (MAS-Bench) for a non-UI route to the same outcome.
|
|
7
7
|
*/
|
|
8
8
|
export type AffordanceClass =
|
|
9
|
-
/** Pointer or drag interaction with what is rendered on screen
|
|
9
|
+
/** Pointer or drag interaction with what is rendered on screen: the naturalistic core. */
|
|
10
10
|
"pointer"
|
|
11
11
|
/** Keyboard input into the page: typed text that is not a URL and not script. */
|
|
12
12
|
| "keyboard"
|
|
@@ -32,7 +32,7 @@ export declare const SHORTCUT_AFFORDANCE_CLASSES: readonly AffordanceClass[];
|
|
|
32
32
|
export interface AffordanceObservation {
|
|
33
33
|
affordance: AffordanceClass;
|
|
34
34
|
/**
|
|
35
|
-
* A public-safe hint about
|
|
35
|
+
* A public-safe hint about why this class was assigned, when one exists: a URL scheme or the
|
|
36
36
|
* devtools chord. Never the typed text, never a full URL (which can carry a session token).
|
|
37
37
|
*/
|
|
38
38
|
signal?: string;
|
|
@@ -40,7 +40,7 @@ export interface AffordanceObservation {
|
|
|
40
40
|
/** Aggregate per-run record: how many actions fell into each class. */
|
|
41
41
|
export interface AffordanceUse {
|
|
42
42
|
schema: typeof AFFORDANCE_CLASS_SCHEMA;
|
|
43
|
-
/** Counts by class
|
|
43
|
+
/** Counts by class. A class with zero actions is omitted, so every listed class was used. */
|
|
44
44
|
counts: Partial<Record<AffordanceClass, number>>;
|
|
45
45
|
/** Total classified actions (the denominator for any rate an adopter computes). */
|
|
46
46
|
total: number;
|
|
@@ -48,7 +48,7 @@ export interface AffordanceUse {
|
|
|
48
48
|
shortcutTotal: number;
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
|
-
* Classify one computer-use action.
|
|
51
|
+
* Classify one computer-use action. Pure: same action in, same class out, no I/O, no clock. The
|
|
52
52
|
* returned signal is public-safe (a scheme or a chord), never the action's text.
|
|
53
53
|
*/
|
|
54
54
|
export declare function classifyCuaAction(action: CuaAction): AffordanceObservation;
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
// Affordance classification
|
|
1
|
+
// Affordance classification: which kind of route an actor took to accomplish a step.
|
|
2
2
|
//
|
|
3
3
|
// Why this exists. A computer-use actor in a human-persona study typed a `javascript:` URL into
|
|
4
4
|
// the address bar to get past a step, and the run finished green: the actor routed around the
|
|
5
5
|
// friction the study existed to measure, and nothing in the evidence said so. Whether that is a
|
|
6
|
-
// defect depends on a question the bundle never recorded
|
|
7
|
-
// population it invalidates the run; for an agent-facing product whose users
|
|
6
|
+
// defect depends on a question the bundle never recorded: who is this study's user? For a human
|
|
7
|
+
// population it invalidates the run; for an agent-facing product whose users are agents the same
|
|
8
8
|
// act is faithful, and the fact the agent reached for it is itself a finding about how legible
|
|
9
|
-
// the surface is. So the harness records the class and bakes
|
|
9
|
+
// the surface is. So the harness records the class and bakes no verdict: the adopter's scorer
|
|
10
10
|
// (review.scorer.ref) decides what it means, because that judgment is product semantics.
|
|
11
11
|
//
|
|
12
12
|
// Two design facts drive the shape:
|
|
13
13
|
//
|
|
14
|
-
// 1. The computer-use action space is mouse + keyboard only
|
|
15
|
-
// URL is a `type` action whose
|
|
14
|
+
// 1. The computer-use action space is mouse + keyboard only; there is no `goto` action. Typing a
|
|
15
|
+
// URL is a `type` action whose text happens to be a URL, and typing script is a `type` action
|
|
16
16
|
// whose text happens to start with `javascript:`. Classification therefore has to look at the
|
|
17
17
|
// typed text, which exists only at dispatch time.
|
|
18
18
|
// 2. Raw typed text is never persisted (describeCuaAction deliberately renders `type [N chars]`),
|
|
19
|
-
// so this module returns a
|
|
19
|
+
// so this module returns a class and at most a scheme-shaped signal, never the text. The
|
|
20
20
|
// class is public-safe by construction.
|
|
21
21
|
//
|
|
22
|
-
// Direct URL navigation is deliberately its own class
|
|
22
|
+
// Direct URL navigation is deliberately its own class, separate from script execution:
|
|
23
23
|
// `load(url)` appears in 99.4% of 2,337 real human web demonstrations (WebLINX), so address-bar
|
|
24
24
|
// use is ordinary human behavior. The anomalous classes are script execution and developer
|
|
25
25
|
// tooling. See docs/principles/actor-fidelity.md for the evidence and the scoping of the claim.
|
|
@@ -61,7 +61,7 @@ const DEVTOOLS_CHORDS = new Set([
|
|
|
61
61
|
"meta+alt+c",
|
|
62
62
|
]);
|
|
63
63
|
/**
|
|
64
|
-
* Classify one computer-use action.
|
|
64
|
+
* Classify one computer-use action. Pure: same action in, same class out, no I/O, no clock. The
|
|
65
65
|
* returned signal is public-safe (a scheme or a chord), never the action's text.
|
|
66
66
|
*/
|
|
67
67
|
export function classifyCuaAction(action) {
|
|
@@ -95,7 +95,7 @@ export function classifyCuaAction(action) {
|
|
|
95
95
|
return { affordance: "browser-internal", signal: schemeOf(text) };
|
|
96
96
|
}
|
|
97
97
|
if (HTTP_URL.test(text)) {
|
|
98
|
-
// Scheme only
|
|
98
|
+
// Scheme only: a full URL can carry a session token or an identifying path.
|
|
99
99
|
return { affordance: "url-navigation", signal: schemeOf(text) };
|
|
100
100
|
}
|
|
101
101
|
if (BARE_HOST.test(text)) {
|
|
@@ -113,7 +113,7 @@ export function classifyCuaAction(action) {
|
|
|
113
113
|
}
|
|
114
114
|
/**
|
|
115
115
|
* Normalize a key chord so the same physical shortcut matches however a provider spells it:
|
|
116
|
-
* `Control`/`ctrl`, `Meta`/`Command`/`cmd`, `Option`/`alt` all collapse, and modifier
|
|
116
|
+
* `Control`/`ctrl`, `Meta`/`Command`/`cmd`, `Option`/`alt` all collapse, and modifier order is
|
|
117
117
|
* normalized so ["Shift","Control","J"] and ["Control","Shift","J"] are one chord.
|
|
118
118
|
*/
|
|
119
119
|
function normalizeChord(keys) {
|
|
@@ -138,7 +138,7 @@ function normalizeChord(keys) {
|
|
|
138
138
|
const rest = parts.filter((part) => !order.includes(part));
|
|
139
139
|
return [...modifiers, ...rest].join("+");
|
|
140
140
|
}
|
|
141
|
-
/** The scheme alone, lowercased
|
|
141
|
+
/** The scheme alone, lowercased; never the rest of a URL, which can carry a session token. */
|
|
142
142
|
function schemeOf(text) {
|
|
143
143
|
const trimmed = text.trim();
|
|
144
144
|
const colon = trimmed.indexOf(":");
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export interface AgentSession {
|
|
2
2
|
/** Human-readable runner name, for the refusal message. */
|
|
3
3
|
runner: string;
|
|
4
|
-
/** The environment variable that identified it
|
|
4
|
+
/** The environment variable that identified it, named so the reader can check us. */
|
|
5
5
|
marker: string;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* The agent runner driving this process, when one identifies itself. `undefined` means nothing
|
|
9
|
-
* claimed to be an agent
|
|
9
|
+
* claimed to be an agent, which is not proof a person is there, only the absence of a claim.
|
|
10
10
|
*/
|
|
11
11
|
export declare function detectAgentSession(env?: NodeJS.ProcessEnv): AgentSession | undefined;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
// Is the terminal on the other end of this process a
|
|
1
|
+
// Is the terminal on the other end of this process a person's, or an agent's?
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// Why this exists: `humanish tui` refused a non-TTY, on the reasoning that an agent driving an
|
|
4
4
|
// interactive surface has asked for something that cannot exist. A study of that refusal
|
|
5
5
|
// (labs/handed-a-human-surface.yaml) found it never fires: `codex exec` allocates a PTY for the
|
|
6
|
-
// commands it runs, so both streams
|
|
7
|
-
// list, opened one, and
|
|
6
|
+
// commands it runs, so both streams are terminals. The TUI launched, the agent navigated the labs
|
|
7
|
+
// list, opened one, and (in its own words) "accidentally triggered a zero-cost dry run while
|
|
8
8
|
// navigating". A stray Enter on a live row is the same two keystrokes as a deliberate one.
|
|
9
9
|
//
|
|
10
10
|
// So a TTY is a real answer to the wrong question. It says a terminal exists; it does not say
|
|
11
11
|
// anyone is reading it. Agent runners announce themselves in the environment, which is the only
|
|
12
12
|
// signal available before the first keystroke, and is what `is-in-ci` has always done for CI.
|
|
13
13
|
//
|
|
14
|
-
//
|
|
14
|
+
// Every marker below was observed, not guessed. Two runtimes are covered because two are what we
|
|
15
15
|
// could verify: Claude Code (read off a live session) and Codex (read off the study sandbox, by a
|
|
16
|
-
// names-only `env | cut -d= -f1` probe that never touched a value). Others certainly exist
|
|
16
|
+
// names-only `env | cut -d= -f1` probe that never touched a value). Others certainly exist; add
|
|
17
17
|
// them the same way, from a real session, rather than from a plausible-looking guess. A marker
|
|
18
18
|
// that is wrong refuses a person for no reason.
|
|
19
19
|
const MARKERS = [
|
|
@@ -27,7 +27,7 @@ const MARKERS = [
|
|
|
27
27
|
];
|
|
28
28
|
/**
|
|
29
29
|
* The agent runner driving this process, when one identifies itself. `undefined` means nothing
|
|
30
|
-
* claimed to be an agent
|
|
30
|
+
* claimed to be an agent, which is not proof a person is there, only the absence of a claim.
|
|
31
31
|
*/
|
|
32
32
|
export function detectAgentSession(env = process.env) {
|
|
33
33
|
for (const { marker, runner } of MARKERS) {
|
|
@@ -5,7 +5,7 @@ export declare function codexStatusToCompletionReason(status: CodexAppServerStat
|
|
|
5
5
|
/**
|
|
6
6
|
* Map a Codex app-server run result into the provider-neutral ActorTrace. Pure
|
|
7
7
|
* and side-effect-free. The persona reference is supplied by the harness; until
|
|
8
|
-
*
|
|
8
|
+
* the Codex route uses personas it is a minimal stub ({ id, traitsApplied: [],
|
|
9
9
|
* promptDigest }).
|
|
10
10
|
*/
|
|
11
11
|
export declare function codexResultToActorTrace(result: CodexAppServerRunResult, persona: ActorPersonaRef): ActorTrace;
|
|
@@ -173,7 +173,7 @@ function codexTraceToActorItems(trace) {
|
|
|
173
173
|
/**
|
|
174
174
|
* Map a Codex app-server run result into the provider-neutral ActorTrace. Pure
|
|
175
175
|
* and side-effect-free. The persona reference is supplied by the harness; until
|
|
176
|
-
*
|
|
176
|
+
* the Codex route uses personas it is a minimal stub ({ id, traitsApplied: [],
|
|
177
177
|
* promptDigest }).
|
|
178
178
|
*/
|
|
179
179
|
export function codexResultToActorTrace(result, persona) {
|
|
@@ -242,7 +242,7 @@ function renderCodexAppServerUiHtml() {
|
|
|
242
242
|
<h1>Codex App-Server Actor</h1>
|
|
243
243
|
<p id="subtitle">Connecting to humanish state...</p>
|
|
244
244
|
</div>
|
|
245
|
-
<div class="pill" id="status" data-status="starting">
|
|
245
|
+
<div class="pill" id="status" data-status="starting">starting</div>
|
|
246
246
|
</header>
|
|
247
247
|
<main>
|
|
248
248
|
<aside>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which Codex CLI releases the restricted launcher starts: every stable `MAJOR.MINOR.PATCH`
|
|
3
|
+
* release from RECORDED_CODEX_CLI_FLOOR (0.154.0, the oldest known to work) on, except the
|
|
4
|
+
* refused ones. There is no ceiling, so a new release runs the day it ships; a release that breaks
|
|
5
|
+
* humanish is a bug, fixed by refusing it here until humanish handles it. Saved bundles read any
|
|
6
|
+
* stable release from the same floor, refused or not (src/actors/contract.ts).
|
|
7
|
+
*
|
|
8
|
+
* A release string is a compatibility check, not binary attestation: the launcher compares what
|
|
9
|
+
* `codex --version`, initialize and thread start report, and a modified binary can report any
|
|
10
|
+
* of them. Each launch also checks the release's app-server schema (protocol-compat.ts).
|
|
11
|
+
*/
|
|
12
|
+
export declare const REFUSED_CODEX_CLI_VERSIONS: readonly {
|
|
13
|
+
readonly version: string;
|
|
14
|
+
readonly reason: string;
|
|
15
|
+
readonly issue: string;
|
|
16
|
+
}[];
|
|
17
|
+
/**
|
|
18
|
+
* Releases `pnpm codex:qualify` passed on Linux x64, oldest first. They gate nothing: the newest is
|
|
19
|
+
* the default a declaration names before detection, the install target and the "last tested"
|
|
20
|
+
* hint, and the list is the qualifier's baseline.
|
|
21
|
+
*/
|
|
22
|
+
export declare const TESTED_CODEX_CLI_VERSIONS: readonly ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"];
|
|
23
|
+
/**
|
|
24
|
+
* The run warning for a hosted (operator-mode) participant on a release not in
|
|
25
|
+
* TESTED_CODEX_CLI_VERSIONS, or undefined. No qualifier ran that release in operator mode, so its
|
|
26
|
+
* evidence rests on what each launch checks (open-admission design, answer C).
|
|
27
|
+
*/
|
|
28
|
+
export declare function untestedOperatorReleaseWarning(cliVersion: string | undefined, operator: boolean): string | undefined;
|
|
29
|
+
/** Why the launcher refuses a release, or undefined when it starts it. */
|
|
30
|
+
export type CodexCliRefusal = {
|
|
31
|
+
readonly reason: "unrecognized";
|
|
32
|
+
} | {
|
|
33
|
+
readonly reason: "prerelease" | "below_floor";
|
|
34
|
+
readonly version: string;
|
|
35
|
+
} | {
|
|
36
|
+
readonly reason: "refused";
|
|
37
|
+
readonly version: string;
|
|
38
|
+
readonly detail: string;
|
|
39
|
+
readonly issue: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Why the launcher refuses a release: not a plain `MAJOR.MINOR.PATCH` (or longer than the 64
|
|
43
|
+
* characters parseCodexCliVersion reads), a prerelease (`-` after the core), older than the floor,
|
|
44
|
+
* or refused.
|
|
45
|
+
*/
|
|
46
|
+
export declare function codexCliRefusal(version: string | undefined): CodexCliRefusal | undefined;
|
|
47
|
+
/** Whether the launcher starts this release. */
|
|
48
|
+
export declare const admitsCodexCliVersion: (version: string) => boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Hosts where isolated launches run (the Codex-account analyst and local-browser participants).
|
|
51
|
+
* Operator launches run on every host with a native npm build (restrictedCodexNpmTarget).
|
|
52
|
+
*/
|
|
53
|
+
export declare const supportsIsolatedCodex: (platform: NodeJS.Platform, arch: string) => boolean;
|
|
54
|
+
/** What a declaration names before the installed CLI is detected: the newest tested release. */
|
|
55
|
+
export declare function defaultCodexCliVersion(): string;
|
|
56
|
+
/** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
|
|
57
|
+
export declare function parseCodexCliVersion(stdout: string): string | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* doctor's recovery for a refused CLI: the release it found and where, why it is refused, and how
|
|
60
|
+
* to replace that binary with the last tested release.
|
|
61
|
+
*/
|
|
62
|
+
export declare function codexVersionRecovery(detected: string | undefined, installation?: CodexInstallation): string;
|
|
63
|
+
/**
|
|
64
|
+
* Where the `codex` humanish found was installed, which decides the command that replaces it.
|
|
65
|
+
* `path` is the file on `PATH`.
|
|
66
|
+
*/
|
|
67
|
+
export type CodexInstallation = {
|
|
68
|
+
readonly kind: "project";
|
|
69
|
+
readonly path: string;
|
|
70
|
+
readonly project: string;
|
|
71
|
+
} | {
|
|
72
|
+
readonly kind: "global";
|
|
73
|
+
readonly path: string;
|
|
74
|
+
} | {
|
|
75
|
+
readonly kind: "other";
|
|
76
|
+
readonly path: string;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
|
|
80
|
+
* resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
|
|
81
|
+
* install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
|
|
82
|
+
* Homebrew or a standalone download, is other.
|
|
83
|
+
*/
|
|
84
|
+
export declare function classifyCodexInstallation(found: {
|
|
85
|
+
path: string;
|
|
86
|
+
resolved: string;
|
|
87
|
+
}, npmGlobalPrefix: string | undefined): CodexInstallation;
|
|
88
|
+
/** One sentence: how to put the last tested Codex CLI in place of the one humanish found. */
|
|
89
|
+
export declare function codexInstallAdvice(installation: CodexInstallation | undefined): string;
|
|
90
|
+
/** For refusal messages: which releases the launcher starts, and the last tested one. */
|
|
91
|
+
export declare function describeCodexCliAdmission(): string;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { RECORDED_CODEX_CLI_FLOOR, isRecordedCodexCliVersion } from "../contract.js";
|
|
3
|
+
/**
|
|
4
|
+
* Which Codex CLI releases the restricted launcher starts: every stable `MAJOR.MINOR.PATCH`
|
|
5
|
+
* release from RECORDED_CODEX_CLI_FLOOR (0.154.0, the oldest known to work) on, except the
|
|
6
|
+
* refused ones. There is no ceiling, so a new release runs the day it ships; a release that breaks
|
|
7
|
+
* humanish is a bug, fixed by refusing it here until humanish handles it. Saved bundles read any
|
|
8
|
+
* stable release from the same floor, refused or not (src/actors/contract.ts).
|
|
9
|
+
*
|
|
10
|
+
* A release string is a compatibility check, not binary attestation: the launcher compares what
|
|
11
|
+
* `codex --version`, initialize and thread start report, and a modified binary can report any
|
|
12
|
+
* of them. Each launch also checks the release's app-server schema (protocol-compat.ts).
|
|
13
|
+
*/
|
|
14
|
+
export const REFUSED_CODEX_CLI_VERSIONS = [];
|
|
15
|
+
/**
|
|
16
|
+
* Releases `pnpm codex:qualify` passed on Linux x64, oldest first. They gate nothing: the newest is
|
|
17
|
+
* the default a declaration names before detection, the install target and the "last tested"
|
|
18
|
+
* hint, and the list is the qualifier's baseline.
|
|
19
|
+
*/
|
|
20
|
+
export const TESTED_CODEX_CLI_VERSIONS = [
|
|
21
|
+
"0.154.0",
|
|
22
|
+
"0.157.1",
|
|
23
|
+
"0.159.2",
|
|
24
|
+
"0.159.3",
|
|
25
|
+
"0.160.0",
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* The run warning for a hosted (operator-mode) participant on a release not in
|
|
29
|
+
* TESTED_CODEX_CLI_VERSIONS, or undefined. No qualifier ran that release in operator mode, so its
|
|
30
|
+
* evidence rests on what each launch checks (open-admission design, answer C).
|
|
31
|
+
*/
|
|
32
|
+
export function untestedOperatorReleaseWarning(cliVersion, operator) {
|
|
33
|
+
if (!operator || cliVersion === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
if (TESTED_CODEX_CLI_VERSIONS.includes(cliVersion))
|
|
36
|
+
return undefined;
|
|
37
|
+
return `Codex CLI ${cliVersion} has not been tested with humanish; this hosted participant's evidence rests on the checks each launch makes.`;
|
|
38
|
+
}
|
|
39
|
+
const CORE = "(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)";
|
|
40
|
+
/**
|
|
41
|
+
* Why the launcher refuses a release: not a plain `MAJOR.MINOR.PATCH` (or longer than the 64
|
|
42
|
+
* characters parseCodexCliVersion reads), a prerelease (`-` after the core), older than the floor,
|
|
43
|
+
* or refused.
|
|
44
|
+
*/
|
|
45
|
+
export function codexCliRefusal(version) {
|
|
46
|
+
if (version === undefined || version.length > 64)
|
|
47
|
+
return { reason: "unrecognized" };
|
|
48
|
+
if (new RegExp(`^${CORE}-[0-9A-Za-z.-]+(?:\\+[0-9A-Za-z.-]+)?$`).test(version))
|
|
49
|
+
return { reason: "prerelease", version };
|
|
50
|
+
if (!new RegExp(`^${CORE}$`).test(version))
|
|
51
|
+
return { reason: "unrecognized" };
|
|
52
|
+
if (!isRecordedCodexCliVersion(version))
|
|
53
|
+
return { reason: "below_floor", version };
|
|
54
|
+
const refused = REFUSED_CODEX_CLI_VERSIONS.find((entry) => entry.version === version);
|
|
55
|
+
return refused === undefined
|
|
56
|
+
? undefined
|
|
57
|
+
: { reason: "refused", version, detail: refused.reason, issue: refused.issue };
|
|
58
|
+
}
|
|
59
|
+
/** Whether the launcher starts this release. */
|
|
60
|
+
export const admitsCodexCliVersion = (version) => codexCliRefusal(version) === undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Hosts where isolated launches run (the Codex-account analyst and local-browser participants).
|
|
63
|
+
* Operator launches run on every host with a native npm build (restrictedCodexNpmTarget).
|
|
64
|
+
*/
|
|
65
|
+
export const supportsIsolatedCodex = (platform, arch) => (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
|
|
66
|
+
/** What a declaration names before the installed CLI is detected: the newest tested release. */
|
|
67
|
+
export function defaultCodexCliVersion() {
|
|
68
|
+
return TESTED_CODEX_CLI_VERSIONS.at(-1);
|
|
69
|
+
}
|
|
70
|
+
/** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
|
|
71
|
+
export function parseCodexCliVersion(stdout) {
|
|
72
|
+
return /^codex-cli ([0-9][0-9A-Za-z.+-]{0,63})$/.exec(stdout.trim())?.[1];
|
|
73
|
+
}
|
|
74
|
+
/** Why a release is refused, as a clause; the admission rule when it is not refused. */
|
|
75
|
+
function refusalClause(detected) {
|
|
76
|
+
const refusal = codexCliRefusal(detected);
|
|
77
|
+
switch (refusal?.reason) {
|
|
78
|
+
case "unrecognized":
|
|
79
|
+
return `it is not a plain MAJOR.MINOR.PATCH release; ${describeCodexCliAdmission()}`;
|
|
80
|
+
case "prerelease":
|
|
81
|
+
return "it is a prerelease, and humanish runs stable releases";
|
|
82
|
+
case "below_floor":
|
|
83
|
+
return `it is older than ${RECORDED_CODEX_CLI_FLOOR}, the oldest release humanish supports`;
|
|
84
|
+
case "refused":
|
|
85
|
+
return `humanish refuses it: ${refusal.detail} (${refusal.issue})`;
|
|
86
|
+
default:
|
|
87
|
+
return describeCodexCliAdmission();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* doctor's recovery for a refused CLI: the release it found and where, why it is refused, and how
|
|
92
|
+
* to replace that binary with the last tested release.
|
|
93
|
+
*/
|
|
94
|
+
export function codexVersionRecovery(detected, installation) {
|
|
95
|
+
const found = detected === undefined
|
|
96
|
+
? "The installed Codex CLI did not report a recognizable version"
|
|
97
|
+
: `Found Codex CLI ${detected}`;
|
|
98
|
+
const where = installation === undefined ? "" : ` at \`${installation.path}\``;
|
|
99
|
+
return `${found}${where}; ${refusalClause(detected)}. ${codexInstallAdvice(installation)} Then sign in with a ChatGPT account (\`codex login\`).`;
|
|
100
|
+
}
|
|
101
|
+
const inside = (file, directory) => file.startsWith(`${directory}${path.sep}`);
|
|
102
|
+
/**
|
|
103
|
+
* Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
|
|
104
|
+
* resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
|
|
105
|
+
* install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
|
|
106
|
+
* Homebrew or a standalone download, is other.
|
|
107
|
+
*/
|
|
108
|
+
export function classifyCodexInstallation(found, npmGlobalPrefix) {
|
|
109
|
+
const bin = path.dirname(found.path);
|
|
110
|
+
const modules = path.dirname(bin);
|
|
111
|
+
if (path.basename(bin) === ".bin" &&
|
|
112
|
+
path.basename(modules) === "node_modules" &&
|
|
113
|
+
inside(found.resolved, path.join(modules, "@openai", "codex")))
|
|
114
|
+
return { kind: "project", path: found.path, project: path.dirname(modules) };
|
|
115
|
+
if (npmGlobalPrefix !== undefined &&
|
|
116
|
+
(found.path === path.join(npmGlobalPrefix, "bin", "codex") ||
|
|
117
|
+
inside(found.resolved, path.join(npmGlobalPrefix, "lib", "node_modules", "@openai", "codex"))))
|
|
118
|
+
return { kind: "global", path: found.path };
|
|
119
|
+
return { kind: "other", path: found.path };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The command that installs the last tested Codex CLI where it replaces the one humanish found:
|
|
123
|
+
* in its project for a project-local install, otherwise npm's global install.
|
|
124
|
+
*/
|
|
125
|
+
function codexInstallCommand(installation) {
|
|
126
|
+
const version = defaultCodexCliVersion();
|
|
127
|
+
return installation?.kind === "project"
|
|
128
|
+
? `npm install -D @openai/codex@${version}`
|
|
129
|
+
: `npm install -g @openai/codex@${version}`;
|
|
130
|
+
}
|
|
131
|
+
/** One sentence: how to put the last tested Codex CLI in place of the one humanish found. */
|
|
132
|
+
export function codexInstallAdvice(installation) {
|
|
133
|
+
const command = codexInstallCommand(installation);
|
|
134
|
+
switch (installation?.kind) {
|
|
135
|
+
case undefined:
|
|
136
|
+
return `Install the last tested release with \`${command}\`.`;
|
|
137
|
+
case "global":
|
|
138
|
+
return `Replace it with \`${command}\`.`;
|
|
139
|
+
case "project":
|
|
140
|
+
return `It is installed in this project: run \`${command}\` in \`${installation.project}\`, or \`npm uninstall @openai/codex\` there to use the global Codex.`;
|
|
141
|
+
case "other":
|
|
142
|
+
return `Update it with the tool that installed it, or put Codex ${defaultCodexCliVersion()} first on PATH.`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** For refusal messages: which releases the launcher starts, and the last tested one. */
|
|
146
|
+
export function describeCodexCliAdmission() {
|
|
147
|
+
const refused = REFUSED_CODEX_CLI_VERSIONS.map((entry) => entry.version);
|
|
148
|
+
const except = refused.length === 0 ? "" : ` except ${refused.join(", ")}`;
|
|
149
|
+
return `humanish runs stable Codex CLI releases from ${RECORDED_CODEX_CLI_FLOOR}${except} (last tested: ${defaultCodexCliVersion()})`;
|
|
150
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type RestrictedCodexDeadline, type RestrictedCodexSpawn } from "./restricted-transport.js";
|
|
2
|
-
/** The environment of every Codex child: a private home and scratch, and PATH and locale. */
|
|
2
|
+
/** The environment of every Codex child: a private home and scratch, and `PATH` and locale. */
|
|
3
3
|
export declare function childEnvironment(source: NodeJS.ProcessEnv, home: string, scratch: string): NodeJS.ProcessEnv;
|
|
4
4
|
/** Official npm launcher target map for the Unix hosts supported by this transport. */
|
|
5
5
|
export declare function restrictedCodexNpmTarget(platform: NodeJS.Platform, arch: string): {
|
|
@@ -11,7 +11,7 @@ export interface RefusedCodexExecutable {
|
|
|
11
11
|
readonly path?: string;
|
|
12
12
|
readonly reason: string;
|
|
13
13
|
}
|
|
14
|
-
/** Resolve PATH without running a shell. The npm launcher is resolved to its
|
|
14
|
+
/** Resolve `PATH` without running a shell. The npm launcher is resolved to its
|
|
15
15
|
* native optional package so cleanup owns the real app-server child. */
|
|
16
16
|
export declare function resolveExecutable(options: {
|
|
17
17
|
executable?: string;
|
|
@@ -37,5 +37,5 @@ export declare function foundCodexExecutable(env: NodeJS.ProcessEnv): Promise<{
|
|
|
37
37
|
* version check: 15 seconds, and a few kilobytes of output, which it does not otherwise read.
|
|
38
38
|
*/
|
|
39
39
|
export declare function generateProtocolSchema(file: string, env: NodeJS.ProcessEnv, cwd: string, out: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline): Promise<boolean>;
|
|
40
|
-
/** Returns the detected release after checking it against
|
|
41
|
-
export declare function checkVersion(file: string, env: NodeJS.ProcessEnv, cwd: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline,
|
|
40
|
+
/** Returns the detected release after checking it against launch admission (`admits`). */
|
|
41
|
+
export declare function checkVersion(file: string, env: NodeJS.ProcessEnv, cwd: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline, admits: (version: string) => boolean, expected: string | undefined): Promise<string>;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
// Finding and admitting the Codex CLI a restricted launch runs: the native executable behind PATH
|
|
1
|
+
// Finding and admitting the Codex CLI a restricted launch runs: the native executable behind `PATH`
|
|
2
2
|
// or the npm launcher, the environment its children get, and the `--version` check against the
|
|
3
3
|
// host's admitted releases.
|
|
4
4
|
import { constants } from "node:fs";
|
|
5
5
|
import { access, open, realpath } from "node:fs/promises";
|
|
6
6
|
import { createRequire } from "node:module";
|
|
7
7
|
import path from "node:path";
|
|
8
|
-
import { parseCodexCliVersion } from "./
|
|
8
|
+
import { parseCodexCliVersion } from "./codex-admission.js";
|
|
9
9
|
import { RestrictedCodexStop, closeOwnedCodexProcess, ownCodexProcess, retainUnclosedChild, } from "./restricted-transport.js";
|
|
10
|
-
/** The environment of every Codex child: a private home and scratch, and PATH and locale. */
|
|
10
|
+
/** The environment of every Codex child: a private home and scratch, and `PATH` and locale. */
|
|
11
11
|
export function childEnvironment(source, home, scratch) {
|
|
12
12
|
const result = { HOME: home, CODEX_HOME: home, TMPDIR: scratch };
|
|
13
13
|
for (const key of ["PATH", "LANG", "USER", "LOGNAME"])
|
|
@@ -47,7 +47,7 @@ export function restrictedCodexNpmTarget(platform, arch) {
|
|
|
47
47
|
return { triple: "aarch64-apple-darwin", packageName: "codex-darwin-arm64" };
|
|
48
48
|
return undefined;
|
|
49
49
|
}
|
|
50
|
-
/** Resolve PATH without running a shell. The npm launcher is resolved to its
|
|
50
|
+
/** Resolve `PATH` without running a shell. The npm launcher is resolved to its
|
|
51
51
|
* native optional package so cleanup owns the real app-server child. */
|
|
52
52
|
export async function resolveExecutable(options, env) {
|
|
53
53
|
const located = await locateExecutable(options, env);
|
|
@@ -72,7 +72,7 @@ async function firstCodexOnPath(env) {
|
|
|
72
72
|
return candidate;
|
|
73
73
|
}
|
|
74
74
|
catch {
|
|
75
|
-
/*
|
|
75
|
+
/* Try the next `PATH` entry. */
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
return undefined;
|
|
@@ -177,8 +177,8 @@ export async function generateProtocolSchema(file, env, cwd, out, spawnFn, deadl
|
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
|
-
/** Returns the detected release after checking it against
|
|
181
|
-
export async function checkVersion(file, env, cwd, spawnFn, deadline,
|
|
180
|
+
/** Returns the detected release after checking it against launch admission (`admits`). */
|
|
181
|
+
export async function checkVersion(file, env, cwd, spawnFn, deadline, admits, expected) {
|
|
182
182
|
deadline.check();
|
|
183
183
|
const owned = ownCodexProcess(spawnFn(file, ["--version"], { cwd, env, detached: false, stdio: ["pipe", "pipe", "pipe"] }));
|
|
184
184
|
let text = "", bytes = 0, exitCode = null;
|
|
@@ -206,7 +206,7 @@ export async function checkVersion(file, env, cwd, spawnFn, deadline, admitted,
|
|
|
206
206
|
throw new RestrictedCodexStop("codex_unavailable");
|
|
207
207
|
const version = parseCodexCliVersion(text);
|
|
208
208
|
if (version === undefined ||
|
|
209
|
-
!
|
|
209
|
+
!admits(version) ||
|
|
210
210
|
(expected !== undefined && version !== expected))
|
|
211
211
|
throw new RestrictedCodexStop("codex_unsupported_version", version);
|
|
212
212
|
return version;
|
|
@@ -22,7 +22,8 @@ export interface LaunchSettings {
|
|
|
22
22
|
readonly operatorAuth: boolean;
|
|
23
23
|
readonly reasoningEffort: ReasoningEffort;
|
|
24
24
|
readonly spawnFn: RestrictedCodexSpawn;
|
|
25
|
-
|
|
25
|
+
/** Launch admission: codex-admission.ts, or the qualifier's exact list (restricted-session.ts). */
|
|
26
|
+
readonly admits: (version: string) => boolean;
|
|
26
27
|
}
|
|
27
28
|
/** What a launch records on the session, each piece as soon as it exists. */
|
|
28
29
|
export interface LaunchState {
|
|
@@ -179,7 +179,7 @@ export async function launchAdmittedAppServer(settings, state, request, deadline
|
|
|
179
179
|
for (const directory of [home, state.cwd, state.scratch])
|
|
180
180
|
await mkdir(directory, { mode: 0o700 });
|
|
181
181
|
const env = childEnvironment(sourceEnv, home, state.scratch);
|
|
182
|
-
state.cliVersion = await checkVersion(file, env, state.cwd, spawnFn, deadline, settings.
|
|
182
|
+
state.cliVersion = await checkVersion(file, env, state.cwd, spawnFn, deadline, settings.admits, options.cliVersion);
|
|
183
183
|
await admitProtocol(file, env, state, spawnFn, deadline, {
|
|
184
184
|
reasoningEffort,
|
|
185
185
|
platform: settings.platform,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { defaultCodexCliVersion } from "./
|
|
1
|
+
import {} from "../contract.js";
|
|
2
|
+
import { defaultCodexCliVersion, untestedOperatorReleaseWarning } from "./codex-admission.js";
|
|
3
3
|
import { CuaProviderError, isCuaProviderError, } from "../computer-use/provider-error.js";
|
|
4
4
|
import { validateBrowserControlPng, validateHeardSpeech } from "../../browser-control/protocol.js";
|
|
5
5
|
import { createRestrictedCodexSession, } from "./restricted-session.js";
|
|
@@ -38,6 +38,7 @@ function deferred() {
|
|
|
38
38
|
void promise.catch(() => undefined);
|
|
39
39
|
return { promise, resolve, reject };
|
|
40
40
|
}
|
|
41
|
+
// prose-check: model prompt (Codex reads this tool description, not a person)
|
|
41
42
|
const toolDescription = (speechEnabled) => `Act on the participant's browser through humanish. Submit one to four UI actions${speechEnabled ? ", including speak when you need to reply aloud," : ""} and a short public comment; never private reasoning. humanish returns a JSON STRING with execution acknowledgments${speechEnabled ? ", speech heard from the actual participant speaker sink," : ""} and a fresh screenshot. In Code Mode use: const r = JSON.parse(await tools.humanish_ui({narration: "...", actions: [...]})); text({acknowledgments: r.acknowledgments${speechEnabled ? ", heardSpeech: r.heardSpeech" : ""}, contextHint: r.contextHint, closing: r.closing}); image(r.imageUrl). Call serially and inspect each returned screenshot${speechEnabled ? " and heardSpeech array" : ""} before deciding what to do next.${speechEnabled ? " Use speak only after the visible UI shows that you joined the call and your microphone is unmuted; it sends audio into that call." : ""} Acknowledged input does not prove an application outcome. If closing is true, stop calling tools and give your final account.`;
|
|
42
43
|
const participantInstructions = (prompt, speechEnabled) => `${prompt}\n\nYou are the study participant throughout this conversation, including its closing account. Use only the supplied screenshots and humanish_ui tool to interact. The tool returns a JSON string: parse it, inspect acknowledgments${speechEnabled ? " and heardSpeech captured from the actual participant speaker sink" : ""}, and display imageUrl with Code Mode image(). Do not print the image data URL as text. Keep your persona and earlier observations throughout the session.${speechEnabled ? " A speak action plays into the participant microphone; use it only after the visible UI shows that you joined the call and the microphone is unmuted." : ""} Speak publicly about your experience, never reveal private reasoning. Completed inputs do not prove application outcomes; verify on the next screenshot. When the task ends, return only the required final JSON with outcome, summary and frictionReports. Report observed confusion and recovered mistakes as well as blockers. Do not invent observations.`;
|
|
43
44
|
/** Turns and failures from the native run, handed in order to the next provider request. */
|
|
@@ -238,8 +239,7 @@ export async function checkRestrictedCodexParticipantReadiness(options) {
|
|
|
238
239
|
* An operator-auth session has one only once it resolved a model on a ChatGPT account.
|
|
239
240
|
*/
|
|
240
241
|
function participantExecutionProfile(session, operator, effort) {
|
|
241
|
-
const
|
|
242
|
-
const cliVersion = isRecordedCodexCliVersion(detected) ? detected : defaultCodexCliVersion();
|
|
242
|
+
const cliVersion = session.cliVersion ?? defaultCodexCliVersion();
|
|
243
243
|
if (!operator)
|
|
244
244
|
return { ...PARTICIPANT_PROFILE, cliVersion };
|
|
245
245
|
return session.authentication === "chatgpt-account" && session.resolvedModel
|
|
@@ -284,8 +284,10 @@ function closeParticipantSession(state) {
|
|
|
284
284
|
}));
|
|
285
285
|
}
|
|
286
286
|
/** What the closed native session reports beside cleanup: its run warnings and a late refusal. */
|
|
287
|
-
function sessionReport(session) {
|
|
287
|
+
function sessionReport(session, operator) {
|
|
288
288
|
const warnings = [
|
|
289
|
+
// A resolved model means thread/start was admitted: the release actually launched.
|
|
290
|
+
untestedOperatorReleaseWarning(session.resolvedModel === undefined ? undefined : session.cliVersion, operator),
|
|
289
291
|
session.protocolIncompatibilities === undefined
|
|
290
292
|
? undefined
|
|
291
293
|
: protocolIncompatibilityMessage(session.cliVersion, session.protocolIncompatibilities),
|
|
@@ -481,7 +483,7 @@ export function createRestrictedCodexParticipant(options = {}) {
|
|
|
481
483
|
state.failedCleanup = true;
|
|
482
484
|
return {
|
|
483
485
|
status: state.failedCleanup ? "unconfirmed" : "confirmed",
|
|
484
|
-
...sessionReport(state.session),
|
|
486
|
+
...sessionReport(state.session, settings.operator),
|
|
485
487
|
};
|
|
486
488
|
})();
|
|
487
489
|
return closing;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ReasoningEffort } from "../reasoning-effort.js";
|
|
2
2
|
/** Versioned, deliberately narrow profile qualified with an account-backed vision turn.
|
|
3
3
|
* The CLI still advertises code-mode tools: disabling their host is the enforcement
|
|
4
|
-
* boundary. Feature names alone are not proof that a tool has been removed.
|
|
5
|
-
*
|
|
4
|
+
* boundary. Feature names alone are not proof that a tool has been removed. Which CLI
|
|
5
|
+
* releases launch is decided in codex-admission.ts. */
|
|
6
6
|
export declare const RESTRICTED_CODEX_ANALYSIS_IDENTITY: {
|
|
7
7
|
readonly provider: "codex";
|
|
8
8
|
readonly authMode: "chatgpt";
|