humanish 0.0.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/AGENTS.md +77 -0
  2. package/CONTRIBUTING.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +435 -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 +356 -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 +327 -0
  32. package/dist/codex-app-server-ui.js.map +1 -0
  33. package/dist/codex-app-server.d.ts +141 -0
  34. package/dist/codex-app-server.js +747 -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 +1092 -0
  50. package/dist/concurrent-shared-world-lab.js.map +1 -0
  51. package/dist/core/git-state.d.ts +31 -0
  52. package/dist/core/git-state.js +142 -0
  53. package/dist/core/git-state.js.map +1 -0
  54. package/dist/core/index.d.ts +4 -0
  55. package/dist/core/index.js +3 -0
  56. package/dist/core/index.js.map +1 -0
  57. package/dist/core/run-primitives.d.ts +66 -0
  58. package/dist/core/run-primitives.js +120 -0
  59. package/dist/core/run-primitives.js.map +1 -0
  60. package/dist/cua-actor-lab.d.ts +620 -0
  61. package/dist/cua-actor-lab.js +2834 -0
  62. package/dist/cua-actor-lab.js.map +1 -0
  63. package/dist/device-presets.d.ts +67 -0
  64. package/dist/device-presets.js +50 -0
  65. package/dist/device-presets.js.map +1 -0
  66. package/dist/e2b-desktop-executor.d.ts +101 -0
  67. package/dist/e2b-desktop-executor.js +309 -0
  68. package/dist/e2b-desktop-executor.js.map +1 -0
  69. package/dist/e2b-desktop-launch.d.ts +144 -0
  70. package/dist/e2b-desktop-launch.js +59 -0
  71. package/dist/e2b-desktop-launch.js.map +1 -0
  72. package/dist/e2b-detached.d.ts +53 -0
  73. package/dist/e2b-detached.js +130 -0
  74. package/dist/e2b-detached.js.map +1 -0
  75. package/dist/e2b-terminal-lab.d.ts +345 -0
  76. package/dist/e2b-terminal-lab.js +1467 -0
  77. package/dist/e2b-terminal-lab.js.map +1 -0
  78. package/dist/env-file.d.ts +14 -0
  79. package/dist/env-file.js +108 -0
  80. package/dist/env-file.js.map +1 -0
  81. package/dist/feedback.d.ts +51 -0
  82. package/dist/feedback.js +313 -0
  83. package/dist/feedback.js.map +1 -0
  84. package/dist/image-evidence.d.ts +2 -0
  85. package/dist/image-evidence.js +33 -0
  86. package/dist/image-evidence.js.map +1 -0
  87. package/dist/index.d.ts +63 -0
  88. package/dist/index.js +33 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/init-templates.d.ts +12 -0
  91. package/dist/init-templates.js +369 -0
  92. package/dist/init-templates.js.map +1 -0
  93. package/dist/init.d.ts +26 -0
  94. package/dist/init.js +343 -0
  95. package/dist/init.js.map +1 -0
  96. package/dist/lab-app-runner.d.ts +78 -0
  97. package/dist/lab-app-runner.js +403 -0
  98. package/dist/lab-app-runner.js.map +1 -0
  99. package/dist/lab-config.d.ts +578 -0
  100. package/dist/lab-config.js +1751 -0
  101. package/dist/lab-config.js.map +1 -0
  102. package/dist/lab-engine.d.ts +77 -0
  103. package/dist/lab-engine.js +216 -0
  104. package/dist/lab-engine.js.map +1 -0
  105. package/dist/lab-preflight.d.ts +67 -0
  106. package/dist/lab-preflight.js +385 -0
  107. package/dist/lab-preflight.js.map +1 -0
  108. package/dist/labs.d.ts +53 -0
  109. package/dist/labs.js +176 -0
  110. package/dist/labs.js.map +1 -0
  111. package/dist/observer-assets.d.ts +2 -0
  112. package/dist/observer-assets.js +2630 -0
  113. package/dist/observer-assets.js.map +1 -0
  114. package/dist/observer-data.d.ts +63 -0
  115. package/dist/observer-data.js +145 -0
  116. package/dist/observer-data.js.map +1 -0
  117. package/dist/observer-static.d.ts +39 -0
  118. package/dist/observer-static.js +192 -0
  119. package/dist/observer-static.js.map +1 -0
  120. package/dist/observer.d.ts +46 -0
  121. package/dist/observer.js +353 -0
  122. package/dist/observer.js.map +1 -0
  123. package/dist/openai-responses-cu.d.ts +113 -0
  124. package/dist/openai-responses-cu.js +531 -0
  125. package/dist/openai-responses-cu.js.map +1 -0
  126. package/dist/oss-lab.d.ts +52 -0
  127. package/dist/oss-lab.js +299 -0
  128. package/dist/oss-lab.js.map +1 -0
  129. package/dist/oss-meta-lab-scoring.d.ts +15 -0
  130. package/dist/oss-meta-lab-scoring.js +145 -0
  131. package/dist/oss-meta-lab-scoring.js.map +1 -0
  132. package/dist/oss-meta-lab.d.ts +279 -0
  133. package/dist/oss-meta-lab.js +4889 -0
  134. package/dist/oss-meta-lab.js.map +1 -0
  135. package/dist/oss-remote-telemetry.d.ts +77 -0
  136. package/dist/oss-remote-telemetry.js +403 -0
  137. package/dist/oss-remote-telemetry.js.map +1 -0
  138. package/dist/persona.d.ts +35 -0
  139. package/dist/persona.js +133 -0
  140. package/dist/persona.js.map +1 -0
  141. package/dist/pi-agent-core.d.ts +77 -0
  142. package/dist/pi-agent-core.js +203 -0
  143. package/dist/pi-agent-core.js.map +1 -0
  144. package/dist/program.d.ts +54 -0
  145. package/dist/program.js +2347 -0
  146. package/dist/program.js.map +1 -0
  147. package/dist/redaction.d.ts +90 -0
  148. package/dist/redaction.js +292 -0
  149. package/dist/redaction.js.map +1 -0
  150. package/dist/run.d.ts +784 -0
  151. package/dist/run.js +4555 -0
  152. package/dist/run.js.map +1 -0
  153. package/dist/scripted-browser-actor.d.ts +294 -0
  154. package/dist/scripted-browser-actor.js +1286 -0
  155. package/dist/scripted-browser-actor.js.map +1 -0
  156. package/dist/scripted-browser-lab.d.ts +107 -0
  157. package/dist/scripted-browser-lab.js +738 -0
  158. package/dist/scripted-browser-lab.js.map +1 -0
  159. package/dist/shared-world-lab.d.ts +208 -0
  160. package/dist/shared-world-lab.js +1048 -0
  161. package/dist/shared-world-lab.js.map +1 -0
  162. package/dist/source-archive.d.ts +82 -0
  163. package/dist/source-archive.js +365 -0
  164. package/dist/source-archive.js.map +1 -0
  165. package/dist/stop-conditions.d.ts +26 -0
  166. package/dist/stop-conditions.js +66 -0
  167. package/dist/stop-conditions.js.map +1 -0
  168. package/dist/terminal-agent-actor.d.ts +36 -0
  169. package/dist/terminal-agent-actor.js +23 -0
  170. package/dist/terminal-agent-actor.js.map +1 -0
  171. package/docs/architecture/actor-contract.md +431 -0
  172. package/docs/architecture/github-feedback-loop.md +189 -0
  173. package/docs/architecture/local-codex-tui-actor.md +213 -0
  174. package/docs/architecture/observer.md +118 -0
  175. package/docs/architecture/oss-lab-poc.md +242 -0
  176. package/docs/architecture/project-layout.md +166 -0
  177. package/docs/architecture/state-driven-executor.md +203 -0
  178. package/docs/architecture/terminal-product-lane.md +148 -0
  179. package/docs/contracts/adapter-fixtures.md +80 -0
  180. package/docs/contracts/core.md +71 -0
  181. package/docs/contracts/feedback.md +145 -0
  182. package/docs/contracts/policy.md +305 -0
  183. package/docs/contracts/run-bundle.md +358 -0
  184. package/docs/contracts/schemas.md +984 -0
  185. package/docs/goals/current.md +409 -0
  186. package/docs/principles/invariants-and-defaults.md +135 -0
  187. package/docs/principles/self-driving-harness.md +129 -0
  188. package/docs/product/open-source-install-experience.md +229 -0
  189. package/docs/ramp/README.md +200 -0
  190. package/docs/release/open-source-readiness.md +208 -0
  191. package/docs/release/public-readiness-standard.md +205 -0
  192. package/docs/roadmap/world-class-open-source-v0.md +311 -0
  193. package/package.json +102 -8
  194. package/skills/humanish/SKILL.md +244 -0
  195. package/skills/humanish/agents/openai.yaml +7 -0
  196. package/index.js +0 -1
@@ -0,0 +1,385 @@
1
+ import path from "node:path";
2
+ import { CUA_ACTOR_LAB_PROVIDER_METADATA, provisionCloneSubject } from "./cua-actor-lab.js";
3
+ import { probeUrl } from "./e2b-detached.js";
4
+ import { createDesktopSandbox, loadE2BDesktopModule } from "./e2b-desktop-launch.js";
5
+ import { isLoopbackUrl } from "./lab-config.js";
6
+ import { selectLabBackend } from "./lab-engine.js";
7
+ import { resolveLabManifest } from "./labs.js";
8
+ import { digestText, redactText } from "./redaction.js";
9
+ export const LAB_PREFLIGHT_SCHEMA = "humanish.lab-preflight-result.v1";
10
+ const DEFAULT_PREFLIGHT_TIMEOUT_MS = 30_000;
11
+ const DEFAULT_SANDBOX_TIMEOUT_MS = 10 * 60_000;
12
+ const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
13
+ export async function runLabPreflight(options) {
14
+ const cwd = path.resolve(options.cwd);
15
+ const reachability = options.reachability ?? "metadata";
16
+ const timeoutMs = options.timeoutMs ?? DEFAULT_PREFLIGHT_TIMEOUT_MS;
17
+ const resolved = await resolveLabManifest(cwd, options.lab);
18
+ if (!resolved.ok) {
19
+ return {
20
+ schema: LAB_PREFLIGHT_SCHEMA,
21
+ ok: false,
22
+ cwd,
23
+ lab: options.lab,
24
+ reachability,
25
+ checks: [{
26
+ name: "lab manifest",
27
+ ok: false,
28
+ message: resolved.error.message
29
+ }],
30
+ targets: [],
31
+ sandbox: { created: false },
32
+ spend: { e2bDesktop: false, model: false },
33
+ warnings: resolved.warnings,
34
+ error: resolved.error
35
+ };
36
+ }
37
+ const backend = selectLabBackend(resolved.config);
38
+ const ctx = {
39
+ cwd,
40
+ lab: options.lab,
41
+ labId: resolved.config.id,
42
+ origin: resolved.origin,
43
+ path: resolved.path,
44
+ config: resolved.config,
45
+ backend,
46
+ reachability,
47
+ timeoutMs,
48
+ env: options.env ?? process.env,
49
+ hooks: options.hooks ?? {},
50
+ checks: [
51
+ { name: "lab manifest", ok: true, message: `resolved ${resolved.origin} lab manifest` },
52
+ { name: "backend", ok: true, message: `selected ${backend}` }
53
+ ],
54
+ targets: collectTargets(resolved.config),
55
+ sandbox: { created: false },
56
+ warnings: resolved.warnings
57
+ };
58
+ switch (reachability) {
59
+ case "metadata":
60
+ return finalize(ctx, {
61
+ check: { name: "reachability", ok: true, message: "metadata-only; no network, sandbox, or model calls" }
62
+ });
63
+ case "public-preview":
64
+ return await runPublicPreviewPreflight(ctx);
65
+ case "sandbox-loopback":
66
+ return await runSandboxLoopbackPreflight(ctx);
67
+ case "prepared-host":
68
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", "prepared-host preflight requires a library adapter hook; the plain CLI can validate metadata only for this mode.", [
69
+ { name: "prepared-host", ok: false, message: "no generic CLI hook exists for adopter-prepared hosts yet" }
70
+ ]);
71
+ }
72
+ }
73
+ async function runPublicPreviewPreflight(ctx) {
74
+ const routeError = publicPreviewRouteError(ctx.config, ctx.backend);
75
+ if (routeError) {
76
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
77
+ { name: "route", ok: false, message: routeError }
78
+ ]);
79
+ }
80
+ const laneTargets = ctx.targets.filter((target) => target.kind === "actors[0].lanes[].target");
81
+ const publicTargets = laneTargets.length > 0
82
+ ? laneTargets
83
+ : ctx.targets.filter((target) => target.kind === "subject.appUrl");
84
+ if (publicTargets.length === 0) {
85
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_TARGET_POLICY", "public-preview preflight needs at least one declared app-url target.", [
86
+ { name: "targets", ok: false, message: "no app-url targets were declared" }
87
+ ]);
88
+ }
89
+ const loopbackTarget = publicTargets.find((target) => target.loopback);
90
+ if (loopbackTarget) {
91
+ blockTarget(loopbackTarget, "public-preview requires externally reachable non-loopback targets.");
92
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_TARGET_POLICY", "public-preview reachability cannot prove loopback targets from a hosted desktop; use sandbox-loopback or a prepared public target.", [
93
+ { name: "target policy", ok: false, message: "loopback target blocked before sandbox launch" }
94
+ ]);
95
+ }
96
+ const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
97
+ if (!e2bApiKey) {
98
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_E2B_REQUIRED", "public-preview preflight creates one E2B desktop to probe target reachability; E2B_API_KEY is required.", [
99
+ { name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }
100
+ ]);
101
+ }
102
+ const probe = await withPreflightSandbox(ctx, { e2bApiKey }, async (desktop) => {
103
+ for (const target of publicTargets) {
104
+ const reachable = await probeUrl(desktop, targetUrlFor(ctx.config, target), {
105
+ timeoutMs: ctx.timeoutMs,
106
+ requestTimeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
107
+ ...(ctx.hooks.now === undefined ? {} : { now: ctx.hooks.now }),
108
+ ...(ctx.hooks.sleep === undefined ? {} : { sleep: ctx.hooks.sleep })
109
+ });
110
+ markTargetReachability(target, reachable);
111
+ }
112
+ });
113
+ if (!probe.ok) {
114
+ return probe.result;
115
+ }
116
+ const failed = publicTargets.find((target) => target.reachable === false);
117
+ if (failed) {
118
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_TARGET_UNREACHABLE", "one or more declared public-preview targets were not reachable from the hosted desktop.", [
119
+ { name: "target reachability", ok: false, message: `${publicTargets.filter((target) => target.reachable).length}/${publicTargets.length} targets reachable` }
120
+ ]);
121
+ }
122
+ return finalize(ctx, {
123
+ check: { name: "target reachability", ok: true, message: `${publicTargets.length}/${publicTargets.length} targets reachable from hosted desktop` }
124
+ });
125
+ }
126
+ async function runSandboxLoopbackPreflight(ctx) {
127
+ const routeError = sandboxLoopbackRouteError(ctx.config, ctx.backend);
128
+ if (routeError) {
129
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
130
+ { name: "route", ok: false, message: routeError }
131
+ ]);
132
+ }
133
+ const missingEnv = (ctx.config.subject.env ?? []).filter((name) => !ctx.env[name]?.trim());
134
+ if (missingEnv.length > 0) {
135
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_ENV_MISSING", `sandbox-loopback preflight needs declared env values: ${missingEnv.join(", ")}`, [
136
+ { name: "subject env", ok: false, message: `${missingEnv.length} declared env var value(s) missing` }
137
+ ]);
138
+ }
139
+ const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
140
+ if (!e2bApiKey) {
141
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_E2B_REQUIRED", "sandbox-loopback preflight creates one E2B desktop to clone, serve, and probe the subject; E2B_API_KEY is required.", [
142
+ { name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }
143
+ ]);
144
+ }
145
+ const repo = ctx.config.subject.repos?.[0];
146
+ const serve = ctx.config.subject.serve;
147
+ if (!repo || !serve) {
148
+ return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", "sandbox-loopback preflight requires one clone repo and subject.serve.", [
149
+ { name: "clone subject", ok: false, message: "missing repo or serve block" }
150
+ ]);
151
+ }
152
+ let subjectCommitDigest;
153
+ const probe = await withPreflightSandbox(ctx, { e2bApiKey }, async (desktop) => {
154
+ const subjectEnvNames = ctx.config.subject.env ?? [];
155
+ await provisionCloneSubject(desktop, {
156
+ repo,
157
+ depth: ctx.config.subject.clone?.depth ?? 1,
158
+ serve,
159
+ ...(ctx.config.subject.state === undefined ? {} : { state: ctx.config.subject.state }),
160
+ hasGithubToken: subjectEnvNames.includes("GITHUB_TOKEN"),
161
+ requestTimeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
162
+ scrub: makeEnvScrubber(ctx.env, subjectEnvNames),
163
+ onCommit: (commit) => {
164
+ subjectCommitDigest = digest(commit);
165
+ },
166
+ ...(ctx.hooks.now === undefined ? {} : { now: ctx.hooks.now }),
167
+ ...(ctx.hooks.sleep === undefined ? {} : { sleep: ctx.hooks.sleep })
168
+ });
169
+ const serveTarget = ctx.targets.find((target) => target.kind === "subject.serve.url");
170
+ if (serveTarget) {
171
+ markTargetReachability(serveTarget, true);
172
+ }
173
+ });
174
+ if (!probe.ok) {
175
+ return probe.result;
176
+ }
177
+ return finalize(ctx, {
178
+ check: {
179
+ name: "subject provisioning",
180
+ ok: true,
181
+ message: `clone subject served and answered readiness${subjectCommitDigest ? ` (commit digest ${subjectCommitDigest})` : ""}`
182
+ }
183
+ });
184
+ }
185
+ async function withPreflightSandbox(ctx, args, callback) {
186
+ let module;
187
+ let desktop;
188
+ let failureMessage;
189
+ try {
190
+ module = await (ctx.hooks.loadDesktopModule ?? loadE2BDesktopModule)();
191
+ desktop = await createDesktopSandbox(module, {
192
+ apiKey: args.e2bApiKey,
193
+ requestTimeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
194
+ timeoutMs: ctx.config.execution?.desktop?.sandboxTimeoutMs ?? DEFAULT_SANDBOX_TIMEOUT_MS,
195
+ lifecycle: { onTimeout: "kill" },
196
+ metadata: {
197
+ ...CUA_ACTOR_LAB_PROVIDER_METADATA,
198
+ mode: "lab-preflight",
199
+ labId: ctx.config.id,
200
+ reachability: ctx.reachability
201
+ },
202
+ ...(ctx.config.subject.env?.length
203
+ ? { envs: Object.fromEntries(ctx.config.subject.env.map((name) => [name, ctx.env[name]])) }
204
+ : {}),
205
+ ...(ctx.config.execution?.desktop?.resolution ? { resolution: ctx.config.execution.desktop.resolution } : {}),
206
+ dpi: 96
207
+ }, ctx.config.execution?.desktop?.template);
208
+ ctx.sandbox = {
209
+ created: true,
210
+ sandboxIdDigest: digest(desktop.sandboxId),
211
+ ...(ctx.config.execution?.desktop?.template ? { template: ctx.config.execution.desktop.template } : {})
212
+ };
213
+ await callback(desktop);
214
+ }
215
+ catch (error) {
216
+ failureMessage = compactError(error);
217
+ }
218
+ finally {
219
+ if (module && desktop) {
220
+ if (typeof module.Sandbox.kill === "function") {
221
+ try {
222
+ await module.Sandbox.kill(desktop.sandboxId, { requestTimeoutMs: DEFAULT_REQUEST_TIMEOUT_MS });
223
+ ctx.sandbox = { ...ctx.sandbox, killed: true };
224
+ }
225
+ catch (error) {
226
+ ctx.sandbox = { ...ctx.sandbox, killed: false };
227
+ ctx.warnings.push(`Sandbox teardown failed; server-side timeout should reclaim it: ${compactError(error)}`);
228
+ }
229
+ }
230
+ else {
231
+ ctx.sandbox = { ...ctx.sandbox, killed: false };
232
+ ctx.warnings.push("Installed @e2b/desktop SDK does not expose Sandbox.kill; server-side timeout should reclaim the sandbox.");
233
+ }
234
+ }
235
+ }
236
+ if (failureMessage) {
237
+ return {
238
+ ok: false,
239
+ result: fail(ctx, "HUMANISH_LAB_PREFLIGHT_PROVISION_FAILED", failureMessage, [
240
+ { name: "sandbox preflight", ok: false, message: failureMessage }
241
+ ])
242
+ };
243
+ }
244
+ if (ctx.sandbox.created && ctx.sandbox.killed !== true) {
245
+ return {
246
+ ok: false,
247
+ result: fail(ctx, "HUMANISH_LAB_PREFLIGHT_TEARDOWN_FAILED", "preflight sandbox was created but teardown could not be proven.", [
248
+ { name: "sandbox teardown", ok: false, message: "sandbox kill was not proven" }
249
+ ])
250
+ };
251
+ }
252
+ return { ok: true };
253
+ }
254
+ function finalize(ctx, args) {
255
+ const checks = args?.check ? [...ctx.checks, args.check] : ctx.checks;
256
+ return {
257
+ schema: LAB_PREFLIGHT_SCHEMA,
258
+ ok: checks.every((check) => check.ok) && ctx.targets.every((target) => target.status !== "failed" && target.status !== "blocked"),
259
+ cwd: ctx.cwd,
260
+ lab: ctx.lab,
261
+ labId: ctx.labId,
262
+ origin: ctx.origin,
263
+ path: ctx.path,
264
+ backend: ctx.backend,
265
+ reachability: ctx.reachability,
266
+ checks,
267
+ targets: ctx.targets,
268
+ sandbox: ctx.sandbox,
269
+ spend: {
270
+ e2bDesktop: ctx.sandbox.created,
271
+ model: false
272
+ },
273
+ warnings: ctx.warnings
274
+ };
275
+ }
276
+ function fail(ctx, code, message, checks) {
277
+ return {
278
+ ...finalize(ctx),
279
+ ok: false,
280
+ checks: [...ctx.checks, ...checks],
281
+ error: { code, message }
282
+ };
283
+ }
284
+ function collectTargets(config) {
285
+ const targets = [];
286
+ if (config.subject.appUrl) {
287
+ targets.push(makeTarget("subject.appUrl", "subject.appUrl", config.subject.appUrl));
288
+ }
289
+ for (const [index, lane] of (config.actors[0]?.lanes ?? []).entries()) {
290
+ if (lane.target) {
291
+ targets.push(makeTarget(`actors[0].lanes[${index}].target`, "actors[0].lanes[].target", lane.target));
292
+ }
293
+ }
294
+ if (config.subject.serve?.url) {
295
+ targets.push(makeTarget("subject.serve.url", "subject.serve.url", config.subject.serve.url));
296
+ }
297
+ for (const [index, surface] of (config.subject.product?.publicSurfaces ?? []).entries()) {
298
+ targets.push(makeTarget(`subject.product.publicSurfaces[${index}]`, "subject.product.publicSurface", surface));
299
+ }
300
+ return targets;
301
+ }
302
+ function makeTarget(label, kind, url) {
303
+ return {
304
+ label,
305
+ kind,
306
+ targetDigest: digest(url),
307
+ ...originDigest(url),
308
+ loopback: isLoopbackUrl(url),
309
+ checked: false,
310
+ status: "not_checked",
311
+ message: "target declared; reachability not checked"
312
+ };
313
+ }
314
+ function markTargetReachability(target, reachable) {
315
+ target.checked = true;
316
+ target.reachable = reachable;
317
+ target.status = reachable ? "passed" : "failed";
318
+ if (reachable) {
319
+ target.message = "target reachable from preflight substrate";
320
+ return;
321
+ }
322
+ target.errorCode = "HUMANISH_PREFLIGHT_TARGET_UNREACHABLE";
323
+ target.message = "target did not answer from preflight substrate within the timeout";
324
+ }
325
+ function blockTarget(target, message) {
326
+ target.checked = false;
327
+ target.reachable = false;
328
+ target.status = "blocked";
329
+ target.errorCode = "HUMANISH_PREFLIGHT_TARGET_BLOCKED";
330
+ target.message = message;
331
+ }
332
+ function targetUrlFor(config, target) {
333
+ if (target.kind === "subject.appUrl" && config.subject.appUrl) {
334
+ return config.subject.appUrl;
335
+ }
336
+ if (target.kind === "actors[0].lanes[].target") {
337
+ const laneTarget = config.actors[0]?.lanes?.find((lane) => lane.target && digest(lane.target) === target.targetDigest)?.target;
338
+ if (laneTarget)
339
+ return laneTarget;
340
+ }
341
+ if (target.kind === "subject.serve.url" && config.subject.serve?.url) {
342
+ return config.subject.serve.url;
343
+ }
344
+ throw new Error(`Internal preflight target lookup failed for ${target.label}.`);
345
+ }
346
+ function publicPreviewRouteError(config, backend) {
347
+ if (backend !== "cua" || config.subject.source !== "app-url" || config.execution?.target !== "e2b-desktop") {
348
+ return "public-preview preflight supports app-url × e2b-desktop computer-use labs.";
349
+ }
350
+ if (config.policies?.allowPublicTargets !== true) {
351
+ return "public-preview preflight requires policies.allowPublicTargets: true so the owner explicitly declares the public/preview target.";
352
+ }
353
+ return null;
354
+ }
355
+ function sandboxLoopbackRouteError(config, backend) {
356
+ if (backend !== "cua" || config.subject.source !== "clone" || config.execution?.target !== "e2b-desktop") {
357
+ return "sandbox-loopback preflight supports clone × e2b-desktop computer-use labs. (local-tree labs are not preflightable yet: see the local-tree goal doc's out-of-scope list; a dry run of the lab is the current no-spend check.)";
358
+ }
359
+ if (!config.subject.serve) {
360
+ return "sandbox-loopback preflight requires subject.serve.";
361
+ }
362
+ return null;
363
+ }
364
+ function makeEnvScrubber(env, names) {
365
+ const values = names
366
+ .map((name) => env[name])
367
+ .filter((value) => typeof value === "string" && value.length > 0);
368
+ return (text) => values.reduce((current, value) => current.replaceAll(value, "[REDACTED_SECRET]"), text);
369
+ }
370
+ function compactError(error) {
371
+ const raw = error instanceof Error ? error.message : String(error);
372
+ return redactText(raw).replace(/\s+/g, " ").trim().slice(0, 500);
373
+ }
374
+ function originDigest(value) {
375
+ try {
376
+ return { originDigest: digest(new URL(value).origin) };
377
+ }
378
+ catch {
379
+ return {};
380
+ }
381
+ }
382
+ function digest(value) {
383
+ return digestText(value, 16);
384
+ }
385
+ //# sourceMappingURL=lab-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lab-preflight.js","sourceRoot":"","sources":["../src/lab-preflight.ts"],"names":[],"mappings":"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"}
package/dist/labs.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ import { type LabConfig } from "./lab-config.js";
2
+ export { LAB_CONFIG_SCHEMA } from "./lab-config.js";
3
+ export type { LabConfig } from "./lab-config.js";
4
+ export declare const LAB_LIST_SCHEMA = "humanish.lab-list.v1";
5
+ export declare const LAB_INSPECT_SCHEMA = "humanish.lab-inspect.v1";
6
+ export type LabOrigin = "committed" | "ignored" | "explicit";
7
+ export interface ResolvedLabConfig {
8
+ config: LabConfig;
9
+ origin: LabOrigin;
10
+ path: string;
11
+ warnings: string[];
12
+ }
13
+ export interface LabResolveFailure {
14
+ ok: false;
15
+ cwd: string;
16
+ lab: string;
17
+ error: {
18
+ code: "HUMANISH_LAB_NOT_FOUND" | "HUMANISH_LAB_INVALID";
19
+ message: string;
20
+ };
21
+ warnings: string[];
22
+ }
23
+ export type LabResolveResult = ({
24
+ ok: true;
25
+ } & ResolvedLabConfig) | LabResolveFailure;
26
+ export interface LabListEntry {
27
+ id: string;
28
+ source: LabConfig["subject"]["source"];
29
+ origin: LabOrigin;
30
+ path: string;
31
+ title?: string;
32
+ }
33
+ export interface LabListResult {
34
+ schema: typeof LAB_LIST_SCHEMA;
35
+ ok: true;
36
+ cwd: string;
37
+ labs: LabListEntry[];
38
+ warnings: string[];
39
+ }
40
+ export interface LabInspectResult {
41
+ schema: typeof LAB_INSPECT_SCHEMA;
42
+ ok: boolean;
43
+ cwd: string;
44
+ lab: string;
45
+ config?: LabConfig;
46
+ origin?: LabOrigin;
47
+ path?: string;
48
+ error?: LabResolveFailure["error"];
49
+ warnings: string[];
50
+ }
51
+ export declare function resolveLabManifest(cwd: string, lab: string): Promise<LabResolveResult>;
52
+ export declare function listLabManifests(cwd: string): Promise<LabListResult>;
53
+ export declare function inspectLabManifest(cwd: string, lab: string): Promise<LabInspectResult>;
package/dist/labs.js ADDED
@@ -0,0 +1,176 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse } from "yaml";
4
+ import { parseLabConfig } from "./lab-config.js";
5
+ export { LAB_CONFIG_SCHEMA } from "./lab-config.js";
6
+ export const LAB_LIST_SCHEMA = "humanish.lab-list.v1";
7
+ export const LAB_INSPECT_SCHEMA = "humanish.lab-inspect.v1";
8
+ const committedLabsDir = path.join("humanish", "labs");
9
+ const ignoredLabsDirs = [
10
+ path.join(".humanish", "labs"),
11
+ path.join(".humanish", "local", "labs")
12
+ ];
13
+ export async function resolveLabManifest(cwd, lab) {
14
+ const resolvedCwd = path.resolve(cwd);
15
+ const warnings = [];
16
+ const candidates = labLooksLikePath(lab)
17
+ ? [{ origin: "explicit", path: path.resolve(resolvedCwd, lab) }]
18
+ : [
19
+ { origin: "committed", path: path.join(resolvedCwd, committedLabsDir, `${lab}.yaml`) },
20
+ { origin: "committed", path: path.join(resolvedCwd, committedLabsDir, `${lab}.yml`) },
21
+ ...ignoredLabsDirs.flatMap((dir) => [
22
+ { origin: "ignored", path: path.join(resolvedCwd, dir, `${lab}.yaml`) },
23
+ { origin: "ignored", path: path.join(resolvedCwd, dir, `${lab}.yml`) }
24
+ ])
25
+ ];
26
+ for (const candidate of candidates) {
27
+ if (!await fileExists(candidate.path)) {
28
+ continue;
29
+ }
30
+ return parseResolvedLab({
31
+ cwd: resolvedCwd,
32
+ lab,
33
+ origin: candidate.origin,
34
+ path: candidate.path,
35
+ warnings
36
+ });
37
+ }
38
+ return {
39
+ ok: false,
40
+ cwd: resolvedCwd,
41
+ lab,
42
+ error: {
43
+ code: "HUMANISH_LAB_NOT_FOUND",
44
+ message: `Lab not found: ${lab}. Look in humanish/labs/ or pass a .yaml path.`
45
+ },
46
+ warnings
47
+ };
48
+ }
49
+ export async function listLabManifests(cwd) {
50
+ const resolvedCwd = path.resolve(cwd);
51
+ const warnings = [];
52
+ const labs = new Map();
53
+ const dirs = [
54
+ { origin: "committed", dir: path.join(resolvedCwd, committedLabsDir) },
55
+ ...ignoredLabsDirs.map((dir) => ({ origin: "ignored", dir: path.join(resolvedCwd, dir) }))
56
+ ];
57
+ for (const entry of dirs) {
58
+ const names = await safeReadDir(entry.dir);
59
+ for (const name of names.filter((value) => value.endsWith(".yaml") || value.endsWith(".yml"))) {
60
+ const candidatePath = path.join(entry.dir, name);
61
+ const parsed = await parseResolvedLab({
62
+ cwd: resolvedCwd,
63
+ lab: name.replace(/\.(?:ya?ml)$/i, ""),
64
+ origin: entry.origin,
65
+ path: candidatePath,
66
+ warnings: []
67
+ });
68
+ if (!parsed.ok) {
69
+ warnings.push(`${relativeToCwd(resolvedCwd, candidatePath)}: ${parsed.error.message}`);
70
+ continue;
71
+ }
72
+ const key = `${parsed.config.id}:${entry.origin}:${relativeToCwd(resolvedCwd, candidatePath)}`;
73
+ labs.set(key, {
74
+ id: parsed.config.id,
75
+ source: parsed.config.subject.source,
76
+ origin: entry.origin,
77
+ path: relativeToCwd(resolvedCwd, candidatePath),
78
+ ...(parsed.config.title ? { title: parsed.config.title } : {})
79
+ });
80
+ }
81
+ }
82
+ return {
83
+ schema: LAB_LIST_SCHEMA,
84
+ ok: true,
85
+ cwd: resolvedCwd,
86
+ labs: [...labs.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
87
+ warnings
88
+ };
89
+ }
90
+ export async function inspectLabManifest(cwd, lab) {
91
+ const resolved = await resolveLabManifest(cwd, lab);
92
+ if (!resolved.ok) {
93
+ return {
94
+ schema: LAB_INSPECT_SCHEMA,
95
+ ok: false,
96
+ cwd: resolved.cwd,
97
+ lab,
98
+ error: resolved.error,
99
+ warnings: resolved.warnings
100
+ };
101
+ }
102
+ return {
103
+ schema: LAB_INSPECT_SCHEMA,
104
+ ok: true,
105
+ cwd: path.resolve(cwd),
106
+ lab,
107
+ config: resolved.config,
108
+ origin: resolved.origin,
109
+ path: resolved.path,
110
+ warnings: resolved.warnings
111
+ };
112
+ }
113
+ async function parseResolvedLab(args) {
114
+ let raw;
115
+ try {
116
+ raw = parse(await readFile(args.path, "utf8"));
117
+ }
118
+ catch (error) {
119
+ return invalidLab(args, error instanceof Error ? error.message : "Lab YAML could not be parsed.");
120
+ }
121
+ const parsed = parseLabConfig(raw);
122
+ if (!parsed.ok) {
123
+ return invalidLab(args, parsed.error.message);
124
+ }
125
+ const warnings = [...args.warnings, ...parsed.warnings];
126
+ if (args.path.endsWith(".yml")) {
127
+ warnings.push("Prefer .yaml for Humanish-authored lab source; .yml is accepted for compatibility only.");
128
+ }
129
+ return {
130
+ ok: true,
131
+ config: parsed.config,
132
+ origin: args.origin,
133
+ path: relativeToCwd(args.cwd, args.path),
134
+ warnings
135
+ };
136
+ }
137
+ function invalidLab(args, message) {
138
+ return {
139
+ ok: false,
140
+ cwd: args.cwd,
141
+ lab: args.lab,
142
+ error: {
143
+ code: "HUMANISH_LAB_INVALID",
144
+ message
145
+ },
146
+ warnings: args.warnings
147
+ };
148
+ }
149
+ function labLooksLikePath(lab) {
150
+ return lab.endsWith(".yaml")
151
+ || lab.endsWith(".yml")
152
+ || lab.includes("/")
153
+ || lab.includes("\\")
154
+ || lab.startsWith(".");
155
+ }
156
+ async function fileExists(filePath) {
157
+ try {
158
+ return (await stat(filePath)).isFile();
159
+ }
160
+ catch {
161
+ return false;
162
+ }
163
+ }
164
+ async function safeReadDir(dir) {
165
+ try {
166
+ return await readdir(dir);
167
+ }
168
+ catch {
169
+ return [];
170
+ }
171
+ }
172
+ function relativeToCwd(cwd, filePath) {
173
+ const relative = path.relative(cwd, filePath);
174
+ return relative && !relative.startsWith("..") ? relative : filePath;
175
+ }
176
+ //# sourceMappingURL=labs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labs.js","sourceRoot":"","sources":["../src/labs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function observerCss(): string;
2
+ export declare function observerClientJs(): string;