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.
Files changed (205) hide show
  1. package/AGENTS.md +77 -0
  2. package/CONTRIBUTING.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +437 -8
  5. package/SECURITY.md +34 -0
  6. package/dist/actor-contract.d.ts +107 -0
  7. package/dist/actor-contract.js +286 -0
  8. package/dist/actor-contract.js.map +1 -0
  9. package/dist/actor-registry.d.ts +73 -0
  10. package/dist/actor-registry.js +93 -0
  11. package/dist/actor-registry.js.map +1 -0
  12. package/dist/adapter-extension.d.ts +54 -0
  13. package/dist/adapter-extension.js +214 -0
  14. package/dist/adapter-extension.js.map +1 -0
  15. package/dist/argv.d.ts +1 -0
  16. package/dist/argv.js +8 -0
  17. package/dist/argv.js.map +1 -0
  18. package/dist/artifact-reference.d.ts +22 -0
  19. package/dist/artifact-reference.js +47 -0
  20. package/dist/artifact-reference.js.map +1 -0
  21. package/dist/browser-evidence-hygiene.d.ts +7 -0
  22. package/dist/browser-evidence-hygiene.js +40 -0
  23. package/dist/browser-evidence-hygiene.js.map +1 -0
  24. package/dist/claude-agent-sdk.d.ts +94 -0
  25. package/dist/claude-agent-sdk.js +363 -0
  26. package/dist/claude-agent-sdk.js.map +1 -0
  27. package/dist/cli.d.ts +2 -0
  28. package/dist/cli.js +5 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/codex-app-server-ui.d.ts +39 -0
  31. package/dist/codex-app-server-ui.js +357 -0
  32. package/dist/codex-app-server-ui.js.map +1 -0
  33. package/dist/codex-app-server.d.ts +144 -0
  34. package/dist/codex-app-server.js +754 -0
  35. package/dist/codex-app-server.js.map +1 -0
  36. package/dist/command-failure.d.ts +29 -0
  37. package/dist/command-failure.js +54 -0
  38. package/dist/command-failure.js.map +1 -0
  39. package/dist/computer-use-actor.d.ts +52 -0
  40. package/dist/computer-use-actor.js +48 -0
  41. package/dist/computer-use-actor.js.map +1 -0
  42. package/dist/computer-use.d.ts +232 -0
  43. package/dist/computer-use.js +615 -0
  44. package/dist/computer-use.js.map +1 -0
  45. package/dist/concurrency.d.ts +1 -0
  46. package/dist/concurrency.js +27 -0
  47. package/dist/concurrency.js.map +1 -0
  48. package/dist/concurrent-shared-world-lab.d.ts +115 -0
  49. package/dist/concurrent-shared-world-lab.js +1094 -0
  50. package/dist/concurrent-shared-world-lab.js.map +1 -0
  51. package/dist/core/git-state.d.ts +33 -0
  52. package/dist/core/git-state.js +277 -0
  53. package/dist/core/git-state.js.map +1 -0
  54. package/dist/core/git-workspace.d.ts +31 -0
  55. package/dist/core/git-workspace.js +447 -0
  56. package/dist/core/git-workspace.js.map +1 -0
  57. package/dist/core/index.d.ts +4 -0
  58. package/dist/core/index.js +3 -0
  59. package/dist/core/index.js.map +1 -0
  60. package/dist/core/run-primitives.d.ts +66 -0
  61. package/dist/core/run-primitives.js +120 -0
  62. package/dist/core/run-primitives.js.map +1 -0
  63. package/dist/cua-actor-lab.d.ts +621 -0
  64. package/dist/cua-actor-lab.js +2845 -0
  65. package/dist/cua-actor-lab.js.map +1 -0
  66. package/dist/device-presets.d.ts +67 -0
  67. package/dist/device-presets.js +50 -0
  68. package/dist/device-presets.js.map +1 -0
  69. package/dist/e2b-desktop-executor.d.ts +101 -0
  70. package/dist/e2b-desktop-executor.js +309 -0
  71. package/dist/e2b-desktop-executor.js.map +1 -0
  72. package/dist/e2b-desktop-launch.d.ts +144 -0
  73. package/dist/e2b-desktop-launch.js +59 -0
  74. package/dist/e2b-desktop-launch.js.map +1 -0
  75. package/dist/e2b-detached.d.ts +53 -0
  76. package/dist/e2b-detached.js +130 -0
  77. package/dist/e2b-detached.js.map +1 -0
  78. package/dist/e2b-terminal-lab.d.ts +345 -0
  79. package/dist/e2b-terminal-lab.js +1532 -0
  80. package/dist/e2b-terminal-lab.js.map +1 -0
  81. package/dist/env-file.d.ts +14 -0
  82. package/dist/env-file.js +108 -0
  83. package/dist/env-file.js.map +1 -0
  84. package/dist/feedback.d.ts +51 -0
  85. package/dist/feedback.js +351 -0
  86. package/dist/feedback.js.map +1 -0
  87. package/dist/image-evidence.d.ts +2 -0
  88. package/dist/image-evidence.js +33 -0
  89. package/dist/image-evidence.js.map +1 -0
  90. package/dist/index.d.ts +63 -0
  91. package/dist/index.js +33 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/init-templates.d.ts +12 -0
  94. package/dist/init-templates.js +369 -0
  95. package/dist/init-templates.js.map +1 -0
  96. package/dist/init.d.ts +26 -0
  97. package/dist/init.js +429 -0
  98. package/dist/init.js.map +1 -0
  99. package/dist/lab-app-runner.d.ts +78 -0
  100. package/dist/lab-app-runner.js +403 -0
  101. package/dist/lab-app-runner.js.map +1 -0
  102. package/dist/lab-config.d.ts +583 -0
  103. package/dist/lab-config.js +1789 -0
  104. package/dist/lab-config.js.map +1 -0
  105. package/dist/lab-engine.d.ts +77 -0
  106. package/dist/lab-engine.js +216 -0
  107. package/dist/lab-engine.js.map +1 -0
  108. package/dist/lab-preflight.d.ts +67 -0
  109. package/dist/lab-preflight.js +385 -0
  110. package/dist/lab-preflight.js.map +1 -0
  111. package/dist/labs.d.ts +53 -0
  112. package/dist/labs.js +382 -0
  113. package/dist/labs.js.map +1 -0
  114. package/dist/observer-assets.d.ts +2 -0
  115. package/dist/observer-assets.js +2630 -0
  116. package/dist/observer-assets.js.map +1 -0
  117. package/dist/observer-data.d.ts +63 -0
  118. package/dist/observer-data.js +145 -0
  119. package/dist/observer-data.js.map +1 -0
  120. package/dist/observer-static.d.ts +39 -0
  121. package/dist/observer-static.js +306 -0
  122. package/dist/observer-static.js.map +1 -0
  123. package/dist/observer.d.ts +46 -0
  124. package/dist/observer.js +550 -0
  125. package/dist/observer.js.map +1 -0
  126. package/dist/openai-responses-cu.d.ts +113 -0
  127. package/dist/openai-responses-cu.js +545 -0
  128. package/dist/openai-responses-cu.js.map +1 -0
  129. package/dist/oss-lab.d.ts +52 -0
  130. package/dist/oss-lab.js +344 -0
  131. package/dist/oss-lab.js.map +1 -0
  132. package/dist/oss-meta-lab-scoring.d.ts +15 -0
  133. package/dist/oss-meta-lab-scoring.js +145 -0
  134. package/dist/oss-meta-lab-scoring.js.map +1 -0
  135. package/dist/oss-meta-lab.d.ts +277 -0
  136. package/dist/oss-meta-lab.js +4529 -0
  137. package/dist/oss-meta-lab.js.map +1 -0
  138. package/dist/oss-remote-telemetry.d.ts +77 -0
  139. package/dist/oss-remote-telemetry.js +403 -0
  140. package/dist/oss-remote-telemetry.js.map +1 -0
  141. package/dist/persona.d.ts +35 -0
  142. package/dist/persona.js +133 -0
  143. package/dist/persona.js.map +1 -0
  144. package/dist/pi-agent-core.d.ts +77 -0
  145. package/dist/pi-agent-core.js +203 -0
  146. package/dist/pi-agent-core.js.map +1 -0
  147. package/dist/program.d.ts +54 -0
  148. package/dist/program.js +2349 -0
  149. package/dist/program.js.map +1 -0
  150. package/dist/redaction.d.ts +90 -0
  151. package/dist/redaction.js +292 -0
  152. package/dist/redaction.js.map +1 -0
  153. package/dist/run-paths.d.ts +56 -0
  154. package/dist/run-paths.js +340 -0
  155. package/dist/run-paths.js.map +1 -0
  156. package/dist/run.d.ts +794 -0
  157. package/dist/run.js +4844 -0
  158. package/dist/run.js.map +1 -0
  159. package/dist/scripted-browser-actor.d.ts +297 -0
  160. package/dist/scripted-browser-actor.js +1399 -0
  161. package/dist/scripted-browser-actor.js.map +1 -0
  162. package/dist/scripted-browser-lab.d.ts +107 -0
  163. package/dist/scripted-browser-lab.js +788 -0
  164. package/dist/scripted-browser-lab.js.map +1 -0
  165. package/dist/selected-output-paths.d.ts +49 -0
  166. package/dist/selected-output-paths.js +354 -0
  167. package/dist/selected-output-paths.js.map +1 -0
  168. package/dist/shared-world-lab.d.ts +208 -0
  169. package/dist/shared-world-lab.js +1049 -0
  170. package/dist/shared-world-lab.js.map +1 -0
  171. package/dist/source-archive.d.ts +82 -0
  172. package/dist/source-archive.js +408 -0
  173. package/dist/source-archive.js.map +1 -0
  174. package/dist/stop-conditions.d.ts +26 -0
  175. package/dist/stop-conditions.js +66 -0
  176. package/dist/stop-conditions.js.map +1 -0
  177. package/dist/terminal-agent-actor.d.ts +36 -0
  178. package/dist/terminal-agent-actor.js +23 -0
  179. package/dist/terminal-agent-actor.js.map +1 -0
  180. package/docs/architecture/actor-contract.md +431 -0
  181. package/docs/architecture/github-feedback-loop.md +189 -0
  182. package/docs/architecture/local-codex-tui-actor.md +213 -0
  183. package/docs/architecture/observer.md +118 -0
  184. package/docs/architecture/oss-lab-poc.md +250 -0
  185. package/docs/architecture/project-layout.md +166 -0
  186. package/docs/architecture/state-driven-executor.md +203 -0
  187. package/docs/architecture/terminal-product-lane.md +148 -0
  188. package/docs/contracts/adapter-fixtures.md +80 -0
  189. package/docs/contracts/core.md +71 -0
  190. package/docs/contracts/feedback.md +145 -0
  191. package/docs/contracts/policy.md +311 -0
  192. package/docs/contracts/run-bundle.md +358 -0
  193. package/docs/contracts/schemas.md +984 -0
  194. package/docs/goals/current.md +428 -0
  195. package/docs/principles/invariants-and-defaults.md +135 -0
  196. package/docs/principles/self-driving-harness.md +129 -0
  197. package/docs/product/open-source-install-experience.md +237 -0
  198. package/docs/ramp/README.md +207 -0
  199. package/docs/release/open-source-readiness.md +208 -0
  200. package/docs/release/public-readiness-standard.md +205 -0
  201. package/docs/roadmap/world-class-open-source-v0.md +311 -0
  202. package/package.json +102 -8
  203. package/skills/humanish/SKILL.md +244 -0
  204. package/skills/humanish/agents/openai.yaml +7 -0
  205. 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 {};