humanish 0.102.0 → 0.103.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 (85) hide show
  1. package/README.md +2 -1
  2. package/dist/browser-control-client.d.ts +3 -1
  3. package/dist/browser-control-client.js +41 -5
  4. package/dist/browser-control-client.js.map +1 -1
  5. package/dist/browser-control-dispatcher.d.ts +6 -1
  6. package/dist/browser-control-dispatcher.js +38 -3
  7. package/dist/browser-control-dispatcher.js.map +1 -1
  8. package/dist/browser-control-protocol.d.ts +24 -0
  9. package/dist/browser-control-protocol.js +7 -4
  10. package/dist/browser-control-protocol.js.map +1 -1
  11. package/dist/browser-control-recording-transfer.d.ts +4 -0
  12. package/dist/browser-control-recording-transfer.js +42 -0
  13. package/dist/browser-control-recording-transfer.js.map +1 -0
  14. package/dist/browser-control-transport.d.ts +3 -0
  15. package/dist/browser-control-transport.js +23 -2
  16. package/dist/browser-control-transport.js.map +1 -1
  17. package/dist/cua-actor-lab.d.ts +5 -2
  18. package/dist/cua-actor-lab.js +9 -1
  19. package/dist/cua-actor-lab.js.map +1 -1
  20. package/dist/cua-desktop-lane.d.ts +1 -1
  21. package/dist/desktop-recorder.d.ts +39 -0
  22. package/dist/desktop-recorder.js +220 -0
  23. package/dist/desktop-recorder.js.map +1 -0
  24. package/dist/desktop-recording-artifact.d.ts +5 -0
  25. package/dist/desktop-recording-artifact.js +54 -0
  26. package/dist/desktop-recording-artifact.js.map +1 -0
  27. package/dist/desktop-recording-types.d.ts +24 -0
  28. package/dist/desktop-recording-types.js +14 -0
  29. package/dist/desktop-recording-types.js.map +1 -0
  30. package/dist/doctor-lab.js +1 -1
  31. package/dist/doctor-lab.js.map +1 -1
  32. package/dist/e2b-cua-desktop.js +31 -7
  33. package/dist/e2b-cua-desktop.js.map +1 -1
  34. package/dist/e2b-desktop-launch.d.ts +8 -0
  35. package/dist/e2b-desktop-launch.js.map +1 -1
  36. package/dist/e2b-desktop-recording.d.ts +16 -0
  37. package/dist/e2b-desktop-recording.js +162 -0
  38. package/dist/e2b-desktop-recording.js.map +1 -0
  39. package/dist/export-bundle.js +2 -0
  40. package/dist/export-bundle.js.map +1 -1
  41. package/dist/export.js +19 -3
  42. package/dist/export.js.map +1 -1
  43. package/dist/guest-bootstrap.d.ts +4 -2
  44. package/dist/guest-bootstrap.js +14 -8
  45. package/dist/guest-bootstrap.js.map +1 -1
  46. package/dist/guest-runtime-desktop.d.ts +3 -1
  47. package/dist/guest-runtime-desktop.js +44 -2
  48. package/dist/guest-runtime-desktop.js.map +1 -1
  49. package/dist/guest-runtime-main.js +3 -2
  50. package/dist/guest-runtime-main.js.map +1 -1
  51. package/dist/guest-runtime.d.ts +7 -2
  52. package/dist/guest-runtime.js +3 -2
  53. package/dist/guest-runtime.js.map +1 -1
  54. package/dist/lab-config.d.ts +4 -0
  55. package/dist/lab-config.js +11 -0
  56. package/dist/lab-config.js.map +1 -1
  57. package/dist/lab-summary.js +1 -1
  58. package/dist/lab-summary.js.map +1 -1
  59. package/dist/local-firecracker-desktop.d.ts +7 -1
  60. package/dist/local-firecracker-desktop.js +10 -2
  61. package/dist/local-firecracker-desktop.js.map +1 -1
  62. package/dist/local-firecracker-study.js +14 -2
  63. package/dist/local-firecracker-study.js.map +1 -1
  64. package/dist/local-runtime-release.js +8 -8
  65. package/dist/observer-app.html +9 -9
  66. package/dist/observer-serve.js +1 -1
  67. package/dist/observer-serve.js.map +1 -1
  68. package/dist/observer.d.ts +2 -2
  69. package/dist/observer.js +106 -27
  70. package/dist/observer.js.map +1 -1
  71. package/dist/run.d.ts +4 -2
  72. package/dist/run.js +49 -9
  73. package/dist/run.js.map +1 -1
  74. package/dist/selected-output-paths.d.ts +3 -0
  75. package/dist/selected-output-paths.js +29 -17
  76. package/dist/selected-output-paths.js.map +1 -1
  77. package/docs/architecture/desktop-recording.md +65 -0
  78. package/docs/architecture/participant-media.md +4 -4
  79. package/docs/contracts/run-bundle.md +27 -0
  80. package/docs/contracts/schemas.md +1 -1
  81. package/docs/goals/current.md +5 -5
  82. package/docs/ramp/README.md +5 -1
  83. package/docs/release/0.103.0-desktop-recording.md +29 -0
  84. package/package.json +1 -1
  85. package/skills/humanish/SKILL.md +6 -0
@@ -771,7 +771,7 @@ export async function runCuaLane(spec, deps) {
771
771
  deps.signalProvisioned(ok);
772
772
  }
773
773
  };
774
- const desktopLane = deps.createDesktopLane?.(spec, warnings) ?? createE2BCuaDesktopLane(spec, deps, warnings);
774
+ const desktopLane = deps.createDesktopLane?.(spec, warnings, deps.artifactRoot) ?? createE2BCuaDesktopLane(spec, deps, warnings);
775
775
  try {
776
776
  await desktopLane.prepare();
777
777
  const ready = await desktopLane.openSession();
@@ -1375,6 +1375,9 @@ async function runCuaActorLabInScope(options) {
1375
1375
  if (inProcessRoute && config.execution?.desktop?.media !== undefined) {
1376
1376
  return fail("HUMANISH_CUA_LAB_SUBJECT_INVALID", "execution.desktop.media is not provisioned by a caller-supplied executor. Remove the declaration or use a hosted computer-use browser lane.", descriptor.id);
1377
1377
  }
1378
+ if (inProcessRoute && config.execution?.desktop?.recording !== undefined) {
1379
+ return fail("HUMANISH_CUA_LAB_SUBJECT_INVALID", "execution.desktop.recording is not provisioned by a caller-supplied executor.", descriptor.id);
1380
+ }
1378
1381
  const localAppSubject = config.subject.source === "local-app";
1379
1382
  // Adopter-hosted comms plane on the app-url route (#380): humanish provisions no subject here,
1380
1383
  // so it cannot host a catch — the OPERATOR runs one, and humanish still does every other part
@@ -2273,6 +2276,7 @@ function buildSingleLaneBundle(args) {
2273
2276
  desktopRoute: !args.inProcessRoute,
2274
2277
  feedbackSubstrate: args.inProcessRoute ? "local-filesystem" : args.config.execution?.target === "local" ? "local-desktop" : "e2b-desktop",
2275
2278
  ...(outcome?.desktopGeometry === undefined ? {} : { desktopGeometry: outcome.desktopGeometry }),
2279
+ ...(outcome?.recording === undefined ? {} : { recording: outcome.recording }),
2276
2280
  isMobile: spec.devicePreset.isMobile,
2277
2281
  runId: args.runId,
2278
2282
  screenshots: outcome?.screenshots ?? [],
@@ -2687,6 +2691,7 @@ export function buildCuaBundle(args) {
2687
2691
  }
2688
2692
  }),
2689
2693
  ...(desktopGeometry === undefined ? {} : { desktopGeometry }),
2694
+ ...(args.recording === undefined ? {} : { recording: args.recording }),
2690
2695
  ui: {
2691
2696
  route: publicAppUrl,
2692
2697
  intent: "Watch the computer-use actor drive the subject app in a hosted desktop browser.",
@@ -2706,6 +2711,7 @@ export function buildCuaBundle(args) {
2706
2711
  ...(args.commsArtifactPath
2707
2712
  ? [{ label: "comms thread", path: args.commsArtifactPath, kind: "log" }]
2708
2713
  : []),
2714
+ ...(args.recording ? [{ label: "desktop recording", path: args.recording.path, kind: "recording" }] : []),
2709
2715
  ...args.screenshots.map((screenshot, index) => ({
2710
2716
  label: `screenshot ${String(index + 1).padStart(2, "0")} (${screenshotMode})`,
2711
2717
  path: screenshot,
@@ -3085,6 +3091,7 @@ export function buildCuaFanoutBundle(args) {
3085
3091
  }
3086
3092
  }),
3087
3093
  desktopGeometry,
3094
+ ...(outcome?.recording === undefined ? {} : { recording: outcome.recording }),
3088
3095
  ui: {
3089
3096
  route: publicLaneAppUrl,
3090
3097
  intent: `Watch lane ${spec.laneId} (${spec.persona.id}/${spec.deviceName}) drive the subject app in its own hosted desktop.`,
@@ -3103,6 +3110,7 @@ export function buildCuaFanoutBundle(args) {
3103
3110
  ...(outcome?.commsArtifactPath
3104
3111
  ? [{ label: `lane ${spec.laneId} comms thread`, path: outcome.commsArtifactPath, kind: "log" }]
3105
3112
  : []),
3113
+ ...(outcome?.recording ? [{ label: "desktop recording", path: outcome.recording.path, kind: "recording" }] : []),
3106
3114
  ...screenshots.map((screenshot, screenshotIndex) => ({
3107
3115
  label: `lane ${spec.laneId} screenshot ${String(screenshotIndex + 1).padStart(2, "0")} (${screenshotMode})`,
3108
3116
  path: screenshot,