@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,101 @@
1
+ /**
2
+ * cli-color.ts — shared ANSI styling for recipe CLI human output.
3
+ *
4
+ * Honors NO_COLOR, RECIPE_NO_COLOR, FORCE_COLOR, RECIPE_COLOR, and TTY detection.
5
+ */
6
+ const STYLES = {
7
+ reset: '\x1b[0m',
8
+ bold: '\x1b[1m',
9
+ dim: '\x1b[2m',
10
+ label: '\x1b[1;36m',
11
+ cmd: '\x1b[1m',
12
+ ok: '\x1b[1;32m',
13
+ warn: '\x1b[1;33m',
14
+ err: '\x1b[1;31m',
15
+ info: '\x1b[0;37m',
16
+ accent: '\x1b[1;35m',
17
+ path: '\x1b[2m',
18
+ comment: '\x1b[2m',
19
+ active: '\x1b[1m',
20
+ };
21
+ export function colorEnabled(stream = process.stderr) {
22
+ if (process.env.NO_COLOR != null && process.env.NO_COLOR !== '' && process.env.NO_COLOR !== '0') {
23
+ return false;
24
+ }
25
+ if (process.env.RECIPE_NO_COLOR === '1')
26
+ return false;
27
+ if (process.env.RECIPE_COLOR === '1' || process.env.FORCE_COLOR === '1')
28
+ return true;
29
+ return Boolean(stream?.isTTY);
30
+ }
31
+ export function stripAnsi(text) {
32
+ return String(text).replace(/\x1b\[[0-9;]*m/gu, '');
33
+ }
34
+ export function color(style, text, { stream = process.stderr } = {}) {
35
+ const value = String(text);
36
+ if (!colorEnabled(stream))
37
+ return value;
38
+ const code = STYLES[style];
39
+ if (!code)
40
+ return value;
41
+ return `${code}${value}${STYLES.reset}`;
42
+ }
43
+ export function colorKv(label, value, valueStyle = 'info', { stream = process.stderr } = {}) {
44
+ return `${color('label', `${label}:`, { stream })} ${color(valueStyle, value, { stream })}`;
45
+ }
46
+ export function colorStatusWord(word, { stream = process.stderr } = {}) {
47
+ const normalized = String(word || '').toLowerCase();
48
+ if (['up', 'ready', 'yes', 'pass', 'running', 'present', 'healthy'].includes(normalized)) {
49
+ return color('ok', word, { stream });
50
+ }
51
+ if (['down', 'stopped', 'no', 'fail', 'failed', 'missing', 'blocked', 'unknown'].includes(normalized)) {
52
+ return color('err', word, { stream });
53
+ }
54
+ if (['compiling', 'bundling', 'starting', 'waiting', 'warn'].includes(normalized)) {
55
+ return color('warn', word, { stream });
56
+ }
57
+ return color('info', word, { stream });
58
+ }
59
+ export function colorHumanMessage(message, { stream = process.stderr } = {}) {
60
+ return String(message)
61
+ .split('\n')
62
+ .map((line) => {
63
+ const marker = /^(\s*)(→|✓|✗)\s?(.*)$/u.exec(line);
64
+ if (marker) {
65
+ const style = marker[2] === '✓' ? 'ok' : marker[2] === '✗' ? 'err' : 'accent';
66
+ return `${marker[1]}${color(style, marker[2], { stream })}${marker[3] ? ` ${marker[3]}` : ''}`;
67
+ }
68
+ const next = /^(\s*)Next:\s*(.*)$/u.exec(line);
69
+ if (next) {
70
+ return `${next[1]}${color('label', 'Next:', { stream })}${next[2] ? ` ${color('cmd', next[2], { stream })}` : ''}`;
71
+ }
72
+ const warning = /^(\s*)(WARN(?:ING)?)(:?)[ \t]*(.*)$/iu.exec(line);
73
+ if (warning) {
74
+ return `${warning[1]}${color('warn', `${warning[2]}${warning[3]}`, { stream })}${warning[4] ? ` ${warning[4]}` : ''}`;
75
+ }
76
+ return line;
77
+ })
78
+ .join('\n');
79
+ }
80
+ export function classifyLogEvent(event) {
81
+ const text = String(event || '');
82
+ if (/Module build failed|^ERROR in |BUILD FAILED|compiled with [1-9][0-9]* error/iu.test(text)) {
83
+ return 'err';
84
+ }
85
+ if (/compiled successfully|compiled with [0-9]+ warning|PASS runtime-launch|launch pass|verify pass|build complete/iu.test(text)) {
86
+ return 'ok';
87
+ }
88
+ if (/phase [0-9]\/[0-9]|prepare pipeline|snapshot|fixture:|dist-freshness|build-health/iu.test(text)) {
89
+ return 'label';
90
+ }
91
+ if (/webpack [0-9]+%|Bundl(ed|ing)|(iOS|Android).*%/iu.test(text)) {
92
+ return 'warn';
93
+ }
94
+ return 'info';
95
+ }
96
+ export function colorLogEvent(event, { latest = false, stream = process.stderr, } = {}) {
97
+ const style = classifyLogEvent(event);
98
+ const painted = color(style === 'label' ? 'label' : style, event, { stream });
99
+ return latest ? color('active', painted, { stream }) : painted;
100
+ }
101
+ //# sourceMappingURL=cli-color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-color.js","sourceRoot":"","sources":["../../src/harness/cli-color.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export declare const COMMAND_JOURNAL_FILE = "last-command.json";
2
+ export interface CommandJournalRecord {
3
+ schemaVersion: 1;
4
+ command: string;
5
+ args: string[];
6
+ target: string;
7
+ verdict: 'running' | 'pass' | 'fail';
8
+ exitCode: number | null;
9
+ evidencePaths: string[];
10
+ startedAt: string;
11
+ finishedAt: string | null;
12
+ }
13
+ export declare function withCommandJournal(command: string, argv: readonly string[], execute: () => Promise<number>): Promise<number>;
14
+ export declare function recordCommandStage(stage: string): void;
15
+ export declare function recordCommandOutput(chunk: string | Uint8Array): void;
16
+ export declare function recordCommandEvidence(...evidence: string[]): void;
17
+ export declare function commandJournalPath(target: string, runtimeDir?: string): string;
18
+ export declare function readCommandJournal(target: string, runtimeDir?: string): {
19
+ file: string;
20
+ record: CommandJournalRecord | null;
21
+ };
22
+ export declare function redactCommandArgs(argv: readonly string[]): string[];
23
+ export declare function isSensitiveKey(key: string): boolean;
24
+ export declare function redactStructuredValue(value: unknown): unknown;
25
+ //# sourceMappingURL=command-journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-journal.d.ts","sourceRoot":"","sources":["../../src/harness/command-journal.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAQxD,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,CAAC,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAUD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAajE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9E;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACrC,CA4CA;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAmCnE;AAiKD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAS7D"}
@@ -0,0 +1,322 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { latestTaskDir } from '@farmslot/agent-runtime';
5
+ import { ensureRuntimeDirectory, OperationRecord, processIdentity, readOperations, } from '@farmslot/recipe-runner/runtime/operation';
6
+ import { harnessHost, hostEnvName } from './host.js';
7
+ import { recipeRuntimeDir } from './paths.js';
8
+ export const COMMAND_JOURNAL_FILE = 'last-command.json';
9
+ const SENSITIVE_KEY = /(?:api[-_]?key|auth|credential|mnemonic|pass(?:word)?|private[-_]?key|secret|seed|srp|token|vault)/iu;
10
+ // Do not infer secrets from value shape: 64 hex characters may be a transaction
11
+ // hash, and mnemonic-length prose may be legitimate CLI evidence.
12
+ const EVIDENCE_OPTIONS = new Set(['--artifacts-dir', '--out', '--output']);
13
+ let activeCommandJournal;
14
+ export async function withCommandJournal(command, argv, execute) {
15
+ // Persist commands whose side effects or proof work should not be guessed or repeated after interruption.
16
+ if (!harnessHost().journaledCommands.includes(command))
17
+ return execute();
18
+ const operationEnv = hostEnvName('OPERATION_ID');
19
+ const handle = tryBeginCommandJournal(command, argv);
20
+ const previous = activeCommandJournal;
21
+ const parentId = process.env[operationEnv];
22
+ if (handle)
23
+ process.env[operationEnv] = handle.operation.value.id;
24
+ activeCommandJournal = handle;
25
+ try {
26
+ const exitCode = await execute();
27
+ tryFinishCommandJournal(handle, exitCode);
28
+ return exitCode;
29
+ }
30
+ catch (error) {
31
+ tryFinishCommandJournal(handle, 1);
32
+ throw error;
33
+ }
34
+ finally {
35
+ activeCommandJournal = previous;
36
+ if (parentId)
37
+ process.env[operationEnv] = parentId;
38
+ else
39
+ delete process.env[operationEnv];
40
+ }
41
+ }
42
+ export function recordCommandStage(stage) {
43
+ activeCommandJournal?.operation.stage(stage);
44
+ }
45
+ export function recordCommandOutput(chunk) {
46
+ activeCommandJournal?.operation.output(chunk);
47
+ }
48
+ export function recordCommandEvidence(...evidence) {
49
+ const handle = activeCommandJournal;
50
+ if (!handle || evidence.length === 0)
51
+ return;
52
+ try {
53
+ const paths = new Set(handle.record.evidencePaths);
54
+ for (const entry of evidence)
55
+ paths.add(path.resolve(entry));
56
+ handle.record = { ...handle.record, evidencePaths: [...paths] };
57
+ writeAtomic(handle.file, handle.record);
58
+ }
59
+ catch (error) {
60
+ process.stderr.write(`${harnessHost().name}: resumability journal could not record evidence: ${errorMessage(error)}\n`);
61
+ }
62
+ }
63
+ export function commandJournalPath(target, runtimeDir) {
64
+ const relative = runtimeDir ?? recipeRuntimeDir();
65
+ assertRelativeRuntimeDir(relative);
66
+ return path.join(path.resolve(target), relative, COMMAND_JOURNAL_FILE);
67
+ }
68
+ export function readCommandJournal(target, runtimeDir) {
69
+ const legacyFile = commandJournalPath(target, runtimeDir);
70
+ const operations = readOperations(path.join(path.dirname(legacyFile), 'operations'));
71
+ const live = operations.filter((operation) => operation.status === 'running' &&
72
+ processIdentity(operation.pid) === operation.processStartedAt);
73
+ const roots = operations
74
+ .filter((operation) => !operation.parentId)
75
+ .sort((a, b) => (a.finishedAt ?? a.startedAt).localeCompare(b.finishedAt ?? b.startedAt));
76
+ const selected = live.find((operation) => !operation.parentId) ??
77
+ live.at(-1) ??
78
+ roots.at(-1) ??
79
+ operations.at(-1);
80
+ const file = selected
81
+ ? path.join(path.dirname(legacyFile), 'operations', `${selected.id}.journal.json`)
82
+ : legacyFile;
83
+ let descriptor;
84
+ try {
85
+ // O_NOFOLLOW blocks symlinks where supported; matching the opened file's
86
+ // identity closes the fallback race, and missing identity fails closed.
87
+ const noFollow = typeof fs.constants.O_NOFOLLOW === 'number' ? fs.constants.O_NOFOLLOW : 0;
88
+ descriptor = fs.openSync(file, fs.constants.O_RDONLY | noFollow);
89
+ const descriptorStat = fs.fstatSync(descriptor, { bigint: true });
90
+ const pathStat = fs.lstatSync(file, { bigint: true });
91
+ if (!descriptorStat.isFile() ||
92
+ !pathStat.isFile() ||
93
+ pathStat.isSymbolicLink() ||
94
+ (pathStat.dev === 0n && pathStat.ino === 0n) ||
95
+ descriptorStat.dev !== pathStat.dev ||
96
+ descriptorStat.ino !== pathStat.ino) {
97
+ return { file, record: null };
98
+ }
99
+ const parsed = JSON.parse(fs.readFileSync(descriptor, 'utf8'));
100
+ return isCommandJournalRecord(parsed) ? { file, record: parsed } : { file, record: null };
101
+ }
102
+ catch {
103
+ return { file, record: null };
104
+ }
105
+ finally {
106
+ if (descriptor !== undefined)
107
+ fs.closeSync(descriptor);
108
+ }
109
+ }
110
+ export function redactCommandArgs(argv) {
111
+ // Redact the complete invocation, including payloads after `--`; the journal must never preserve secrets.
112
+ const redacted = [];
113
+ for (let index = 0; index < argv.length; index += 1) {
114
+ const token = argv[index] ?? '';
115
+ const equals = token.indexOf('=');
116
+ if (token.startsWith('--') && equals !== -1) {
117
+ const option = token.slice(0, equals);
118
+ const value = token.slice(equals + 1);
119
+ redacted.push(`${option}=${option === '--arg' ? redactAssignment(value) : SENSITIVE_KEY.test(option) ? '<redacted>' : redactUrl(value)}`);
120
+ continue;
121
+ }
122
+ if (token.startsWith('--') && SENSITIVE_KEY.test(token)) {
123
+ redacted.push(token);
124
+ const value = argv[index + 1];
125
+ if (value !== undefined && !value.startsWith('--')) {
126
+ redacted.push('<redacted>');
127
+ index += 1;
128
+ }
129
+ continue;
130
+ }
131
+ if (token === '--arg') {
132
+ redacted.push(token);
133
+ const value = argv[index + 1];
134
+ if (value !== undefined) {
135
+ redacted.push(redactAssignment(value));
136
+ index += 1;
137
+ }
138
+ continue;
139
+ }
140
+ redacted.push(redactAssignment(redactUrl(token)));
141
+ }
142
+ return redacted;
143
+ }
144
+ // Bound standalone history; task-local mirrors remain with their task artifacts.
145
+ function pruneCompletedJournals(directory, operations) {
146
+ const completed = operations.filter((operation) => operation.status !== 'running');
147
+ for (const operation of completed.slice(0, -100)) {
148
+ for (const suffix of ['.json', '.journal.json', '.log']) {
149
+ fs.rmSync(path.join(directory, `${operation.id}${suffix}`), { force: true });
150
+ }
151
+ }
152
+ }
153
+ function tryBeginCommandJournal(command, argv) {
154
+ try {
155
+ const target = invocationTarget(argv);
156
+ if (!fs.existsSync(target))
157
+ return undefined;
158
+ const runtimeDir = optionValue(argv, '--runtime-dir');
159
+ const legacyFile = commandJournalPath(target, runtimeDir);
160
+ const taskDir = latestTaskDir(path.join(target, 'temp', 'tasks'));
161
+ const signalFile = taskDir && path.join(taskDir, 'SIGNAL.json');
162
+ const liveTask = signalFile &&
163
+ fs.existsSync(signalFile) &&
164
+ JSON.parse(fs.readFileSync(signalFile, 'utf8')).status === 'running';
165
+ const directory = path.join(path.dirname(legacyFile), 'operations');
166
+ const operations = readOperations(directory, (error) => process.stderr.write(`${harnessHost().name}: ignoring invalid prior operation: ${error.message}\n`));
167
+ pruneCompletedJournals(directory, operations);
168
+ const inherited = process.env[hostEnvName('OPERATION_ID')];
169
+ const parent = inherited &&
170
+ operations.find((operation) => operation.id === inherited &&
171
+ operation.target === target &&
172
+ operation.status === 'running' &&
173
+ processIdentity(operation.pid) === operation.processStartedAt);
174
+ const operation = new OperationRecord(directory, command, target, {
175
+ ...(parent ? { parentId: parent.id } : {}),
176
+ ...(liveTask ? { mirrorDirectory: path.join(taskDir, 'artifacts', 'operations') } : {}),
177
+ });
178
+ const file = path.join(directory, `${operation.value.id}.journal.json`);
179
+ const now = new Date().toISOString();
180
+ const record = {
181
+ schemaVersion: 1,
182
+ command,
183
+ args: redactCommandArgs(argv.slice(1)),
184
+ target,
185
+ verdict: 'running',
186
+ exitCode: null,
187
+ evidencePaths: evidencePaths(argv),
188
+ startedAt: now,
189
+ finishedAt: null,
190
+ };
191
+ writeAtomic(file, record);
192
+ return { file, record, operation };
193
+ }
194
+ catch (error) {
195
+ process.stderr.write(`${harnessHost().name}: resumability journal unavailable: ${errorMessage(error)}\n`);
196
+ return undefined;
197
+ }
198
+ }
199
+ function tryFinishCommandJournal(handle, exitCode) {
200
+ if (!handle)
201
+ return;
202
+ try {
203
+ writeAtomic(handle.file, {
204
+ ...handle.record,
205
+ verdict: exitCode === 0 ? 'pass' : 'fail',
206
+ exitCode,
207
+ finishedAt: new Date().toISOString(),
208
+ });
209
+ }
210
+ catch (error) {
211
+ process.stderr.write(`${harnessHost().name}: resumability journal could not finalize: ${errorMessage(error)}\n`);
212
+ }
213
+ finally {
214
+ handle.operation.finish(exitCode);
215
+ }
216
+ }
217
+ function writeAtomic(file, record) {
218
+ ensureRuntimeDirectory(path.dirname(file));
219
+ const temporary = `${file}.${process.pid}.${randomUUID()}.tmp`;
220
+ let descriptor;
221
+ try {
222
+ descriptor = fs.openSync(temporary, 'wx', 0o600);
223
+ fs.fchmodSync(descriptor, 0o600);
224
+ fs.writeFileSync(descriptor, `${JSON.stringify(record, null, 2)}\n`);
225
+ fs.fsyncSync(descriptor);
226
+ fs.closeSync(descriptor);
227
+ descriptor = undefined;
228
+ fs.renameSync(temporary, file);
229
+ }
230
+ finally {
231
+ if (descriptor !== undefined)
232
+ fs.closeSync(descriptor);
233
+ fs.rmSync(temporary, { force: true });
234
+ }
235
+ }
236
+ function invocationTarget(argv) {
237
+ const target = path.resolve(optionValue(argv, '--target') ?? process.cwd());
238
+ return fs.existsSync(target) ? fs.realpathSync(target) : target;
239
+ }
240
+ function evidencePaths(argv) {
241
+ const values = new Set();
242
+ for (const option of EVIDENCE_OPTIONS) {
243
+ const value = optionValue(argv, option);
244
+ if (value)
245
+ values.add(path.resolve(value));
246
+ }
247
+ return [...values];
248
+ }
249
+ function optionValue(argv, option) {
250
+ const divider = argv.indexOf('--');
251
+ const end = divider === -1 ? argv.length : divider;
252
+ for (let index = 1; index < end; index += 1) {
253
+ const token = argv[index] ?? '';
254
+ if (token === option) {
255
+ const value = argv[index + 1];
256
+ return value && !value.startsWith('--') ? value : undefined;
257
+ }
258
+ if (token.startsWith(`${option}=`))
259
+ return token.slice(option.length + 1);
260
+ }
261
+ return undefined;
262
+ }
263
+ function redactAssignment(token) {
264
+ const equals = token.indexOf('=');
265
+ if (equals <= 0)
266
+ return redactValue(token);
267
+ const key = token.slice(0, equals);
268
+ const value = token.slice(equals + 1);
269
+ return `${key}=${SENSITIVE_KEY.test(key) ? '<redacted>' : redactValue(value)}`;
270
+ }
271
+ function redactUrl(token) {
272
+ return token.replace(/(\w+:\/\/)[^/@\s:]+:[^/@\s]+@/gu, '$1<redacted>@');
273
+ }
274
+ function redactValue(value) {
275
+ try {
276
+ return JSON.stringify(redactStructuredValue(JSON.parse(value)));
277
+ }
278
+ catch {
279
+ return value.replace(/((?:api[-_]?key|auth|credential|mnemonic|pass(?:word)?|private[-_]?key|secret|seed|srp|token|vault)=)[^\s]+/giu, '$1<redacted>');
280
+ }
281
+ }
282
+ export function isSensitiveKey(key) {
283
+ return SENSITIVE_KEY.test(key);
284
+ }
285
+ export function redactStructuredValue(value) {
286
+ if (Array.isArray(value))
287
+ return value.map(redactStructuredValue);
288
+ if (!value || typeof value !== 'object')
289
+ return value;
290
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
291
+ key,
292
+ isSensitiveKey(key) ? '<redacted>' : redactStructuredValue(entry),
293
+ ]));
294
+ }
295
+ function assertRelativeRuntimeDir(value) {
296
+ if (!value || path.isAbsolute(value) || !/^[A-Za-z0-9._/-]+$/u.test(value)) {
297
+ throw new Error(`--runtime-dir must be a safe relative path: ${value}`);
298
+ }
299
+ if (value.split('/').some((part) => !part || part === '.' || part === '..')) {
300
+ throw new Error(`--runtime-dir contains an unsafe path component: ${value}`);
301
+ }
302
+ }
303
+ function isCommandJournalRecord(value) {
304
+ if (!value || typeof value !== 'object' || Array.isArray(value))
305
+ return false;
306
+ const record = value;
307
+ return (record.schemaVersion === 1 &&
308
+ typeof record.command === 'string' &&
309
+ Array.isArray(record.args) &&
310
+ record.args.every((entry) => typeof entry === 'string') &&
311
+ typeof record.target === 'string' &&
312
+ (record.verdict === 'running' || record.verdict === 'pass' || record.verdict === 'fail') &&
313
+ (record.exitCode === null || typeof record.exitCode === 'number') &&
314
+ Array.isArray(record.evidencePaths) &&
315
+ record.evidencePaths.every((entry) => typeof entry === 'string') &&
316
+ typeof record.startedAt === 'string' &&
317
+ (record.finishedAt === null || typeof record.finishedAt === 'string'));
318
+ }
319
+ function errorMessage(error) {
320
+ return error instanceof Error ? error.message : String(error);
321
+ }
322
+ //# sourceMappingURL=command-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-journal.js","sourceRoot":"","sources":["../../src/harness/command-journal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ParsedArgs } from '../parse-args.js';
2
+ export declare function handleLast({ options }: ParsedArgs): number;
3
+ //# sourceMappingURL=last.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last.d.ts","sourceRoot":"","sources":["../../../src/harness/commands/last.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,UAAU,EAGhB,MAAM,kBAAkB,CAAC;AAG1B,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,GAAG,MAAM,CAgE1D"}
@@ -0,0 +1,59 @@
1
+ // last — the resumability journal's most recent command for a checkout.
2
+ import { readCommandJournal } from '../command-journal.js';
3
+ import { harnessHost } from '../host.js';
4
+ import { optionFlag, optionString, shellQuote, targetPath, } from '../parse-args.js';
5
+ import { EXIT } from '../shared.js';
6
+ export function handleLast({ options }) {
7
+ const { name } = harnessHost();
8
+ const target = targetPath(options);
9
+ const { file, record } = readCommandJournal(target, optionString(options, 'runtimeDir'));
10
+ const json = optionFlag(options, 'json');
11
+ if (!record) {
12
+ const message = `no resumability journal exists for ${target}`;
13
+ const userAction = `run a proof or runtime command in this checkout, then re-run ${name} last --json`;
14
+ if (json) {
15
+ console.log(JSON.stringify({
16
+ schemaVersion: 1,
17
+ command: 'last',
18
+ target,
19
+ journalPath: file,
20
+ status: 'fail',
21
+ exitCode: EXIT.runtime,
22
+ error: { code: 'LAST_NOT_FOUND', message, userAction },
23
+ }, null, 2));
24
+ }
25
+ else {
26
+ console.error(`✗ ${name} last: ${message}\n Next: ${userAction}`);
27
+ }
28
+ return EXIT.runtime;
29
+ }
30
+ if (json) {
31
+ console.log(JSON.stringify({
32
+ schemaVersion: 1,
33
+ command: 'last',
34
+ target,
35
+ journalPath: file,
36
+ status: 'pass',
37
+ exitCode: EXIT.ok,
38
+ last: record,
39
+ }, null, 2));
40
+ }
41
+ else {
42
+ const end = record.finishedAt ?? 'still running or interrupted';
43
+ console.log(`${record.verdict.toUpperCase()} ${record.command} (exit ${record.exitCode ?? 'pending'})`);
44
+ console.log(`command: ${name} ${record.command}${record.args.length > 0 ? ` ${record.args.map(shellQuote).join(' ')}` : ''}`);
45
+ console.log(`started: ${record.startedAt}`);
46
+ console.log(`finished: ${end}`);
47
+ if (record.evidencePaths.length > 0) {
48
+ console.log('evidence:');
49
+ for (const evidence of record.evidencePaths)
50
+ console.log(` ${evidence}`);
51
+ }
52
+ else {
53
+ console.log('evidence: none recorded');
54
+ }
55
+ console.log(`journal: ${file}`);
56
+ }
57
+ return EXIT.ok;
58
+ }
59
+ //# sourceMappingURL=last.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last.js","sourceRoot":"","sources":["../../../src/harness/commands/last.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleLaunch(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/harness/commands/launch.ts"],"names":[],"mappings":"AAkCA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6ClE"}