@farmslot/recipe-runner 0.29.0 → 0.31.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 (113) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/adapters/core.d.ts.map +1 -1
  3. package/dist/adapters/core.js +60 -55
  4. package/dist/adapters/core.js.map +1 -1
  5. package/dist/adapters/ui.d.ts +2 -0
  6. package/dist/adapters/ui.d.ts.map +1 -1
  7. package/dist/adapters/ui.js +79 -37
  8. package/dist/adapters/ui.js.map +1 -1
  9. package/dist/cli/support.d.ts.map +1 -1
  10. package/dist/cli/support.js +13 -9
  11. package/dist/cli/support.js.map +1 -1
  12. package/dist/core/assertions.d.ts +16 -0
  13. package/dist/core/assertions.d.ts.map +1 -0
  14. package/dist/core/assertions.js +59 -0
  15. package/dist/core/assertions.js.map +1 -0
  16. package/dist/core/compose.d.ts +3 -2
  17. package/dist/core/compose.d.ts.map +1 -1
  18. package/dist/core/compose.js +23 -7
  19. package/dist/core/compose.js.map +1 -1
  20. package/dist/core/execution.d.ts +3 -0
  21. package/dist/core/execution.d.ts.map +1 -1
  22. package/dist/core/execution.js +60 -3
  23. package/dist/core/execution.js.map +1 -1
  24. package/dist/core/graph.d.ts +1 -0
  25. package/dist/core/graph.d.ts.map +1 -1
  26. package/dist/core/graph.js +2 -2
  27. package/dist/core/graph.js.map +1 -1
  28. package/dist/core/hud.d.ts.map +1 -1
  29. package/dist/core/hud.js +3 -3
  30. package/dist/core/hud.js.map +1 -1
  31. package/dist/core/invocation.d.ts +4 -1
  32. package/dist/core/invocation.d.ts.map +1 -1
  33. package/dist/core/invocation.js +3 -1
  34. package/dist/core/invocation.js.map +1 -1
  35. package/dist/core/json.d.ts +1 -0
  36. package/dist/core/json.d.ts.map +1 -1
  37. package/dist/core/json.js +7 -9
  38. package/dist/core/json.js.map +1 -1
  39. package/dist/core/recording-limits.d.ts +4 -0
  40. package/dist/core/recording-limits.d.ts.map +1 -0
  41. package/dist/core/recording-limits.js +74 -0
  42. package/dist/core/recording-limits.js.map +1 -0
  43. package/dist/core/recording-segments.d.ts +4 -0
  44. package/dist/core/recording-segments.d.ts.map +1 -0
  45. package/dist/core/recording-segments.js +101 -0
  46. package/dist/core/recording-segments.js.map +1 -0
  47. package/dist/core/runner.d.ts.map +1 -1
  48. package/dist/core/runner.js +340 -129
  49. package/dist/core/runner.js.map +1 -1
  50. package/dist/core/trust.d.ts.map +1 -1
  51. package/dist/core/trust.js +7 -0
  52. package/dist/core/trust.js.map +1 -1
  53. package/dist/core/types.d.ts +37 -22
  54. package/dist/core/types.d.ts.map +1 -1
  55. package/dist/evidence/assertions.d.ts +50 -0
  56. package/dist/evidence/assertions.d.ts.map +1 -0
  57. package/dist/evidence/assertions.js +156 -0
  58. package/dist/evidence/assertions.js.map +1 -0
  59. package/dist/evidence/claims.d.ts +15 -0
  60. package/dist/evidence/claims.d.ts.map +1 -0
  61. package/dist/evidence/claims.js +201 -0
  62. package/dist/evidence/claims.js.map +1 -0
  63. package/dist/evidence/index.d.ts +4 -0
  64. package/dist/evidence/index.d.ts.map +1 -0
  65. package/dist/evidence/index.js +3 -0
  66. package/dist/evidence/index.js.map +1 -0
  67. package/dist/evidence/moments.d.ts +8 -0
  68. package/dist/evidence/moments.d.ts.map +1 -0
  69. package/dist/evidence/moments.js +26 -0
  70. package/dist/evidence/moments.js.map +1 -0
  71. package/dist/evidence/package.d.ts +4 -0
  72. package/dist/evidence/package.d.ts.map +1 -0
  73. package/dist/evidence/package.js +140 -0
  74. package/dist/evidence/package.js.map +1 -0
  75. package/dist/evidence/plan.d.ts +9 -0
  76. package/dist/evidence/plan.d.ts.map +1 -0
  77. package/dist/evidence/plan.js +87 -0
  78. package/dist/evidence/plan.js.map +1 -0
  79. package/dist/evidence/read-package.d.ts +14 -0
  80. package/dist/evidence/read-package.d.ts.map +1 -0
  81. package/dist/evidence/read-package.js +153 -0
  82. package/dist/evidence/read-package.js.map +1 -0
  83. package/dist/evidence/stills.d.ts +5 -0
  84. package/dist/evidence/stills.d.ts.map +1 -0
  85. package/dist/evidence/stills.js +58 -0
  86. package/dist/evidence/stills.js.map +1 -0
  87. package/dist/file-digest.d.ts +3 -0
  88. package/dist/file-digest.d.ts.map +1 -0
  89. package/dist/file-digest.js +4 -0
  90. package/dist/file-digest.js.map +1 -0
  91. package/dist/index.d.ts +5 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +5 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/recording/android-mirror.d.ts.map +1 -1
  96. package/dist/recording/android-mirror.js +17 -8
  97. package/dist/recording/android-mirror.js.map +1 -1
  98. package/dist/recording/capture-helper-timing.d.ts +2 -2
  99. package/dist/recording/capture-helper-timing.d.ts.map +1 -1
  100. package/dist/recording/capture-helper.d.ts.map +1 -1
  101. package/dist/recording/capture-helper.js +24 -12
  102. package/dist/recording/capture-helper.js.map +1 -1
  103. package/dist/recording/cdp-video-recorder.d.ts +2 -0
  104. package/dist/recording/cdp-video-recorder.d.ts.map +1 -1
  105. package/dist/recording/cdp-video-recorder.js +160 -50
  106. package/dist/recording/cdp-video-recorder.js.map +1 -1
  107. package/dist/recording/timeline.d.ts +2 -2
  108. package/dist/recording/timeline.d.ts.map +1 -1
  109. package/dist/runtime/cdp.d.ts +1 -0
  110. package/dist/runtime/cdp.d.ts.map +1 -1
  111. package/dist/runtime/cdp.js +105 -28
  112. package/dist/runtime/cdp.js.map +1 -1
  113. package/package.json +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ActiveVideoRecording, RecipeVideoRecordingOptions } from './types.js';
2
+ /** Own exactly one backend stop, retaining usable media when a configured limit ends capture early. */
3
+ export declare function boundRecording(active: ActiveVideoRecording, outputPath: string, policy: RecipeVideoRecordingOptions): ActiveVideoRecording;
4
+ //# sourceMappingURL=recording-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-limits.d.ts","sourceRoot":"","sources":["../../src/core/recording-limits.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,oBAAoB,EACpB,2BAA2B,EAE5B,MAAM,YAAY,CAAC;AAEpB,uGAAuG;AACvG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,2BAA2B,GAClC,oBAAoB,CAmEtB"}
@@ -0,0 +1,74 @@
1
+ import { readdir, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DEFAULT_RECORDED_EVIDENCE_POLICY } from '@farmslot/protocol';
4
+ /** Own exactly one backend stop, retaining usable media when a configured limit ends capture early. */
5
+ export function boundRecording(active, outputPath, policy) {
6
+ const duration = policy.maxDurationMs ?? DEFAULT_RECORDED_EVIDENCE_POLICY.maxDurationMs;
7
+ const bytes = policy.maxBytes ?? DEFAULT_RECORDED_EVIDENCE_POLICY.maxBytes;
8
+ let stopped;
9
+ let limitation;
10
+ let checking = false;
11
+ const stop = () => {
12
+ if (stopped)
13
+ return stopped;
14
+ clearTimeout(deadline);
15
+ clearInterval(poll);
16
+ stopped = active.stop().then((result) => {
17
+ if (!limitation || result.interruption)
18
+ return result;
19
+ return {
20
+ ...result,
21
+ interruption: {
22
+ frames: result.segments.reduce((count, segment) => count + (segment.timing?.framesMs.length ?? 0), 0),
23
+ mediaTimeMs: result.segments.at(-1)?.timing?.framesMs.at(-1) ?? 0,
24
+ cause: limitation,
25
+ },
26
+ };
27
+ });
28
+ // Early stop completion is awaited by the engine's final stop; retain rejection until then.
29
+ void stopped.catch((error) => {
30
+ limitation ??= `Capture finalization failed: ${error instanceof Error ? error.message : String(error)}`;
31
+ });
32
+ return stopped;
33
+ };
34
+ const deadline = setTimeout(() => {
35
+ limitation = `Recording duration limit reached (${duration} ms).`;
36
+ void stop();
37
+ }, duration);
38
+ deadline.unref();
39
+ const poll = setInterval(async () => {
40
+ if (checking || stopped)
41
+ return;
42
+ checking = true;
43
+ try {
44
+ const directory = path.dirname(outputPath);
45
+ const files = (await readdir(directory)).filter((file) => file.endsWith('.mp4'));
46
+ const sizes = await Promise.all(files.map(async (file) => (await stat(path.join(directory, file))).size));
47
+ if (sizes.reduce((total, size) => total + size, 0) >= bytes) {
48
+ limitation = `Recording byte limit reached (${bytes} bytes).`;
49
+ void stop();
50
+ }
51
+ }
52
+ catch (error) {
53
+ limitation = `Recording budget could not be measured: ${error instanceof Error ? error.message : String(error)}`;
54
+ void stop();
55
+ }
56
+ finally {
57
+ checking = false;
58
+ }
59
+ }, 250);
60
+ poll.unref();
61
+ return {
62
+ stop,
63
+ ...(active.snapshot
64
+ ? {
65
+ snapshot: async (file) => {
66
+ if (stopped)
67
+ throw new Error(limitation ?? 'Recording is finalizing.');
68
+ return active.snapshot(file);
69
+ },
70
+ }
71
+ : {}),
72
+ };
73
+ }
74
+ //# sourceMappingURL=recording-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-limits.js","sourceRoot":"","sources":["../../src/core/recording-limits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ActiveVideoRecording, VideoRecorder, VideoRecorderStartRequest } from './types.js';
2
+ /** Backends with continuous segments handle their own boundaries; native restarts retain the gap. */
3
+ export declare function startSegmentedRecording(recorder: VideoRecorder, request: VideoRecorderStartRequest): Promise<ActiveVideoRecording>;
4
+ //# sourceMappingURL=recording-segments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-segments.d.ts","sourceRoot":"","sources":["../../src/core/recording-segments.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EAG1B,MAAM,YAAY,CAAC;AAEpB,qGAAqG;AACrG,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAyF/B"}
@@ -0,0 +1,101 @@
1
+ import { stat } from 'node:fs/promises';
2
+ /** Backends with continuous segments handle their own boundaries; native restarts retain the gap. */
3
+ export async function startSegmentedRecording(recorder, request) {
4
+ if (recorder.continuousSegments)
5
+ return recorder.start(request);
6
+ let active = await recorder.start(request);
7
+ let output = request.outputPath;
8
+ let startedAt = Date.now();
9
+ let ended = false;
10
+ let failure;
11
+ let interruption;
12
+ const segments = [];
13
+ let boundary;
14
+ let stopped;
15
+ const collect = (result) => {
16
+ for (const [index, segment] of result.segments.entries())
17
+ segments.push({ ...segment, ...(segments.length && index === 0 ? { gapBefore: true } : {}) });
18
+ interruption ??= result.interruption;
19
+ };
20
+ const rotate = async () => {
21
+ collect(await active.stop());
22
+ if (interruption) {
23
+ ended = true;
24
+ return;
25
+ }
26
+ output = request.outputPath.replace(/\.mp4$/u, `-segment-${segments.length}.mp4`);
27
+ active = await recorder.start({ ...request, outputPath: output });
28
+ startedAt = Date.now();
29
+ };
30
+ const poll = setInterval(() => {
31
+ if (ended || boundary || failure)
32
+ return;
33
+ boundary = (async () => {
34
+ let size = 0;
35
+ try {
36
+ size = (await stat(output)).size;
37
+ }
38
+ catch (error) {
39
+ if (error.code !== 'ENOENT')
40
+ throw error;
41
+ }
42
+ if (size >= 100 * 1024 * 1024 || Date.now() - startedAt >= 10 * 60 * 1000)
43
+ await rotate();
44
+ })()
45
+ .catch((error) => {
46
+ failure = error;
47
+ ended = true;
48
+ })
49
+ .finally(() => {
50
+ boundary = undefined;
51
+ });
52
+ }, 250);
53
+ poll.unref();
54
+ return {
55
+ ...(active.snapshot
56
+ ? {
57
+ snapshot: async (file) => {
58
+ if (ended || failure)
59
+ throw failure ?? new Error('Recording has stopped.');
60
+ if (boundary)
61
+ await boundary;
62
+ if (ended || failure)
63
+ throw failure ?? new Error('Recording has stopped.');
64
+ const result = await active.snapshot(file);
65
+ return { ...result, segmentIndex: segments.length };
66
+ },
67
+ }
68
+ : {}),
69
+ stop() {
70
+ if (stopped)
71
+ return stopped;
72
+ clearInterval(poll);
73
+ stopped = (async () => {
74
+ if (boundary)
75
+ await boundary;
76
+ if (!ended) {
77
+ ended = true;
78
+ collect(await active.stop());
79
+ }
80
+ if (failure && !segments.length)
81
+ throw failure;
82
+ return {
83
+ segments,
84
+ ...(interruption
85
+ ? { interruption }
86
+ : failure
87
+ ? {
88
+ interruption: {
89
+ frames: segments.reduce((count, segment) => count + (segment.timing?.framesMs.length ?? 0), 0),
90
+ mediaTimeMs: segments.at(-1)?.timing?.framesMs.at(-1) ?? 0,
91
+ cause: failure instanceof Error ? failure.message : String(failure),
92
+ },
93
+ }
94
+ : {}),
95
+ };
96
+ })();
97
+ return stopped;
98
+ },
99
+ };
100
+ }
101
+ //# sourceMappingURL=recording-segments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-segments.js","sourceRoot":"","sources":["../../src/core/recording-segments.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAwEA,OAAO,KAAK,EACV,aAAa,EAEb,yBAAyB,EAMzB,YAAY,EAOb,MAAM,YAAY,CAAC;AA0BpB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAGzE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CAiCnF"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AA0FA,OAAO,KAAK,EACV,aAAa,EAEb,yBAAyB,EAMzB,YAAY,EASb,MAAM,YAAY,CAAC;AA8BpB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAGzE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CAiCnF"}