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
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) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import readline from "node:readline";
|
|
2
2
|
import { redactText } from "../../evidence/redaction.js";
|
|
3
|
-
import {
|
|
3
|
+
import { isRecord } from "../../run/type-guards.js";
|
|
4
|
+
import { formatJsonRpcError } from "./app-server-trace.js";
|
|
4
5
|
export class CodexStdioClient {
|
|
5
6
|
child;
|
|
6
7
|
commandName;
|
|
@@ -150,5 +150,4 @@ export declare function renderTranscript(trace: CodexAppServerTrace): string;
|
|
|
150
150
|
export declare function readNestedString(value: unknown, pathParts: string[]): string | undefined;
|
|
151
151
|
export declare function formatJsonRpcError(error: JsonObject): string;
|
|
152
152
|
export declare function redactCodexEnvelope(value: unknown, rootCwd: string): unknown;
|
|
153
|
-
export declare function isRecord(value: unknown): value is JsonObject;
|
|
154
153
|
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// The trace a codex-app-server run writes (summary.json): its schema, the recorder that builds it
|
|
2
2
|
// from app-server envelopes, and the redaction applied before anything is persisted.
|
|
3
3
|
import { digestText, publicPathForTrace, redactText, tailText } from "../../evidence/redaction.js";
|
|
4
|
+
import { isRecord } from "../../run/type-guards.js";
|
|
4
5
|
export const CODEX_APP_SERVER_TRACE_SCHEMA = "humanish.codex-app-server-trace.v1";
|
|
5
6
|
const authLikeKey = /(api[_-]?key|access[_-]?token|auth[_-]?url|authorization|bearer|credential|password|secret|token)$/i;
|
|
6
7
|
const pathLikeKey = /^(cwd|path|writableRoots|workspaceRoot)$/i;
|
|
@@ -419,6 +420,3 @@ function limitTranscript(value) {
|
|
|
419
420
|
}
|
|
420
421
|
return `[...sanitized transcript truncated to last ${maxChars} characters...]\n${value.slice(-maxChars)}`;
|
|
421
422
|
}
|
|
422
|
-
export function isRecord(value) {
|
|
423
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
424
|
-
}
|
|
@@ -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>
|
|
@@ -2,8 +2,9 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { digestText, tailText } from "../../evidence/redaction.js";
|
|
4
4
|
import { prepareContainedOutputDirectory, prepareContainedOutputFile, prepareSelectedOutputDirectory, writeContainedOutputFile, } from "../../run/contained-output.js";
|
|
5
|
+
import { isRecord } from "../../run/type-guards.js";
|
|
5
6
|
import { CodexStdioClient } from "./app-server-client.js";
|
|
6
|
-
import { CodexTraceRecorder,
|
|
7
|
+
import { CodexTraceRecorder, readNestedString, redactCodexEnvelope, renderTranscript, } from "./app-server-trace.js";
|
|
7
8
|
export async function runCodexAppServerSession(options) {
|
|
8
9
|
const preparedRunRoot = await prepareSelectedOutputDirectory(process.cwd(), options.runRoot);
|
|
9
10
|
return runCodexAppServerSessionInPreparedRoot(options, preparedRunRoot);
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ProtocolContract } from "./protocol-contract.js";
|
|
2
|
+
type Schema = boolean | Record<string, unknown>;
|
|
3
|
+
/** The definitions of one generated schema, and the params definition of each method. */
|
|
4
|
+
export interface ProtocolSchema {
|
|
5
|
+
readonly definitions: ReadonlyMap<string, Schema>;
|
|
6
|
+
readonly requestParams: ReadonlyMap<string, string>;
|
|
7
|
+
readonly notificationParams: ReadonlyMap<string, string>;
|
|
8
|
+
}
|
|
9
|
+
/** What the check found: changes that refuse the launch, and additions it only records. */
|
|
10
|
+
export interface ProtocolCheck {
|
|
11
|
+
readonly incompatibilities: string[];
|
|
12
|
+
readonly additions: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Reads the files `codex app-server generate-json-schema --experimental` writes: the v2 and full
|
|
16
|
+
* bundles for definitions, and the ClientRequest and ServerNotification unions for params.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadProtocolSchema(directory: string): Promise<ProtocolSchema>;
|
|
19
|
+
/** A field's alternatives at `path` under a definition, or none when the field is gone. */
|
|
20
|
+
export declare function resolveField(schema: ProtocolSchema, definition: string, fieldPath: string): Schema[];
|
|
21
|
+
/** Checks a generated schema against the contract; any incompatibility refuses the launch. */
|
|
22
|
+
export declare function checkProtocol(schema: ProtocolSchema, contract: ProtocolContract): ProtocolCheck;
|
|
23
|
+
/** The refusal detail for an incompatible release. */
|
|
24
|
+
export declare function protocolIncompatibilityMessage(cliVersion: string | undefined, incompatibilities: readonly string[]): string;
|
|
25
|
+
/** The run warning for schema values beyond the baseline, or undefined when there were none. */
|
|
26
|
+
export declare function protocolAdditionsWarning(cliVersion: string | undefined, additions: readonly string[] | undefined): string | undefined;
|
|
27
|
+
export {};
|