humanish 0.0.1 → 0.15.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 +77 -0
- package/CONTRIBUTING.md +39 -0
- package/LICENSE +21 -0
- package/README.md +437 -8
- package/SECURITY.md +34 -0
- package/dist/actor-contract.d.ts +107 -0
- package/dist/actor-contract.js +286 -0
- package/dist/actor-contract.js.map +1 -0
- package/dist/actor-registry.d.ts +73 -0
- package/dist/actor-registry.js +93 -0
- package/dist/actor-registry.js.map +1 -0
- package/dist/adapter-extension.d.ts +54 -0
- package/dist/adapter-extension.js +214 -0
- package/dist/adapter-extension.js.map +1 -0
- package/dist/argv.d.ts +1 -0
- package/dist/argv.js +8 -0
- package/dist/argv.js.map +1 -0
- package/dist/artifact-reference.d.ts +22 -0
- package/dist/artifact-reference.js +47 -0
- package/dist/artifact-reference.js.map +1 -0
- package/dist/browser-evidence-hygiene.d.ts +7 -0
- package/dist/browser-evidence-hygiene.js +40 -0
- package/dist/browser-evidence-hygiene.js.map +1 -0
- package/dist/claude-agent-sdk.d.ts +94 -0
- package/dist/claude-agent-sdk.js +363 -0
- package/dist/claude-agent-sdk.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-app-server-ui.d.ts +39 -0
- package/dist/codex-app-server-ui.js +357 -0
- package/dist/codex-app-server-ui.js.map +1 -0
- package/dist/codex-app-server.d.ts +144 -0
- package/dist/codex-app-server.js +754 -0
- package/dist/codex-app-server.js.map +1 -0
- package/dist/command-failure.d.ts +29 -0
- package/dist/command-failure.js +54 -0
- package/dist/command-failure.js.map +1 -0
- package/dist/computer-use-actor.d.ts +52 -0
- package/dist/computer-use-actor.js +48 -0
- package/dist/computer-use-actor.js.map +1 -0
- package/dist/computer-use.d.ts +232 -0
- package/dist/computer-use.js +615 -0
- package/dist/computer-use.js.map +1 -0
- package/dist/concurrency.d.ts +1 -0
- package/dist/concurrency.js +27 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/concurrent-shared-world-lab.d.ts +115 -0
- package/dist/concurrent-shared-world-lab.js +1094 -0
- package/dist/concurrent-shared-world-lab.js.map +1 -0
- package/dist/core/git-state.d.ts +33 -0
- package/dist/core/git-state.js +277 -0
- package/dist/core/git-state.js.map +1 -0
- package/dist/core/git-workspace.d.ts +31 -0
- package/dist/core/git-workspace.js +447 -0
- package/dist/core/git-workspace.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/run-primitives.d.ts +66 -0
- package/dist/core/run-primitives.js +120 -0
- package/dist/core/run-primitives.js.map +1 -0
- package/dist/cua-actor-lab.d.ts +621 -0
- package/dist/cua-actor-lab.js +2845 -0
- package/dist/cua-actor-lab.js.map +1 -0
- package/dist/device-presets.d.ts +67 -0
- package/dist/device-presets.js +50 -0
- package/dist/device-presets.js.map +1 -0
- package/dist/e2b-desktop-executor.d.ts +101 -0
- package/dist/e2b-desktop-executor.js +309 -0
- package/dist/e2b-desktop-executor.js.map +1 -0
- package/dist/e2b-desktop-launch.d.ts +144 -0
- package/dist/e2b-desktop-launch.js +59 -0
- package/dist/e2b-desktop-launch.js.map +1 -0
- package/dist/e2b-detached.d.ts +53 -0
- package/dist/e2b-detached.js +130 -0
- package/dist/e2b-detached.js.map +1 -0
- package/dist/e2b-terminal-lab.d.ts +345 -0
- package/dist/e2b-terminal-lab.js +1532 -0
- package/dist/e2b-terminal-lab.js.map +1 -0
- package/dist/env-file.d.ts +14 -0
- package/dist/env-file.js +108 -0
- package/dist/env-file.js.map +1 -0
- package/dist/feedback.d.ts +51 -0
- package/dist/feedback.js +351 -0
- package/dist/feedback.js.map +1 -0
- package/dist/image-evidence.d.ts +2 -0
- package/dist/image-evidence.js +33 -0
- package/dist/image-evidence.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/init-templates.d.ts +12 -0
- package/dist/init-templates.js +369 -0
- package/dist/init-templates.js.map +1 -0
- package/dist/init.d.ts +26 -0
- package/dist/init.js +429 -0
- package/dist/init.js.map +1 -0
- package/dist/lab-app-runner.d.ts +78 -0
- package/dist/lab-app-runner.js +403 -0
- package/dist/lab-app-runner.js.map +1 -0
- package/dist/lab-config.d.ts +583 -0
- package/dist/lab-config.js +1789 -0
- package/dist/lab-config.js.map +1 -0
- package/dist/lab-engine.d.ts +77 -0
- package/dist/lab-engine.js +216 -0
- package/dist/lab-engine.js.map +1 -0
- package/dist/lab-preflight.d.ts +67 -0
- package/dist/lab-preflight.js +385 -0
- package/dist/lab-preflight.js.map +1 -0
- package/dist/labs.d.ts +53 -0
- package/dist/labs.js +382 -0
- package/dist/labs.js.map +1 -0
- package/dist/observer-assets.d.ts +2 -0
- package/dist/observer-assets.js +2630 -0
- package/dist/observer-assets.js.map +1 -0
- package/dist/observer-data.d.ts +63 -0
- package/dist/observer-data.js +145 -0
- package/dist/observer-data.js.map +1 -0
- package/dist/observer-static.d.ts +39 -0
- package/dist/observer-static.js +306 -0
- package/dist/observer-static.js.map +1 -0
- package/dist/observer.d.ts +46 -0
- package/dist/observer.js +550 -0
- package/dist/observer.js.map +1 -0
- package/dist/openai-responses-cu.d.ts +113 -0
- package/dist/openai-responses-cu.js +545 -0
- package/dist/openai-responses-cu.js.map +1 -0
- package/dist/oss-lab.d.ts +52 -0
- package/dist/oss-lab.js +344 -0
- package/dist/oss-lab.js.map +1 -0
- package/dist/oss-meta-lab-scoring.d.ts +15 -0
- package/dist/oss-meta-lab-scoring.js +145 -0
- package/dist/oss-meta-lab-scoring.js.map +1 -0
- package/dist/oss-meta-lab.d.ts +277 -0
- package/dist/oss-meta-lab.js +4529 -0
- package/dist/oss-meta-lab.js.map +1 -0
- package/dist/oss-remote-telemetry.d.ts +77 -0
- package/dist/oss-remote-telemetry.js +403 -0
- package/dist/oss-remote-telemetry.js.map +1 -0
- package/dist/persona.d.ts +35 -0
- package/dist/persona.js +133 -0
- package/dist/persona.js.map +1 -0
- package/dist/pi-agent-core.d.ts +77 -0
- package/dist/pi-agent-core.js +203 -0
- package/dist/pi-agent-core.js.map +1 -0
- package/dist/program.d.ts +54 -0
- package/dist/program.js +2349 -0
- package/dist/program.js.map +1 -0
- package/dist/redaction.d.ts +90 -0
- package/dist/redaction.js +292 -0
- package/dist/redaction.js.map +1 -0
- package/dist/run-paths.d.ts +56 -0
- package/dist/run-paths.js +340 -0
- package/dist/run-paths.js.map +1 -0
- package/dist/run.d.ts +794 -0
- package/dist/run.js +4844 -0
- package/dist/run.js.map +1 -0
- package/dist/scripted-browser-actor.d.ts +297 -0
- package/dist/scripted-browser-actor.js +1399 -0
- package/dist/scripted-browser-actor.js.map +1 -0
- package/dist/scripted-browser-lab.d.ts +107 -0
- package/dist/scripted-browser-lab.js +788 -0
- package/dist/scripted-browser-lab.js.map +1 -0
- package/dist/selected-output-paths.d.ts +49 -0
- package/dist/selected-output-paths.js +354 -0
- package/dist/selected-output-paths.js.map +1 -0
- package/dist/shared-world-lab.d.ts +208 -0
- package/dist/shared-world-lab.js +1049 -0
- package/dist/shared-world-lab.js.map +1 -0
- package/dist/source-archive.d.ts +82 -0
- package/dist/source-archive.js +408 -0
- package/dist/source-archive.js.map +1 -0
- package/dist/stop-conditions.d.ts +26 -0
- package/dist/stop-conditions.js +66 -0
- package/dist/stop-conditions.js.map +1 -0
- package/dist/terminal-agent-actor.d.ts +36 -0
- package/dist/terminal-agent-actor.js +23 -0
- package/dist/terminal-agent-actor.js.map +1 -0
- package/docs/architecture/actor-contract.md +431 -0
- package/docs/architecture/github-feedback-loop.md +189 -0
- package/docs/architecture/local-codex-tui-actor.md +213 -0
- package/docs/architecture/observer.md +118 -0
- package/docs/architecture/oss-lab-poc.md +250 -0
- package/docs/architecture/project-layout.md +166 -0
- package/docs/architecture/state-driven-executor.md +203 -0
- package/docs/architecture/terminal-product-lane.md +148 -0
- package/docs/contracts/adapter-fixtures.md +80 -0
- package/docs/contracts/core.md +71 -0
- package/docs/contracts/feedback.md +145 -0
- package/docs/contracts/policy.md +311 -0
- package/docs/contracts/run-bundle.md +358 -0
- package/docs/contracts/schemas.md +984 -0
- package/docs/goals/current.md +428 -0
- package/docs/principles/invariants-and-defaults.md +135 -0
- package/docs/principles/self-driving-harness.md +129 -0
- package/docs/product/open-source-install-experience.md +237 -0
- package/docs/ramp/README.md +207 -0
- package/docs/release/open-source-readiness.md +208 -0
- package/docs/release/public-readiness-standard.md +205 -0
- package/docs/roadmap/world-class-open-source-v0.md +311 -0
- package/package.json +102 -8
- package/skills/humanish/SKILL.md +244 -0
- package/skills/humanish/agents/openai.yaml +7 -0
- package/index.js +0 -1
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,794 @@
|
|
|
1
|
+
import { type CodexAppServerTrace } from "./codex-app-server.js";
|
|
2
|
+
import { type ActorTrace } from "./actor-contract.js";
|
|
3
|
+
import { type CapturedGitState } from "./core/git-state.js";
|
|
4
|
+
import type { E2BDesktopModule } from "./e2b-desktop-launch.js";
|
|
5
|
+
import { type PreparedRunArtifactPaths } from "./run-paths.js";
|
|
6
|
+
export declare const RUN_BUNDLE_SCHEMA = "humanish.run-bundle.v1";
|
|
7
|
+
export declare const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
|
|
8
|
+
export declare const REVIEW_SCHEMA = "humanish.review.v1";
|
|
9
|
+
export declare const VERIFY_SCHEMA = "humanish.verify-result.v1";
|
|
10
|
+
export declare const RUNS_SCHEMA = "humanish.runs-result.v1";
|
|
11
|
+
export declare const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
|
|
12
|
+
export declare const CLEANUP_SCHEMA = "humanish.cleanup-result.v1";
|
|
13
|
+
export declare const PUBLIC_TARGET_CWD = "[target-cwd]";
|
|
14
|
+
export interface RunOptions {
|
|
15
|
+
cwd: string;
|
|
16
|
+
actor?: string;
|
|
17
|
+
actorCommand?: string[];
|
|
18
|
+
appUrl?: string;
|
|
19
|
+
dryRun?: boolean;
|
|
20
|
+
runId?: string;
|
|
21
|
+
simCount?: number;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
export type RunStreamKind = "ui" | "browser" | "terminal" | "tui" | "codex-ui" | "artifact" | "summary";
|
|
25
|
+
export type RunSimulationStatus = "queued" | "preparing" | "running" | "passed" | "complete" | "blocked" | "timed_out" | "failed" | "contract_proof_only";
|
|
26
|
+
export interface RunStreamCompletion {
|
|
27
|
+
actorLogPath?: string;
|
|
28
|
+
actorLogTail?: string;
|
|
29
|
+
actorLastMessageTail?: string;
|
|
30
|
+
actorPid?: number;
|
|
31
|
+
actorStatus?: "not_started" | "running" | "passed" | "failed" | "blocked" | "timed_out" | "suspended" | "unknown";
|
|
32
|
+
appLogPath?: string;
|
|
33
|
+
appPid?: number;
|
|
34
|
+
appReason?: string;
|
|
35
|
+
appStatus?: "not_started" | "running" | "blocked" | "failed" | "missing" | "unknown";
|
|
36
|
+
appUrl?: string;
|
|
37
|
+
checkedAt: string;
|
|
38
|
+
exitCode?: number;
|
|
39
|
+
logTail?: string;
|
|
40
|
+
nestedObserverPresent?: boolean;
|
|
41
|
+
nestedVerifyPassed?: boolean;
|
|
42
|
+
reason: string;
|
|
43
|
+
status: "running" | "passed" | "failed" | "blocked" | "timed_out";
|
|
44
|
+
visualReason?: string;
|
|
45
|
+
visualStatus?: "not_started" | "visible" | "blocked" | "unknown";
|
|
46
|
+
visualWindowCount?: number;
|
|
47
|
+
meaningfulUse?: RunMeaningfulUseScore;
|
|
48
|
+
}
|
|
49
|
+
export interface RunSetupQualitySnapshot {
|
|
50
|
+
schema: "humanish.setup-quality.v1";
|
|
51
|
+
generatedAt: string;
|
|
52
|
+
redaction: {
|
|
53
|
+
status: "passed";
|
|
54
|
+
rawPreviews: "included" | "suppressed";
|
|
55
|
+
notes: string;
|
|
56
|
+
};
|
|
57
|
+
summary: string;
|
|
58
|
+
status: "passed" | "needs_review" | "blocked";
|
|
59
|
+
checks: Array<{
|
|
60
|
+
id: string;
|
|
61
|
+
label: string;
|
|
62
|
+
ok: boolean;
|
|
63
|
+
detail: string;
|
|
64
|
+
}>;
|
|
65
|
+
tree: Array<{
|
|
66
|
+
path: string;
|
|
67
|
+
type: "file" | "directory";
|
|
68
|
+
sizeBytes?: number;
|
|
69
|
+
}>;
|
|
70
|
+
previews: Array<{
|
|
71
|
+
path: string;
|
|
72
|
+
language: "json" | "yaml" | "typescript" | "markdown" | "text";
|
|
73
|
+
truncated: boolean;
|
|
74
|
+
text: string;
|
|
75
|
+
}>;
|
|
76
|
+
studyQuality?: {
|
|
77
|
+
schema: "humanish.study-quality.v1";
|
|
78
|
+
rating: "none" | "ceremonial" | "useful" | "high_leverage";
|
|
79
|
+
summary: string;
|
|
80
|
+
checks: Array<{
|
|
81
|
+
id: string;
|
|
82
|
+
label: string;
|
|
83
|
+
ok: boolean;
|
|
84
|
+
detail: string;
|
|
85
|
+
}>;
|
|
86
|
+
signals: {
|
|
87
|
+
appUrlProofBlocked: boolean;
|
|
88
|
+
appUrlProofMentioned: boolean;
|
|
89
|
+
actorInsightCaptured: boolean;
|
|
90
|
+
coverageCustomized: boolean;
|
|
91
|
+
personaCustomized: boolean;
|
|
92
|
+
scenarioCustomized: boolean;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
packageScripts: Record<string, string>;
|
|
96
|
+
humanish: {
|
|
97
|
+
configPresent: boolean;
|
|
98
|
+
personaCount: number;
|
|
99
|
+
scenarioCount: number;
|
|
100
|
+
packageScriptPresent: boolean;
|
|
101
|
+
gitignoreContainsRuntimeIgnore: boolean;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The CLOSED set of core meaningful-use scoring components. Closed by design: these are the generic
|
|
106
|
+
* dimensions core itself meters (setup/filesystem/nested/actor/product/feedback). A product-specific
|
|
107
|
+
* scorecard does NOT extend this enum (that would be closed-taxonomy rot — every adopter's nouns
|
|
108
|
+
* leaking into core); it ships as a thin in-repo extension that emits a namespaced `RunAdapterScore`
|
|
109
|
+
* via the lane's `score` hook, leaving its own component breakdown in that score's `data`. Exported
|
|
110
|
+
* so a thin adapter can type against core's score shape without forking.
|
|
111
|
+
*/
|
|
112
|
+
export type RunMeaningfulUseComponentId = "setup-correctness" | "filesystem-evidence" | "nested-humanish-evidence" | "actor-activity" | "product-surface" | "feedback-quality";
|
|
113
|
+
export interface RunMeaningfulUseScore {
|
|
114
|
+
schema: "humanish.meaningful-use-score.v1";
|
|
115
|
+
status: "pass" | "partial" | "fail";
|
|
116
|
+
score: number;
|
|
117
|
+
summary: string;
|
|
118
|
+
hardFailures: string[];
|
|
119
|
+
components: Array<{
|
|
120
|
+
id: RunMeaningfulUseComponentId;
|
|
121
|
+
label: string;
|
|
122
|
+
status: "pass" | "partial" | "fail";
|
|
123
|
+
score: number;
|
|
124
|
+
detail: string;
|
|
125
|
+
}>;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* A namespaced, product-agnostic score a thin adapter attaches to the bundle via the terminal-product
|
|
129
|
+
* lane's `score` hook (the layer-6 extension seam, issue #154 acceptance #8). Core never reads its
|
|
130
|
+
* `data` and knows none of the adopter's nouns — the `namespace` (e.g. `"acme-pixelforge"`) scopes
|
|
131
|
+
* the whole record so core schemas stay product-agnostic and a future inert-field audit does not
|
|
132
|
+
* misfire on a noun core never owned. The adopter's real scorecard (component weights, product
|
|
133
|
+
* rubric) lives in ITS repo and is summarized into the generic status/score/summary; everything
|
|
134
|
+
* product-specific rides under `data`. This is NOT a built-in product scorer — it is the SEAM the
|
|
135
|
+
* adopter's scorer plugs into without forking core.
|
|
136
|
+
*/
|
|
137
|
+
export interface RunAdapterScore {
|
|
138
|
+
schema: "humanish.adapter-score.v1";
|
|
139
|
+
/** The adapter's namespace — non-core, product-scoped (e.g. an adopter slug). Required + non-empty. */
|
|
140
|
+
namespace: string;
|
|
141
|
+
status: "pass" | "partial" | "fail";
|
|
142
|
+
/** A 0-100 summary the adapter derived from its own (off-core) rubric. */
|
|
143
|
+
score: number;
|
|
144
|
+
summary: string;
|
|
145
|
+
/** Arbitrary product-specific payload (the adopter's component breakdown / nouns). Core never reads it. */
|
|
146
|
+
data?: Record<string, unknown>;
|
|
147
|
+
}
|
|
148
|
+
export interface RunFeedbackCandidate {
|
|
149
|
+
schema: "humanish.feedback-candidate.v1";
|
|
150
|
+
id: string;
|
|
151
|
+
run_id: string;
|
|
152
|
+
stream_id?: string;
|
|
153
|
+
adapter_id: string;
|
|
154
|
+
scenario_id: string;
|
|
155
|
+
persona_id: string;
|
|
156
|
+
actor: "codex-tui" | "codex-exec" | "codex-app-server" | "synthetic-dry-run" | "unknown";
|
|
157
|
+
substrate: "e2b-desktop" | "e2b-terminal" | "local-filesystem" | "codex-app-server" | "unknown";
|
|
158
|
+
failure_owner: "harness" | "target-app" | "actor" | "environment" | "unknown";
|
|
159
|
+
summary: string;
|
|
160
|
+
expected: string;
|
|
161
|
+
actual: string;
|
|
162
|
+
evidence: Array<{
|
|
163
|
+
path: string;
|
|
164
|
+
kind: "review" | "state" | "log" | "trace" | "screenshot" | "filesystem";
|
|
165
|
+
note: string;
|
|
166
|
+
}>;
|
|
167
|
+
redaction: {
|
|
168
|
+
status: "passed";
|
|
169
|
+
notes: string;
|
|
170
|
+
};
|
|
171
|
+
idempotency_key: string;
|
|
172
|
+
proposed_next_state: "watch" | "adapter-hardening" | "target-app-setup" | "actor-auth" | "setup-quality-review" | "study-quality-review";
|
|
173
|
+
acceptance_proof: string[];
|
|
174
|
+
/**
|
|
175
|
+
* OPTIONAL, ADAPTER-NAMESPACED product-noun block (the layer-6 extension seam, issue #154
|
|
176
|
+
* acceptance #8 + the "record product-specific concepts as NON-core nouns" list). A thin adapter
|
|
177
|
+
* records product-specific concepts — public CLI/product command observed, hosted product
|
|
178
|
+
* success-or-blocker, feedback id/draft observed, media/job/asset ids, explicit
|
|
179
|
+
* no-media/no-provider-spend proof, defection/friction risk — WITHOUT making any of them core
|
|
180
|
+
* primitives. They ride under a single namespaced field so core's feedback enums
|
|
181
|
+
* (`evidence.kind`, `proposed_next_state`) stay product-agnostic and a future inert-field audit
|
|
182
|
+
* never misfires on a noun core never owned. Core validates only the SHAPE (a non-empty
|
|
183
|
+
* `namespace` + a `data` record); the keys inside `data` are the adapter's, never core's.
|
|
184
|
+
*/
|
|
185
|
+
adapter?: {
|
|
186
|
+
/** Non-core, product-scoped namespace (e.g. an adopter slug). Required + non-empty. */
|
|
187
|
+
namespace: string;
|
|
188
|
+
/** The adapter's product nouns. Core never reads these keys — it stays product-agnostic. */
|
|
189
|
+
data: Record<string, unknown>;
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Optional, adapter-namespaced artifact references. These let a thin in-repo
|
|
194
|
+
* adapter attach product/state proof outputs to the Humanish evidence packet
|
|
195
|
+
* without teaching core product nouns or inventing fake streams.
|
|
196
|
+
*/
|
|
197
|
+
export interface RunAdapterArtifact {
|
|
198
|
+
schema: "humanish.adapter-artifact.v1";
|
|
199
|
+
namespace: string;
|
|
200
|
+
label: string;
|
|
201
|
+
path: string;
|
|
202
|
+
kind: "state" | "review" | "log" | "trace" | "screenshot" | "filesystem" | "summary";
|
|
203
|
+
note: string;
|
|
204
|
+
}
|
|
205
|
+
export interface RunSimulation {
|
|
206
|
+
id: string;
|
|
207
|
+
index: number;
|
|
208
|
+
personaId: string;
|
|
209
|
+
scenarioId: string;
|
|
210
|
+
status: RunSimulationStatus;
|
|
211
|
+
streamKind: RunStreamKind;
|
|
212
|
+
mode: "browser-sim" | "cli-sim" | "tui-sim" | "codex-app-sim";
|
|
213
|
+
progress: number;
|
|
214
|
+
currentStep: string;
|
|
215
|
+
summary: string;
|
|
216
|
+
streamIds: string[];
|
|
217
|
+
startedAt: string;
|
|
218
|
+
updatedAt: string;
|
|
219
|
+
}
|
|
220
|
+
export interface RunStream {
|
|
221
|
+
id: string;
|
|
222
|
+
simId: string;
|
|
223
|
+
/** Adapter-owned lane id for fan-out / target-swarm runs. Safe categorical metadata only. */
|
|
224
|
+
laneId?: string;
|
|
225
|
+
/** Adapter-owned actor class for grouping lanes, e.g. viewer/reviewer/admin. */
|
|
226
|
+
actorType?: string;
|
|
227
|
+
/** Adapter-owned product surface label for grouping lanes without parsing URLs. */
|
|
228
|
+
surface?: string;
|
|
229
|
+
/** Adapter-owned scenario/case grouping label. */
|
|
230
|
+
caseGroup?: string;
|
|
231
|
+
kind: RunStreamKind;
|
|
232
|
+
label: string;
|
|
233
|
+
status: RunSimulationStatus;
|
|
234
|
+
transport: "snapshot" | "polling" | "sse" | "pty" | "app-server";
|
|
235
|
+
updatedAt: string;
|
|
236
|
+
url?: string;
|
|
237
|
+
embed?: {
|
|
238
|
+
kind: "iframe" | "terminal" | "screenshot" | "placeholder";
|
|
239
|
+
url?: string;
|
|
240
|
+
title?: string;
|
|
241
|
+
};
|
|
242
|
+
viewport?: {
|
|
243
|
+
width: number;
|
|
244
|
+
height: number;
|
|
245
|
+
deviceScaleFactor?: number;
|
|
246
|
+
isMobile?: boolean;
|
|
247
|
+
};
|
|
248
|
+
terminal?: {
|
|
249
|
+
title: string;
|
|
250
|
+
format: "ansi" | "plain";
|
|
251
|
+
stdin: "disabled" | "planned" | "sent";
|
|
252
|
+
tail: string;
|
|
253
|
+
};
|
|
254
|
+
ui?: {
|
|
255
|
+
actorStatus?: string;
|
|
256
|
+
appStatus?: string;
|
|
257
|
+
appUrl?: string;
|
|
258
|
+
route?: string;
|
|
259
|
+
intent?: string;
|
|
260
|
+
nestedObserverPath?: string;
|
|
261
|
+
nestedObserverUrl?: string;
|
|
262
|
+
screenshotUrl?: string;
|
|
263
|
+
state?: string;
|
|
264
|
+
visualStatus?: string;
|
|
265
|
+
};
|
|
266
|
+
codex?: {
|
|
267
|
+
provider: "codex-app-server";
|
|
268
|
+
eventCount?: number;
|
|
269
|
+
experimentalApi?: boolean;
|
|
270
|
+
model?: string;
|
|
271
|
+
sessionId?: string;
|
|
272
|
+
state: "not_connected" | "connecting" | "watching" | "running" | "completed" | "failed" | "blocked" | "timed_out";
|
|
273
|
+
contract: string;
|
|
274
|
+
threadId?: string;
|
|
275
|
+
trace?: CodexAppServerTrace;
|
|
276
|
+
tracePath?: string;
|
|
277
|
+
turnId?: string;
|
|
278
|
+
};
|
|
279
|
+
actor?: ActorTrace;
|
|
280
|
+
completion?: RunStreamCompletion;
|
|
281
|
+
artifacts: Array<{
|
|
282
|
+
label: string;
|
|
283
|
+
path: string;
|
|
284
|
+
kind: "bundle" | "review" | "observer" | "events" | "screenshot" | "trace" | "log" | "filesystem";
|
|
285
|
+
}>;
|
|
286
|
+
}
|
|
287
|
+
export interface RunEvent {
|
|
288
|
+
id: string;
|
|
289
|
+
at: string;
|
|
290
|
+
level: "info" | "warn" | "error";
|
|
291
|
+
type: string;
|
|
292
|
+
message: string;
|
|
293
|
+
simId?: string;
|
|
294
|
+
streamId?: string;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* One executed (or declared) subject-state seed step. Live records carry execution fields
|
|
298
|
+
* (ok/exitCode/timedOut/durationMs); dry-run "declared, not run" records carry only the
|
|
299
|
+
* declaration (name, phase, command DIGEST). The command itself never persists — the digest
|
|
300
|
+
* pins "same recipe" across bundles while the lab YAML in the consumer's repo stays the
|
|
301
|
+
* plaintext source of truth (publish-safe by construction).
|
|
302
|
+
*/
|
|
303
|
+
export interface RunSubjectStateStepRecord {
|
|
304
|
+
name: string;
|
|
305
|
+
when: "before-build" | "before-start" | "after-ready";
|
|
306
|
+
/** sha256 hex of the exact command string, first 16 chars (the promptDigest convention). */
|
|
307
|
+
commandDigest: string;
|
|
308
|
+
/** Absent on declared-not-run records (dry-run; unreached steps are absent entirely). */
|
|
309
|
+
ok?: boolean;
|
|
310
|
+
exitCode?: number;
|
|
311
|
+
timedOut?: boolean;
|
|
312
|
+
durationMs?: number;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Structured subject provenance (invariant 5): what the subject WAS — code pin (repo/commit,
|
|
316
|
+
* or a local-tree archive digest) AND state story. Optional additive field on
|
|
317
|
+
* humanish.run-bundle.v1; absent on bundles from backends that have not adopted it (and on all
|
|
318
|
+
* pre-existing bundles).
|
|
319
|
+
*/
|
|
320
|
+
export interface RunSubjectProvenance {
|
|
321
|
+
source: "clone" | "app-url" | "local-tree";
|
|
322
|
+
/** Clone-route only. Honors policies.redactRepos exactly as the provenance event does. */
|
|
323
|
+
repo?: string;
|
|
324
|
+
/** Clone-route: the cloned commit SHA. Local-tree route: the host-side HEAD at pack time,
|
|
325
|
+
* when the packed root was a git work tree. */
|
|
326
|
+
commit?: string;
|
|
327
|
+
/**
|
|
328
|
+
* Local-tree-route only (additive): 64 lowercase-hex sha256 over the sorted packed-entries
|
|
329
|
+
* list (docs/contracts/schemas.md). This is the provenance PIN for the local-tree route: a
|
|
330
|
+
* dirty working tree cannot be commit-pinned, so the archive content digest stands in for it.
|
|
331
|
+
*/
|
|
332
|
+
archiveSha256?: string;
|
|
333
|
+
/**
|
|
334
|
+
* Local-tree-route only (additive): true when the host git work tree had uncommitted changes
|
|
335
|
+
* at pack time. Absent when the packed root was not a git work tree at all.
|
|
336
|
+
*/
|
|
337
|
+
dirty?: boolean;
|
|
338
|
+
/** Declared env NAMES provisioned for the subject — names only, values never. */
|
|
339
|
+
envNames?: string[];
|
|
340
|
+
state: {
|
|
341
|
+
/**
|
|
342
|
+
* seeded: live run, steps declared, ALL ran ok, no external state declared.
|
|
343
|
+
* unpinned: external state declared (seed records, if any, still attached — migrating
|
|
344
|
+
* an external DB is still unpinned overall).
|
|
345
|
+
* declared-not-run: steps declared but not (all) executed ok — dry-run contract bundles
|
|
346
|
+
* and failed live provisioning.
|
|
347
|
+
* undeclared: no subject.state block (stateless apps, app-url subjects) — the explicit
|
|
348
|
+
* "absence declared" marker invariant 5 requires.
|
|
349
|
+
*/
|
|
350
|
+
provenance: "seeded" | "unpinned" | "declared-not-run" | "undeclared";
|
|
351
|
+
seed?: RunSubjectStateStepRecord[];
|
|
352
|
+
externalEnvNames?: string[];
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* How well a run attributed INTERACTION between actors — a new, ORTHOGONAL honesty axis to the
|
|
357
|
+
* persona-sampling evidence classes (which answer "how representative is the actor?"). Absent ==
|
|
358
|
+
* `isolated` (every existing bundle byte-stable). `shared-world` means N roles drove ONE mutable
|
|
359
|
+
* plane and their per-role attribution is weaker (its ceiling is pinned in `sharedWorld.attributionLimits`).
|
|
360
|
+
*/
|
|
361
|
+
export type RunAttributionClass = "isolated" | "shared-world";
|
|
362
|
+
/** The ONE shared service-plane provenance for a shared-world run (#164): single commit + a
|
|
363
|
+
* seed-recipe digest + the provisioned env NAMES (values never). */
|
|
364
|
+
export interface SharedWorldPlane {
|
|
365
|
+
/** The cloned commit SHA of the shared plane (when the clone resolved one). */
|
|
366
|
+
commit?: string;
|
|
367
|
+
/** sha256-16 over the ordered seed-step command digests — the seeded-state RECIPE identity
|
|
368
|
+
* (not the runtime state). Pins "same seed recipe" across bundles. */
|
|
369
|
+
seedDigest: string;
|
|
370
|
+
/** Declared env NAMES provisioned for the shared plane (values never surface). */
|
|
371
|
+
envNames: string[];
|
|
372
|
+
/**
|
|
373
|
+
* CONCURRENT route only (#164 phase 2): sha256-16 of the harness-minted `getHost` URL's ORIGIN
|
|
374
|
+
* (the first-class provisioned-subject target every actor drove — invariant 2). A DIGEST, not the
|
|
375
|
+
* raw URL: a getHost URL embeds the (live) sandbox id and matches the publish-safety e2b-URL
|
|
376
|
+
* redaction, so — like the stream URL and like sandbox ids — it never lands raw in a published
|
|
377
|
+
* bundle (the raw tokenless URL is surfaced only on the ephemeral lab result). The orchestrator
|
|
378
|
+
* confirms the URL is TOKENLESS (no authKey — invariant 1) before digesting. verify proves every
|
|
379
|
+
* actor drove this host by digest equality. Absent on the sequential route.
|
|
380
|
+
*/
|
|
381
|
+
hostDigest?: string;
|
|
382
|
+
/**
|
|
383
|
+
* CONCURRENT route only: the author's REQUIRED attestation that the subject behind the
|
|
384
|
+
* internet-reachable getHost URL is synthetic seeded data (FIX-3). This is author-trust + a
|
|
385
|
+
* provenance gate, NOT a no-real-data guarantee. Verify fails closed if absent on the concurrent route.
|
|
386
|
+
*/
|
|
387
|
+
exposure?: "synthetic";
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* CONCURRENT shape (#164 phase 2): one actor's harness-clocked activity window against the ONE
|
|
391
|
+
* shared plane. OVERLAPPING windows mechanically prove ≥2 personas were active simultaneously.
|
|
392
|
+
* `laneWindows` and `stateSeries` are INDEPENDENT series — there is deliberately NO per-delta→actor
|
|
393
|
+
* field (causation under concurrency is structurally inexpressible — FIX-7).
|
|
394
|
+
*/
|
|
395
|
+
export interface SharedWorldLaneWindow {
|
|
396
|
+
roleId: string;
|
|
397
|
+
actorType?: string;
|
|
398
|
+
surface?: string;
|
|
399
|
+
caseGroup?: string;
|
|
400
|
+
/** Resolves to a real RunSimulation in this bundle. */
|
|
401
|
+
simId: string;
|
|
402
|
+
/** Resolves to a real RunStream (the actor's trace) in this bundle. */
|
|
403
|
+
streamId: string;
|
|
404
|
+
/** ms on the ONE harness clock — the wrapped [start,end] the orchestrator MEASURED (FIX-1). */
|
|
405
|
+
startedAt: number;
|
|
406
|
+
endedAt: number;
|
|
407
|
+
/** The actor's terminal session verdict (per-persona). */
|
|
408
|
+
verdict: string;
|
|
409
|
+
/** sha256-16 of the ORIGIN of the getHost seat URL this actor drove. verify confirms it equals
|
|
410
|
+
* plane.hostDigest — i.e. the actor drove EXACTLY the harness-minted host (invariant 2; FIX-2).
|
|
411
|
+
* A digest, not the raw URL (a getHost URL is not publish-safe — see SharedWorldPlane.hostDigest). */
|
|
412
|
+
routeHostDigest: string;
|
|
413
|
+
/** The shared plane's commit this actor observed (omitted when unresolved). */
|
|
414
|
+
commit?: string;
|
|
415
|
+
/** The shared plane's seed-recipe digest this actor observed. */
|
|
416
|
+
seedDigest: string;
|
|
417
|
+
}
|
|
418
|
+
/** CONCURRENT shape: one cadence checkpoint of the shared world under load. DIGEST-ONLY — the
|
|
419
|
+
* allowed-keys tripwire (SHARED_WORLD_STATESERIES_KEYS) permits ONLY {timestamp, digest}. */
|
|
420
|
+
export interface SharedWorldStateSnapshot {
|
|
421
|
+
/** ms on the ONE harness clock. */
|
|
422
|
+
timestamp: number;
|
|
423
|
+
/** sha256-16 of the (scrubbed, redacted) combined probe output at this snapshot. */
|
|
424
|
+
digest: string;
|
|
425
|
+
}
|
|
426
|
+
/** CONCURRENT shape: one persona's OUTCOME against the contended world (the "M of N" headline). */
|
|
427
|
+
export interface SharedWorldOutcome {
|
|
428
|
+
roleId: string;
|
|
429
|
+
actorType?: string;
|
|
430
|
+
surface?: string;
|
|
431
|
+
caseGroup?: string;
|
|
432
|
+
simId: string;
|
|
433
|
+
streamId: string;
|
|
434
|
+
/** Terminal session status. */
|
|
435
|
+
status: string;
|
|
436
|
+
completionReason?: string;
|
|
437
|
+
/** Reached its goal (terminal, engaged, no harness error). */
|
|
438
|
+
ok: boolean;
|
|
439
|
+
}
|
|
440
|
+
/** A timeline checkpoint: a read-only digest probe of the shared plane at one moment. Persisted
|
|
441
|
+
* DIGEST-ONLY — `digest` is sha256-16(scrub+redact(stdout)); no raw value ever lands. */
|
|
442
|
+
export interface SharedWorldCheckpoint {
|
|
443
|
+
kind: "checkpoint";
|
|
444
|
+
/** "cp-baseline" for the baseline snapshot; "cp-after-<roleId>" after each role's turn. */
|
|
445
|
+
name: string;
|
|
446
|
+
/** sha256-16 of the (scrubbed, redacted) combined probe output at this snapshot. */
|
|
447
|
+
digest: string;
|
|
448
|
+
/** True when this snapshot's digest differs from the previous checkpoint's — the observed
|
|
449
|
+
* state changed across the intervening turn (delta attributed to the TURN, not an action). */
|
|
450
|
+
deltaFromPrev: boolean;
|
|
451
|
+
}
|
|
452
|
+
/** A timeline turn: one role's seat session against the shared plane. Carries the plane
|
|
453
|
+
* provenance it observed (identical across turns by construction — the single-plane proof). */
|
|
454
|
+
export interface SharedWorldTurn {
|
|
455
|
+
kind: "turn";
|
|
456
|
+
roleId: string;
|
|
457
|
+
/** Resolves to a real RunSimulation in this bundle. */
|
|
458
|
+
simId: string;
|
|
459
|
+
/** Resolves to a real RunStream (the role's actor trace) in this bundle. */
|
|
460
|
+
streamId: string;
|
|
461
|
+
/** The shared plane's commit the role observed (omitted when unresolved). */
|
|
462
|
+
commit?: string;
|
|
463
|
+
/** The shared plane's seed-recipe digest the role observed. */
|
|
464
|
+
seedDigest: string;
|
|
465
|
+
}
|
|
466
|
+
export type SharedWorldTimelineEntry = SharedWorldCheckpoint | SharedWorldTurn;
|
|
467
|
+
/**
|
|
468
|
+
* The shared-world evidence block (`humanish.shared-world.v1`). TWO variants discriminated by
|
|
469
|
+
* `topologyMode` (FIX-8 — renamed off `RunBundle.mode` to avoid the dry-run|live collision):
|
|
470
|
+
*
|
|
471
|
+
* - SEQUENTIAL (`topologyMode: "sequential"`, the PoC): `sequence` + an alternating `timeline`
|
|
472
|
+
* (cp-baseline → turn → cp → … → cp); limits `sequential-only` etc.
|
|
473
|
+
* - CONCURRENT (`topologyMode: "concurrent"`, #164 phase 2): `laneWindows` + `stateSeries` +
|
|
474
|
+
* `outcomes`; limits `concurrent` etc. NO `timeline`.
|
|
475
|
+
*
|
|
476
|
+
* Additive + optional on `humanish.run-bundle.v1` — absent on every non-shared-world bundle.
|
|
477
|
+
* The mandatory `attributionLimits` are verify-enforced (FAIL CLOSED on a missing required or a
|
|
478
|
+
* present forbidden limit).
|
|
479
|
+
*/
|
|
480
|
+
export interface SharedWorldEvidence {
|
|
481
|
+
schema: typeof SHARED_WORLD_SCHEMA;
|
|
482
|
+
topology: "shared-world";
|
|
483
|
+
/** The substrate discriminator (FIX-8). Branched on FIRST by validateSharedWorldEvidence. */
|
|
484
|
+
topologyMode: "sequential" | "concurrent";
|
|
485
|
+
/** The DECLARED number of role seats. */
|
|
486
|
+
roleCount: number;
|
|
487
|
+
plane: SharedWorldPlane;
|
|
488
|
+
/** The pinned, verify-enforced attribution ceiling (the set differs per topologyMode). */
|
|
489
|
+
attributionLimits: string[];
|
|
490
|
+
/** The role ids that actually took a turn, in declared order. */
|
|
491
|
+
sequence?: string[];
|
|
492
|
+
timeline?: SharedWorldTimelineEntry[];
|
|
493
|
+
/** Per-actor harness-clocked windows (overlap proves simultaneity). */
|
|
494
|
+
laneWindows?: SharedWorldLaneWindow[];
|
|
495
|
+
/** Cadence digests of the shared world under load (baseline + periodic + final). */
|
|
496
|
+
stateSeries?: SharedWorldStateSnapshot[];
|
|
497
|
+
/** Per-persona outcomes (the "M of N succeeded" headline). */
|
|
498
|
+
outcomes?: SharedWorldOutcome[];
|
|
499
|
+
}
|
|
500
|
+
export interface RunBundle {
|
|
501
|
+
schema: typeof RUN_BUNDLE_SCHEMA;
|
|
502
|
+
runId: string;
|
|
503
|
+
mode: "dry-run" | "live";
|
|
504
|
+
simCount: number;
|
|
505
|
+
createdAt: string;
|
|
506
|
+
cwd: string;
|
|
507
|
+
artifactRoot: string;
|
|
508
|
+
source: {
|
|
509
|
+
packageName: string | null;
|
|
510
|
+
humanishSource: "present" | "missing";
|
|
511
|
+
git: CapturedGitState;
|
|
512
|
+
};
|
|
513
|
+
persona: {
|
|
514
|
+
id: string;
|
|
515
|
+
name: string;
|
|
516
|
+
source: string;
|
|
517
|
+
sourceDigest: string;
|
|
518
|
+
};
|
|
519
|
+
scenario: {
|
|
520
|
+
id: string;
|
|
521
|
+
title: string;
|
|
522
|
+
goal: string;
|
|
523
|
+
source: string;
|
|
524
|
+
sourceDigest: string;
|
|
525
|
+
};
|
|
526
|
+
lifecycle: Array<{
|
|
527
|
+
at: string;
|
|
528
|
+
event: string;
|
|
529
|
+
message: string;
|
|
530
|
+
}>;
|
|
531
|
+
simulations: RunSimulation[];
|
|
532
|
+
streams: RunStream[];
|
|
533
|
+
events: RunEvent[];
|
|
534
|
+
redaction: {
|
|
535
|
+
status: "passed";
|
|
536
|
+
notes: string;
|
|
537
|
+
};
|
|
538
|
+
artifacts: {
|
|
539
|
+
run: string;
|
|
540
|
+
reviewJson: string;
|
|
541
|
+
reviewMarkdown: string;
|
|
542
|
+
observerData: string;
|
|
543
|
+
events: string;
|
|
544
|
+
};
|
|
545
|
+
review: ReviewSummary;
|
|
546
|
+
feedbackCandidates: RunFeedbackCandidate[];
|
|
547
|
+
/** Structured subject provenance (invariant 5). Optional and additive: emitted by the
|
|
548
|
+
* computer-use backend; tolerated absent everywhere else. */
|
|
549
|
+
subject?: RunSubjectProvenance;
|
|
550
|
+
/**
|
|
551
|
+
* The custom E2B desktop TEMPLATE (image) the run's sandbox(es) actually launched on, from
|
|
552
|
+
* `execution.desktop.template` — so the evidence shows WHICH image ran (a subject needing
|
|
553
|
+
* runtimes the stock `desktop` image lacks runs on an adopter's template). Optional + additive:
|
|
554
|
+
* present only when a template was configured (absent == the stock `desktop` template, every
|
|
555
|
+
* pre-existing bundle byte-stable). A template name is public-safe (not a secret).
|
|
556
|
+
*/
|
|
557
|
+
desktopTemplate?: string;
|
|
558
|
+
/**
|
|
559
|
+
* Browser family requested for hosted desktop actor lanes and the in-sandbox command that opened
|
|
560
|
+
* it, when explicitly configured. Optional + additive; absent means the historical default opener
|
|
561
|
+
* path was used or the backend does not create a headed desktop.
|
|
562
|
+
*/
|
|
563
|
+
desktopBrowser?: {
|
|
564
|
+
requested: "default" | "chrome" | "chromium" | "firefox";
|
|
565
|
+
resolved?: string;
|
|
566
|
+
};
|
|
567
|
+
/**
|
|
568
|
+
* Optional lineage for a run that intentionally re-executes selected lanes from a prior
|
|
569
|
+
* multi-lane run. This keeps retry-like workflows explicit: the new run is linked to the old
|
|
570
|
+
* evidence, but it never mutates or silently "fixes" the original verdict.
|
|
571
|
+
*/
|
|
572
|
+
rerun?: RunRerunLineage;
|
|
573
|
+
/**
|
|
574
|
+
* The interaction-attribution honesty axis (#164). Absent == `isolated` (every existing bundle
|
|
575
|
+
* byte-stable). Set to `shared-world` by the shared-world backend, paired with `sharedWorld`.
|
|
576
|
+
*/
|
|
577
|
+
attributionClass?: RunAttributionClass;
|
|
578
|
+
/**
|
|
579
|
+
* Shared-world evidence block (`humanish.shared-world.v1`). Optional + additive; present only on
|
|
580
|
+
* shared-world runs. Verified fail-closed by validateSharedWorldEvidence.
|
|
581
|
+
*/
|
|
582
|
+
sharedWorld?: SharedWorldEvidence;
|
|
583
|
+
/**
|
|
584
|
+
* OPTIONAL, ADAPTER-NAMESPACED product score (the layer-6 extension seam, issue #154 acceptance
|
|
585
|
+
* #8). A thin adapter's `score` hook returns a `RunAdapterScore`; the lane attaches it here
|
|
586
|
+
* WITHOUT core knowing any product noun (the score is namespaced + its breakdown lives in `data`).
|
|
587
|
+
* The default mission-based verdict (`review`) is unchanged when no scorer hook is given.
|
|
588
|
+
*/
|
|
589
|
+
adapterScore?: RunAdapterScore;
|
|
590
|
+
/**
|
|
591
|
+
* OPTIONAL, ADAPTER-NAMESPACED product/state proof artifacts. Core validates
|
|
592
|
+
* shape and local relative artifact references, then verifies the referenced
|
|
593
|
+
* files exist. The adapter owns the payload schema under `namespace`.
|
|
594
|
+
*/
|
|
595
|
+
adapterArtifacts?: RunAdapterArtifact[];
|
|
596
|
+
/**
|
|
597
|
+
* Evidence about mutable provider resources observed during this run. Stored ids
|
|
598
|
+
* are not cleanup authority: automatic provider mutation requires a verified
|
|
599
|
+
* resource lease. Optional + additive; core never enumerates provider accounts.
|
|
600
|
+
*/
|
|
601
|
+
providerResources?: RunProviderResource[];
|
|
602
|
+
}
|
|
603
|
+
export interface RunProviderResource {
|
|
604
|
+
schema: "humanish.provider-resource.v1";
|
|
605
|
+
provider: "e2b-desktop";
|
|
606
|
+
kind: "sandbox";
|
|
607
|
+
id: string;
|
|
608
|
+
owner: "humanish";
|
|
609
|
+
status: "running" | "killed" | "unknown";
|
|
610
|
+
simId?: string;
|
|
611
|
+
streamId?: string;
|
|
612
|
+
laneId?: string;
|
|
613
|
+
createdAt?: string;
|
|
614
|
+
cleanup?: {
|
|
615
|
+
killed: boolean;
|
|
616
|
+
reason: string;
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
export interface RunRerunLineage {
|
|
620
|
+
sourceRunId: string;
|
|
621
|
+
selectedLaneIds: string[];
|
|
622
|
+
previous: Array<{
|
|
623
|
+
laneId: string;
|
|
624
|
+
streamId?: string;
|
|
625
|
+
status: string;
|
|
626
|
+
reason?: string;
|
|
627
|
+
actorStatus?: string;
|
|
628
|
+
completionReason?: string;
|
|
629
|
+
}>;
|
|
630
|
+
}
|
|
631
|
+
export interface ReviewSummary {
|
|
632
|
+
schema: typeof REVIEW_SCHEMA;
|
|
633
|
+
verdict: "contract_proof_only" | "pass" | "fail" | "blocked" | "timed_out";
|
|
634
|
+
summary: string;
|
|
635
|
+
gaps: string[];
|
|
636
|
+
}
|
|
637
|
+
export declare function buildRunSource(args: {
|
|
638
|
+
cwd: string;
|
|
639
|
+
capturedAt?: Date | string;
|
|
640
|
+
humanishSource: RunBundle["source"]["humanishSource"];
|
|
641
|
+
packageName: string | null;
|
|
642
|
+
}): Promise<RunBundle["source"]>;
|
|
643
|
+
export interface RunResult {
|
|
644
|
+
schema: "humanish.run-result.v1";
|
|
645
|
+
ok: boolean;
|
|
646
|
+
runId?: string;
|
|
647
|
+
mode?: "dry-run" | "live";
|
|
648
|
+
simCount?: number;
|
|
649
|
+
cwd: string;
|
|
650
|
+
artifactRoot?: string;
|
|
651
|
+
bundlePath?: string;
|
|
652
|
+
reviewPath?: string;
|
|
653
|
+
latestPath?: string;
|
|
654
|
+
warnings: string[];
|
|
655
|
+
error?: {
|
|
656
|
+
code: "HUMANISH_ACTOR_FANOUT_UNIMPLEMENTED" | "HUMANISH_APP_URL_OPTION_CONFLICT" | "HUMANISH_BROWSER_APP_CAPTURE_FAILED" | "HUMANISH_CODEX_APP_SERVER_FAILED" | "HUMANISH_LIVE_RUN_UNIMPLEMENTED" | "HUMANISH_LOCAL_CODEX_EXEC_FAILED" | "HUMANISH_LOCAL_CODEX_TUI_FAILED" | "HUMANISH_INVALID_APP_URL" | "HUMANISH_INVALID_ACTOR_CONCURRENCY" | "HUMANISH_INVALID_CWD" | "HUMANISH_INVALID_SIM_COUNT" | "HUMANISH_INVALID_TIMEOUT" | "HUMANISH_INVALID_PORT" | "HUMANISH_UNSUPPORTED_ACTOR" | "HUMANISH_UNSUPPORTED_RERUN_FLAGS" | "HUMANISH_WATCH_OPTION_CONFLICT";
|
|
657
|
+
message: string;
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
export interface VerifyResult {
|
|
661
|
+
schema: typeof VERIFY_SCHEMA;
|
|
662
|
+
ok: boolean;
|
|
663
|
+
cwd: string;
|
|
664
|
+
run: string;
|
|
665
|
+
bundlePath?: string;
|
|
666
|
+
checks: Array<{
|
|
667
|
+
name: string;
|
|
668
|
+
ok: boolean;
|
|
669
|
+
message: string;
|
|
670
|
+
}>;
|
|
671
|
+
shareSafety: {
|
|
672
|
+
status: "share_ready" | "local_only" | "blocked";
|
|
673
|
+
reasons: Array<{
|
|
674
|
+
code: "VERIFY_FAILED" | "PUBLIC_SAFETY_FINDINGS" | "RAW_SCREENSHOTS";
|
|
675
|
+
message: string;
|
|
676
|
+
}>;
|
|
677
|
+
};
|
|
678
|
+
warnings: string[];
|
|
679
|
+
error?: {
|
|
680
|
+
code: "HUMANISH_RUN_NOT_FOUND" | "HUMANISH_INVALID_RUN_BUNDLE";
|
|
681
|
+
message: string;
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
export interface CleanupResourceResult {
|
|
685
|
+
provider: RunProviderResource["provider"];
|
|
686
|
+
kind: RunProviderResource["kind"];
|
|
687
|
+
id: string;
|
|
688
|
+
status: "killed" | "already_clean" | "failed" | "skipped";
|
|
689
|
+
message: string;
|
|
690
|
+
}
|
|
691
|
+
export interface CleanupAdapterResult {
|
|
692
|
+
id: string;
|
|
693
|
+
ok: boolean;
|
|
694
|
+
message: string;
|
|
695
|
+
}
|
|
696
|
+
export interface CleanupResult {
|
|
697
|
+
schema: typeof CLEANUP_SCHEMA;
|
|
698
|
+
ok: boolean;
|
|
699
|
+
cwd: string;
|
|
700
|
+
run: string;
|
|
701
|
+
runId?: string;
|
|
702
|
+
bundlePath?: string;
|
|
703
|
+
cleanupPath?: string;
|
|
704
|
+
checkedAt: string;
|
|
705
|
+
summary: {
|
|
706
|
+
resources: number;
|
|
707
|
+
killed: number;
|
|
708
|
+
alreadyClean: number;
|
|
709
|
+
failed: number;
|
|
710
|
+
skipped: number;
|
|
711
|
+
};
|
|
712
|
+
resources: CleanupResourceResult[];
|
|
713
|
+
adapterResults: CleanupAdapterResult[];
|
|
714
|
+
warnings: string[];
|
|
715
|
+
error?: {
|
|
716
|
+
code: "HUMANISH_RUN_NOT_FOUND" | "HUMANISH_INVALID_RUN_BUNDLE";
|
|
717
|
+
message: string;
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
export interface RunCleanupHooks {
|
|
721
|
+
/** @deprecated Ignored. Stored provider ids are not authority to load or mutate a provider. */
|
|
722
|
+
loadDesktopModule?: () => Promise<E2BDesktopModule>;
|
|
723
|
+
cleanupAdapterResources?: (ctx: {
|
|
724
|
+
cwd: string;
|
|
725
|
+
runDir: string;
|
|
726
|
+
bundle: RunBundle;
|
|
727
|
+
}) => Promise<CleanupAdapterResult[]>;
|
|
728
|
+
now?: () => Date;
|
|
729
|
+
}
|
|
730
|
+
export interface RunsResult {
|
|
731
|
+
schema: typeof RUNS_SCHEMA;
|
|
732
|
+
ok: boolean;
|
|
733
|
+
cwd: string;
|
|
734
|
+
runs: Array<{
|
|
735
|
+
runId: string;
|
|
736
|
+
createdAt: string | null;
|
|
737
|
+
mode: string | null;
|
|
738
|
+
path: string;
|
|
739
|
+
}>;
|
|
740
|
+
latest: string | null;
|
|
741
|
+
error?: {
|
|
742
|
+
code: "HUMANISH_RUNS_UNAVAILABLE";
|
|
743
|
+
message: string;
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
export interface DoctorResult {
|
|
747
|
+
schema: typeof DOCTOR_SCHEMA;
|
|
748
|
+
ok: boolean;
|
|
749
|
+
cwd: string;
|
|
750
|
+
checks: Array<{
|
|
751
|
+
name: string;
|
|
752
|
+
ok: boolean;
|
|
753
|
+
message: string;
|
|
754
|
+
}>;
|
|
755
|
+
}
|
|
756
|
+
export declare function runDryRun(options: RunOptions): Promise<RunResult>;
|
|
757
|
+
type LocalActorTerminalStatus = Extract<RunSimulationStatus, "passed" | "failed" | "blocked" | "timed_out">;
|
|
758
|
+
/**
|
|
759
|
+
* Strip ANSI/control noise from a captured terminal transcript into stable, scannable text.
|
|
760
|
+
* Pure (no IO). Exported so the terminal-product lane (src/e2b-terminal-lab.ts) normalizes its
|
|
761
|
+
* captured exec stream EXACTLY as the local-actor lanes do — the verdict-nonce scorer is only
|
|
762
|
+
* sound against the same normalization the marker is matched on, so the logic must not diverge.
|
|
763
|
+
*/
|
|
764
|
+
export declare function normalizeLocalActorTranscript(transcript: string): string;
|
|
765
|
+
/**
|
|
766
|
+
* Extract the per-run verdict from a normalized transcript: the agent must print exactly
|
|
767
|
+
* `HUMANISH_ACTOR_VERDICT=<status> HUMANISH_ACTOR_NONCE=<nonce>`, and the nonce is mandatory so a
|
|
768
|
+
* bare marker (echoed or replayed from untrusted text) can never forge a verdict. Pure (no IO).
|
|
769
|
+
* Exported so the terminal-product lane scores its in-sandbox `codex exec` run by the SAME marker
|
|
770
|
+
* — divergent verdict logic would let the two lanes disagree about what "passed" means.
|
|
771
|
+
*/
|
|
772
|
+
export declare function extractLocalActorVerdict(transcript: string, verdictNonce: string): LocalActorTerminalStatus | null;
|
|
773
|
+
export declare function verifyRun(cwdInput: string, runInput: string): Promise<VerifyResult>;
|
|
774
|
+
export declare function cleanupRun(cwdInput: string, runInput: string, hooks?: RunCleanupHooks): Promise<CleanupResult>;
|
|
775
|
+
export declare function loadRunBundle(cwdInput: string, runInput: string): Promise<{
|
|
776
|
+
bundle: RunBundle;
|
|
777
|
+
bundlePath: string;
|
|
778
|
+
runDir: string;
|
|
779
|
+
} | null>;
|
|
780
|
+
/** Internal continuity seam for callers that already bound one run identity. */
|
|
781
|
+
export declare function loadRunBundlePrepared(cwdInput: string, runPaths: PreparedRunArtifactPaths): Promise<{
|
|
782
|
+
bundle: RunBundle;
|
|
783
|
+
bundlePath: string;
|
|
784
|
+
runDir: string;
|
|
785
|
+
} | null>;
|
|
786
|
+
/** Internal continuity seam for callers that already bound one run identity. */
|
|
787
|
+
export declare function verifyRunPrepared(cwdInput: string, runInput: string, runPaths: PreparedRunArtifactPaths): Promise<VerifyResult>;
|
|
788
|
+
export declare function listRuns(cwdInput: string): Promise<RunsResult>;
|
|
789
|
+
export declare function readReview(cwdInput: string, runInput: string): Promise<VerifyResult | (ReviewSummary & {
|
|
790
|
+
path: string;
|
|
791
|
+
runId: string;
|
|
792
|
+
})>;
|
|
793
|
+
export declare function doctor(cwdInput: string): Promise<DoctorResult>;
|
|
794
|
+
export {};
|