@farmslot/recipe-cli 0.2.0 → 0.4.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 (119) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +13 -9
  3. package/dist/harness/adapters.d.ts +27 -0
  4. package/dist/harness/adapters.d.ts.map +1 -0
  5. package/dist/harness/adapters.js +91 -0
  6. package/dist/harness/adapters.js.map +1 -0
  7. package/dist/harness/artifact-files.d.ts +11 -0
  8. package/dist/harness/artifact-files.d.ts.map +1 -0
  9. package/dist/harness/artifact-files.js +75 -0
  10. package/dist/harness/artifact-files.js.map +1 -0
  11. package/dist/harness/checkout-lock.d.ts +13 -0
  12. package/dist/harness/checkout-lock.d.ts.map +1 -0
  13. package/dist/harness/checkout-lock.js +211 -0
  14. package/dist/harness/checkout-lock.js.map +1 -0
  15. package/dist/harness/cli-color.d.ts +25 -0
  16. package/dist/harness/cli-color.d.ts.map +1 -0
  17. package/dist/harness/cli-color.js +101 -0
  18. package/dist/harness/cli-color.js.map +1 -0
  19. package/dist/harness/command-journal.d.ts +25 -0
  20. package/dist/harness/command-journal.d.ts.map +1 -0
  21. package/dist/harness/command-journal.js +322 -0
  22. package/dist/harness/command-journal.js.map +1 -0
  23. package/dist/harness/commands/last.d.ts +3 -0
  24. package/dist/harness/commands/last.d.ts.map +1 -0
  25. package/dist/harness/commands/last.js +59 -0
  26. package/dist/harness/commands/last.js.map +1 -0
  27. package/dist/harness/commands/launch.d.ts +2 -0
  28. package/dist/harness/commands/launch.d.ts.map +1 -0
  29. package/dist/harness/commands/launch.js +105 -0
  30. package/dist/harness/commands/launch.js.map +1 -0
  31. package/dist/harness/commands/reload.d.ts +2 -0
  32. package/dist/harness/commands/reload.d.ts.map +1 -0
  33. package/dist/harness/commands/reload.js +24 -0
  34. package/dist/harness/commands/reload.js.map +1 -0
  35. package/dist/harness/commands/stop.d.ts +9 -0
  36. package/dist/harness/commands/stop.d.ts.map +1 -0
  37. package/dist/harness/commands/stop.js +60 -0
  38. package/dist/harness/commands/stop.js.map +1 -0
  39. package/dist/harness/execution-provenance.d.ts +56 -0
  40. package/dist/harness/execution-provenance.d.ts.map +1 -0
  41. package/dist/harness/execution-provenance.js +308 -0
  42. package/dist/harness/execution-provenance.js.map +1 -0
  43. package/dist/harness/heal-bounds.d.ts +15 -0
  44. package/dist/harness/heal-bounds.d.ts.map +1 -0
  45. package/dist/harness/heal-bounds.js +194 -0
  46. package/dist/harness/heal-bounds.js.map +1 -0
  47. package/dist/harness/host.d.ts +45 -0
  48. package/dist/harness/host.d.ts.map +1 -0
  49. package/dist/harness/host.js +55 -0
  50. package/dist/harness/host.js.map +1 -0
  51. package/dist/harness/index.d.ts +29 -0
  52. package/dist/harness/index.d.ts.map +1 -0
  53. package/dist/harness/index.js +32 -0
  54. package/dist/harness/index.js.map +1 -0
  55. package/dist/harness/json-stream.d.ts +19 -0
  56. package/dist/harness/json-stream.d.ts.map +1 -0
  57. package/dist/harness/json-stream.js +59 -0
  58. package/dist/harness/json-stream.js.map +1 -0
  59. package/dist/harness/leaf-invoke.d.ts +8 -0
  60. package/dist/harness/leaf-invoke.d.ts.map +1 -0
  61. package/dist/harness/leaf-invoke.js +31 -0
  62. package/dist/harness/leaf-invoke.js.map +1 -0
  63. package/dist/harness/library-provenance.d.ts +3 -0
  64. package/dist/harness/library-provenance.d.ts.map +1 -0
  65. package/dist/harness/library-provenance.js +31 -0
  66. package/dist/harness/library-provenance.js.map +1 -0
  67. package/dist/harness/live-adapter-contract.d.ts +32 -0
  68. package/dist/harness/live-adapter-contract.d.ts.map +1 -0
  69. package/dist/harness/live-adapter-contract.js +425 -0
  70. package/dist/harness/live-adapter-contract.js.map +1 -0
  71. package/dist/harness/overlay.d.ts +17 -0
  72. package/dist/harness/overlay.d.ts.map +1 -0
  73. package/dist/harness/overlay.js +415 -0
  74. package/dist/harness/overlay.js.map +1 -0
  75. package/dist/harness/parse-args.d.ts +35 -0
  76. package/dist/harness/parse-args.d.ts.map +1 -0
  77. package/dist/harness/parse-args.js +249 -0
  78. package/dist/harness/parse-args.js.map +1 -0
  79. package/dist/harness/paths.d.ts +15 -0
  80. package/dist/harness/paths.d.ts.map +1 -0
  81. package/dist/harness/paths.js +29 -0
  82. package/dist/harness/paths.js.map +1 -0
  83. package/dist/harness/recording-target.d.ts +9 -0
  84. package/dist/harness/recording-target.d.ts.map +1 -0
  85. package/dist/harness/recording-target.js +39 -0
  86. package/dist/harness/recording-target.js.map +1 -0
  87. package/dist/harness/run-diagnostics.d.ts +139 -0
  88. package/dist/harness/run-diagnostics.d.ts.map +1 -0
  89. package/dist/harness/run-diagnostics.js +458 -0
  90. package/dist/harness/run-diagnostics.js.map +1 -0
  91. package/dist/harness/run-options.d.ts +4 -0
  92. package/dist/harness/run-options.d.ts.map +1 -0
  93. package/dist/harness/run-options.js +35 -0
  94. package/dist/harness/run-options.js.map +1 -0
  95. package/dist/harness/run-recording.d.ts +43 -0
  96. package/dist/harness/run-recording.d.ts.map +1 -0
  97. package/dist/harness/run-recording.js +517 -0
  98. package/dist/harness/run-recording.js.map +1 -0
  99. package/dist/harness/run-report.d.ts +19 -0
  100. package/dist/harness/run-report.d.ts.map +1 -0
  101. package/dist/harness/run-report.js +269 -0
  102. package/dist/harness/run-report.js.map +1 -0
  103. package/dist/harness/runtime-proof.d.ts +27 -0
  104. package/dist/harness/runtime-proof.d.ts.map +1 -0
  105. package/dist/harness/runtime-proof.js +144 -0
  106. package/dist/harness/runtime-proof.js.map +1 -0
  107. package/dist/harness/shared.d.ts +43 -0
  108. package/dist/harness/shared.d.ts.map +1 -0
  109. package/dist/harness/shared.js +414 -0
  110. package/dist/harness/shared.js.map +1 -0
  111. package/dist/harness/suggest.d.ts +3 -0
  112. package/dist/harness/suggest.d.ts.map +1 -0
  113. package/dist/harness/suggest.js +37 -0
  114. package/dist/harness/suggest.js.map +1 -0
  115. package/dist/harness/trust.d.ts +38 -0
  116. package/dist/harness/trust.d.ts.map +1 -0
  117. package/dist/harness/trust.js +89 -0
  118. package/dist/harness/trust.js.map +1 -0
  119. package/package.json +11 -2
@@ -0,0 +1,458 @@
1
+ // Run-scoped application diagnostics: what the app logged while a recipe ran
2
+ // (from a baseline offset), its in-app issue buffer and request log, grouped,
3
+ // redacted and classified by the host's console classifier. Non-blocking: a
4
+ // finding marks the run REVIEW, never FAIL.
5
+ import { createHash } from 'node:crypto';
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import { harnessAdapter } from './adapters.js';
9
+ const MAX_CAPTURE_BYTES = 512 * 1024;
10
+ const MAX_FINDINGS = 20;
11
+ const MAX_PREVIEW_CHARS = 320;
12
+ const RAW_APP_LOG_ARTIFACT = 'diagnostics-app-log.txt';
13
+ export function readRunDiagnosticsDocument(diagnosticsPath) {
14
+ if (typeof diagnosticsPath !== 'string' || diagnosticsPath.length === 0)
15
+ return null;
16
+ try {
17
+ const document = JSON.parse(fs.readFileSync(diagnosticsPath, 'utf8'));
18
+ return isRunDiagnosticsDocument(document) ? document : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ export function formatRunDiagnosticsForHuman(diagnostics, adapter) {
25
+ if (!diagnostics) {
26
+ return [
27
+ harnessAdapter(adapter).headless
28
+ ? `N/A — ${adapter.charAt(0).toUpperCase()}${adapter.slice(1)} is headless and has no application log source.`
29
+ : 'UNAVAILABLE — application diagnostics could not be collected for this run.',
30
+ ];
31
+ }
32
+ const status = diagnostics.status === 'clean'
33
+ ? 'CLEAN'
34
+ : diagnostics.status === 'review'
35
+ ? 'REVIEW'
36
+ : 'UNAVAILABLE';
37
+ const lines = [`${status} — ${diagnostics.note}`];
38
+ for (const finding of diagnostics.findings) {
39
+ const count = finding.count > 1 ? ` ×${finding.count}` : '';
40
+ const source = finding.source ? ` [${finding.source}]` : '';
41
+ const allowed = finding.allowlisted ? ` (allowlisted: ${finding.allowlisted.reason})` : '';
42
+ lines.push(`${finding.level.toUpperCase()}${count}${source} — ${finding.preview}${allowed}`);
43
+ }
44
+ return lines;
45
+ }
46
+ export async function beginRunDiagnostics(adapter, projectRoot) {
47
+ const surface = harnessAdapter(adapter);
48
+ const source = surface.appLogSource(projectRoot);
49
+ if (!source)
50
+ return null;
51
+ const diagnostics = surface.diagnostics;
52
+ const issueBuffer = diagnostics?.issueBuffer?.arm(projectRoot)
53
+ ? { adapter, projectRoot }
54
+ : undefined;
55
+ let capture;
56
+ if (diagnostics?.console) {
57
+ const collector = diagnostics.console;
58
+ const startError = await collector.start(projectRoot).then(() => undefined, (error) => (error instanceof Error ? error.message : String(error)));
59
+ const { extensionLog, pageLog, pidFile } = collector.files(projectRoot);
60
+ const cdpPort = collector.cdpPort();
61
+ capture = {
62
+ adapter,
63
+ projectRoot,
64
+ extensionLog,
65
+ pageLog,
66
+ pidFile,
67
+ ...(cdpPort ? { cdpPort } : {}),
68
+ ...(startError ? { startError } : {}),
69
+ };
70
+ }
71
+ const requestLogPath = diagnostics?.requestLog?.path(projectRoot) ?? null;
72
+ const requestStat = requestLogPath ? safeStat(requestLogPath) : null;
73
+ const stat = safeStat(source.path);
74
+ return {
75
+ source,
76
+ offset: stat?.size ?? 0,
77
+ ...(stat ? { inode: stat.ino } : {}),
78
+ ...(issueBuffer ? { issueBuffer } : {}),
79
+ ...(capture ? { capture } : {}),
80
+ ...(requestLogPath
81
+ ? {
82
+ requestLog: {
83
+ adapter,
84
+ path: requestLogPath,
85
+ offset: requestStat?.size ?? 0,
86
+ ...(requestStat ? { inode: requestStat.ino } : {}),
87
+ },
88
+ }
89
+ : {}),
90
+ };
91
+ }
92
+ // The collector started on a CDP port, and the platform proves it is still
93
+ // the runtime's own and that a control line logged where the run's log comes
94
+ // from reaches it.
95
+ export async function verifyConsoleCapture(capture) {
96
+ if (capture.startError)
97
+ return {
98
+ verified: false,
99
+ detail: `the console collector did not start: ${capture.startError}`,
100
+ };
101
+ if (!capture.cdpPort)
102
+ return { verified: false, detail: 'no CDP port for the console collector' };
103
+ const control = await harnessAdapter(capture.adapter).diagnostics.console.verifyControl({
104
+ projectRoot: capture.projectRoot,
105
+ cdpPort: capture.cdpPort,
106
+ extensionLog: capture.extensionLog,
107
+ pageLog: capture.pageLog,
108
+ pidFile: capture.pidFile,
109
+ });
110
+ return { verified: control.ok, detail: control.detail };
111
+ }
112
+ function isRunDiagnosticsDocument(value) {
113
+ if (!isRecord(value) || value.schemaVersion !== 1 || value.scope !== 'recipe-run-application')
114
+ return false;
115
+ if (value.status !== 'clean' && value.status !== 'review' && value.status !== 'unavailable')
116
+ return false;
117
+ return typeof value.note === 'string' && Array.isArray(value.findings);
118
+ }
119
+ export async function finishRunDiagnostics(baseline, result, classifier) {
120
+ if (!baseline)
121
+ return result;
122
+ try {
123
+ const bufferedIssues = baseline.issueBuffer
124
+ ? harnessAdapter(baseline.issueBuffer.adapter).diagnostics?.issueBuffer?.collect(baseline.issueBuffer.projectRoot)
125
+ : undefined;
126
+ const allowlist = classifier.loadAllowlist(recipeLibraryRoots(result.summaryPath, classifier));
127
+ const capture = baseline.capture ? await verifyConsoleCapture(baseline.capture) : undefined;
128
+ const { diagnostics, rawAppLog } = collectRunDiagnosticsCapture(baseline, classifier, bufferedIssues, allowlist, capture);
129
+ const artifactsDir = path.dirname(result.summaryPath);
130
+ const diagnosticsPath = path.join(artifactsDir, 'diagnostics.json');
131
+ fs.writeFileSync(diagnosticsPath, `${JSON.stringify(diagnostics, null, 2)}\n`);
132
+ fs.writeFileSync(path.join(artifactsDir, RAW_APP_LOG_ARTIFACT), redactDiagnosticText(rawAppLog.toString('utf8')));
133
+ indexDiagnosticArtifact(result.artifactManifestPath);
134
+ indexDiagnosticSummary(result.summaryPath, diagnostics);
135
+ return {
136
+ ...result,
137
+ diagnosticsPath,
138
+ sideFindings: {
139
+ status: diagnostics.status,
140
+ note: diagnostics.note,
141
+ counts: diagnostics.counts,
142
+ },
143
+ };
144
+ }
145
+ catch (error) {
146
+ const detail = error instanceof Error ? error.message : String(error);
147
+ console.warn(`WARN: run diagnostics were unavailable: ${detail}`);
148
+ return {
149
+ ...result,
150
+ sideFindings: {
151
+ status: 'unavailable',
152
+ note: 'Run diagnostics could not be collected; the recipe result is unchanged.',
153
+ counts: { total: 0, warning: 0, error: 0, exception: 0 },
154
+ },
155
+ };
156
+ }
157
+ }
158
+ export function collectRunDiagnostics(baseline, classifier, bufferedIssues, allowlist = null, capture) {
159
+ return collectRunDiagnosticsCapture(baseline, classifier, bufferedIssues, allowlist, capture)
160
+ .diagnostics;
161
+ }
162
+ function collectRunDiagnosticsCapture(baseline, classifier, bufferedIssues, allowlist = null, capture) {
163
+ const stat = safeStat(baseline.source.path);
164
+ const source = {
165
+ label: baseline.source.label,
166
+ path: baseline.source.path,
167
+ startOffset: baseline.offset,
168
+ endOffset: stat?.size ?? baseline.offset,
169
+ inode: undefined,
170
+ bytesRead: 0,
171
+ truncated: false,
172
+ inAppBuffer: bufferedIssues === undefined
173
+ ? 'n/a'
174
+ : bufferedIssues === null
175
+ ? 'unavailable'
176
+ : 'collected',
177
+ rawArtifact: RAW_APP_LOG_ARTIFACT,
178
+ redacted: true,
179
+ };
180
+ let rawAppLog = Buffer.alloc(0);
181
+ if (stat) {
182
+ const sameFile = baseline.inode === undefined || baseline.inode === stat.ino;
183
+ const startOffset = sameFile && stat.size >= baseline.offset ? baseline.offset : 0;
184
+ const available = Math.max(0, stat.size - startOffset);
185
+ const bytesToRead = Math.min(available, MAX_CAPTURE_BYTES);
186
+ source.startOffset = startOffset;
187
+ source.endOffset = stat.size;
188
+ source.inode = stat.ino;
189
+ source.bytesRead = bytesToRead;
190
+ source.truncated = available > MAX_CAPTURE_BYTES;
191
+ if (bytesToRead > 0)
192
+ rawAppLog = readSlice(baseline.source.path, startOffset, bytesToRead);
193
+ // A read cut at the size limit ends mid-line: that partial line is not
194
+ // an event of its own.
195
+ if (source.truncated)
196
+ rawAppLog = rawAppLog.subarray(0, rawAppLog.lastIndexOf(0x0a) + 1);
197
+ }
198
+ const text = rawAppLog.toString('utf8');
199
+ const lineFindings = classifier
200
+ .records(text)
201
+ .map((record) => classifyRecord(record, classifier))
202
+ .filter((finding) => finding !== null);
203
+ applyConsoleAllowlist(lineFindings, classifier, allowlist);
204
+ const allFindings = dedupeFindings([
205
+ ...lineFindings,
206
+ ...(bufferedIssues ?? [])
207
+ .map(classifyBufferedIssue)
208
+ .filter((finding) => finding !== null),
209
+ ...(baseline.requestLog ? requestLogFindings(baseline.requestLog) : []),
210
+ ]);
211
+ const applied = allFindings.filter((finding) => finding.level === 'info').length;
212
+ // Findings that need review first, allowlisted noise last.
213
+ allFindings.sort((a, b) => Number(a.level === 'info') - Number(b.level === 'info'));
214
+ const findings = allFindings.slice(0, MAX_FINDINGS).map(stripInternal);
215
+ const counts = countFindings(allFindings);
216
+ const omittedFindingCount = Math.max(0, allFindings.length - findings.length);
217
+ const captureFailed = capture !== undefined && !capture.verified;
218
+ // Only the first MAX_CAPTURE_BYTES of the run's log were read: the rest was
219
+ // never checked, so an empty result is not CLEAN.
220
+ const status = counts.total > 0
221
+ ? 'review'
222
+ : !captureFailed &&
223
+ !source.truncated &&
224
+ (stat || (bufferedIssues !== undefined && bufferedIssues !== null))
225
+ ? 'clean'
226
+ : 'unavailable';
227
+ const captureNote = (captureFailed ? ` Console capture was not verified: ${capture.detail}.` : '') +
228
+ (source.truncated
229
+ ? ` The run's log exceeded ${MAX_CAPTURE_BYTES} bytes; only its start was checked.`
230
+ : '');
231
+ const note = (counts.total > 0
232
+ ? `Observed ${counts.total} distinct application warning/error event(s) during the recipe run; showing ${findings.length} preview(s) and omitting ${omittedFindingCount}. Relation to the task is not determined.`
233
+ : status === 'clean'
234
+ ? 'No application warnings or errors were emitted during the recipe run.'
235
+ : 'Application diagnostics were unavailable for this run.') + captureNote;
236
+ return {
237
+ diagnostics: {
238
+ schemaVersion: 1,
239
+ scope: 'recipe-run-application',
240
+ status,
241
+ nonBlocking: true,
242
+ note,
243
+ source,
244
+ counts,
245
+ ...(allowlist
246
+ ? {
247
+ allowlist: { entries: allowlist.entries.length, applied, problems: allowlist.problems },
248
+ }
249
+ : {}),
250
+ ...(capture ? { capture } : {}),
251
+ displayedFindingCount: findings.length,
252
+ omittedFindingCount,
253
+ findings,
254
+ },
255
+ rawAppLog,
256
+ };
257
+ }
258
+ function classifyRecord(record, classifier) {
259
+ const classified = classifier.classify(record);
260
+ if (!classified)
261
+ return null;
262
+ const line = record.line;
263
+ // Grouped by the redacted signature, so lines that differ only in a secret
264
+ // value or a query string are one finding.
265
+ const signature = classifier.signature(redactDiagnosticText(classified.message));
266
+ return {
267
+ ...makeFinding(classified.level, line.trim(), `${classified.source}|${signature}`),
268
+ source: classified.source,
269
+ signature: redactPreview(signature),
270
+ firstFrame: classified.firstFrame ? redactPreview(classified.firstFrame) : null,
271
+ event: classified.key,
272
+ };
273
+ }
274
+ // What the platform reads from its request log during the run.
275
+ function requestLogFindings(requestLog) {
276
+ const reader = harnessAdapter(requestLog.adapter).diagnostics?.requestLog;
277
+ const stat = safeStat(requestLog.path);
278
+ if (!reader || !stat)
279
+ return [];
280
+ const sameFile = requestLog.inode === undefined || requestLog.inode === stat.ino;
281
+ const start = sameFile && stat.size >= requestLog.offset ? requestLog.offset : 0;
282
+ const lines = readSlice(requestLog.path, start, stat.size - start)
283
+ .toString('utf8')
284
+ .split('\n');
285
+ return reader.findings(lines).map(({ level, source, text }) => ({
286
+ ...makeFinding(level, text, `${source}|${text}`),
287
+ source,
288
+ signature: text,
289
+ firstFrame: null,
290
+ }));
291
+ }
292
+ function classifyBufferedIssue(value) {
293
+ if (!isRecord(value) || typeof value.text !== 'string')
294
+ return null;
295
+ const rawLevel = String(value.level ?? '').toLowerCase();
296
+ const level = rawLevel === 'warn' || rawLevel === 'warning'
297
+ ? 'warning'
298
+ : rawLevel === 'error'
299
+ ? 'error'
300
+ : rawLevel === 'exception'
301
+ ? 'exception'
302
+ : null;
303
+ return level ? makeFinding(level, value.text) : null;
304
+ }
305
+ function makeFinding(level, text, groupKey) {
306
+ const preview = redactPreview(text.trim());
307
+ const identity = groupKey ??
308
+ preview
309
+ .replace(/\b\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?\b/gu, '[TIME]')
310
+ .replace(/\[(?:sw|page:[^\]]+|console:[^\]]+)\]/gu, '[APP]')
311
+ .replace(/^(?:(?:WARN(?:ING)?|ERROR|EXCEPTION|\[TIME\]|\[APP\])\s*)+/u, '');
312
+ return {
313
+ level,
314
+ fingerprint: createHash('sha256').update(`${level}|${identity}`).digest('hex').slice(0, 12),
315
+ preview,
316
+ };
317
+ }
318
+ // Allowlisted findings become info (known third-party noise, with the
319
+ // reason). Decided per event before grouping, so one allowlisted occurrence
320
+ // never hides a different one with the same first line.
321
+ function applyConsoleAllowlist(findings, classifier, allowlist) {
322
+ if (!allowlist)
323
+ return;
324
+ for (const finding of findings) {
325
+ // A classified record always has its event key and source.
326
+ if (!finding.event || finding.source === undefined)
327
+ continue;
328
+ const match = classifier.match({ source: finding.source, key: finding.event }, allowlist);
329
+ if (!match)
330
+ continue;
331
+ finding.allowlisted = {
332
+ reason: match.reason,
333
+ entry: match.index,
334
+ file: match.file,
335
+ ...(match.temporary ? { temporary: true } : {}),
336
+ };
337
+ finding.level = 'info';
338
+ finding.fingerprint = createHash('sha256')
339
+ .update(`${finding.fingerprint}|info|${match.file}#${match.index}`)
340
+ .digest('hex')
341
+ .slice(0, 12);
342
+ }
343
+ }
344
+ function redactPreview(value) {
345
+ return redactDiagnosticText(value).slice(0, MAX_PREVIEW_CHARS);
346
+ }
347
+ function redactDiagnosticText(value) {
348
+ return value
349
+ .replace(/\b(Bearer)\s+\S+/giu, '$1 [REDACTED]')
350
+ .replace(/(["'])(api[-_]?key|password|passphrase|mnemonic|seed(?:Phrase)?|privateKey|secret|token|authorization|vault)\1\s*:\s*(?:"[^"]*"|'[^']*'|[^,\s}\]]+)/giu, '$1$2$1:"[REDACTED]"')
351
+ .replace(/\b(api[-_]?key|password|passphrase|mnemonic|seed(?:Phrase)?|privateKey|secret|token|authorization|vault)\b\s*[:=]\s*(?:"[^"]*"|'[^']*'|\S+)/giu, '$1=[REDACTED]')
352
+ .replace(/\b(?:0x)?[a-f0-9]{64,}\b/giu, '[REDACTED_HEX]')
353
+ .replace(/(https?:\/\/[^\s?]+)\?\S+/giu, '$1?[REDACTED_QUERY]');
354
+ }
355
+ function dedupeFindings(findings) {
356
+ const byFingerprint = new Map();
357
+ for (const finding of findings) {
358
+ const existing = byFingerprint.get(finding.fingerprint);
359
+ if (existing)
360
+ existing.count += 1;
361
+ else
362
+ byFingerprint.set(finding.fingerprint, { ...finding, count: 1 });
363
+ }
364
+ return [...byFingerprint.values()];
365
+ }
366
+ // total counts the findings that need review; allowlisted ones are info.
367
+ function countFindings(findings) {
368
+ const counts = { total: 0, warning: 0, error: 0, exception: 0, info: 0 };
369
+ for (const finding of findings) {
370
+ counts[finding.level] += 1;
371
+ if (finding.level !== 'info')
372
+ counts.total += 1;
373
+ }
374
+ return counts;
375
+ }
376
+ function stripInternal(finding) {
377
+ const { event: _event, ...rest } = finding;
378
+ return rest;
379
+ }
380
+ function readSlice(filePath, offset, length) {
381
+ const fd = fs.openSync(filePath, 'r');
382
+ try {
383
+ const buffer = Buffer.alloc(length);
384
+ const bytesRead = fs.readSync(fd, buffer, 0, length, offset);
385
+ return buffer.subarray(0, bytesRead);
386
+ }
387
+ finally {
388
+ fs.closeSync(fd);
389
+ }
390
+ }
391
+ function safeStat(filePath) {
392
+ try {
393
+ return fs.statSync(filePath);
394
+ }
395
+ catch {
396
+ return null;
397
+ }
398
+ }
399
+ function indexDiagnosticArtifact(manifestPath) {
400
+ const manifest = readJsonRecord(manifestPath);
401
+ if (!manifest)
402
+ return;
403
+ const artifacts = Array.isArray(manifest.artifacts) ? manifest.artifacts : [];
404
+ manifest.artifacts = [
405
+ ...artifacts.filter((artifact) => !isRecord(artifact) ||
406
+ !['diagnostics.json', RAW_APP_LOG_ARTIFACT].includes(String(artifact.path))),
407
+ {
408
+ path: 'diagnostics.json',
409
+ type: 'json',
410
+ label: 'Run-scoped application diagnostics',
411
+ category: 'diagnostic',
412
+ },
413
+ {
414
+ path: RAW_APP_LOG_ARTIFACT,
415
+ type: 'log',
416
+ label: 'Redacted run-scoped application log slice',
417
+ category: 'diagnostic',
418
+ },
419
+ ];
420
+ fs.writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
421
+ }
422
+ function indexDiagnosticSummary(summaryPath, diagnostics) {
423
+ const summary = readJsonRecord(summaryPath);
424
+ if (!summary)
425
+ return;
426
+ summary.sideFindings = {
427
+ status: diagnostics.status,
428
+ nonBlocking: true,
429
+ counts: diagnostics.counts,
430
+ diagnosticsPath: 'diagnostics.json',
431
+ appLogPath: RAW_APP_LOG_ARTIFACT,
432
+ appLogRedacted: true,
433
+ };
434
+ fs.writeFileSync(summaryPath, `${JSON.stringify(summary, null, 2)}\n`);
435
+ }
436
+ // The run's recipe library roots (summary.json), where console allowlists live.
437
+ function recipeLibraryRoots(summaryPath, classifier) {
438
+ const summary = readJsonRecord(summaryPath);
439
+ const libraries = isRecord(summary?.recipeLibraries) ? summary.recipeLibraries : null;
440
+ const sources = Array.isArray(libraries?.sources) ? libraries.sources : [];
441
+ const roots = sources
442
+ .map((source) => isRecord(source) && typeof source.root === 'string' ? source.root : null)
443
+ .filter((root) => Boolean(root));
444
+ return roots.length ? roots : classifier.libraryRoots();
445
+ }
446
+ function readJsonRecord(filePath) {
447
+ try {
448
+ const value = JSON.parse(fs.readFileSync(filePath, 'utf8'));
449
+ return isRecord(value) ? value : null;
450
+ }
451
+ catch {
452
+ return null;
453
+ }
454
+ }
455
+ function isRecord(value) {
456
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
457
+ }
458
+ //# sourceMappingURL=run-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-diagnostics.js","sourceRoot":"","sources":["../../src/harness/run-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RecipeRunOptions } from '@farmslot/adapter-sdk';
2
+ import { type CliOptions } from './parse-args.js';
3
+ export declare function recipeRunOptionsFromCli(adapter: string, options: CliOptions): RecipeRunOptions;
4
+ //# sourceMappingURL=run-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-options.d.ts","sourceRoot":"","sources":["../../src/harness/run-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,KAAK,UAAU,EAAgB,MAAM,iBAAiB,CAAC;AAGhE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,gBAAgB,CAqB9F"}
@@ -0,0 +1,35 @@
1
+ import { adapterPortFlags, harnessAdapter } from './adapters.js';
2
+ import { optionString } from './parse-args.js';
3
+ import { explicitRecipeTrustOptions } from './trust.js';
4
+ export function recipeRunOptionsFromCli(adapter, options) {
5
+ const recordVideo = options.recordVideo;
6
+ const hud = optionString(options, 'hud');
7
+ const trust = explicitRecipeTrustOptions({
8
+ sourceTrust: optionString(options, 'sourceTrust'),
9
+ sourceKind: optionString(options, 'sourceKind'),
10
+ sourceName: optionString(options, 'sourceName'),
11
+ sourceDigest: optionString(options, 'sourceDigest'),
12
+ approvalDigest: optionString(options, 'approvePlan'),
13
+ });
14
+ const platform = harnessAdapter(adapter).run?.platformOptions?.(options);
15
+ return {
16
+ cdpPort: optionString(options, 'cdpPort'),
17
+ watcherPort: watcherPortOption(options),
18
+ slot: optionString(options, 'slot'),
19
+ validationRuntimeDir: optionString(options, 'validationRuntimeDir'),
20
+ recordVideo: recordVideo === 'full-run' ? 'full-run' : false,
21
+ autoHud: hud === 'show' ? true : hud === 'hide' ? false : undefined,
22
+ ...(platform ? { platform } : {}),
23
+ ...trust,
24
+ };
25
+ }
26
+ // --watcher-port, else the first port option a registered adapter adds.
27
+ function watcherPortOption(options) {
28
+ for (const flag of ['watcherPort', ...adapterPortFlags()]) {
29
+ const port = optionString(options, flag);
30
+ if (port !== undefined)
31
+ return port;
32
+ }
33
+ return undefined;
34
+ }
35
+ //# sourceMappingURL=run-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-options.js","sourceRoot":"","sources":["../../src/harness/run-options.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAmB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,OAAmB;IAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,0BAA0B,CAAC;QACvC,WAAW,EAAE,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC;QACjD,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC;QAC/C,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC;QAC/C,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC;QACnD,cAAc,EAAE,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC;KACrD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;IACzE,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC;QACzC,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC;QACvC,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;QACnC,oBAAoB,EAAE,YAAY,CAAC,OAAO,EAAE,sBAAsB,CAAC;QACnE,WAAW,EAAE,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK;QAC5D,OAAO,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QACnE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,KAAK;KACT,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,SAAS,iBAAiB,CAAC,OAAmB;IAC5C,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type ChildProcessWithoutNullStreams } from 'node:child_process';
2
+ import { readCaptureHelperTiming, type RecipeRunResult } from '@farmslot/recipe-runner';
3
+ export interface RecipeRecordingOptions {
4
+ record?: boolean;
5
+ cdpPort?: string;
6
+ }
7
+ export interface ActiveRecipeRecording {
8
+ child: ChildProcessWithoutNullStreams;
9
+ outputPath: string;
10
+ stagingDir: string;
11
+ stagedPath: string;
12
+ relativePath: string;
13
+ pid: number;
14
+ stdout: string;
15
+ stderr: string;
16
+ exited: boolean;
17
+ exitCode: number | null;
18
+ frameReady: boolean;
19
+ finalized: boolean;
20
+ startedAtUnixMs: number;
21
+ stoppedAtUnixMs?: number;
22
+ nativeTiming: boolean;
23
+ completedRecordingId?: string;
24
+ completedVideo?: boolean;
25
+ nativeTimingEvidence?: Awaited<ReturnType<typeof readCaptureHelperTiming>>;
26
+ error?: Error;
27
+ activePidEnv: string;
28
+ previousActiveRecordingPid: string | undefined;
29
+ stderrBuffer: string;
30
+ pendingSnapshots: Map<string, PendingRecordingSnapshot>;
31
+ }
32
+ interface PendingRecordingSnapshot {
33
+ outputPath: string;
34
+ timer: NodeJS.Timeout;
35
+ resolve: (event: Record<string, unknown>) => void;
36
+ reject: (error: Error) => void;
37
+ }
38
+ export declare function startRecipeRecording(adapter: string, projectRoot: string, artifactsDir: string, options: RecipeRecordingOptions): Promise<ActiveRecipeRecording | undefined>;
39
+ /** Ask the recording of `pid` for an in-session snapshot; undefined when none runs. */
40
+ export declare function captureActiveRecipeRecordingSnapshot(pid: number, outputPath: string, timeoutMs?: number): Promise<Record<string, unknown> | undefined>;
41
+ export declare function stopRecipeRecording(recording: ActiveRecipeRecording | undefined, result?: RecipeRunResult): Promise<void>;
42
+ export {};
43
+ //# sourceMappingURL=run-recording.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-recording.d.ts","sourceRoot":"","sources":["../../src/harness/run-recording.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,8BAA8B,EAAoB,MAAM,oBAAoB,CAAC;AAI3F,OAAO,EAEL,uBAAuB,EACvB,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAUjC,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,8BAA8B,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC;IAC3E,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CACzD;AAED,UAAU,wBAAwB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAClD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAID,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA8G5C;AAED,uFAAuF;AACvF,wBAAsB,oCAAoC,CACxD,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,SAAS,SAAS,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAsB9C;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,GAAG,SAAS,EAC5C,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAqBf"}