humanish 0.105.0 → 0.106.1
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/AGENTS.md +91 -94
- package/ARCHITECTURE.md +146 -0
- package/CHANGELOG.md +512 -0
- package/CONTEXT.md +51 -0
- package/CONTRIBUTING.md +113 -9
- package/README.md +213 -124
- package/SECURITY.md +1 -1
- package/TELEMETRY.md +112 -0
- package/dist/actors/affordance.d.ts +56 -0
- package/dist/actors/affordance.js +155 -0
- package/dist/actors/agent-session.js +42 -0
- package/dist/actors/codex/app-server-actor-trace.d.ts +11 -0
- package/dist/actors/codex/app-server-actor-trace.js +211 -0
- package/dist/actors/codex/app-server-client.d.ts +39 -0
- package/dist/actors/codex/app-server-client.js +116 -0
- package/dist/actors/codex/app-server-trace.d.ts +154 -0
- package/dist/actors/codex/app-server-trace.js +424 -0
- package/dist/actors/codex/app-server-ui.d.ts +40 -0
- package/dist/actors/codex/app-server-ui.js +328 -0
- package/dist/actors/codex/app-server.d.ts +44 -0
- package/dist/actors/codex/app-server.js +268 -0
- package/dist/actors/codex/qualified-versions.d.ts +45 -0
- package/dist/actors/codex/qualified-versions.js +87 -0
- package/dist/actors/codex/restricted-executable.d.ts +17 -0
- package/dist/actors/codex/restricted-executable.js +147 -0
- package/dist/actors/codex/restricted-launch.d.ts +116 -0
- package/dist/actors/codex/restricted-launch.js +222 -0
- package/dist/actors/codex/restricted-participant-policy.d.ts +46 -0
- package/dist/actors/codex/restricted-participant-policy.js +82 -0
- package/dist/actors/codex/restricted-participant.d.ts +20 -0
- package/dist/actors/codex/restricted-participant.js +432 -0
- package/dist/actors/codex/restricted-policy.d.ts +70 -0
- package/dist/actors/codex/restricted-policy.js +326 -0
- package/dist/actors/codex/restricted-session.d.ts +65 -0
- package/dist/actors/codex/restricted-session.js +432 -0
- package/dist/actors/codex/restricted-transport.d.ts +73 -0
- package/dist/actors/codex/restricted-transport.js +335 -0
- package/dist/actors/codex/restricted-turn.d.ts +62 -0
- package/dist/actors/codex/restricted-turn.js +284 -0
- package/dist/actors/computer-use/actor.d.ts +77 -0
- package/dist/actors/computer-use/actor.js +78 -0
- package/dist/actors/computer-use/admission-limit.d.ts +12 -0
- package/dist/actors/computer-use/admission-limit.js +19 -0
- package/dist/actors/computer-use/executor-error.js +48 -0
- package/dist/actors/computer-use/loop/actions.d.ts +26 -0
- package/dist/actors/computer-use/loop/actions.js +245 -0
- package/dist/actors/computer-use/loop/backstop.d.ts +42 -0
- package/dist/actors/computer-use/loop/backstop.js +202 -0
- package/dist/actors/computer-use/loop/debrief.d.ts +19 -0
- package/dist/actors/computer-use/loop/debrief.js +164 -0
- package/dist/actors/computer-use/loop/ending.d.ts +86 -0
- package/dist/actors/computer-use/loop/ending.js +316 -0
- package/dist/actors/computer-use/loop/observation.d.ts +55 -0
- package/dist/actors/computer-use/loop/observation.js +246 -0
- package/dist/actors/computer-use/loop/output-limit.d.ts +11 -0
- package/dist/actors/computer-use/loop/output-limit.js +21 -0
- package/dist/actors/computer-use/loop/provider-call.d.ts +19 -0
- package/dist/actors/computer-use/loop/provider-call.js +208 -0
- package/dist/actors/computer-use/loop/race.d.ts +34 -0
- package/dist/actors/computer-use/loop/race.js +79 -0
- package/dist/actors/computer-use/loop/session.d.ts +77 -0
- package/dist/actors/computer-use/loop/session.js +135 -0
- package/dist/actors/computer-use/loop/spend.d.ts +30 -0
- package/dist/actors/computer-use/loop/spend.js +85 -0
- package/dist/actors/computer-use/loop/trace.d.ts +35 -0
- package/dist/actors/computer-use/loop/trace.js +140 -0
- package/dist/actors/computer-use/loop/types.d.ts +404 -0
- package/dist/actors/computer-use/loop/types.js +1 -0
- package/dist/actors/computer-use/loop/usage.d.ts +102 -0
- package/dist/actors/computer-use/loop/usage.js +355 -0
- package/dist/actors/computer-use/loop.d.ts +11 -0
- package/dist/actors/computer-use/loop.js +248 -0
- package/dist/actors/computer-use/openai-provider.d.ts +107 -0
- package/dist/actors/computer-use/openai-provider.js +472 -0
- package/dist/actors/computer-use/openai-requests.d.ts +35 -0
- package/dist/actors/computer-use/openai-requests.js +74 -0
- package/dist/actors/computer-use/openai-wire.d.ts +67 -0
- package/dist/actors/computer-use/openai-wire.js +365 -0
- package/dist/actors/computer-use/provider-error.d.ts +27 -0
- package/dist/actors/computer-use/provider-error.js +86 -0
- package/dist/actors/computer-use/speech.js +6 -0
- package/dist/actors/contract.d.ts +315 -0
- package/dist/actors/contract.js +207 -0
- package/dist/actors/goal-source.js +38 -0
- package/dist/actors/local-agent/claude-session.d.ts +43 -0
- package/dist/actors/local-agent/claude-session.js +370 -0
- package/dist/actors/local-agent/cli.d.ts +115 -0
- package/dist/actors/local-agent/cli.js +413 -0
- package/dist/actors/local-agent/readiness.d.ts +31 -0
- package/dist/actors/local-agent/readiness.js +45 -0
- package/dist/actors/openai-endpoint.d.ts +2 -0
- package/dist/actors/openai-endpoint.js +2 -0
- package/dist/actors/output-token-limit.js +4 -0
- package/dist/actors/reasoning-effort.js +33 -0
- package/dist/actors/registry.d.ts +59 -0
- package/dist/actors/registry.js +89 -0
- package/dist/actors/scripted-browser/actor.d.ts +49 -0
- package/dist/actors/scripted-browser/actor.js +428 -0
- package/dist/actors/scripted-browser/browser-command.d.ts +1 -0
- package/dist/actors/scripted-browser/browser-command.js +48 -0
- package/dist/actors/scripted-browser/journey.d.ts +9 -0
- package/dist/actors/scripted-browser/journey.js +171 -0
- package/dist/actors/scripted-browser/steps.d.ts +60 -0
- package/dist/actors/scripted-browser/steps.js +384 -0
- package/dist/actors/scripted-browser/types.d.ts +135 -0
- package/dist/actors/scripted-browser/types.js +26 -0
- package/dist/actors/stop-cause.d.ts +9 -0
- package/dist/actors/stop-cause.js +42 -0
- package/dist/actors/stop-conditions.d.ts +40 -0
- package/dist/actors/stop-conditions.js +65 -0
- package/dist/analysis/automatic-completion.d.ts +38 -0
- package/dist/analysis/automatic-completion.js +90 -0
- package/dist/analysis/automatic-config.d.ts +41 -0
- package/dist/analysis/automatic-config.js +135 -0
- package/dist/analysis/automatic.d.ts +17 -0
- package/dist/analysis/automatic.js +279 -0
- package/dist/analysis/codex-config.d.ts +8 -0
- package/dist/analysis/codex-config.js +69 -0
- package/dist/analysis/evidence-sources.d.ts +23 -0
- package/dist/analysis/evidence-sources.js +251 -0
- package/dist/analysis/evidence.d.ts +18 -0
- package/dist/analysis/evidence.js +482 -0
- package/dist/analysis/execute.d.ts +52 -0
- package/dist/analysis/execute.js +504 -0
- package/dist/analysis/image-tokens.d.ts +1 -0
- package/dist/analysis/image-tokens.js +41 -0
- package/dist/analysis/job.d.ts +97 -0
- package/dist/analysis/job.js +311 -0
- package/dist/analysis/load.d.ts +3 -0
- package/dist/analysis/load.js +11 -0
- package/dist/analysis/provider.d.ts +57 -0
- package/dist/analysis/provider.js +227 -0
- package/dist/analysis/restricted-codex.d.ts +19 -0
- package/dist/analysis/restricted-codex.js +23 -0
- package/dist/analysis/service.d.ts +72 -0
- package/dist/analysis/service.js +399 -0
- package/dist/analysis/sharing.d.ts +11 -0
- package/dist/analysis/sharing.js +44 -0
- package/dist/analysis/store-executions.d.ts +27 -0
- package/dist/analysis/store-executions.js +224 -0
- package/dist/analysis/store.d.ts +31 -0
- package/dist/analysis/store.js +315 -0
- package/dist/analysis/types.d.ts +217 -0
- package/dist/analysis/types.js +12 -0
- package/dist/analysis/validation.d.ts +225 -0
- package/dist/analysis/validation.js +562 -0
- package/dist/browser-control/client.d.ts +18 -0
- package/dist/browser-control/client.js +239 -0
- package/dist/browser-control/dispatcher.d.ts +19 -0
- package/dist/browser-control/dispatcher.js +221 -0
- package/dist/browser-control/protocol.d.ts +492 -0
- package/dist/browser-control/protocol.js +360 -0
- package/dist/browser-control/recording-transfer.d.ts +3 -0
- package/dist/browser-control/recording-transfer.js +48 -0
- package/dist/browser-control/transport.d.ts +27 -0
- package/dist/browser-control/transport.js +189 -0
- package/dist/cli/commands/analysis-signals.d.ts +7 -0
- package/dist/cli/commands/analysis-signals.js +25 -0
- package/dist/cli/commands/analyze.d.ts +3 -0
- package/dist/cli/commands/analyze.js +212 -0
- package/dist/cli/commands/codex.d.ts +3 -0
- package/dist/cli/commands/codex.js +145 -0
- package/dist/cli/commands/comms.d.ts +3 -0
- package/dist/cli/commands/comms.js +225 -0
- package/dist/cli/commands/feedback.d.ts +3 -0
- package/dist/cli/commands/feedback.js +138 -0
- package/dist/cli/commands/lab-format.d.ts +8 -0
- package/dist/cli/commands/lab-format.js +105 -0
- package/dist/cli/commands/lab-route-computer-use.d.ts +20 -0
- package/dist/cli/commands/lab-route-computer-use.js +251 -0
- package/dist/cli/commands/lab-route-open.d.ts +27 -0
- package/dist/cli/commands/lab-route-open.js +37 -0
- package/dist/cli/commands/lab-route-preview.d.ts +20 -0
- package/dist/cli/commands/lab-route-preview.js +74 -0
- package/dist/cli/commands/lab-route-run.d.ts +17 -0
- package/dist/cli/commands/lab-route-run.js +31 -0
- package/dist/cli/commands/lab-route-scripted.d.ts +19 -0
- package/dist/cli/commands/lab-route-scripted.js +50 -0
- package/dist/cli/commands/lab-route-shared-world.d.ts +20 -0
- package/dist/cli/commands/lab-route-shared-world.js +135 -0
- package/dist/cli/commands/lab-route-terminal.d.ts +19 -0
- package/dist/cli/commands/lab-route-terminal.js +49 -0
- package/dist/cli/commands/lab-run.d.ts +9 -0
- package/dist/cli/commands/lab-run.js +166 -0
- package/dist/cli/commands/lab-scorer.d.ts +30 -0
- package/dist/cli/commands/lab-scorer.js +17 -0
- package/dist/cli/commands/lab.d.ts +3 -0
- package/dist/cli/commands/lab.js +193 -0
- package/dist/cli/commands/observe.d.ts +4 -0
- package/dist/cli/commands/observe.js +345 -0
- package/dist/cli/commands/runs.d.ts +11 -0
- package/dist/cli/commands/runs.js +314 -0
- package/dist/cli/commands/setup.d.ts +11 -0
- package/dist/cli/commands/setup.js +325 -0
- package/dist/cli/commands/tui.d.ts +32 -0
- package/dist/cli/commands/tui.js +305 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.js +245 -0
- package/dist/cli/doctor.d.ts +39 -0
- package/dist/cli/doctor.js +263 -0
- package/dist/cli/first-run-path.d.ts +67 -0
- package/dist/cli/first-run-path.js +150 -0
- package/dist/cli/io.d.ts +85 -0
- package/dist/cli/io.js +232 -0
- package/dist/cli/observer-follow.d.ts +56 -0
- package/dist/cli/observer-follow.js +160 -0
- package/dist/cli/orientation.d.ts +30 -0
- package/dist/cli/orientation.js +114 -0
- package/dist/cli/program.d.ts +15 -0
- package/dist/cli/program.js +338 -0
- package/dist/cli/secret-prompt.js +39 -0
- package/dist/cli/telemetry.js +351 -0
- package/dist/cli.js +2 -4
- package/dist/comms/agentmail.d.ts +29 -0
- package/dist/comms/agentmail.js +568 -0
- package/dist/comms/capture-surface.d.ts +54 -0
- package/dist/comms/capture-surface.js +468 -0
- package/dist/comms/catch-host.d.ts +52 -0
- package/dist/comms/catch-host.js +192 -0
- package/dist/comms/connections.d.ts +20 -0
- package/dist/comms/connections.js +116 -0
- package/dist/comms/email-catch.d.ts +49 -0
- package/dist/comms/email-catch.js +236 -0
- package/dist/comms/extract.d.ts +7 -0
- package/dist/comms/extract.js +65 -0
- package/dist/comms/fake-inbox.d.ts +39 -0
- package/dist/comms/fake-inbox.js +136 -0
- package/dist/comms/images.d.ts +7 -0
- package/dist/comms/images.js +53 -0
- package/dist/comms/lease-store.d.ts +91 -0
- package/dist/comms/lease-store.js +600 -0
- package/dist/comms/providers.d.ts +30 -0
- package/dist/comms/providers.js +24 -0
- package/dist/comms/receiving-common.d.ts +17 -0
- package/dist/comms/receiving-common.js +82 -0
- package/dist/comms/receiving-evidence.d.ts +4 -0
- package/dist/comms/receiving-evidence.js +59 -0
- package/dist/comms/receiving-recovery.d.ts +22 -0
- package/dist/comms/receiving-recovery.js +100 -0
- package/dist/comms/receiving-render.d.ts +16 -0
- package/dist/comms/receiving-render.js +409 -0
- package/dist/comms/receiving-runtime.d.ts +41 -0
- package/dist/comms/receiving-runtime.js +66 -0
- package/dist/comms/receiving-surface.d.ts +8 -0
- package/dist/comms/receiving-surface.js +156 -0
- package/dist/comms/receiving-types.d.ts +122 -0
- package/dist/comms/receiving-types.js +3 -0
- package/dist/comms/receiving.d.ts +33 -0
- package/dist/comms/receiving.js +508 -0
- package/dist/comms/sandbox-catch-script.d.ts +16 -0
- package/dist/comms/sandbox-catch-script.js +331 -0
- package/dist/comms/sandbox-catch.d.ts +214 -0
- package/dist/comms/sandbox-catch.js +451 -0
- package/dist/comms/setup.d.ts +65 -0
- package/dist/comms/setup.js +259 -0
- package/dist/comms/thread-evidence.d.ts +28 -0
- package/dist/comms/thread-evidence.js +30 -0
- package/dist/comms/types.d.ts +76 -0
- package/dist/comms/types.js +8 -0
- package/dist/deprecated.d.ts +90 -0
- package/dist/deprecated.js +106 -0
- package/dist/evidence/browser-hygiene.js +42 -0
- package/dist/evidence/desktop-recorder.d.ts +39 -0
- package/dist/evidence/desktop-recorder.js +340 -0
- package/dist/evidence/desktop-recording-artifact.d.ts +5 -0
- package/dist/evidence/desktop-recording-artifact.js +53 -0
- package/dist/evidence/desktop-recording-types.d.ts +27 -0
- package/dist/evidence/desktop-recording-types.js +16 -0
- package/dist/evidence/encoded-text.d.ts +27 -0
- package/dist/evidence/encoded-text.js +243 -0
- package/dist/evidence/frame-signature.d.ts +17 -0
- package/dist/evidence/frame-signature.js +111 -0
- package/dist/evidence/image.d.ts +24 -0
- package/dist/evidence/image.js +170 -0
- package/dist/evidence/plain-text.d.ts +8 -0
- package/dist/evidence/plain-text.js +16 -0
- package/dist/evidence/redaction.d.ts +110 -0
- package/dist/evidence/redaction.js +329 -0
- package/dist/feedback/draft.d.ts +58 -0
- package/dist/feedback/draft.js +309 -0
- package/dist/feedback/export-bundle.d.ts +6 -0
- package/dist/feedback/export-bundle.js +585 -0
- package/dist/feedback/export.d.ts +50 -0
- package/dist/feedback/export.js +392 -0
- package/dist/feedback/feedback.d.ts +37 -0
- package/dist/feedback/feedback.js +282 -0
- package/dist/feedback/proof.d.ts +8 -0
- package/dist/feedback/proof.js +56 -0
- package/dist/guest/bootstrap.d.ts +55 -0
- package/dist/guest/bootstrap.js +348 -0
- package/dist/guest/browser-tools.d.ts +8 -0
- package/dist/guest/browser-tools.js +72 -0
- package/dist/guest/chromium-text.d.ts +62 -0
- package/dist/guest/chromium-text.js +386 -0
- package/dist/guest/desktop-executor.d.ts +57 -0
- package/dist/guest/desktop-executor.js +256 -0
- package/dist/guest/desktop-keys.d.ts +8 -0
- package/dist/guest/desktop-keys.js +89 -0
- package/dist/guest/desktop-media.d.ts +70 -0
- package/dist/guest/desktop-media.js +385 -0
- package/dist/guest/desktop-native.d.ts +14 -0
- package/dist/guest/desktop-native.js +156 -0
- package/dist/guest/media-config.d.ts +15 -0
- package/dist/guest/media-config.js +16 -0
- package/dist/guest/runtime-desktop.d.ts +45 -0
- package/dist/guest/runtime-desktop.js +420 -0
- package/dist/guest/runtime-processes.d.ts +28 -0
- package/dist/guest/runtime-processes.js +94 -0
- package/dist/guest/runtime.d.ts +31 -0
- package/dist/guest/runtime.js +124 -0
- package/dist/guest-media-worker.js +184 -48
- package/dist/guest-runtime-main.js +23 -10
- package/dist/guest-runtime-revision.js +1 -1
- package/dist/index.d.ts +32 -83
- package/dist/index.js +21 -42
- package/dist/keys/env-file.d.ts +15 -0
- package/dist/keys/env-file.js +109 -0
- package/dist/keys/key-resolution.d.ts +58 -0
- package/dist/keys/key-resolution.js +389 -0
- package/dist/lab/adapter-extension.d.ts +75 -0
- package/dist/lab/adapter-extension.js +253 -0
- package/dist/lab/adapter-scorer-loader.d.ts +43 -0
- package/dist/lab/adapter-scorer-loader.js +130 -0
- package/dist/lab/bag-overrides.d.ts +18 -0
- package/dist/lab/bag-overrides.js +121 -0
- package/dist/lab/composition-rules.d.ts +7 -0
- package/dist/lab/composition-rules.js +292 -0
- package/dist/lab/config.d.ts +7 -0
- package/dist/lab/config.js +208 -0
- package/dist/lab/device-presets.d.ts +97 -0
- package/dist/lab/device-presets.js +87 -0
- package/dist/lab/discover.d.ts +65 -0
- package/dist/lab/discover.js +422 -0
- package/dist/lab/doctor.d.ts +39 -0
- package/dist/lab/doctor.js +233 -0
- package/dist/lab/init-paths.d.ts +5 -0
- package/dist/lab/init-paths.js +89 -0
- package/dist/lab/init-plan.d.ts +20 -0
- package/dist/lab/init-plan.js +163 -0
- package/dist/lab/init-templates.d.ts +28 -0
- package/dist/lab/init-templates.js +416 -0
- package/dist/lab/init.d.ts +39 -0
- package/dist/lab/init.js +287 -0
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +264 -0
- package/dist/lab/parse/actors.d.ts +14 -0
- package/dist/lab/parse/actors.js +453 -0
- package/dist/lab/parse/comms.d.ts +12 -0
- package/dist/lab/parse/comms.js +246 -0
- package/dist/lab/parse/execution.d.ts +19 -0
- package/dist/lab/parse/execution.js +356 -0
- package/dist/lab/parse/subject-state.d.ts +30 -0
- package/dist/lab/parse/subject-state.js +179 -0
- package/dist/lab/parse/subject.d.ts +9 -0
- package/dist/lab/parse/subject.js +420 -0
- package/dist/lab/parse/values.d.ts +17 -0
- package/dist/lab/parse/values.js +65 -0
- package/dist/lab/participant-assignment.d.ts +12 -0
- package/dist/lab/participant-assignment.js +19 -0
- package/dist/lab/persona-resolve.d.ts +39 -0
- package/dist/lab/persona-resolve.js +118 -0
- package/dist/lab/persona.d.ts +39 -0
- package/dist/lab/persona.js +192 -0
- package/dist/lab/plan-base.d.ts +30 -0
- package/dist/lab/plan-base.js +126 -0
- package/dist/lab/plan-participants.d.ts +81 -0
- package/dist/lab/plan-participants.js +92 -0
- package/dist/lab/plan-types.d.ts +277 -0
- package/dist/lab/plan-types.js +5 -0
- package/dist/lab/plan.d.ts +27 -0
- package/dist/lab/plan.js +156 -0
- package/dist/lab/preflight-probes.d.ts +3 -0
- package/dist/lab/preflight-probes.js +312 -0
- package/dist/lab/preflight-result.d.ts +7 -0
- package/dist/lab/preflight-result.js +43 -0
- package/dist/lab/preflight.d.ts +95 -0
- package/dist/lab/preflight.js +117 -0
- package/dist/lab/route-inputs.d.ts +17 -0
- package/dist/lab/route-inputs.js +95 -0
- package/dist/lab/routing.d.ts +81 -0
- package/dist/lab/routing.js +214 -0
- package/dist/lab/run-lab-events.d.ts +69 -0
- package/dist/lab/run-lab-events.js +95 -0
- package/dist/lab/run-lab-options.d.ts +82 -0
- package/dist/lab/run-lab-options.js +399 -0
- package/dist/lab/summary.d.ts +60 -0
- package/dist/lab/summary.js +168 -0
- package/dist/lab/tasks.d.ts +91 -0
- package/dist/lab/tasks.js +139 -0
- package/dist/lab/types.d.ts +813 -0
- package/dist/lab/types.js +6 -0
- package/dist/lab/validation.d.ts +67 -0
- package/dist/lab/validation.js +387 -0
- package/dist/lab/warnings.d.ts +2 -0
- package/dist/lab/warnings.js +338 -0
- package/dist/observer/artifact.d.ts +23 -0
- package/dist/observer/artifact.js +235 -0
- package/dist/observer/data.d.ts +115 -0
- package/dist/observer/data.js +258 -0
- package/dist/observer/exposure.d.ts +64 -0
- package/dist/observer/exposure.js +143 -0
- package/dist/observer/http.js +50 -0
- package/dist/observer/library.js +190 -0
- package/dist/observer/listen.js +85 -0
- package/dist/observer/live.d.ts +9 -0
- package/dist/observer/live.js +25 -0
- package/dist/observer/pinned-files.d.ts +30 -0
- package/dist/observer/pinned-files.js +160 -0
- package/dist/observer/render.d.ts +69 -0
- package/dist/observer/render.js +350 -0
- package/dist/observer/run-inventory.d.ts +35 -0
- package/dist/observer/run-inventory.js +95 -0
- package/dist/observer/run-routes.d.ts +37 -0
- package/dist/observer/run-routes.js +373 -0
- package/dist/observer/serve.d.ts +97 -0
- package/dist/observer/serve.js +305 -0
- package/dist/observer/static.js +369 -0
- package/dist/observer/tunnel.js +112 -0
- package/dist/observer-app.html +9 -20
- package/dist/routes/computer-use/bundle-parts.d.ts +50 -0
- package/dist/routes/computer-use/bundle-parts.js +177 -0
- package/dist/routes/computer-use/bundle.d.ts +56 -0
- package/dist/routes/computer-use/bundle.js +184 -0
- package/dist/routes/computer-use/diagnostics.d.ts +38 -0
- package/dist/routes/computer-use/diagnostics.js +94 -0
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +65 -0
- package/dist/routes/computer-use/e2b-desktop/comms.js +225 -0
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +3 -0
- package/dist/routes/computer-use/e2b-desktop/desktop.js +91 -0
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +65 -0
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +156 -0
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +18 -0
- package/dist/routes/computer-use/e2b-desktop/prepare.js +198 -0
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +14 -0
- package/dist/routes/computer-use/e2b-desktop/start.js +193 -0
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +65 -0
- package/dist/routes/computer-use/e2b-desktop/state.js +69 -0
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +6 -0
- package/dist/routes/computer-use/e2b-desktop/teardown.js +152 -0
- package/dist/routes/computer-use/external-comms.d.ts +20 -0
- package/dist/routes/computer-use/external-comms.js +55 -0
- package/dist/routes/computer-use/fanout-bundle.d.ts +11 -0
- package/dist/routes/computer-use/fanout-bundle.js +274 -0
- package/dist/routes/computer-use/fanout-lanes.d.ts +15 -0
- package/dist/routes/computer-use/fanout-lanes.js +302 -0
- package/dist/routes/computer-use/in-process-desktop.d.ts +17 -0
- package/dist/routes/computer-use/in-process-desktop.js +40 -0
- package/dist/routes/computer-use/lanes.d.ts +35 -0
- package/dist/routes/computer-use/lanes.js +321 -0
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +62 -0
- package/dist/routes/computer-use/legacy-lane-spec.js +39 -0
- package/dist/routes/computer-use/live-flush.d.ts +42 -0
- package/dist/routes/computer-use/live-flush.js +154 -0
- package/dist/routes/computer-use/local-tree-pack.d.ts +27 -0
- package/dist/routes/computer-use/local-tree-pack.js +47 -0
- package/dist/routes/computer-use/local-vm.d.ts +20 -0
- package/dist/routes/computer-use/local-vm.js +218 -0
- package/dist/routes/computer-use/participant-desktop.d.ts +63 -0
- package/dist/routes/computer-use/participant-desktop.js +33 -0
- package/dist/routes/computer-use/participant-facts.d.ts +6 -0
- package/dist/routes/computer-use/participant-facts.js +22 -0
- package/dist/routes/computer-use/participant-model.d.ts +30 -0
- package/dist/routes/computer-use/participant-model.js +223 -0
- package/dist/routes/computer-use/participant-prompt.d.ts +53 -0
- package/dist/routes/computer-use/participant-prompt.js +87 -0
- package/dist/routes/computer-use/participant-runs.d.ts +67 -0
- package/dist/routes/computer-use/participant-runs.js +255 -0
- package/dist/routes/computer-use/plan.d.ts +56 -0
- package/dist/routes/computer-use/plan.js +310 -0
- package/dist/routes/computer-use/preflight.d.ts +23 -0
- package/dist/routes/computer-use/preflight.js +89 -0
- package/dist/routes/computer-use/rerun-selection.d.ts +19 -0
- package/dist/routes/computer-use/rerun-selection.js +121 -0
- package/dist/routes/computer-use/result.d.ts +7 -0
- package/dist/routes/computer-use/result.js +292 -0
- package/dist/routes/computer-use/route.d.ts +33 -0
- package/dist/routes/computer-use/route.js +145 -0
- package/dist/routes/computer-use/run-lanes.d.ts +59 -0
- package/dist/routes/computer-use/run-lanes.js +135 -0
- package/dist/routes/computer-use/self-report.d.ts +21 -0
- package/dist/routes/computer-use/self-report.js +231 -0
- package/dist/routes/computer-use/setup.d.ts +133 -0
- package/dist/routes/computer-use/setup.js +359 -0
- package/dist/routes/computer-use/single-bundle.d.ts +97 -0
- package/dist/routes/computer-use/single-bundle.js +393 -0
- package/dist/routes/computer-use/subject-projection.d.ts +51 -0
- package/dist/routes/computer-use/subject-projection.js +159 -0
- package/dist/routes/computer-use/types.d.ts +538 -0
- package/dist/routes/computer-use/types.js +36 -0
- package/dist/routes/preview.d.ts +13 -0
- package/dist/routes/preview.js +36 -0
- package/dist/routes/scripted/bundle.d.ts +47 -0
- package/dist/routes/scripted/bundle.js +195 -0
- package/dist/routes/scripted/plan.d.ts +30 -0
- package/dist/routes/scripted/plan.js +95 -0
- package/dist/routes/scripted/result.d.ts +48 -0
- package/dist/routes/scripted/result.js +176 -0
- package/dist/routes/scripted/route.d.ts +28 -0
- package/dist/routes/scripted/route.js +218 -0
- package/dist/routes/scripted/scenario.d.ts +21 -0
- package/dist/routes/scripted/scenario.js +102 -0
- package/dist/routes/scripted/session-result.d.ts +8 -0
- package/dist/routes/scripted/session-result.js +60 -0
- package/dist/routes/scripted/setup.d.ts +45 -0
- package/dist/routes/scripted/setup.js +126 -0
- package/dist/routes/scripted/subject.d.ts +49 -0
- package/dist/routes/scripted/subject.js +157 -0
- package/dist/routes/scripted/surface-records.d.ts +26 -0
- package/dist/routes/scripted/surface-records.js +88 -0
- package/dist/routes/scripted/surface-sessions.d.ts +13 -0
- package/dist/routes/scripted/surface-sessions.js +40 -0
- package/dist/routes/scripted/types.d.ts +88 -0
- package/dist/routes/scripted/types.js +3 -0
- package/dist/routes/shared-world/bundle.d.ts +20 -0
- package/dist/routes/shared-world/bundle.js +446 -0
- package/dist/routes/shared-world/checkpoints.d.ts +25 -0
- package/dist/routes/shared-world/checkpoints.js +46 -0
- package/dist/routes/shared-world/comms.d.ts +68 -0
- package/dist/routes/shared-world/comms.js +176 -0
- package/dist/routes/shared-world/external-public.d.ts +21 -0
- package/dist/routes/shared-world/external-public.js +130 -0
- package/dist/routes/shared-world/handoff.d.ts +62 -0
- package/dist/routes/shared-world/handoff.js +348 -0
- package/dist/routes/shared-world/lobby-code.d.ts +25 -0
- package/dist/routes/shared-world/lobby-code.js +152 -0
- package/dist/routes/shared-world/plan.d.ts +27 -0
- package/dist/routes/shared-world/plan.js +174 -0
- package/dist/routes/shared-world/provenance.d.ts +27 -0
- package/dist/routes/shared-world/provenance.js +65 -0
- package/dist/routes/shared-world/provisioned.d.ts +57 -0
- package/dist/routes/shared-world/provisioned.js +506 -0
- package/dist/routes/shared-world/result.d.ts +18 -0
- package/dist/routes/shared-world/result.js +327 -0
- package/dist/routes/shared-world/route.d.ts +21 -0
- package/dist/routes/shared-world/route.js +277 -0
- package/dist/routes/shared-world/seat-records.d.ts +20 -0
- package/dist/routes/shared-world/seat-records.js +213 -0
- package/dist/routes/shared-world/seats.d.ts +38 -0
- package/dist/routes/shared-world/seats.js +208 -0
- package/dist/routes/shared-world/setup.d.ts +48 -0
- package/dist/routes/shared-world/setup.js +200 -0
- package/dist/routes/shared-world/types.d.ts +354 -0
- package/dist/routes/shared-world/types.js +29 -0
- package/dist/routes/terminal/adapter.d.ts +37 -0
- package/dist/routes/terminal/adapter.js +201 -0
- package/dist/routes/terminal/bundle.d.ts +79 -0
- package/dist/routes/terminal/bundle.js +305 -0
- package/dist/routes/terminal/credentials.d.ts +34 -0
- package/dist/routes/terminal/credentials.js +102 -0
- package/dist/routes/terminal/dry-run.d.ts +24 -0
- package/dist/routes/terminal/dry-run.js +157 -0
- package/dist/routes/terminal/encoding.js +79 -0
- package/dist/routes/terminal/ledger.d.ts +49 -0
- package/dist/routes/terminal/ledger.js +170 -0
- package/dist/routes/terminal/lifetime.d.ts +10 -0
- package/dist/routes/terminal/lifetime.js +22 -0
- package/dist/routes/terminal/live-finish.d.ts +31 -0
- package/dist/routes/terminal/live-finish.js +215 -0
- package/dist/routes/terminal/live-sandbox.d.ts +70 -0
- package/dist/routes/terminal/live-sandbox.js +456 -0
- package/dist/routes/terminal/persona.d.ts +20 -0
- package/dist/routes/terminal/persona.js +34 -0
- package/dist/routes/terminal/plan.d.ts +21 -0
- package/dist/routes/terminal/plan.js +115 -0
- package/dist/routes/terminal/recorder.d.ts +23 -0
- package/dist/routes/terminal/recorder.js +77 -0
- package/dist/routes/terminal/result.d.ts +47 -0
- package/dist/routes/terminal/result.js +114 -0
- package/dist/routes/terminal/route.d.ts +23 -0
- package/dist/routes/terminal/route.js +170 -0
- package/dist/routes/terminal/runtime-auth.d.ts +12 -0
- package/dist/routes/terminal/runtime-auth.js +23 -0
- package/dist/routes/terminal/runtime.d.ts +14 -0
- package/dist/routes/terminal/runtime.js +47 -0
- package/dist/routes/terminal/sandbox.d.ts +37 -0
- package/dist/routes/terminal/sandbox.js +123 -0
- package/dist/routes/terminal/session.d.ts +25 -0
- package/dist/routes/terminal/session.js +199 -0
- package/dist/routes/terminal/token-usage.d.ts +15 -0
- package/dist/routes/terminal/token-usage.js +93 -0
- package/dist/routes/terminal/trace.d.ts +40 -0
- package/dist/routes/terminal/trace.js +172 -0
- package/dist/routes/terminal/types.d.ts +342 -0
- package/dist/routes/terminal/types.js +31 -0
- package/dist/run/bundle-shape.d.ts +7 -0
- package/dist/run/bundle-shape.js +369 -0
- package/dist/run/bundle.d.ts +547 -0
- package/dist/run/bundle.js +44 -0
- package/dist/run/concurrency.js +24 -0
- package/dist/run/contained-output.d.ts +50 -0
- package/dist/run/contained-output.js +351 -0
- package/dist/run/cost-summary.d.ts +28 -0
- package/dist/run/cost-summary.js +213 -0
- package/dist/run/costs.js +140 -0
- package/dist/run/detail.d.ts +62 -0
- package/dist/run/detail.js +139 -0
- package/dist/run/dry-run-inputs.d.ts +9 -0
- package/dist/run/dry-run-inputs.js +90 -0
- package/dist/run/dry-run.d.ts +6 -0
- package/dist/run/dry-run.js +362 -0
- package/dist/run/feedback-shape.d.ts +7 -0
- package/dist/run/feedback-shape.js +89 -0
- package/dist/run/git-state.d.ts +35 -0
- package/dist/run/git-state.js +316 -0
- package/dist/run/git-workspace.d.ts +32 -0
- package/dist/run/git-workspace.js +450 -0
- package/dist/run/judge.d.ts +210 -0
- package/dist/run/judge.js +240 -0
- package/dist/run/locate.d.ts +22 -0
- package/dist/run/locate.js +122 -0
- package/dist/run/outcomes.d.ts +31 -0
- package/dist/run/outcomes.js +210 -0
- package/dist/run/participant-records.d.ts +28 -0
- package/dist/run/participant-records.js +63 -0
- package/dist/run/participant.d.ts +29 -0
- package/dist/run/participant.js +12 -0
- package/dist/run/paths.d.ts +79 -0
- package/dist/run/paths.js +356 -0
- package/dist/run/preflight-receipts.d.ts +46 -0
- package/dist/run/preflight-receipts.js +173 -0
- package/dist/run/pricing.d.ts +124 -0
- package/dist/run/pricing.js +298 -0
- package/dist/run/project.d.ts +8 -0
- package/dist/run/project.js +103 -0
- package/dist/run/projection.d.ts +184 -0
- package/dist/run/projection.js +356 -0
- package/dist/run/reclaim.d.ts +41 -0
- package/dist/run/reclaim.js +193 -0
- package/dist/run/results.d.ts +88 -0
- package/dist/run/results.js +3 -0
- package/dist/run/run-index.d.ts +107 -0
- package/dist/run/run-index.js +243 -0
- package/dist/run/run.d.ts +103 -0
- package/dist/run/run.js +199 -0
- package/dist/run/sandbox-receipts.d.ts +31 -0
- package/dist/run/sandbox-receipts.js +49 -0
- package/dist/run/shared-world-evidence.d.ts +220 -0
- package/dist/run/shared-world-evidence.js +49 -0
- package/dist/run/shared-world-shape.d.ts +26 -0
- package/dist/run/shared-world-shape.js +181 -0
- package/dist/run/stats.d.ts +82 -0
- package/dist/run/stats.js +258 -0
- package/dist/run/status.d.ts +111 -0
- package/dist/run/status.js +176 -0
- package/dist/run/stored-runs.d.ts +38 -0
- package/dist/run/stored-runs.js +273 -0
- package/dist/run/stream-shape.d.ts +4 -0
- package/dist/run/stream-shape.js +160 -0
- package/dist/run/streams.d.ts +257 -0
- package/dist/run/streams.js +12 -0
- package/dist/run/study-files.d.ts +35 -0
- package/dist/run/study-files.js +164 -0
- package/dist/run/terminal-contract.d.ts +25 -0
- package/dist/run/terminal-contract.js +47 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.js +72 -0
- package/dist/run/type-guards.d.ts +6 -0
- package/dist/run/type-guards.js +18 -0
- package/dist/run-lab.d.ts +110 -0
- package/dist/run-lab.js +148 -0
- package/dist/subject/clone.d.ts +37 -0
- package/dist/subject/clone.js +62 -0
- package/dist/subject/desktop-cli.d.ts +17 -0
- package/dist/subject/desktop-cli.js +51 -0
- package/dist/subject/local-tree-archive.d.ts +82 -0
- package/dist/subject/local-tree-archive.js +431 -0
- package/dist/subject/local-tree.d.ts +28 -0
- package/dist/subject/local-tree.js +58 -0
- package/dist/subject/node-bootstrap.d.ts +12 -0
- package/dist/subject/node-bootstrap.js +66 -0
- package/dist/subject/runtime.d.ts +13 -0
- package/dist/subject/runtime.js +50 -0
- package/dist/subject/serve.d.ts +39 -0
- package/dist/subject/serve.js +249 -0
- package/dist/subject/state.d.ts +23 -0
- package/dist/subject/state.js +58 -0
- package/dist/subject/steps.d.ts +37 -0
- package/dist/subject/steps.js +39 -0
- package/dist/substrates/command-failure.d.ts +23 -0
- package/dist/substrates/command-failure.js +45 -0
- package/dist/substrates/desktop-session.d.ts +43 -0
- package/dist/substrates/desktop-session.js +59 -0
- package/dist/substrates/detached.d.ts +55 -0
- package/dist/substrates/detached.js +139 -0
- package/dist/substrates/e2b/cdp-probe.d.ts +99 -0
- package/dist/substrates/e2b/cdp-probe.js +556 -0
- package/dist/substrates/e2b/desktop-browser.d.ts +81 -0
- package/dist/substrates/e2b/desktop-browser.js +410 -0
- package/dist/substrates/e2b/desktop-cdp.d.ts +77 -0
- package/dist/substrates/e2b/desktop-cdp.js +211 -0
- package/dist/substrates/e2b/desktop-executor.d.ts +92 -0
- package/dist/substrates/e2b/desktop-executor.js +302 -0
- package/dist/substrates/e2b/desktop-geometry.d.ts +83 -0
- package/dist/substrates/e2b/desktop-geometry.js +331 -0
- package/dist/substrates/e2b/desktop-media.d.ts +29 -0
- package/dist/substrates/e2b/desktop-media.js +151 -0
- package/dist/substrates/e2b/desktop-recording.d.ts +18 -0
- package/dist/substrates/e2b/desktop-recording.js +238 -0
- package/dist/substrates/e2b/desktop-resources.d.ts +11 -0
- package/dist/substrates/e2b/desktop-resources.js +35 -0
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +15 -0
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +66 -0
- package/dist/substrates/e2b/lifetime.d.ts +12 -0
- package/dist/substrates/e2b/lifetime.js +18 -0
- package/dist/substrates/e2b/sandbox.d.ts +104 -0
- package/dist/substrates/e2b/sandbox.js +216 -0
- package/dist/substrates/e2b/sdk.d.ts +205 -0
- package/dist/substrates/e2b/sdk.js +189 -0
- package/dist/substrates/e2b/shell.d.ts +10 -0
- package/dist/substrates/e2b/shell.js +61 -0
- package/dist/substrates/local/captured-inbox.d.ts +6 -0
- package/dist/substrates/local/captured-inbox.js +87 -0
- package/dist/substrates/local/firecracker-desktop.d.ts +25 -0
- package/dist/substrates/local/firecracker-desktop.js +315 -0
- package/dist/substrates/local/runtime-config.d.ts +6 -0
- package/dist/substrates/local/runtime-config.js +91 -0
- package/dist/substrates/local/runtime-host.d.ts +30 -0
- package/dist/substrates/local/runtime-host.js +143 -0
- package/dist/substrates/local/runtime-release.d.ts +5 -0
- package/dist/substrates/local/runtime-release.js +32 -0
- package/dist/substrates/local/runtime-ssh.d.ts +9 -0
- package/dist/substrates/local/runtime-ssh.js +129 -0
- package/dist/substrates/local/runtime.d.ts +25 -0
- package/dist/substrates/local/runtime.js +190 -0
- package/dist/substrates/shell.d.ts +44 -0
- package/dist/substrates/shell.js +22 -0
- package/dist/tui/actions.d.ts +39 -0
- package/dist/tui/actions.js +203 -0
- package/dist/tui/contract.d.ts +144 -0
- package/dist/tui/contract.js +52 -0
- package/dist/tui/launch.js +172 -0
- package/dist/tui/project.d.ts +10 -0
- package/dist/tui/project.js +17 -0
- package/dist/tui-app.js +125 -125
- package/dist/verify/actor.d.ts +27 -0
- package/dist/verify/actor.js +292 -0
- package/dist/verify/artifacts.d.ts +47 -0
- package/dist/verify/artifacts.js +373 -0
- package/dist/verify/costs.d.ts +30 -0
- package/dist/verify/costs.js +129 -0
- package/dist/verify/liveness.d.ts +7 -0
- package/dist/verify/liveness.js +72 -0
- package/dist/verify/rerun.d.ts +3 -0
- package/dist/verify/rerun.js +46 -0
- package/dist/verify/shared-world-concurrent.d.ts +11 -0
- package/dist/verify/shared-world-concurrent.js +346 -0
- package/dist/verify/shared-world.d.ts +8 -0
- package/dist/verify/shared-world.js +295 -0
- package/dist/verify/subject.d.ts +17 -0
- package/dist/verify/subject.js +123 -0
- package/dist/verify/verify.d.ts +34 -0
- package/dist/verify/verify.js +333 -0
- package/docs/README.md +67 -0
- package/docs/architecture/actor-contract.md +215 -174
- package/docs/architecture/browser-control.md +51 -37
- package/docs/architecture/comms-inbox.md +8 -8
- package/docs/architecture/desktop-recording.md +2 -2
- package/docs/architecture/desktop-sessions.md +33 -21
- package/docs/architecture/external-public-shared-world.md +80 -64
- package/docs/architecture/github-feedback-loop.md +40 -27
- package/docs/architecture/guest-desktop.md +22 -10
- package/docs/architecture/local-browser-runtime.md +30 -21
- package/docs/architecture/observer-review.md +9 -9
- package/docs/architecture/observer.md +53 -57
- package/docs/architecture/participant-media.md +3 -3
- package/docs/architecture/project-layout.md +33 -137
- package/docs/architecture/real-email-receiving.md +7 -6
- package/docs/architecture/restricted-codex-analysis.md +213 -25
- package/docs/architecture/serve.md +89 -87
- package/docs/architecture/state-driven-executor.md +79 -64
- package/docs/architecture/task-protocol-support.md +18 -18
- package/docs/architecture/terminal-product-lane.md +92 -86
- package/docs/contracts/adapter-admission.md +8 -4
- package/docs/contracts/adapter-fixtures.md +6 -6
- package/docs/contracts/core.md +22 -24
- package/docs/contracts/feedback.md +33 -23
- package/docs/contracts/policy.md +28 -31
- package/docs/contracts/run-bundle.md +168 -82
- package/docs/contracts/schemas.md +563 -379
- package/docs/contracts/study-analysis.md +2 -2
- package/docs/contracts/study-costs.md +12 -12
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +36 -0
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +30 -0
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +35 -0
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +31 -0
- package/docs/decisions/README.md +16 -0
- package/docs/goals/current.md +22 -50
- package/docs/principles/actor-fidelity.md +37 -40
- package/docs/principles/engineering.md +81 -0
- package/docs/principles/invariants-and-defaults.md +48 -45
- package/docs/principles/self-driving-harness.md +11 -10
- package/docs/principles/three-roles.md +12 -13
- package/docs/product/automatic-analysis.md +39 -9
- package/docs/product/lobby-trivia-3player-external-public.md +14 -13
- package/docs/product/open-source-install-experience.md +34 -38
- package/docs/ramp/README.md +91 -218
- package/docs/release/open-source-readiness.md +5 -2
- package/docs/release/public-readiness-standard.md +1 -1
- package/examples/README.md +11 -0
- package/examples/participant/README.md +80 -0
- package/examples/participant/app.mjs +55 -0
- package/examples/participant/run.mjs +116 -0
- package/examples/scorer/README.md +29 -0
- package/examples/scorer/run.mjs +63 -0
- package/examples/scorer/scorer.mjs +20 -0
- package/package.json +61 -57
- package/skills/humanish/SKILL.md +72 -60
- package/skills/humanish/agents/openai.yaml +2 -2
- package/dist/actor-contract.d.ts +0 -296
- package/dist/actor-contract.js +0 -340
- package/dist/actor-contract.js.map +0 -1
- package/dist/actor-goal-source.js +0 -32
- package/dist/actor-goal-source.js.map +0 -1
- package/dist/actor-registry.d.ts +0 -77
- package/dist/actor-registry.js +0 -106
- package/dist/actor-registry.js.map +0 -1
- package/dist/actor-stop-cause.d.ts +0 -9
- package/dist/actor-stop-cause.js +0 -42
- package/dist/actor-stop-cause.js.map +0 -1
- package/dist/adapter-extension.d.ts +0 -76
- package/dist/adapter-extension.js +0 -273
- package/dist/adapter-extension.js.map +0 -1
- package/dist/adapter-scorer-loader.d.ts +0 -42
- package/dist/adapter-scorer-loader.js +0 -129
- package/dist/adapter-scorer-loader.js.map +0 -1
- package/dist/affordance.d.ts +0 -53
- package/dist/affordance.js +0 -145
- package/dist/affordance.js.map +0 -1
- package/dist/agent-session.js +0 -43
- package/dist/agent-session.js.map +0 -1
- package/dist/argv.d.ts +0 -1
- package/dist/argv.js +0 -8
- package/dist/argv.js.map +0 -1
- package/dist/artifact-reference.d.ts +0 -22
- package/dist/artifact-reference.js +0 -47
- package/dist/artifact-reference.js.map +0 -1
- package/dist/automatic-analysis-completion.d.ts +0 -25
- package/dist/automatic-analysis-completion.js +0 -56
- package/dist/automatic-analysis-completion.js.map +0 -1
- package/dist/automatic-analysis-config.d.ts +0 -38
- package/dist/automatic-analysis-config.js +0 -68
- package/dist/automatic-analysis-config.js.map +0 -1
- package/dist/automatic-study-analysis.d.ts +0 -17
- package/dist/automatic-study-analysis.js +0 -195
- package/dist/automatic-study-analysis.js.map +0 -1
- package/dist/browser-control-client.d.ts +0 -18
- package/dist/browser-control-client.js +0 -176
- package/dist/browser-control-client.js.map +0 -1
- package/dist/browser-control-dispatcher.d.ts +0 -19
- package/dist/browser-control-dispatcher.js +0 -147
- package/dist/browser-control-dispatcher.js.map +0 -1
- package/dist/browser-control-protocol.d.ts +0 -472
- package/dist/browser-control-protocol.js +0 -185
- package/dist/browser-control-protocol.js.map +0 -1
- package/dist/browser-control-recording-transfer.d.ts +0 -4
- package/dist/browser-control-recording-transfer.js +0 -42
- package/dist/browser-control-recording-transfer.js.map +0 -1
- package/dist/browser-control-transport.d.ts +0 -27
- package/dist/browser-control-transport.js +0 -177
- package/dist/browser-control-transport.js.map +0 -1
- package/dist/browser-evidence-hygiene.js +0 -43
- package/dist/browser-evidence-hygiene.js.map +0 -1
- package/dist/chrome-cdp-probe.d.ts +0 -97
- package/dist/chrome-cdp-probe.js +0 -536
- package/dist/chrome-cdp-probe.js.map +0 -1
- package/dist/claude-agent-sdk.d.ts +0 -94
- package/dist/claude-agent-sdk.js +0 -367
- package/dist/claude-agent-sdk.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/codex-app-server-ui.d.ts +0 -39
- package/dist/codex-app-server-ui.js +0 -357
- package/dist/codex-app-server-ui.js.map +0 -1
- package/dist/codex-app-server.d.ts +0 -144
- package/dist/codex-app-server.js +0 -754
- package/dist/codex-app-server.js.map +0 -1
- package/dist/command-failure.d.ts +0 -43
- package/dist/command-failure.js +0 -73
- package/dist/command-failure.js.map +0 -1
- package/dist/comms-agentmail.d.ts +0 -25
- package/dist/comms-agentmail.js +0 -418
- package/dist/comms-agentmail.js.map +0 -1
- package/dist/comms-catch-host.d.ts +0 -52
- package/dist/comms-catch-host.js +0 -178
- package/dist/comms-catch-host.js.map +0 -1
- package/dist/comms-connections.d.ts +0 -52
- package/dist/comms-connections.js +0 -123
- package/dist/comms-connections.js.map +0 -1
- package/dist/comms-email-catch.d.ts +0 -54
- package/dist/comms-email-catch.js +0 -212
- package/dist/comms-email-catch.js.map +0 -1
- package/dist/comms-evidence.d.ts +0 -27
- package/dist/comms-evidence.js +0 -31
- package/dist/comms-evidence.js.map +0 -1
- package/dist/comms-fake-inbox.d.ts +0 -45
- package/dist/comms-fake-inbox.js +0 -184
- package/dist/comms-fake-inbox.js.map +0 -1
- package/dist/comms-images.d.ts +0 -7
- package/dist/comms-images.js +0 -39
- package/dist/comms-images.js.map +0 -1
- package/dist/comms-inbox.d.ts +0 -66
- package/dist/comms-inbox.js +0 -389
- package/dist/comms-inbox.js.map +0 -1
- package/dist/comms-lease-store.d.ts +0 -91
- package/dist/comms-lease-store.js +0 -495
- package/dist/comms-lease-store.js.map +0 -1
- package/dist/comms-receiving-evidence.d.ts +0 -46
- package/dist/comms-receiving-evidence.js +0 -35
- package/dist/comms-receiving-evidence.js.map +0 -1
- package/dist/comms-receiving-inbox.d.ts +0 -16
- package/dist/comms-receiving-inbox.js +0 -410
- package/dist/comms-receiving-inbox.js.map +0 -1
- package/dist/comms-receiving-runtime.d.ts +0 -25
- package/dist/comms-receiving-runtime.js +0 -45
- package/dist/comms-receiving-runtime.js.map +0 -1
- package/dist/comms-receiving-types.d.ts +0 -98
- package/dist/comms-receiving-types.js +0 -2
- package/dist/comms-receiving-types.js.map +0 -1
- package/dist/comms-receiving.d.ts +0 -58
- package/dist/comms-receiving.js +0 -554
- package/dist/comms-receiving.js.map +0 -1
- package/dist/comms-sandbox-catch.d.ts +0 -229
- package/dist/comms-sandbox-catch.js +0 -737
- package/dist/comms-sandbox-catch.js.map +0 -1
- package/dist/comms-setup.d.ts +0 -40
- package/dist/comms-setup.js +0 -121
- package/dist/comms-setup.js.map +0 -1
- package/dist/comms-types.d.ts +0 -72
- package/dist/comms-types.js +0 -10
- package/dist/comms-types.js.map +0 -1
- package/dist/computer-use-actor.d.ts +0 -76
- package/dist/computer-use-actor.js +0 -68
- package/dist/computer-use-actor.js.map +0 -1
- package/dist/computer-use.d.ts +0 -429
- package/dist/computer-use.js +0 -1751
- package/dist/computer-use.js.map +0 -1
- package/dist/concurrency.js +0 -27
- package/dist/concurrency.js.map +0 -1
- package/dist/concurrent-shared-world-lab.d.ts +0 -186
- package/dist/concurrent-shared-world-lab.js +0 -2181
- package/dist/concurrent-shared-world-lab.js.map +0 -1
- package/dist/core/git-state.d.ts +0 -33
- package/dist/core/git-state.js +0 -277
- package/dist/core/git-state.js.map +0 -1
- package/dist/core/git-workspace.d.ts +0 -31
- package/dist/core/git-workspace.js +0 -447
- package/dist/core/git-workspace.js.map +0 -1
- package/dist/core/index.d.ts +0 -4
- package/dist/core/index.js +0 -3
- package/dist/core/index.js.map +0 -1
- package/dist/core/run-primitives.d.ts +0 -66
- package/dist/core/run-primitives.js +0 -120
- package/dist/core/run-primitives.js.map +0 -1
- package/dist/cua-actor-lab.d.ts +0 -855
- package/dist/cua-actor-lab.js +0 -3543
- package/dist/cua-actor-lab.js.map +0 -1
- package/dist/cua-admission-limit.d.ts +0 -12
- package/dist/cua-admission-limit.js +0 -20
- package/dist/cua-admission-limit.js.map +0 -1
- package/dist/cua-desktop-lane.d.ts +0 -35
- package/dist/cua-desktop-lane.js +0 -13
- package/dist/cua-desktop-lane.js.map +0 -1
- package/dist/cua-diagnostics.d.ts +0 -38
- package/dist/cua-diagnostics.js +0 -68
- package/dist/cua-diagnostics.js.map +0 -1
- package/dist/cua-executor-error.js +0 -48
- package/dist/cua-executor-error.js.map +0 -1
- package/dist/cua-provider-error.d.ts +0 -16
- package/dist/cua-provider-error.js +0 -35
- package/dist/cua-provider-error.js.map +0 -1
- package/dist/cua-speech.js +0 -2
- package/dist/cua-speech.js.map +0 -1
- package/dist/desktop-recorder.d.ts +0 -39
- package/dist/desktop-recorder.js +0 -226
- package/dist/desktop-recorder.js.map +0 -1
- package/dist/desktop-recording-artifact.d.ts +0 -5
- package/dist/desktop-recording-artifact.js +0 -54
- package/dist/desktop-recording-artifact.js.map +0 -1
- package/dist/desktop-recording-types.d.ts +0 -24
- package/dist/desktop-recording-types.js +0 -14
- package/dist/desktop-recording-types.js.map +0 -1
- package/dist/desktop-session.d.ts +0 -41
- package/dist/desktop-session.js +0 -47
- package/dist/desktop-session.js.map +0 -1
- package/dist/device-presets.d.ts +0 -67
- package/dist/device-presets.js +0 -55
- package/dist/device-presets.js.map +0 -1
- package/dist/doctor-lab.d.ts +0 -38
- package/dist/doctor-lab.js +0 -126
- package/dist/doctor-lab.js.map +0 -1
- package/dist/e2b-cua-desktop.d.ts +0 -3
- package/dist/e2b-cua-desktop.js +0 -708
- package/dist/e2b-cua-desktop.js.map +0 -1
- package/dist/e2b-cua-provisioning.d.ts +0 -314
- package/dist/e2b-cua-provisioning.js +0 -1219
- package/dist/e2b-cua-provisioning.js.map +0 -1
- package/dist/e2b-desktop-executor.d.ts +0 -101
- package/dist/e2b-desktop-executor.js +0 -297
- package/dist/e2b-desktop-executor.js.map +0 -1
- package/dist/e2b-desktop-launch.d.ts +0 -243
- package/dist/e2b-desktop-launch.js +0 -234
- package/dist/e2b-desktop-launch.js.map +0 -1
- package/dist/e2b-desktop-media.d.ts +0 -14
- package/dist/e2b-desktop-media.js +0 -58
- package/dist/e2b-desktop-media.js.map +0 -1
- package/dist/e2b-desktop-recording.d.ts +0 -16
- package/dist/e2b-desktop-recording.js +0 -162
- package/dist/e2b-desktop-recording.js.map +0 -1
- package/dist/e2b-desktop-resources.d.ts +0 -11
- package/dist/e2b-desktop-resources.js +0 -33
- package/dist/e2b-desktop-resources.js.map +0 -1
- package/dist/e2b-desktop-screenshot-cleanup.d.ts +0 -15
- package/dist/e2b-desktop-screenshot-cleanup.js +0 -67
- package/dist/e2b-desktop-screenshot-cleanup.js.map +0 -1
- package/dist/e2b-desktop-session.d.ts +0 -7
- package/dist/e2b-desktop-session.js +0 -29
- package/dist/e2b-desktop-session.js.map +0 -1
- package/dist/e2b-detached.d.ts +0 -53
- package/dist/e2b-detached.js +0 -130
- package/dist/e2b-detached.js.map +0 -1
- package/dist/e2b-terminal-lab.d.ts +0 -383
- package/dist/e2b-terminal-lab.js +0 -2000
- package/dist/e2b-terminal-lab.js.map +0 -1
- package/dist/env-file.d.ts +0 -14
- package/dist/env-file.js +0 -108
- package/dist/env-file.js.map +0 -1
- package/dist/export-bundle.d.ts +0 -7
- package/dist/export-bundle.js +0 -441
- package/dist/export-bundle.js.map +0 -1
- package/dist/export.d.ts +0 -49
- package/dist/export.js +0 -308
- package/dist/export.js.map +0 -1
- package/dist/feedback-proof.d.ts +0 -8
- package/dist/feedback-proof.js +0 -44
- package/dist/feedback-proof.js.map +0 -1
- package/dist/feedback.d.ts +0 -76
- package/dist/feedback.js +0 -496
- package/dist/feedback.js.map +0 -1
- package/dist/first-run-path.d.ts +0 -55
- package/dist/first-run-path.js +0 -136
- package/dist/first-run-path.js.map +0 -1
- package/dist/frame-signature.d.ts +0 -24
- package/dist/frame-signature.js +0 -128
- package/dist/frame-signature.js.map +0 -1
- package/dist/guest-bootstrap.d.ts +0 -55
- package/dist/guest-bootstrap.js +0 -285
- package/dist/guest-bootstrap.js.map +0 -1
- package/dist/guest-browser-tools.d.ts +0 -8
- package/dist/guest-browser-tools.js +0 -66
- package/dist/guest-browser-tools.js.map +0 -1
- package/dist/guest-chromium-text.d.ts +0 -27
- package/dist/guest-chromium-text.js +0 -281
- package/dist/guest-chromium-text.js.map +0 -1
- package/dist/guest-desktop-executor.d.ts +0 -22
- package/dist/guest-desktop-executor.js +0 -178
- package/dist/guest-desktop-executor.js.map +0 -1
- package/dist/guest-desktop-media.d.ts +0 -33
- package/dist/guest-desktop-media.js +0 -281
- package/dist/guest-desktop-media.js.map +0 -1
- package/dist/guest-desktop-native.d.ts +0 -14
- package/dist/guest-desktop-native.js +0 -131
- package/dist/guest-desktop-native.js.map +0 -1
- package/dist/guest-media-config.d.ts +0 -15
- package/dist/guest-media-config.js +0 -8
- package/dist/guest-media-config.js.map +0 -1
- package/dist/guest-media-worker.js.map +0 -1
- package/dist/guest-runtime-desktop.d.ts +0 -42
- package/dist/guest-runtime-desktop.js +0 -314
- package/dist/guest-runtime-desktop.js.map +0 -1
- package/dist/guest-runtime-main.js.map +0 -1
- package/dist/guest-runtime-revision.js.map +0 -1
- package/dist/guest-runtime.d.ts +0 -31
- package/dist/guest-runtime.js +0 -99
- package/dist/guest-runtime.js.map +0 -1
- package/dist/image-evidence.d.ts +0 -2
- package/dist/image-evidence.js +0 -47
- package/dist/image-evidence.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-templates.d.ts +0 -25
- package/dist/init-templates.js +0 -541
- package/dist/init-templates.js.map +0 -1
- package/dist/init.d.ts +0 -38
- package/dist/init.js +0 -532
- package/dist/init.js.map +0 -1
- package/dist/key-resolution.d.ts +0 -67
- package/dist/key-resolution.js +0 -375
- package/dist/key-resolution.js.map +0 -1
- package/dist/lab-app-runner.d.ts +0 -78
- package/dist/lab-app-runner.js +0 -403
- package/dist/lab-app-runner.js.map +0 -1
- package/dist/lab-config.d.ts +0 -968
- package/dist/lab-config.js +0 -2714
- package/dist/lab-config.js.map +0 -1
- package/dist/lab-engine.d.ts +0 -97
- package/dist/lab-engine.js +0 -285
- package/dist/lab-engine.js.map +0 -1
- package/dist/lab-preflight.d.ts +0 -70
- package/dist/lab-preflight.js +0 -388
- package/dist/lab-preflight.js.map +0 -1
- package/dist/lab-summary.d.ts +0 -57
- package/dist/lab-summary.js +0 -126
- package/dist/lab-summary.js.map +0 -1
- package/dist/labs.d.ts +0 -66
- package/dist/labs.js +0 -401
- package/dist/labs.js.map +0 -1
- package/dist/listen.js +0 -84
- package/dist/listen.js.map +0 -1
- package/dist/local-agent-claude-session.d.ts +0 -45
- package/dist/local-agent-claude-session.js +0 -203
- package/dist/local-agent-claude-session.js.map +0 -1
- package/dist/local-agent-cli.d.ts +0 -121
- package/dist/local-agent-cli.js +0 -427
- package/dist/local-agent-cli.js.map +0 -1
- package/dist/local-captured-inbox.d.ts +0 -6
- package/dist/local-captured-inbox.js +0 -65
- package/dist/local-captured-inbox.js.map +0 -1
- package/dist/local-firecracker-desktop.d.ts +0 -23
- package/dist/local-firecracker-desktop.js +0 -191
- package/dist/local-firecracker-desktop.js.map +0 -1
- package/dist/local-firecracker-study.d.ts +0 -9
- package/dist/local-firecracker-study.js +0 -135
- package/dist/local-firecracker-study.js.map +0 -1
- package/dist/local-runtime-config.d.ts +0 -6
- package/dist/local-runtime-config.js +0 -60
- package/dist/local-runtime-config.js.map +0 -1
- package/dist/local-runtime-host.d.ts +0 -31
- package/dist/local-runtime-host.js +0 -128
- package/dist/local-runtime-host.js.map +0 -1
- package/dist/local-runtime-release.d.ts +0 -7
- package/dist/local-runtime-release.js +0 -33
- package/dist/local-runtime-release.js.map +0 -1
- package/dist/local-runtime-ssh.d.ts +0 -27
- package/dist/local-runtime-ssh.js +0 -91
- package/dist/local-runtime-ssh.js.map +0 -1
- package/dist/local-runtime.d.ts +0 -25
- package/dist/local-runtime.js +0 -133
- package/dist/local-runtime.js.map +0 -1
- package/dist/observer-data.d.ts +0 -114
- package/dist/observer-data.js +0 -224
- package/dist/observer-data.js.map +0 -1
- package/dist/observer-library.js +0 -191
- package/dist/observer-library.js.map +0 -1
- package/dist/observer-serve.d.ts +0 -99
- package/dist/observer-serve.js +0 -284
- package/dist/observer-serve.js.map +0 -1
- package/dist/observer-static.js +0 -357
- package/dist/observer-static.js.map +0 -1
- package/dist/observer.d.ts +0 -118
- package/dist/observer.js +0 -947
- package/dist/observer.js.map +0 -1
- package/dist/openai-responses-cu.d.ts +0 -158
- package/dist/openai-responses-cu.js +0 -714
- package/dist/openai-responses-cu.js.map +0 -1
- package/dist/orientation.d.ts +0 -29
- package/dist/orientation.js +0 -95
- package/dist/orientation.js.map +0 -1
- package/dist/oss-lab.d.ts +0 -55
- package/dist/oss-lab.js +0 -344
- package/dist/oss-lab.js.map +0 -1
- package/dist/oss-meta-lab-scoring.d.ts +0 -15
- package/dist/oss-meta-lab-scoring.js +0 -145
- package/dist/oss-meta-lab-scoring.js.map +0 -1
- package/dist/oss-meta-lab.d.ts +0 -287
- package/dist/oss-meta-lab.js +0 -4551
- package/dist/oss-meta-lab.js.map +0 -1
- package/dist/oss-remote-telemetry.d.ts +0 -77
- package/dist/oss-remote-telemetry.js +0 -403
- package/dist/oss-remote-telemetry.js.map +0 -1
- package/dist/output-token-limit.js +0 -5
- package/dist/output-token-limit.js.map +0 -1
- package/dist/participant-assignment.d.ts +0 -12
- package/dist/participant-assignment.js +0 -15
- package/dist/participant-assignment.js.map +0 -1
- package/dist/persona-resolve.d.ts +0 -44
- package/dist/persona-resolve.js +0 -99
- package/dist/persona-resolve.js.map +0 -1
- package/dist/persona.d.ts +0 -39
- package/dist/persona.js +0 -144
- package/dist/persona.js.map +0 -1
- package/dist/pi-agent-core.d.ts +0 -77
- package/dist/pi-agent-core.js +0 -207
- package/dist/pi-agent-core.js.map +0 -1
- package/dist/pricing.d.ts +0 -145
- package/dist/pricing.js +0 -277
- package/dist/pricing.js.map +0 -1
- package/dist/program.d.ts +0 -96
- package/dist/program.js +0 -4030
- package/dist/program.js.map +0 -1
- package/dist/reasoning-effort.js +0 -26
- package/dist/reasoning-effort.js.map +0 -1
- package/dist/reclaim.d.ts +0 -31
- package/dist/reclaim.js +0 -90
- package/dist/reclaim.js.map +0 -1
- package/dist/redaction.d.ts +0 -90
- package/dist/redaction.js +0 -294
- package/dist/redaction.js.map +0 -1
- package/dist/restricted-codex-analysis.d.ts +0 -15
- package/dist/restricted-codex-analysis.js +0 -13
- package/dist/restricted-codex-analysis.js.map +0 -1
- package/dist/restricted-codex-participant-policy.d.ts +0 -44
- package/dist/restricted-codex-participant-policy.js +0 -43
- package/dist/restricted-codex-participant-policy.js.map +0 -1
- package/dist/restricted-codex-participant-run.d.ts +0 -20
- package/dist/restricted-codex-participant-run.js +0 -79
- package/dist/restricted-codex-participant-run.js.map +0 -1
- package/dist/restricted-codex-participant.d.ts +0 -20
- package/dist/restricted-codex-participant.js +0 -250
- package/dist/restricted-codex-participant.js.map +0 -1
- package/dist/restricted-codex-policy.d.ts +0 -64
- package/dist/restricted-codex-policy.js +0 -176
- package/dist/restricted-codex-policy.js.map +0 -1
- package/dist/restricted-codex-session.d.ts +0 -44
- package/dist/restricted-codex-session.js +0 -657
- package/dist/restricted-codex-session.js.map +0 -1
- package/dist/restricted-codex-transport.d.ts +0 -69
- package/dist/restricted-codex-transport.js +0 -296
- package/dist/restricted-codex-transport.js.map +0 -1
- package/dist/run-detail.d.ts +0 -61
- package/dist/run-detail.js +0 -137
- package/dist/run-detail.js.map +0 -1
- package/dist/run-index.d.ts +0 -71
- package/dist/run-index.js +0 -206
- package/dist/run-index.js.map +0 -1
- package/dist/run-narration-secrets.js +0 -68
- package/dist/run-narration-secrets.js.map +0 -1
- package/dist/run-paths.d.ts +0 -56
- package/dist/run-paths.js +0 -355
- package/dist/run-paths.js.map +0 -1
- package/dist/run-projection.d.ts +0 -186
- package/dist/run-projection.js +0 -350
- package/dist/run-projection.js.map +0 -1
- package/dist/run-status.d.ts +0 -139
- package/dist/run-status.js +0 -218
- package/dist/run-status.js.map +0 -1
- package/dist/run.d.ts +0 -1255
- package/dist/run.js +0 -5949
- package/dist/run.js.map +0 -1
- package/dist/sandbox-receipts.d.ts +0 -19
- package/dist/sandbox-receipts.js +0 -51
- package/dist/sandbox-receipts.js.map +0 -1
- package/dist/screenshot-image.d.ts +0 -11
- package/dist/screenshot-image.js +0 -26
- package/dist/screenshot-image.js.map +0 -1
- package/dist/scripted-browser-actor.d.ts +0 -297
- package/dist/scripted-browser-actor.js +0 -1399
- package/dist/scripted-browser-actor.js.map +0 -1
- package/dist/scripted-browser-lab.d.ts +0 -121
- package/dist/scripted-browser-lab.js +0 -852
- package/dist/scripted-browser-lab.js.map +0 -1
- package/dist/secret-prompt.js +0 -36
- package/dist/secret-prompt.js.map +0 -1
- package/dist/selected-output-paths.d.ts +0 -52
- package/dist/selected-output-paths.js +0 -366
- package/dist/selected-output-paths.js.map +0 -1
- package/dist/serve-exposure.d.ts +0 -62
- package/dist/serve-exposure.js +0 -129
- package/dist/serve-exposure.js.map +0 -1
- package/dist/serve-http.js +0 -45
- package/dist/serve-http.js.map +0 -1
- package/dist/serve-tunnel.js +0 -113
- package/dist/serve-tunnel.js.map +0 -1
- package/dist/shared-world-lab.d.ts +0 -269
- package/dist/shared-world-lab.js +0 -1424
- package/dist/shared-world-lab.js.map +0 -1
- package/dist/source-archive.d.ts +0 -82
- package/dist/source-archive.js +0 -408
- package/dist/source-archive.js.map +0 -1
- package/dist/stats.d.ts +0 -82
- package/dist/stats.js +0 -219
- package/dist/stats.js.map +0 -1
- package/dist/stop-conditions.d.ts +0 -39
- package/dist/stop-conditions.js +0 -66
- package/dist/stop-conditions.js.map +0 -1
- package/dist/study-analysis-codex-config.d.ts +0 -11
- package/dist/study-analysis-codex-config.js +0 -34
- package/dist/study-analysis-codex-config.js.map +0 -1
- package/dist/study-analysis-engine.d.ts +0 -47
- package/dist/study-analysis-engine.js +0 -327
- package/dist/study-analysis-engine.js.map +0 -1
- package/dist/study-analysis-evidence.d.ts +0 -27
- package/dist/study-analysis-evidence.js +0 -660
- package/dist/study-analysis-evidence.js.map +0 -1
- package/dist/study-analysis-job.d.ts +0 -97
- package/dist/study-analysis-job.js +0 -214
- package/dist/study-analysis-job.js.map +0 -1
- package/dist/study-analysis-provider.d.ts +0 -40
- package/dist/study-analysis-provider.js +0 -170
- package/dist/study-analysis-provider.js.map +0 -1
- package/dist/study-analysis-service.d.ts +0 -59
- package/dist/study-analysis-service.js +0 -257
- package/dist/study-analysis-service.js.map +0 -1
- package/dist/study-analysis-sharing.d.ts +0 -11
- package/dist/study-analysis-sharing.js +0 -35
- package/dist/study-analysis-sharing.js.map +0 -1
- package/dist/study-analysis-store.d.ts +0 -47
- package/dist/study-analysis-store.js +0 -493
- package/dist/study-analysis-store.js.map +0 -1
- package/dist/study-analysis-validation.d.ts +0 -618
- package/dist/study-analysis-validation.js +0 -384
- package/dist/study-analysis-validation.js.map +0 -1
- package/dist/study-analysis.d.ts +0 -206
- package/dist/study-analysis.js +0 -4
- package/dist/study-analysis.js.map +0 -1
- package/dist/study-costs.js +0 -114
- package/dist/study-costs.js.map +0 -1
- package/dist/subject-runtime.d.ts +0 -23
- package/dist/subject-runtime.js +0 -70
- package/dist/subject-runtime.js.map +0 -1
- package/dist/tasks.d.ts +0 -90
- package/dist/tasks.js +0 -144
- package/dist/tasks.js.map +0 -1
- package/dist/telemetry.js +0 -324
- package/dist/telemetry.js.map +0 -1
- package/dist/terminal-agent-actor.d.ts +0 -41
- package/dist/terminal-agent-actor.js +0 -25
- package/dist/terminal-agent-actor.js.map +0 -1
- package/dist/terminal-encoding.js +0 -80
- package/dist/terminal-encoding.js.map +0 -1
- package/dist/terminal-node-bootstrap.d.ts +0 -4
- package/dist/terminal-node-bootstrap.js +0 -58
- package/dist/terminal-node-bootstrap.js.map +0 -1
- package/dist/terminal-participant-activity.d.ts +0 -6
- package/dist/terminal-participant-activity.js +0 -34
- package/dist/terminal-participant-activity.js.map +0 -1
- package/dist/terminal-runtime-auth.d.ts +0 -13
- package/dist/terminal-runtime-auth.js +0 -24
- package/dist/terminal-runtime-auth.js.map +0 -1
- package/dist/terminal-runtime.d.ts +0 -16
- package/dist/terminal-runtime.js +0 -42
- package/dist/terminal-runtime.js.map +0 -1
- package/dist/terminal-token-usage.d.ts +0 -15
- package/dist/terminal-token-usage.js +0 -94
- package/dist/terminal-token-usage.js.map +0 -1
- package/dist/tui-actions.d.ts +0 -39
- package/dist/tui-actions.js +0 -178
- package/dist/tui-actions.js.map +0 -1
- package/dist/tui-contract.d.ts +0 -141
- package/dist/tui-contract.js +0 -54
- package/dist/tui-contract.js.map +0 -1
- package/dist/tui-launch.js +0 -167
- package/dist/tui-launch.js.map +0 -1
- package/dist/tui-project.d.ts +0 -9
- package/dist/tui-project.js +0 -18
- package/dist/tui-project.js.map +0 -1
- package/docs/architecture/examples/state-driven-local-app/README.md +0 -80
- package/docs/architecture/examples/state-driven-local-app/app.mjs +0 -48
- package/docs/architecture/examples/state-driven-local-app/runner.mjs +0 -105
- package/docs/architecture/local-codex-tui-actor.md +0 -213
- package/docs/architecture/oss-lab-poc.md +0 -250
- package/docs/architecture/runtime-broker-core.md +0 -30
- package/docs/release/0.100.0-local-setup.md +0 -31
- package/docs/release/0.100.1-participant-continuity.md +0 -20
- package/docs/release/0.101.0-codex-ui-tools.md +0 -28
- package/docs/release/0.102.0-participant-media.md +0 -43
- package/docs/release/0.103.0-desktop-recording.md +0 -29
- package/docs/release/0.103.1-analysis-capture-allocation.md +0 -18
- package/docs/release/0.103.2-analysis-ending-context.md +0 -21
- package/docs/release/0.104.0-local-captured-inboxes.md +0 -29
- package/docs/release/0.104.1-recording-startup.md +0 -24
- package/docs/release/0.104.2-recording-timestamps.md +0 -32
- package/docs/release/0.104.3-local-smtp-catch.md +0 -15
- package/docs/release/0.105.0-participant-backgrounds.md +0 -50
- package/docs/release/0.20.0-external-public-shared-world.md +0 -43
- package/docs/release/0.84.0-redacted-evidence.md +0 -42
- package/docs/release/0.84.1-portable-feedback.md +0 -20
- package/docs/release/0.85.0-observer-review.md +0 -56
- package/docs/release/0.85.1-observer-continuity.md +0 -20
- package/docs/release/0.86.0-participant-evidence.md +0 -50
- package/docs/release/0.86.1-task-preflight-saved-recordings.md +0 -40
- package/docs/release/0.87.0-participant-endings-and-phone-review.md +0 -64
- package/docs/release/0.88.0-study-diagnostics.md +0 -43
- package/docs/release/0.88.1-completion-evidence-and-local-app.md +0 -79
- package/docs/release/0.88.2-sequential-study-budgets.md +0 -57
- package/docs/release/0.89.0-study-findings.md +0 -79
- package/docs/release/0.89.1-analysis-finished-notice.md +0 -24
- package/docs/release/0.90.0-automatic-analysis.md +0 -21
- package/docs/release/0.91.0-analysis-quality-and-defaults.md +0 -33
- package/docs/release/0.91.1-study-review-polish.md +0 -28
- package/docs/release/0.92.0-grid-playback.md +0 -22
- package/docs/release/0.93.0-global-playback.md +0 -26
- package/docs/release/0.93.1-observer-review-controls.md +0 -24
- package/docs/release/0.94.0-reliability.md +0 -48
- package/docs/release/0.95.0-connections-setup.md +0 -38
- package/docs/release/0.96.0-real-email-receiving.md +0 -47
- package/docs/release/0.96.1-browser-navigation.md +0 -22
- package/docs/release/0.97.0-codex-account-analysis.md +0 -45
- package/docs/release/0.98.0-local-browser-studies.md +0 -31
- package/docs/release/0.99.0-local-browser-mac.md +0 -34
- package/docs/release/0.99.1-action-recovery.md +0 -19
- /package/dist/{agent-session.d.ts → actors/agent-session.d.ts} +0 -0
- /package/dist/{cua-executor-error.d.ts → actors/computer-use/executor-error.d.ts} +0 -0
- /package/dist/{cua-speech.d.ts → actors/computer-use/speech.d.ts} +0 -0
- /package/dist/{actor-goal-source.d.ts → actors/goal-source.d.ts} +0 -0
- /package/dist/{output-token-limit.d.ts → actors/output-token-limit.d.ts} +0 -0
- /package/dist/{reasoning-effort.d.ts → actors/reasoning-effort.d.ts} +0 -0
- /package/dist/{secret-prompt.d.ts → cli/secret-prompt.d.ts} +0 -0
- /package/dist/{telemetry.d.ts → cli/telemetry.d.ts} +0 -0
- /package/dist/{browser-evidence-hygiene.d.ts → evidence/browser-hygiene.d.ts} +0 -0
- /package/dist/{serve-http.d.ts → observer/http.d.ts} +0 -0
- /package/dist/{observer-library.d.ts → observer/library.d.ts} +0 -0
- /package/dist/{listen.d.ts → observer/listen.d.ts} +0 -0
- /package/dist/{observer-static.d.ts → observer/static.d.ts} +0 -0
- /package/dist/{serve-tunnel.d.ts → observer/tunnel.d.ts} +0 -0
- /package/dist/{terminal-encoding.d.ts → routes/terminal/encoding.d.ts} +0 -0
- /package/dist/{concurrency.d.ts → run/concurrency.d.ts} +0 -0
- /package/dist/{study-costs.d.ts → run/costs.d.ts} +0 -0
- /package/dist/{run-narration-secrets.d.ts → run/transient-comms-secrets.d.ts} +0 -0
- /package/dist/{tui-launch.d.ts → tui/launch.d.ts} +0 -0
|
@@ -1,737 +0,0 @@
|
|
|
1
|
-
// Deploy the vendor-neutral email catch INSIDE the subject E2B sandbox and bridge captured sends back
|
|
2
|
-
// to the host bus (#297 config-block core). The host `startEmailCatchServer` binds the HOST's loopback,
|
|
3
|
-
// which a sandboxed app cannot reach — `127.0.0.1:PORT` from the app is the SANDBOX's loopback. So the
|
|
4
|
-
// listener must live in the sandbox: we write a tiny self-contained capture server (no deps, no host
|
|
5
|
-
// import) into the sandbox, launch it detached (the same substrate that serves the subject app), and
|
|
6
|
-
// each poll `cat` its append-only NDJSON of captured sends back to the host, where the real profiles
|
|
7
|
-
// parse them and route into the CommsChannel. A FIXED loopback port is chosen up front so the app's
|
|
8
|
-
// injected base-URL env (`http://127.0.0.1:<port>`) is known before the sandbox is created.
|
|
9
|
-
import { FakeInbox } from "./comms-fake-inbox.js";
|
|
10
|
-
import { buildCommsThreadArtifact } from "./comms-evidence.js";
|
|
11
|
-
import { buildInboxSurface } from "./comms-inbox.js";
|
|
12
|
-
import { DEFAULT_EMAIL_PROFILES } from "./comms-email-catch.js";
|
|
13
|
-
import { startDetachedProcess } from "./e2b-detached.js";
|
|
14
|
-
/** The default in-sandbox loopback port for the catch. Fixed (not ephemeral) so the injected base-URL
|
|
15
|
-
* env is known before `createDesktopSandbox`. 8025 is the conventional local-mail-UI port and is
|
|
16
|
-
* unlikely to collide with a subject app; override via config if it does. */
|
|
17
|
-
export const DEFAULT_SANDBOX_CATCH_PORT = 8025;
|
|
18
|
-
const DEFAULT_CATCH_DIR = "/tmp/humanish-comms";
|
|
19
|
-
/** Single-quote for safe shell interpolation. */
|
|
20
|
-
function shq(value) {
|
|
21
|
-
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* The self-contained in-sandbox capture server — a plain **python3** script (stdlib only), because the
|
|
25
|
-
* stock E2B desktop template ships python3 but NOT node, and the co-located catcher must run in a
|
|
26
|
-
* runtime the sandbox guarantees (the precedented choice: LocalStack is a python catcher the app points
|
|
27
|
-
* at; you pick the runtime the environment has). It runs on the sandbox's own python3, imports nothing
|
|
28
|
-
* from humanish. DELIBERATELY dumb: it records each POST verbatim as an NDJSON line `{t, path, body}`
|
|
29
|
-
* and returns a plausible provider success — all normalization/profile parsing happens host-side on the
|
|
30
|
-
* drained lines, so the typed, tested profiles stay in one place. It also serves the host-rendered inbox
|
|
31
|
-
* surface statically at /inbox + /api/inbox (with a script-forbidding CSP). argv: <port> <deliveriesFile>
|
|
32
|
-
* <servedDir> [inboxPort]. The capture listener binds 127.0.0.1 (loopback) — the app under test reaches
|
|
33
|
-
* it in-sandbox, nothing on the internet can inject a fake send. When an [inboxPort] is given (the
|
|
34
|
-
* shared-world route, where the persona lives in a DIFFERENT sandbox), it ALSO starts a READ-ONLY inbox
|
|
35
|
-
* listener on 0.0.0.0:<inboxPort> so getHost can proxy the persona's inbox reads to it; that listener
|
|
36
|
-
* serves GET only (POST → 405). The CUA same-sandbox route omits it and stays loopback-only.
|
|
37
|
-
*/
|
|
38
|
-
export const SANDBOX_CATCH_SCRIPT = `import json
|
|
39
|
-
import os
|
|
40
|
-
import random
|
|
41
|
-
import sys
|
|
42
|
-
import threading
|
|
43
|
-
import time
|
|
44
|
-
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
45
|
-
from urllib.parse import unquote
|
|
46
|
-
|
|
47
|
-
PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 8025
|
|
48
|
-
OUT_FILE = sys.argv[2] if len(sys.argv) > 2 else "/tmp/humanish-comms/deliveries.ndjson"
|
|
49
|
-
SERVED_DIR = sys.argv[3] if len(sys.argv) > 3 else (os.path.dirname(OUT_FILE) + "/surface")
|
|
50
|
-
INBOX_PORT = int(sys.argv[4]) if len(sys.argv) > 4 else 0
|
|
51
|
-
# Optional shared token guarding GET /deliveries (the drain read). Empty = unguarded, which is the
|
|
52
|
-
# in-sandbox default: the capture listener binds loopback there, so nothing external can reach it.
|
|
53
|
-
# An ADOPTER-HOSTED catch is reachable over the network, so it should pass one.
|
|
54
|
-
DELIVERIES_TOKEN = sys.argv[5] if len(sys.argv) > 5 else ""
|
|
55
|
-
# Optional loopback SMTP listener. Most self-hostable apps send mail over SMTP rather than an HTTP
|
|
56
|
-
# provider API, so without this the catch only works for the minority that speak HTTP.
|
|
57
|
-
SMTP_PORT = int(sys.argv[6]) if len(sys.argv) > 6 else 0
|
|
58
|
-
try:
|
|
59
|
-
os.makedirs(os.path.dirname(OUT_FILE), exist_ok=True)
|
|
60
|
-
except Exception:
|
|
61
|
-
pass
|
|
62
|
-
MAX_BODY = 5 * 1024 * 1024
|
|
63
|
-
CSP = "default-src 'self'; script-src 'none'; object-src 'none'; base-uri 'none'; frame-src 'none'; img-src * data:; style-src 'unsafe-inline'; font-src * data:"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def message_id():
|
|
67
|
-
return "humanish-catch-" + format(int(time.time() * 1000), "x") + format(random.randrange(16 ** 8), "08x")
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class BaseHandler(BaseHTTPRequestHandler):
|
|
71
|
-
def log_message(self, *args):
|
|
72
|
-
return
|
|
73
|
-
|
|
74
|
-
def _json(self, status, obj, extra_headers=None):
|
|
75
|
-
payload = json.dumps(obj).encode("utf-8")
|
|
76
|
-
self.send_response(status)
|
|
77
|
-
self.send_header("content-type", "application/json; charset=utf-8")
|
|
78
|
-
for key, value in (extra_headers or {}).items():
|
|
79
|
-
self.send_header(key, value)
|
|
80
|
-
self.end_headers()
|
|
81
|
-
self.wfile.write(payload)
|
|
82
|
-
|
|
83
|
-
def do_GET(self):
|
|
84
|
-
path = self.path.split("?")[0]
|
|
85
|
-
if path == "/health":
|
|
86
|
-
self._json(200, {"ok": True, "service": "humanish-comms-catch", "capabilities": ["recipient-inbox-v1", "captured-inline-images-v1"]})
|
|
87
|
-
return
|
|
88
|
-
if path == "/":
|
|
89
|
-
# A persona that trims the /inbox path lands here. It used to get the health JSON and read
|
|
90
|
-
# it as "wrong place / broken", so send it where it meant to go. /health keeps the machine
|
|
91
|
-
# marker: both readiness probes assert on /health specifically, never on /.
|
|
92
|
-
self.send_response(200)
|
|
93
|
-
self.send_header("content-type", "text/html; charset=utf-8")
|
|
94
|
-
self.send_header("content-security-policy", CSP)
|
|
95
|
-
self.end_headers()
|
|
96
|
-
self.wfile.write(b"<!doctype html><title>Mailbox</title><p><a href='/inbox'>Open the inbox</a></p>")
|
|
97
|
-
return
|
|
98
|
-
if path == "/deliveries":
|
|
99
|
-
# The drain read. In-sandbox humanish reads the NDJSON file directly; an adopter-hosted
|
|
100
|
-
# catch is on another machine, so the same bytes are served over HTTP. Capture bodies
|
|
101
|
-
# can contain a verification link, so this is the one route worth guarding.
|
|
102
|
-
if DELIVERIES_TOKEN:
|
|
103
|
-
supplied = self.headers.get("authorization", "")
|
|
104
|
-
if supplied != ("Bearer " + DELIVERIES_TOKEN):
|
|
105
|
-
self._json(401, {"error": "unauthorized"})
|
|
106
|
-
return
|
|
107
|
-
try:
|
|
108
|
-
with open(OUT_FILE, "rb") as handle:
|
|
109
|
-
body = handle.read()
|
|
110
|
-
except Exception:
|
|
111
|
-
body = b""
|
|
112
|
-
self.send_response(200)
|
|
113
|
-
self.send_header("content-type", "application/x-ndjson; charset=utf-8")
|
|
114
|
-
self.send_header("cache-control", "no-store")
|
|
115
|
-
self.end_headers()
|
|
116
|
-
self.wfile.write(body)
|
|
117
|
-
return
|
|
118
|
-
if path == "/inbox" or path.startswith("/inbox/") or path == "/api/inbox" or path.startswith("/api/inbox/"):
|
|
119
|
-
rel = unquote(path)
|
|
120
|
-
if ".." in rel or chr(0) in rel:
|
|
121
|
-
self.send_response(400)
|
|
122
|
-
self.end_headers()
|
|
123
|
-
return
|
|
124
|
-
data = None
|
|
125
|
-
for candidate in (SERVED_DIR + rel, SERVED_DIR + rel + "/index"):
|
|
126
|
-
try:
|
|
127
|
-
with open(candidate, "rb") as handle:
|
|
128
|
-
data = handle.read()
|
|
129
|
-
break
|
|
130
|
-
except Exception:
|
|
131
|
-
data = None
|
|
132
|
-
if data is None:
|
|
133
|
-
import re
|
|
134
|
-
if re.fullmatch(r"/(api/)?inbox/for/[a-f0-9]{64}/?", rel):
|
|
135
|
-
if rel.startswith("/api/"):
|
|
136
|
-
self._json(200, [])
|
|
137
|
-
return
|
|
138
|
-
self.send_response(200)
|
|
139
|
-
self.send_header("content-type", "text/html; charset=utf-8")
|
|
140
|
-
self.send_header("content-security-policy", CSP)
|
|
141
|
-
self.send_header("cache-control", "no-store")
|
|
142
|
-
self.end_headers()
|
|
143
|
-
self.wfile.write(b"<!doctype html><html lang='en'><meta name='viewport' content='width=device-width,initial-scale=1'><title>Your inbox</title><main><h1>Your inbox</h1><p>No messages yet.</p></main></html>")
|
|
144
|
-
return
|
|
145
|
-
# A JSON route answers in JSON; only the HTML route answers in HTML.
|
|
146
|
-
if rel.startswith("/api/"):
|
|
147
|
-
self._json(404, {"error": "message not found"})
|
|
148
|
-
return
|
|
149
|
-
self.send_response(404)
|
|
150
|
-
self.send_header("content-type", "text/html; charset=utf-8")
|
|
151
|
-
self.send_header("content-security-policy", CSP)
|
|
152
|
-
self.end_headers()
|
|
153
|
-
scope = re.match(r"^/inbox/for/[a-f0-9]{64}(?:/|$)", rel)
|
|
154
|
-
back = scope.group(0).rstrip("/") if scope else (None if rel.startswith("/inbox/for") else "/inbox")
|
|
155
|
-
body = "<!doctype html><title>Mailbox</title><p>message not found</p>"
|
|
156
|
-
if back:
|
|
157
|
-
body += "<p><a href='" + back + "'>Back to the inbox</a></p>"
|
|
158
|
-
self.wfile.write(body.encode("utf-8"))
|
|
159
|
-
return
|
|
160
|
-
is_api = rel.startswith("/api/")
|
|
161
|
-
self.send_response(200)
|
|
162
|
-
self.send_header("cache-control", "no-store")
|
|
163
|
-
self.send_header("referrer-policy", "no-referrer")
|
|
164
|
-
self.send_header("x-content-type-options", "nosniff")
|
|
165
|
-
self.send_header("content-type", "application/json; charset=utf-8" if is_api else "text/html; charset=utf-8")
|
|
166
|
-
if not is_api:
|
|
167
|
-
self.send_header("content-security-policy", CSP)
|
|
168
|
-
self.end_headers()
|
|
169
|
-
self.wfile.write(data)
|
|
170
|
-
return
|
|
171
|
-
self._json(404, {"error": "not found"})
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
class CaptureHandler(BaseHandler):
|
|
175
|
-
def do_POST(self):
|
|
176
|
-
path = self.path.split("?")[0]
|
|
177
|
-
try:
|
|
178
|
-
length = int(self.headers.get("content-length") or 0)
|
|
179
|
-
except Exception:
|
|
180
|
-
length = 0
|
|
181
|
-
if length > MAX_BODY:
|
|
182
|
-
self.send_response(413)
|
|
183
|
-
self.end_headers()
|
|
184
|
-
return
|
|
185
|
-
body = self.rfile.read(length).decode("utf-8", "replace") if length > 0 else ""
|
|
186
|
-
try:
|
|
187
|
-
with open(OUT_FILE, "a", encoding="utf-8") as handle:
|
|
188
|
-
print(json.dumps({"t": int(time.time() * 1000), "path": path, "body": body}), file=handle)
|
|
189
|
-
except Exception:
|
|
190
|
-
pass
|
|
191
|
-
mid = message_id()
|
|
192
|
-
if path == "/v3/mail/send":
|
|
193
|
-
self.send_response(202)
|
|
194
|
-
self.send_header("x-message-id", mid)
|
|
195
|
-
self.end_headers()
|
|
196
|
-
elif path.endswith("/batch"):
|
|
197
|
-
self._json(200, {"data": [{"id": mid}]})
|
|
198
|
-
else:
|
|
199
|
-
self._json(200, {"id": mid})
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
class ReadOnlyHandler(BaseHandler):
|
|
203
|
-
def do_GET(self):
|
|
204
|
-
if self.path.split("?")[0] == "/deliveries":
|
|
205
|
-
self._json(404, {"error": "not found"})
|
|
206
|
-
return
|
|
207
|
-
super().do_GET()
|
|
208
|
-
|
|
209
|
-
def do_POST(self):
|
|
210
|
-
self.send_response(405)
|
|
211
|
-
self.end_headers()
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
# Optional read-only inbox listener on 0.0.0.0 (getHost-reachable from a DIFFERENT sandbox on the
|
|
215
|
-
# shared-world route). Serves GET /inbox + /api/inbox + /health only; POST capture stays on the
|
|
216
|
-
# 127.0.0.1 listener so nothing on the internet can inject a fake captured send. Started only when a
|
|
217
|
-
# distinct inbox port is provided (the CUA same-sandbox route omits it and stays loopback-only).
|
|
218
|
-
if INBOX_PORT and INBOX_PORT != PORT:
|
|
219
|
-
threading.Thread(target=lambda: ThreadingHTTPServer(("0.0.0.0", INBOX_PORT), ReadOnlyHandler).serve_forever(), daemon=True).start()
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
# Minimal SMTP capture listener. Most self-hostable apps send mail through SMTP, not an HTTP provider
|
|
223
|
-
# API, so an HTTP-only catch could not study them at all. Plain sockets and the stdlib email parser:
|
|
224
|
-
# python 3.12 removed smtpd, and a co-located catcher must not need a dependency.
|
|
225
|
-
#
|
|
226
|
-
# It normalizes each message into the SAME NDJSON line an HTTP send produces, on the /emails path, so
|
|
227
|
-
# every host-side profile, the inbox surface, and the drain work unchanged — SMTP is a transport
|
|
228
|
-
# here, not a second pipeline.
|
|
229
|
-
# Built from chr() rather than a backslash escape: this script lives inside a TS template
|
|
230
|
-
# literal, where JS would consume the escape before python ever saw it.
|
|
231
|
-
CRLF = chr(13) + chr(10)
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
def smtp_reply(conn, text):
|
|
235
|
-
conn.sendall((text + CRLF).encode("utf-8"))
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
def smtp_session(conn):
|
|
239
|
-
import email
|
|
240
|
-
from email import policy
|
|
241
|
-
|
|
242
|
-
reader = conn.makefile("rb")
|
|
243
|
-
smtp_reply(conn, "220 humanish-comms-catch")
|
|
244
|
-
sender = ""
|
|
245
|
-
rcpts = []
|
|
246
|
-
while True:
|
|
247
|
-
line = reader.readline()
|
|
248
|
-
if not line:
|
|
249
|
-
break
|
|
250
|
-
command = line.decode("utf-8", "replace").strip()
|
|
251
|
-
upper = command.upper()
|
|
252
|
-
if upper.startswith("EHLO") or upper.startswith("HELO"):
|
|
253
|
-
# AUTH is advertised and then accepted unconditionally: the app under test holds
|
|
254
|
-
# whatever credentials its config carries, and this listener is loopback-only.
|
|
255
|
-
smtp_reply(conn, "250-humanish-comms-catch")
|
|
256
|
-
smtp_reply(conn, "250 AUTH PLAIN LOGIN")
|
|
257
|
-
elif upper.startswith("AUTH"):
|
|
258
|
-
smtp_reply(conn, "235 2.7.0 accepted")
|
|
259
|
-
elif upper.startswith("MAIL FROM"):
|
|
260
|
-
sender = command[command.find(":") + 1 :].strip().strip("<>")
|
|
261
|
-
smtp_reply(conn, "250 2.1.0 ok")
|
|
262
|
-
elif upper.startswith("RCPT TO"):
|
|
263
|
-
rcpts.append(command[command.find(":") + 1 :].strip().strip("<>"))
|
|
264
|
-
smtp_reply(conn, "250 2.1.5 ok")
|
|
265
|
-
elif upper == "DATA":
|
|
266
|
-
smtp_reply(conn, "354 end with <CRLF>.<CRLF>")
|
|
267
|
-
raw = b""
|
|
268
|
-
while True:
|
|
269
|
-
chunk = reader.readline()
|
|
270
|
-
if not chunk or chunk.strip() == b".":
|
|
271
|
-
break
|
|
272
|
-
# Undo dot-stuffing (RFC 5321): a leading '.' on a body line is doubled on the wire.
|
|
273
|
-
if chunk.startswith(b".."):
|
|
274
|
-
chunk = chunk[1:]
|
|
275
|
-
raw += chunk
|
|
276
|
-
if len(raw) > MAX_BODY:
|
|
277
|
-
break
|
|
278
|
-
try:
|
|
279
|
-
parsed = email.message_from_bytes(raw, policy=policy.default)
|
|
280
|
-
subject = str(parsed.get("subject") or "")
|
|
281
|
-
html_part = parsed.get_body(preferencelist=("html", "plain"))
|
|
282
|
-
body = html_part.get_content() if html_part is not None else ""
|
|
283
|
-
import base64
|
|
284
|
-
inline_images = []
|
|
285
|
-
image_bytes = 0
|
|
286
|
-
for part in parsed.walk():
|
|
287
|
-
cid = str(part.get("Content-ID") or "").strip().strip("<>")
|
|
288
|
-
content_type = part.get_content_type()
|
|
289
|
-
if not cid or len(cid) > 256 or content_type not in ("image/png", "image/jpeg", "image/gif", "image/webp"):
|
|
290
|
-
continue
|
|
291
|
-
payload = part.get_payload(decode=True) or b""
|
|
292
|
-
if not payload or len(payload) > 1024 * 1024:
|
|
293
|
-
continue
|
|
294
|
-
image_bytes += len(payload)
|
|
295
|
-
if len(inline_images) >= 12 or image_bytes > 2 * 1024 * 1024:
|
|
296
|
-
break
|
|
297
|
-
inline_images.append({"contentId": cid, "contentType": content_type, "base64": base64.b64encode(payload).decode("ascii")})
|
|
298
|
-
except Exception:
|
|
299
|
-
subject = ""
|
|
300
|
-
body = raw.decode("utf-8", "replace")
|
|
301
|
-
inline_images = []
|
|
302
|
-
record = {
|
|
303
|
-
"t": int(time.time() * 1000),
|
|
304
|
-
"path": "/emails",
|
|
305
|
-
"body": json.dumps({"from": sender, "to": rcpts, "subject": subject, "html": body, "inlineImages": inline_images})
|
|
306
|
-
}
|
|
307
|
-
# Same append convention as the HTTP capture path: one line, opened in append mode.
|
|
308
|
-
with open(OUT_FILE, "a", encoding="utf-8") as handle:
|
|
309
|
-
print(json.dumps(record), file=handle)
|
|
310
|
-
sender = ""
|
|
311
|
-
rcpts = []
|
|
312
|
-
smtp_reply(conn, "250 2.0.0 queued")
|
|
313
|
-
elif upper == "RSET":
|
|
314
|
-
sender = ""
|
|
315
|
-
rcpts = []
|
|
316
|
-
smtp_reply(conn, "250 2.0.0 ok")
|
|
317
|
-
elif upper == "QUIT":
|
|
318
|
-
smtp_reply(conn, "221 2.0.0 bye")
|
|
319
|
-
break
|
|
320
|
-
elif upper == "NOOP":
|
|
321
|
-
smtp_reply(conn, "250 2.0.0 ok")
|
|
322
|
-
else:
|
|
323
|
-
smtp_reply(conn, "250 2.0.0 ok")
|
|
324
|
-
try:
|
|
325
|
-
conn.close()
|
|
326
|
-
except Exception:
|
|
327
|
-
pass
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
def smtp_serve(server):
|
|
331
|
-
while True:
|
|
332
|
-
conn, _ = server.accept()
|
|
333
|
-
threading.Thread(target=smtp_session, args=(conn,), daemon=True).start()
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
if SMTP_PORT:
|
|
337
|
-
import socket
|
|
338
|
-
|
|
339
|
-
# Bind before serving HTTP health: a busy SMTP port must fail startup, not
|
|
340
|
-
# leave a healthy-looking catch that silently cannot receive the app's mail.
|
|
341
|
-
smtp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
342
|
-
smtp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
343
|
-
smtp_server.bind(("127.0.0.1", SMTP_PORT))
|
|
344
|
-
smtp_server.listen(16)
|
|
345
|
-
threading.Thread(target=lambda: smtp_serve(smtp_server), daemon=True).start()
|
|
346
|
-
|
|
347
|
-
ThreadingHTTPServer(("127.0.0.1", PORT), CaptureHandler).serve_forever()
|
|
348
|
-
`;
|
|
349
|
-
/** Readiness probe that asserts OUR service marker in the /health body (not merely any 2xx) — so a
|
|
350
|
-
* process squatting on the fixed port cannot produce a false "ready" while the app's sends bypass us. */
|
|
351
|
-
async function catchHealthy(desktop, port, options) {
|
|
352
|
-
const now = options.now ?? Date.now;
|
|
353
|
-
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
354
|
-
const deadline = now() + options.timeoutMs;
|
|
355
|
-
for (;;) {
|
|
356
|
-
const result = await desktop.commands
|
|
357
|
-
.run(`curl -s --max-time 5 http://127.0.0.1:${port}/health 2>/dev/null || true`, { requestTimeoutMs: options.requestTimeoutMs })
|
|
358
|
-
.catch(() => ({ stdout: "" }));
|
|
359
|
-
if ((result.stdout ?? "").includes("humanish-comms-catch"))
|
|
360
|
-
return true;
|
|
361
|
-
if (now() >= deadline)
|
|
362
|
-
return false;
|
|
363
|
-
await sleep(1000);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Write + launch the in-sandbox catch (detached), then probe it ready. Call AFTER the subject sandbox
|
|
368
|
-
* is created and BEFORE the subject app's serve.start, so the base URL resolves at the app's boot.
|
|
369
|
-
*/
|
|
370
|
-
export async function deployCommsCatch(desktop, options = {}) {
|
|
371
|
-
// Validate the port to an integer before it reaches the shell command (defense-in-depth: a future
|
|
372
|
-
// caller might cast a config value; the value is typed `number` but this makes injection impossible).
|
|
373
|
-
const port = Math.trunc(Number(options.port ?? DEFAULT_SANDBOX_CATCH_PORT));
|
|
374
|
-
if (!Number.isInteger(port) || port <= 0 || port > 65_535) {
|
|
375
|
-
throw new Error(`deployCommsCatch: invalid port ${JSON.stringify(options.port)}`);
|
|
376
|
-
}
|
|
377
|
-
const inboxPort = options.inboxPort === undefined ? undefined : Math.trunc(Number(options.inboxPort));
|
|
378
|
-
if (inboxPort !== undefined && (!Number.isInteger(inboxPort) || inboxPort <= 0 || inboxPort > 65_535 || inboxPort === port)) {
|
|
379
|
-
throw new Error(`deployCommsCatch: invalid inboxPort ${JSON.stringify(options.inboxPort)}`);
|
|
380
|
-
}
|
|
381
|
-
const smtpPort = options.smtpPort === undefined ? undefined : Math.trunc(Number(options.smtpPort));
|
|
382
|
-
if (smtpPort !== undefined &&
|
|
383
|
-
(!Number.isInteger(smtpPort) || smtpPort <= 0 || smtpPort > 65_535 || smtpPort === port || smtpPort === inboxPort)) {
|
|
384
|
-
throw new Error(`deployCommsCatch: invalid smtpPort ${JSON.stringify(options.smtpPort)}`);
|
|
385
|
-
}
|
|
386
|
-
const dir = options.dir ?? DEFAULT_CATCH_DIR;
|
|
387
|
-
const name = options.name ?? "comms-catch";
|
|
388
|
-
const requestTimeoutMs = options.requestTimeoutMs ?? 30_000;
|
|
389
|
-
const scriptPath = `${dir}/catch.py`;
|
|
390
|
-
const deliveriesPath = `${dir}/deliveries.ndjson`;
|
|
391
|
-
const surfaceDir = `${dir}/surface`;
|
|
392
|
-
await desktop.commands.run(`mkdir -p ${shq(dir)} ${shq(surfaceDir)}`, { requestTimeoutMs });
|
|
393
|
-
await desktop.files.write(scriptPath, SANDBOX_CATCH_SCRIPT);
|
|
394
|
-
await startDetachedProcess(desktop, {
|
|
395
|
-
name,
|
|
396
|
-
command: [
|
|
397
|
-
"python3",
|
|
398
|
-
shq(scriptPath),
|
|
399
|
-
String(port),
|
|
400
|
-
shq(deliveriesPath),
|
|
401
|
-
shq(surfaceDir),
|
|
402
|
-
...(inboxPort === undefined && smtpPort === undefined ? [] : [String(inboxPort ?? 0)]),
|
|
403
|
-
// The token slot is positional: an SMTP port cannot be reached without filling it. In-sandbox
|
|
404
|
-
// the capture listener is loopback-only, so an empty token is the same posture as before.
|
|
405
|
-
...(smtpPort === undefined ? [] : ['""', String(smtpPort)])
|
|
406
|
-
].join(" "),
|
|
407
|
-
requestTimeoutMs
|
|
408
|
-
});
|
|
409
|
-
const probe = { timeoutMs: options.readyTimeoutMs ?? 15_000, requestTimeoutMs, ...(options.timers ?? {}) };
|
|
410
|
-
const ready = await catchHealthy(desktop, port, probe);
|
|
411
|
-
// Confirm the read-only inbox listener bound too (loopback-reachable at its own port), when requested —
|
|
412
|
-
// else a getHost-exposed inbox would 502. Fail closed by folding it into `ready`.
|
|
413
|
-
const inboxReady = inboxPort === undefined ? true : await catchHealthy(desktop, inboxPort, probe);
|
|
414
|
-
return {
|
|
415
|
-
port,
|
|
416
|
-
baseUrl: `http://127.0.0.1:${port}`,
|
|
417
|
-
deliveriesPath,
|
|
418
|
-
surfaceDir,
|
|
419
|
-
...(inboxPort === undefined ? {} : { inboxPort }),
|
|
420
|
-
...(smtpPort === undefined ? {} : { smtpPort }),
|
|
421
|
-
ready: ready && inboxReady
|
|
422
|
-
};
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Drain new captured sends from the in-sandbox NDJSON since `cursor` (a line count). Returns the fresh
|
|
426
|
-
* sends and the new cursor. Cheap `cat` over commands.run; NDJSON is small for a run.
|
|
427
|
-
*/
|
|
428
|
-
export async function drainCommsCatch(desktop, deployed, cursor = 0, requestTimeoutMs = 30_000) {
|
|
429
|
-
const result = await desktop.commands.run(`cat ${shq(deployed.deliveriesPath)} 2>/dev/null || true`, { requestTimeoutMs });
|
|
430
|
-
const stdout = result.stdout ?? "";
|
|
431
|
-
let lines = stdout.split("\n").filter((line) => line.trim().length > 0);
|
|
432
|
-
// If the file doesn't end in a newline, the last line may be a PARTIAL append (the host `cat` raced
|
|
433
|
-
// an in-sandbox append of a large body). Drop it and don't advance the cursor past it — it re-reads
|
|
434
|
-
// complete on the next poll, so a captured send is never lost to the race (the script only ever emits
|
|
435
|
-
// valid JSON, so an incomplete line is the only cause of a parse miss).
|
|
436
|
-
if (!stdout.endsWith("\n") && lines.length > 0)
|
|
437
|
-
lines = lines.slice(0, -1);
|
|
438
|
-
const sends = [];
|
|
439
|
-
for (const line of lines.slice(cursor)) {
|
|
440
|
-
try {
|
|
441
|
-
const parsed = JSON.parse(line);
|
|
442
|
-
if (typeof parsed.path === "string" && typeof parsed.body === "string") {
|
|
443
|
-
sends.push({ path: parsed.path, body: parsed.body, t: typeof parsed.t === "number" ? parsed.t : 0 });
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
catch {
|
|
447
|
-
// skip a malformed line
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
return { sends, cursor: lines.length };
|
|
451
|
-
}
|
|
452
|
-
/**
|
|
453
|
-
* Parse an append-only deliveries NDJSON blob into raw sends. Split out of drainCommsCatch (#380) so
|
|
454
|
-
* the SAME parsing serves a sandbox we own (read over the E2B command channel) and a catch running on
|
|
455
|
-
* a plane we do not own (read from the local filesystem by `humanish comms catch`).
|
|
456
|
-
*
|
|
457
|
-
* A file that does not end in a newline may have a PARTIAL last line — a reader racing an append of a
|
|
458
|
-
* large body. Dropping it is never lossy: the script only ever emits valid JSON lines, so an incomplete
|
|
459
|
-
* line re-reads complete on the next pass.
|
|
460
|
-
*/
|
|
461
|
-
export function parseDeliveriesNdjson(text) {
|
|
462
|
-
let lines = text.split("\n").filter((line) => line.trim().length > 0);
|
|
463
|
-
if (!text.endsWith("\n") && lines.length > 0)
|
|
464
|
-
lines = lines.slice(0, -1);
|
|
465
|
-
const sends = [];
|
|
466
|
-
for (const line of lines) {
|
|
467
|
-
try {
|
|
468
|
-
const parsed = JSON.parse(line);
|
|
469
|
-
if (typeof parsed.path === "string" && typeof parsed.body === "string") {
|
|
470
|
-
sends.push({ path: parsed.path, body: parsed.body, t: typeof parsed.t === "number" ? parsed.t : 0 });
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
catch {
|
|
474
|
-
// skip a malformed line
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
return sends;
|
|
478
|
-
}
|
|
479
|
-
/**
|
|
480
|
-
* The distinct `to` addresses the captured mail was actually sent to, parsed with the SAME profiles
|
|
481
|
-
* that route it. A lab run knows its recipients from the declared roster; a standalone catch does not,
|
|
482
|
-
* so it discovers them from the mail itself — otherwise an operator who forgot to name an address gets
|
|
483
|
-
* a technically-healthy catch rendering an empty inbox forever, which is the false-green class #380 is
|
|
484
|
-
* about.
|
|
485
|
-
*/
|
|
486
|
-
export function capturedRecipientAddresses(sends, profiles = DEFAULT_EMAIL_PROFILES) {
|
|
487
|
-
const addresses = new Set();
|
|
488
|
-
for (const send of sends) {
|
|
489
|
-
let parsed;
|
|
490
|
-
try {
|
|
491
|
-
parsed = JSON.parse(send.body.length > 0 ? send.body : "{}");
|
|
492
|
-
}
|
|
493
|
-
catch {
|
|
494
|
-
continue;
|
|
495
|
-
}
|
|
496
|
-
const profile = profiles.find((candidate) => candidate.sendPaths.includes(send.path)) ?? profiles[0];
|
|
497
|
-
if (profile === undefined)
|
|
498
|
-
continue;
|
|
499
|
-
for (const normalized of profile.parse(send.path, parsed)) {
|
|
500
|
-
for (const address of normalized.to) {
|
|
501
|
-
if (address.trim().length > 0)
|
|
502
|
-
addresses.add(address);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
return [...addresses];
|
|
507
|
-
}
|
|
508
|
-
/**
|
|
509
|
-
* Route raw sends into a FRESH FakeInbox and return the deduped, delivery-ordered messages. Split out
|
|
510
|
-
* of refreshInboxSurface (#380) so the rendering pipeline is shared by every transport; the freshness
|
|
511
|
-
* is what makes a full rebuild idempotent (a send is never routed twice, so no duplicate emails).
|
|
512
|
-
*/
|
|
513
|
-
export async function inboxMessagesFrom(sends, recipients) {
|
|
514
|
-
const channel = new FakeInbox();
|
|
515
|
-
const inboxes = [];
|
|
516
|
-
for (const recipient of recipients)
|
|
517
|
-
inboxes.push(await channel.provisionAddress(recipient.lane, recipient.address));
|
|
518
|
-
await routeCapturedSends([...sends], channel);
|
|
519
|
-
const seen = new Set();
|
|
520
|
-
const messages = [];
|
|
521
|
-
for (const inbox of inboxes) {
|
|
522
|
-
for (const message of await channel.poll(inbox, 0)) {
|
|
523
|
-
if (seen.has(message.id))
|
|
524
|
-
continue;
|
|
525
|
-
seen.add(message.id);
|
|
526
|
-
messages.push(message);
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
messages.sort((a, b) => a.deliveredAt - b.deliveredAt || a.id.localeCompare(b.id));
|
|
530
|
-
return messages;
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Parse drained raw sends with the host profiles and route them into the CommsChannel (the host-side
|
|
534
|
-
* FakeInbox). Returns the number of inbox deliveries made. Same profiles as the host catch, so the
|
|
535
|
-
* in-sandbox and in-process routes normalize identically.
|
|
536
|
-
*/
|
|
537
|
-
export async function routeCapturedSends(sends, channel, profiles = DEFAULT_EMAIL_PROFILES) {
|
|
538
|
-
let delivered = 0;
|
|
539
|
-
for (const send of sends) {
|
|
540
|
-
let parsed;
|
|
541
|
-
try {
|
|
542
|
-
parsed = JSON.parse(send.body.length > 0 ? send.body : "{}");
|
|
543
|
-
}
|
|
544
|
-
catch {
|
|
545
|
-
continue;
|
|
546
|
-
}
|
|
547
|
-
const profile = profiles.find((candidate) => candidate.sendPaths.includes(send.path)) ?? profiles[0];
|
|
548
|
-
if (profile === undefined)
|
|
549
|
-
continue;
|
|
550
|
-
for (const normalized of profile.parse(send.path, parsed)) {
|
|
551
|
-
const messages = await channel.deliverRaw({
|
|
552
|
-
from: normalized.from,
|
|
553
|
-
to: normalized.to,
|
|
554
|
-
...(normalized.subject === undefined ? {} : { subject: normalized.subject }),
|
|
555
|
-
body: normalized.body,
|
|
556
|
-
...(normalized.inlineImages ? { inlineImages: normalized.inlineImages } : {})
|
|
557
|
-
});
|
|
558
|
-
delivered += messages.length;
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
return delivered;
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* End of a run's comms funnel: drain everything the in-sandbox catch captured, route it into the
|
|
565
|
-
* host `channel`, poll the provisioned `inboxes`, and build the digest-only thread artifact. The
|
|
566
|
-
* `artifact` is omitted when nothing was captured OR nothing matched a provisioned inbox (an empty
|
|
567
|
-
* file would be a false claim of a delivered thread) — but `captured`/`matched` are always reported so
|
|
568
|
-
* the caller can warn on captured-but-unevidenced mail rather than lose it silently. Composes the
|
|
569
|
-
* tested drain/route/build pieces so the CUA and shared-world routes collect evidence identically. The
|
|
570
|
-
* full NDJSON is drained from cursor 0 (a whole-run collect), so it is idempotent to call once at
|
|
571
|
-
* teardown.
|
|
572
|
-
*/
|
|
573
|
-
export async function collectCommsThread(args) {
|
|
574
|
-
const { sends } = await drainCommsCatch(args.desktop, args.deployed, 0, args.requestTimeoutMs);
|
|
575
|
-
if (sends.length === 0)
|
|
576
|
-
return { captured: 0, matched: 0 };
|
|
577
|
-
await routeCapturedSends(sends, args.channel, args.profiles);
|
|
578
|
-
const seen = new Set();
|
|
579
|
-
const messages = [];
|
|
580
|
-
for (const inbox of args.inboxes) {
|
|
581
|
-
for (const message of await args.channel.poll(inbox, 0)) {
|
|
582
|
-
// A single send addressed to several provisioned inboxes must appear once in the thread.
|
|
583
|
-
if (seen.has(message.id))
|
|
584
|
-
continue;
|
|
585
|
-
seen.add(message.id);
|
|
586
|
-
messages.push(message);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
if (messages.length === 0)
|
|
590
|
-
return { captured: sends.length, matched: 0 };
|
|
591
|
-
messages.sort((a, b) => a.deliveredAt - b.deliveredAt || a.id.localeCompare(b.id));
|
|
592
|
-
return { artifact: buildCommsThreadArtifact(messages), captured: sends.length, matched: messages.length };
|
|
593
|
-
}
|
|
594
|
-
/** Trim one trailing slash so `${base}/deliveries` never becomes a double slash. */
|
|
595
|
-
function baseOf(url) {
|
|
596
|
-
return url.replace(/\/+$/, "");
|
|
597
|
-
}
|
|
598
|
-
/** The URL a persona is told to open to read its mail on an adopter-hosted plane. */
|
|
599
|
-
export function externalInboxUrl(external) {
|
|
600
|
-
return `${baseOf(external.inboxBaseUrl ?? external.catchBaseUrl)}/inbox`;
|
|
601
|
-
}
|
|
602
|
-
/**
|
|
603
|
-
* Probe an adopter-hosted catch the way the in-sandbox one is probed: assert OUR service marker in
|
|
604
|
-
* /health, not merely any 2xx — an adopter's reverse proxy or a captive portal will happily return
|
|
605
|
-
* 200 for anything, and a comms lab whose catch is not actually there collects nothing while
|
|
606
|
-
* looking fine. Fail-closed callers treat `false` as a hard stop before spending on a run.
|
|
607
|
-
*/
|
|
608
|
-
export async function externalCatchHealthy(external, options = {}) {
|
|
609
|
-
const fetchFn = options.fetchFn ?? fetch;
|
|
610
|
-
try {
|
|
611
|
-
const bases = new Set([external.catchBaseUrl, external.inboxBaseUrl ?? external.catchBaseUrl].map(baseOf));
|
|
612
|
-
const health = await Promise.all([...bases].map(async (base) => {
|
|
613
|
-
const response = await fetchFn(`${base}/health`, { signal: AbortSignal.timeout(options.timeoutMs ?? 15_000) });
|
|
614
|
-
if (!response.ok)
|
|
615
|
-
return false;
|
|
616
|
-
const body = await response.json();
|
|
617
|
-
if (!body || typeof body !== "object")
|
|
618
|
-
return false;
|
|
619
|
-
const value = body;
|
|
620
|
-
return value.ok === true && value.service === "humanish-comms-catch" && Array.isArray(value.capabilities) && value.capabilities.includes("recipient-inbox-v1");
|
|
621
|
-
}));
|
|
622
|
-
return health.every(Boolean);
|
|
623
|
-
}
|
|
624
|
-
catch {
|
|
625
|
-
return false;
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
/**
|
|
629
|
-
* Drain an adopter-hosted catch over HTTP. Same NDJSON contract and same partial-line discipline as
|
|
630
|
-
* the in-sandbox `cat` drain: a body that does not end in a newline may have a torn final append, so
|
|
631
|
-
* that line is dropped rather than parsed into a half-message.
|
|
632
|
-
*/
|
|
633
|
-
export async function drainExternalCommsCatch(external, cursor = 0, options = {}) {
|
|
634
|
-
const fetchFn = options.fetchFn ?? fetch;
|
|
635
|
-
const response = await fetchFn(`${baseOf(external.catchBaseUrl)}/deliveries`, {
|
|
636
|
-
signal: AbortSignal.timeout(options.timeoutMs ?? 30_000),
|
|
637
|
-
...(external.authToken ? { headers: { authorization: `Bearer ${external.authToken}` } } : {})
|
|
638
|
-
});
|
|
639
|
-
if (!response.ok) {
|
|
640
|
-
throw new Error(`comms catch GET /deliveries returned ${response.status}`);
|
|
641
|
-
}
|
|
642
|
-
const body = await response.text();
|
|
643
|
-
let lines = body.split("\n").filter((line) => line.trim().length > 0);
|
|
644
|
-
if (!body.endsWith("\n") && lines.length > 0)
|
|
645
|
-
lines = lines.slice(0, -1);
|
|
646
|
-
const sends = [];
|
|
647
|
-
for (const line of lines.slice(cursor)) {
|
|
648
|
-
try {
|
|
649
|
-
const parsed = JSON.parse(line);
|
|
650
|
-
if (typeof parsed.path === "string" && typeof parsed.body === "string") {
|
|
651
|
-
sends.push({ path: parsed.path, body: parsed.body, t: typeof parsed.t === "number" ? parsed.t : 0 });
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
catch {
|
|
655
|
-
// skip a malformed line
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
return { sends, cursor: lines.length };
|
|
659
|
-
}
|
|
660
|
-
/**
|
|
661
|
-
* The adopter-hosted analogue of collectCommsThread: drain over HTTP, route into the host inbox bus,
|
|
662
|
-
* and build the SAME digest-only humanish.comms-thread.v1 artifact. Evidence shape does not depend
|
|
663
|
-
* on who hosted the catch — only the transport does.
|
|
664
|
-
*/
|
|
665
|
-
export async function collectExternalCommsThread(args) {
|
|
666
|
-
const drainOptions = { ...(args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs }), ...(args.fetchFn ? { fetchFn: args.fetchFn } : {}) };
|
|
667
|
-
const { sends } = await drainExternalCommsCatch(args.external, 0, drainOptions);
|
|
668
|
-
if (sends.length === 0)
|
|
669
|
-
return { captured: 0, matched: 0 };
|
|
670
|
-
await routeCapturedSends(sends, args.channel, args.profiles);
|
|
671
|
-
const seen = new Set();
|
|
672
|
-
const messages = [];
|
|
673
|
-
for (const inbox of args.inboxes) {
|
|
674
|
-
for (const message of await args.channel.poll(inbox, 0)) {
|
|
675
|
-
if (seen.has(message.id))
|
|
676
|
-
continue;
|
|
677
|
-
seen.add(message.id);
|
|
678
|
-
messages.push(message);
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
if (messages.length === 0)
|
|
682
|
-
return { captured: sends.length, matched: 0 };
|
|
683
|
-
messages.sort((a, b) => a.deliveredAt - b.deliveredAt || a.id.localeCompare(b.id));
|
|
684
|
-
return { artifact: buildCommsThreadArtifact(messages), captured: sends.length, matched: messages.length };
|
|
685
|
-
}
|
|
686
|
-
/**
|
|
687
|
-
* Render the persona-facing inbox surface (host-side, typed — see comms-inbox.ts) and write the files
|
|
688
|
-
* into the sandbox's served dir, so the catch serves a LIVE inbox the persona opens and clicks. Creates
|
|
689
|
-
* the nested route dirs first; overwrites idempotently, so call it whenever the message set changes
|
|
690
|
-
* (e.g. after a mid-run drain). Returns the number of files written. Raw content is written INTO the
|
|
691
|
-
* sandbox only (runtime-only, served to the in-sandbox browser); nothing here persists to the bundle.
|
|
692
|
-
*/
|
|
693
|
-
export async function writeInboxSurface(desktop, surfaceDir, messages, options = {}) {
|
|
694
|
-
const files = buildInboxSurface(messages, options);
|
|
695
|
-
// Create the union of parent dirs (inbox/<id>/synth etc.) in one mkdir before writing.
|
|
696
|
-
const dirs = new Set([surfaceDir]);
|
|
697
|
-
for (const file of files) {
|
|
698
|
-
const slash = file.path.lastIndexOf("/");
|
|
699
|
-
if (slash > 0)
|
|
700
|
-
dirs.add(`${surfaceDir}/${file.path.slice(0, slash)}`);
|
|
701
|
-
}
|
|
702
|
-
await desktop.commands.run(`mkdir -p ${[...dirs].map(shq).join(" ")}`, { requestTimeoutMs: options.requestTimeoutMs ?? 30_000 });
|
|
703
|
-
for (const file of files) {
|
|
704
|
-
await desktop.files.write(`${surfaceDir}/${file.path}`, file.body);
|
|
705
|
-
}
|
|
706
|
-
return files.length;
|
|
707
|
-
}
|
|
708
|
-
/**
|
|
709
|
-
* One mid-run inbox-surface refresh cycle: FULL rebuild from the append-only NDJSON (drain from cursor 0)
|
|
710
|
-
* into a FRESH FakeInbox each call, provisioning the declared `recipients`, then (re)render the surface
|
|
711
|
-
* so the persona sees new mail while the session is live. Returns the total captured-send `count` + whether
|
|
712
|
-
* it rendered.
|
|
713
|
-
*
|
|
714
|
-
* The full rebuild is deliberate — it is IDEMPOTENT and RETRY-SAFE: a transient writeInboxSurface failure
|
|
715
|
-
* PROPAGATES (the caller retries next tick without advancing its `sinceCount`), and because each rebuild
|
|
716
|
-
* starts from a clean channel, a send is never routed twice, so the persona never sees duplicate emails.
|
|
717
|
-
* Pass `sinceCount` (the last SUCCESSFULLY-rendered send count) to skip the (N-file) render when nothing
|
|
718
|
-
* new has arrived. This is independent of the teardown collectCommsThread drain (its own fresh channel,
|
|
719
|
-
* also cursor 0) — no evidence is lost or altered. The NDJSON is small for a run, so re-reading it is cheap.
|
|
720
|
-
*/
|
|
721
|
-
export async function refreshInboxSurface(args) {
|
|
722
|
-
const { sends } = await drainCommsCatch(args.desktop, args.deployed, 0, args.requestTimeoutMs);
|
|
723
|
-
if (sends.length === 0)
|
|
724
|
-
return { count: 0, rendered: false };
|
|
725
|
-
if (args.sinceCount !== undefined && sends.length <= args.sinceCount)
|
|
726
|
-
return { count: sends.length, rendered: false };
|
|
727
|
-
const messages = await inboxMessagesFrom(sends, args.recipients);
|
|
728
|
-
if (messages.length === 0)
|
|
729
|
-
return { count: sends.length, rendered: false };
|
|
730
|
-
await writeInboxSurface(args.desktop, args.deployed.surfaceDir, messages, {
|
|
731
|
-
recipients: args.recipients.map((recipient) => recipient.address),
|
|
732
|
-
...(args.originMap === undefined ? {} : { originMap: args.originMap }),
|
|
733
|
-
...(args.requestTimeoutMs === undefined ? {} : { requestTimeoutMs: args.requestTimeoutMs })
|
|
734
|
-
});
|
|
735
|
-
return { count: sends.length, rendered: true };
|
|
736
|
-
}
|
|
737
|
-
//# sourceMappingURL=comms-sandbox-catch.js.map
|