ferrycat 0.3.3 → 0.5.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.
@@ -1,9 +1,34 @@
1
- import type { FileFingerprint, FilePointerInput } from './types.js';
1
+ import { MAX_GIT_PATCH_BYTES } from './schemas.js';
2
+ import type { ArtifactPointer, FileFingerprint, FilePointerInput } from './types.js';
3
+ export { MAX_GIT_PATCH_BYTES };
2
4
  export declare class SecurityPolicyError extends Error {
3
5
  constructor(message: string);
4
6
  }
5
7
  export declare function assertSafePointerPath(workspaceRoot: string, rawPath: string): string;
6
8
  export declare function computeFullFileSha256(buffer: Buffer): string;
9
+ /**
10
+ * Validates an optional unified git diff patch payload (FC-202):
11
+ * - Non-empty UTF-8 string without binary null bytes
12
+ * - Bounded to MAX_GIT_PATCH_BYTES (512KB)
13
+ * - Scans diff header paths (diff --git / --- / +++) against workspace escape and sensitive file blacklists
14
+ * - Requires at least one valid unified diff header (`NOT_A_UNIFIED_DIFF` if prose/empty)
15
+ * - Requires every declared file block to carry at least one `@@` hunk (`EMPTY_PATCH_HUNKS`)
16
+ * and at least one `+` / `-` changed content line (`EMPTY_PATCH_CONTENT`), so a header-only
17
+ * patch can never stand in for a reviewable diff
18
+ * - When `requiredPointers` is provided, requires `touchedPaths` to cover every pointer path (`PATCH_DOES_NOT_COVER_POINTERS`)
19
+ * - Computes deterministic SHA-256 hex digest of the patch content
20
+ *
21
+ * Known limitation: mode-only changes (`old mode` / `new mode` with no hunk) and text-encoded
22
+ * binary diffs (`GIT binary patch`) carry no `@@` hunk and are therefore rejected. Self-contained
23
+ * review is a text-diff feature; use a normal on-disk contract for those cases.
24
+ */
25
+ export declare function assertSafeGitPatch(gitPatch: string, requiredPointers?: Array<{
26
+ path: string;
27
+ } | string>): {
28
+ sha256: string;
29
+ byteLength: number;
30
+ touchedPaths: string[];
31
+ };
7
32
  export declare function computeFingerprints(workspaceRoot: string, pointers: FilePointerInput[], nowMs?: number): {
8
33
  fingerprints: FileFingerprint[];
9
34
  recentlyModified: boolean;
@@ -23,9 +48,40 @@ export declare function verifyAllPointers(workspaceRoot: string, fingerprints: F
23
48
  firstFailure?: FingerprintVerificationResult;
24
49
  dirtyFiles: PointerDriftItem[];
25
50
  };
51
+ /**
52
+ * Verifies pointer files at fulfillment/pre-flight time for mutation tasks
53
+ * (`implementation` | `test_generation`).
54
+ *
55
+ * Unlike read-only review tasks (`code_review` | `architecture_audit`), mutation tasks
56
+ * are expected to modify pointer files on disk after claiming the contract. Therefore:
57
+ * - `SECURITY_REJECTED` (workspace escape / sensitive file / symlink escape) and
58
+ * `FILE_MISSING` (deleted pointer target) remain hard failures (`valid: false`).
59
+ * - `SIZE_MISMATCH` and `CONTENT_CHANGED` are permitted; modified files are recorded in
60
+ * `dirtyFiles` for audit visibility, and every pointer's post-mutation SHA-256 is
61
+ * captured in `verifiedShaMap` so `verified_sha256` records the exact delivered state
62
+ * while `pointers` preserves the pre-mutation baseline.
63
+ */
64
+ export declare function verifyAndSnapshotMutationPointers(workspaceRoot: string, fingerprints: FileFingerprint[], artifacts?: Array<ArtifactPointer | string>): {
65
+ valid: boolean;
66
+ firstFailure?: FingerprintVerificationResult;
67
+ dirtyFiles: PointerDriftItem[];
68
+ verifiedShaMap: Record<string, string>;
69
+ noOp: boolean;
70
+ };
71
+ /**
72
+ * Verifies a COMPLETED mutation contract's on-disk files against its committed
73
+ * post-mutation `verified_sha256` snapshot (ADR-0006).
74
+ */
75
+ export declare function verifyCommittedMutationSnapshot(workspaceRoot: string, verifiedShaMap: Record<string, string>): {
76
+ valid: boolean;
77
+ firstFailure?: FingerprintVerificationResult;
78
+ dirtyFiles: PointerDriftItem[];
79
+ };
26
80
  export declare function verifySingleRun(workspaceRoot: string, fingerprints: FileFingerprint[]): FingerprintVerificationResult;
27
81
  /**
28
- * Verifies all file fingerprints. If a content/size mismatch is detected on the first read,
29
- * waits `retryDelayMs` (default 150ms) and re-checks once to rule out transient IDE buffer flushes.
82
+ * Verifies all file fingerprints asynchronously (FC-203).
83
+ * If a content/size/existence mismatch is detected on the first read,
84
+ * yields to the event loop for `retryDelayMs` (default 150ms) without blocking
85
+ * timers or I/O, then re-checks once to rule out transient IDE buffer flushes.
30
86
  */
31
- export declare function verifyFingerprintsWithRetry(workspaceRoot: string, fingerprints: FileFingerprint[], retryDelayMs?: number): FingerprintVerificationResult;
87
+ export declare function verifyFingerprintsWithRetry(workspaceRoot: string, fingerprints: FileFingerprint[], retryDelayMs?: number): Promise<FingerprintVerificationResult>;
@@ -1,6 +1,8 @@
1
1
  import crypto from 'node:crypto';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
+ import { MAX_GIT_PATCH_BYTES } from './schemas.js';
5
+ export { MAX_GIT_PATCH_BYTES };
4
6
  const SENSITIVE_PATTERNS = [
5
7
  /(^|[\\/])\.env(\..+)?$/i,
6
8
  /\.(pem|key|p12|pfx)$/i,
@@ -59,6 +61,267 @@ export function assertSafePointerPath(workspaceRoot, rawPath) {
59
61
  export function computeFullFileSha256(buffer) {
60
62
  return crypto.createHash('sha256').update(buffer).digest('hex');
61
63
  }
64
+ /**
65
+ * Sensitive file patterns enforced on diff headers (`diff --git`, `---`, `+++`).
66
+ * Uses exact sensitive basenames and key/cert extensions rather than broad `secret` / `credentials`
67
+ * substring matches so legitimate source files (e.g. `src/secretManager.ts`, `docs/credentials-guide.md`)
68
+ * are not falsely blocked. Note: this checks diff header target paths, not patch body content.
69
+ */
70
+ const PATCH_HEADER_SENSITIVE_PATTERNS = [
71
+ /(^|[\\/])\.env(\..+)?$/i,
72
+ /\.(pem|key|p12|pfx)$/i,
73
+ /(^|[\\/])id_(rsa|dsa|ecdsa|ed25519)(\.pub)?$/i,
74
+ /(^|[\\/])(credentials|secrets?)(\.(json|ya?ml|toml|ini|conf|env|txt))?$/i,
75
+ /(^|[\\/])\.(npmrc|pypirc|netrc)$/i,
76
+ /(^|[\\/])\.git[\\/]config$/i,
77
+ ];
78
+ function unquoteGitPath(raw) {
79
+ const trimmed = raw.trim();
80
+ if (trimmed.startsWith('"') && trimmed.endsWith('"') && trimmed.length >= 2) {
81
+ const inner = trimmed.slice(1, -1);
82
+ const bytes = [];
83
+ for (let i = 0; i < inner.length; i++) {
84
+ if (inner[i] === '\\' && i + 1 < inner.length) {
85
+ const next = inner[i + 1];
86
+ if (next >= '0' && next <= '7') {
87
+ const octal = inner.slice(i + 1, i + 4).match(/^[0-7]{1,3}/)?.[0] ?? next;
88
+ bytes.push(parseInt(octal, 8));
89
+ i += octal.length;
90
+ continue;
91
+ }
92
+ i += 1;
93
+ if (next === 'n')
94
+ bytes.push(0x0a);
95
+ else if (next === 'r')
96
+ bytes.push(0x0d);
97
+ else if (next === 't')
98
+ bytes.push(0x09);
99
+ else if (next === '\\')
100
+ bytes.push(0x5c);
101
+ else if (next === '"')
102
+ bytes.push(0x22);
103
+ else
104
+ bytes.push(...Buffer.from(next, 'utf8'));
105
+ }
106
+ else {
107
+ bytes.push(...Buffer.from(inner[i], 'utf8'));
108
+ }
109
+ }
110
+ return Buffer.from(bytes).toString('utf8');
111
+ }
112
+ return trimmed;
113
+ }
114
+ function parseDiffGitHeaderPaths(rest) {
115
+ const tokens = [];
116
+ const trimmed = rest.trim();
117
+ if (!trimmed)
118
+ return tokens;
119
+ // Handle C-quoted paths: diff --git "a/my file.ts" "b/my file.ts"
120
+ if (trimmed.includes('"')) {
121
+ const re = /"((?:[^"\\]|\\.)*)"|(\S+)/g;
122
+ let m;
123
+ while ((m = re.exec(trimmed)) !== null) {
124
+ tokens.push(unquoteGitPath(m[0]));
125
+ }
126
+ return tokens;
127
+ }
128
+ // Handle unquoted paths with or without spaces: diff --git a/my file.ts b/my file.ts
129
+ const bSplitIdx = trimmed.indexOf(' b/');
130
+ if (bSplitIdx > 0 && trimmed.startsWith('a/')) {
131
+ tokens.push(trimmed.slice(0, bSplitIdx).trim());
132
+ tokens.push(trimmed.slice(bSplitIdx + 1).trim());
133
+ return tokens;
134
+ }
135
+ return trimmed.split(/\s+/);
136
+ }
137
+ function normalizeRelPointerPath(rawPath) {
138
+ return rawPath
139
+ .trim()
140
+ .replace(/\\/g, '/')
141
+ .replace(/^(\.\/)+/, '');
142
+ }
143
+ function assertSafePatchRelPath(rawPath) {
144
+ const cleaned = unquoteGitPath(rawPath).replace(/\\/g, '/');
145
+ if (!cleaned || cleaned === '/dev/null' || cleaned === 'dev/null') {
146
+ return '';
147
+ }
148
+ const stripped = cleaned.replace(/^[ab]\//, '').replace(/^(\.\/)+/, '');
149
+ if (!stripped || stripped === '/dev/null') {
150
+ return '';
151
+ }
152
+ if (stripped.startsWith('/') ||
153
+ /^[A-Za-z]:/.test(stripped) ||
154
+ /(^|\/)\.\.(\/|$)/.test(stripped)) {
155
+ throw new SecurityPolicyError(`Git patch rejected: diff header path "${rawPath}" escapes workspace boundary.`);
156
+ }
157
+ for (const pattern of PATCH_HEADER_SENSITIVE_PATTERNS) {
158
+ if (pattern.test(stripped) || pattern.test(path.basename(stripped))) {
159
+ throw new SecurityPolicyError(`Git patch rejected by security blacklist: diff header "${rawPath}" matches sensitive file pattern.`);
160
+ }
161
+ }
162
+ return stripped;
163
+ }
164
+ /**
165
+ * Statefully walks a unified diff and groups its lines into per-file blocks.
166
+ *
167
+ * Statefulness is load-bearing: a hunk body line can itself begin with `--- ` / `+++ `
168
+ * (a removed line whose content starts with `--`, or an added line starting with `++`).
169
+ * Only outside an open hunk is a `--- ` / `+++ ` line treated as a file header, so payload
170
+ * lines can no longer be mis-parsed as headers or injected as bogus touched paths.
171
+ *
172
+ * Hunk extents are tracked from the `@@ -l,s +l,s @@` counts rather than guessed, which is
173
+ * what makes the "no hunk / no changed content" gate below reliable.
174
+ */
175
+ function parseGitPatchBlocks(gitPatch) {
176
+ const blocks = [];
177
+ const touched = new Set();
178
+ let hasDiffHeader = false;
179
+ let current = null;
180
+ let oldRemaining = 0;
181
+ let newRemaining = 0;
182
+ let inHunk = false;
183
+ for (const line of gitPatch.split(/\r?\n/)) {
184
+ if (line.startsWith('diff --git ')) {
185
+ hasDiffHeader = true;
186
+ inHunk = false;
187
+ oldRemaining = 0;
188
+ newRemaining = 0;
189
+ const block = { paths: [], hunks: 0, changedLines: 0 };
190
+ blocks.push(block);
191
+ current = block;
192
+ for (const part of parseDiffGitHeaderPaths(line.slice('diff --git '.length).trim())) {
193
+ const safe = assertSafePatchRelPath(part);
194
+ if (safe) {
195
+ block.paths.push(safe);
196
+ touched.add(safe);
197
+ }
198
+ }
199
+ continue;
200
+ }
201
+ if (inHunk) {
202
+ if (line.startsWith('\\'))
203
+ continue; // ""
204
+ if (line.startsWith('+')) {
205
+ if (newRemaining > 0)
206
+ newRemaining -= 1;
207
+ if (current)
208
+ current.changedLines += 1;
209
+ }
210
+ else if (line.startsWith('-')) {
211
+ if (oldRemaining > 0)
212
+ oldRemaining -= 1;
213
+ if (current)
214
+ current.changedLines += 1;
215
+ }
216
+ else {
217
+ if (oldRemaining > 0)
218
+ oldRemaining -= 1;
219
+ if (newRemaining > 0)
220
+ newRemaining -= 1;
221
+ }
222
+ if (oldRemaining <= 0 && newRemaining <= 0)
223
+ inHunk = false;
224
+ continue;
225
+ }
226
+ if (line.startsWith('@@')) {
227
+ const match = /^@@+ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(line);
228
+ if (!match) {
229
+ throw new Error(`MALFORMED_HUNK_HEADER: cannot parse hunk extent from "${line.slice(0, 60)}" (FC-202).`);
230
+ }
231
+ hasDiffHeader = true;
232
+ if (current === null) {
233
+ current = { paths: [], hunks: 0, changedLines: 0 };
234
+ blocks.push(current);
235
+ }
236
+ oldRemaining = match[2] === undefined ? 1 : Number(match[2]);
237
+ newRemaining = match[4] === undefined ? 1 : Number(match[4]);
238
+ current.hunks += 1;
239
+ inHunk = oldRemaining > 0 || newRemaining > 0;
240
+ continue;
241
+ }
242
+ if (line.startsWith('--- ') || line.startsWith('+++ ')) {
243
+ hasDiffHeader = true;
244
+ // A fresh `--- ` after a completed file block starts a new block (diff without `diff --git`)
245
+ if (current === null || (line.startsWith('--- ') && current.hunks > 0)) {
246
+ current = { paths: [], hunks: 0, changedLines: 0 };
247
+ blocks.push(current);
248
+ }
249
+ const afterPrefix = line.slice(4).trim();
250
+ const rawTarget = afterPrefix.startsWith('"')
251
+ ? (afterPrefix.match(/^"((?:[^"\\]|\\.)*)"/)?.[0] ?? afterPrefix.split('\t')[0].trim())
252
+ : afterPrefix.split('\t')[0].trim();
253
+ const safe = assertSafePatchRelPath(rawTarget);
254
+ if (safe) {
255
+ current.paths.push(safe);
256
+ touched.add(safe);
257
+ }
258
+ continue;
259
+ }
260
+ }
261
+ return { blocks, touched, hasDiffHeader };
262
+ }
263
+ /**
264
+ * Validates an optional unified git diff patch payload (FC-202):
265
+ * - Non-empty UTF-8 string without binary null bytes
266
+ * - Bounded to MAX_GIT_PATCH_BYTES (512KB)
267
+ * - Scans diff header paths (diff --git / --- / +++) against workspace escape and sensitive file blacklists
268
+ * - Requires at least one valid unified diff header (`NOT_A_UNIFIED_DIFF` if prose/empty)
269
+ * - Requires every declared file block to carry at least one `@@` hunk (`EMPTY_PATCH_HUNKS`)
270
+ * and at least one `+` / `-` changed content line (`EMPTY_PATCH_CONTENT`), so a header-only
271
+ * patch can never stand in for a reviewable diff
272
+ * - When `requiredPointers` is provided, requires `touchedPaths` to cover every pointer path (`PATCH_DOES_NOT_COVER_POINTERS`)
273
+ * - Computes deterministic SHA-256 hex digest of the patch content
274
+ *
275
+ * Known limitation: mode-only changes (`old mode` / `new mode` with no hunk) and text-encoded
276
+ * binary diffs (`GIT binary patch`) carry no `@@` hunk and are therefore rejected. Self-contained
277
+ * review is a text-diff feature; use a normal on-disk contract for those cases.
278
+ */
279
+ export function assertSafeGitPatch(gitPatch, requiredPointers) {
280
+ if (typeof gitPatch !== 'string' || gitPatch.trim().length === 0) {
281
+ throw new Error('git_patch must be a non-empty string when provided (FC-202).');
282
+ }
283
+ if (gitPatch.includes('\0')) {
284
+ throw new SecurityPolicyError('Git patch rejected: payload contains binary null bytes.');
285
+ }
286
+ const buf = Buffer.from(gitPatch, 'utf8');
287
+ if (buf.byteLength > MAX_GIT_PATCH_BYTES) {
288
+ throw new Error(`git_patch size (${buf.byteLength} bytes) exceeds maximum allowed limit of ${MAX_GIT_PATCH_BYTES} bytes (512KB) (FC-202).`);
289
+ }
290
+ const { blocks, touched, hasDiffHeader } = parseGitPatchBlocks(gitPatch);
291
+ if (!hasDiffHeader || touched.size === 0) {
292
+ throw new Error('NOT_A_UNIFIED_DIFF: git_patch must be a valid unified diff containing at least one file diff header (diff --git / --- / +++) (FC-202).');
293
+ }
294
+ // R1: a header-only patch names files without carrying any diff content. Reject it so
295
+ // `SELF_CONTAINED` can never be unlocked by a patch the reviewer cannot actually read.
296
+ const headerOnly = Array.from(new Set(blocks.filter((b) => b.paths.length > 0 && b.hunks === 0).flatMap((b) => b.paths)));
297
+ if (headerOnly.length > 0) {
298
+ throw new Error(`EMPTY_PATCH_HUNKS: git_patch file block(s) [${headerOnly.join(', ')}] declare a diff header but carry no "@@ ... @@" hunk; a header-only patch is not reviewable (FC-202).`);
299
+ }
300
+ const contentless = Array.from(new Set(blocks
301
+ .filter((b) => b.paths.length > 0 && b.hunks > 0 && b.changedLines === 0)
302
+ .flatMap((b) => b.paths)));
303
+ if (contentless.length > 0) {
304
+ throw new Error(`EMPTY_PATCH_CONTENT: git_patch file block(s) [${contentless.join(', ')}] contain hunk headers but no "+" / "-" changed content line; a context-only hunk carries no reviewable change (FC-202).`);
305
+ }
306
+ if (requiredPointers && requiredPointers.length > 0) {
307
+ const missingPointers = [];
308
+ for (const ptr of requiredPointers) {
309
+ const rawPtr = typeof ptr === 'string' ? ptr : ptr.path;
310
+ const normPtr = normalizeRelPointerPath(rawPtr);
311
+ if (normPtr && !touched.has(normPtr)) {
312
+ missingPointers.push(normPtr);
313
+ }
314
+ }
315
+ if (missingPointers.length > 0) {
316
+ throw new Error(`PATCH_DOES_NOT_COVER_POINTERS: git_patch touched [${Array.from(touched).join(', ')}] does not cover pointer file(s) [${missingPointers.join(', ')}] (FC-202).`);
317
+ }
318
+ }
319
+ return {
320
+ sha256: computeFullFileSha256(buf),
321
+ byteLength: buf.byteLength,
322
+ touchedPaths: Array.from(touched),
323
+ };
324
+ }
62
325
  function extractFirstAndLastLine(content, maxLen = 48) {
63
326
  const lines = content.split(/\r?\n/);
64
327
  const nonEmpty = lines.filter((l) => l.trim().length > 0);
@@ -139,6 +402,172 @@ export function verifyAllPointers(workspaceRoot, fingerprints) {
139
402
  }
140
403
  return { valid: true, dirtyFiles: [] };
141
404
  }
405
+ /**
406
+ * Verifies pointer files at fulfillment/pre-flight time for mutation tasks
407
+ * (`implementation` | `test_generation`).
408
+ *
409
+ * Unlike read-only review tasks (`code_review` | `architecture_audit`), mutation tasks
410
+ * are expected to modify pointer files on disk after claiming the contract. Therefore:
411
+ * - `SECURITY_REJECTED` (workspace escape / sensitive file / symlink escape) and
412
+ * `FILE_MISSING` (deleted pointer target) remain hard failures (`valid: false`).
413
+ * - `SIZE_MISMATCH` and `CONTENT_CHANGED` are permitted; modified files are recorded in
414
+ * `dirtyFiles` for audit visibility, and every pointer's post-mutation SHA-256 is
415
+ * captured in `verifiedShaMap` so `verified_sha256` records the exact delivered state
416
+ * while `pointers` preserves the pre-mutation baseline.
417
+ */
418
+ export function verifyAndSnapshotMutationPointers(workspaceRoot, fingerprints, artifacts) {
419
+ const dirtyFiles = [];
420
+ const blockingFailures = [];
421
+ const verifiedShaMap = {};
422
+ let addedArtifactCount = 0;
423
+ for (const fp of fingerprints) {
424
+ let absPath;
425
+ try {
426
+ absPath = assertSafePointerPath(workspaceRoot, fp.path);
427
+ }
428
+ catch (err) {
429
+ const item = {
430
+ path: fp.path,
431
+ reason: 'SECURITY_REJECTED',
432
+ detail: err instanceof Error ? err.message : String(err),
433
+ };
434
+ dirtyFiles.push(item);
435
+ blockingFailures.push(item);
436
+ continue;
437
+ }
438
+ if (!fs.existsSync(absPath) || !fs.statSync(absPath).isFile()) {
439
+ const item = {
440
+ path: fp.path,
441
+ reason: 'FILE_MISSING',
442
+ detail: `File missing on worker disk: "${fp.path}"`,
443
+ };
444
+ dirtyFiles.push(item);
445
+ blockingFailures.push(item);
446
+ continue;
447
+ }
448
+ const stat = fs.statSync(absPath);
449
+ const buffer = fs.readFileSync(absPath);
450
+ const currentSha256 = computeFullFileSha256(buffer);
451
+ verifiedShaMap[fp.path] = currentSha256;
452
+ if (stat.size !== fp.size) {
453
+ dirtyFiles.push({
454
+ path: fp.path,
455
+ reason: 'SIZE_MISMATCH',
456
+ detail: `File size changed for "${fp.path}": baseline ${fp.size} bytes -> post-mutation ${stat.size} bytes`,
457
+ });
458
+ }
459
+ else if (currentSha256 !== fp.sha256) {
460
+ dirtyFiles.push({
461
+ path: fp.path,
462
+ reason: 'CONTENT_CHANGED',
463
+ detail: `File content SHA-256 updated for "${fp.path}": baseline ${fp.sha256.slice(0, 16)}... -> post-mutation ${currentSha256.slice(0, 16)}...`,
464
+ });
465
+ }
466
+ }
467
+ if (artifacts && artifacts.length > 0) {
468
+ for (const entry of artifacts) {
469
+ const rawArtifact = typeof entry === 'string' ? entry : entry.path;
470
+ if (!rawArtifact || verifiedShaMap[rawArtifact])
471
+ continue;
472
+ let absArtifact;
473
+ try {
474
+ absArtifact = assertSafePointerPath(workspaceRoot, rawArtifact);
475
+ }
476
+ catch (err) {
477
+ const item = {
478
+ path: rawArtifact,
479
+ reason: 'SECURITY_REJECTED',
480
+ detail: err instanceof Error ? err.message : String(err),
481
+ };
482
+ dirtyFiles.push(item);
483
+ blockingFailures.push(item);
484
+ continue;
485
+ }
486
+ if (!fs.existsSync(absArtifact) || !fs.statSync(absArtifact).isFile()) {
487
+ const item = {
488
+ path: rawArtifact,
489
+ reason: 'FILE_MISSING',
490
+ detail: `Declared artifact file missing on worker disk: "${rawArtifact}"`,
491
+ };
492
+ dirtyFiles.push(item);
493
+ blockingFailures.push(item);
494
+ continue;
495
+ }
496
+ const buffer = fs.readFileSync(absArtifact);
497
+ verifiedShaMap[rawArtifact] = computeFullFileSha256(buffer);
498
+ addedArtifactCount++;
499
+ }
500
+ }
501
+ if (blockingFailures.length > 0) {
502
+ return {
503
+ valid: false,
504
+ firstFailure: {
505
+ valid: false,
506
+ reason: blockingFailures[0].reason,
507
+ detail: blockingFailures[0].detail,
508
+ },
509
+ dirtyFiles,
510
+ verifiedShaMap: {},
511
+ noOp: false,
512
+ };
513
+ }
514
+ return {
515
+ valid: true,
516
+ dirtyFiles,
517
+ verifiedShaMap,
518
+ noOp: dirtyFiles.length === 0 && addedArtifactCount === 0,
519
+ };
520
+ }
521
+ /**
522
+ * Verifies a COMPLETED mutation contract's on-disk files against its committed
523
+ * post-mutation `verified_sha256` snapshot (ADR-0006).
524
+ */
525
+ export function verifyCommittedMutationSnapshot(workspaceRoot, verifiedShaMap) {
526
+ const dirtyFiles = [];
527
+ for (const [rawPath, committedSha] of Object.entries(verifiedShaMap)) {
528
+ let absPath;
529
+ try {
530
+ absPath = assertSafePointerPath(workspaceRoot, rawPath);
531
+ }
532
+ catch (err) {
533
+ dirtyFiles.push({
534
+ path: rawPath,
535
+ reason: 'SECURITY_REJECTED',
536
+ detail: err instanceof Error ? err.message : String(err),
537
+ });
538
+ continue;
539
+ }
540
+ if (!fs.existsSync(absPath) || !fs.statSync(absPath).isFile()) {
541
+ dirtyFiles.push({
542
+ path: rawPath,
543
+ reason: 'FILE_MISSING',
544
+ detail: `Delivered file missing on disk: "${rawPath}"`,
545
+ });
546
+ continue;
547
+ }
548
+ const buffer = fs.readFileSync(absPath);
549
+ const currentSha256 = computeFullFileSha256(buffer);
550
+ if (currentSha256 !== committedSha) {
551
+ dirtyFiles.push({
552
+ path: rawPath,
553
+ reason: 'CONTENT_CHANGED',
554
+ detail: `Post-completion SHA-256 mismatch for "${rawPath}": expected committed ${committedSha.slice(0, 16)}..., got ${currentSha256.slice(0, 16)}...`,
555
+ });
556
+ }
557
+ }
558
+ if (dirtyFiles.length > 0) {
559
+ return {
560
+ valid: false,
561
+ firstFailure: {
562
+ valid: false,
563
+ reason: dirtyFiles[0].reason,
564
+ detail: dirtyFiles[0].detail,
565
+ },
566
+ dirtyFiles,
567
+ };
568
+ }
569
+ return { valid: true, dirtyFiles: [] };
570
+ }
142
571
  export function verifySingleRun(workspaceRoot, fingerprints) {
143
572
  for (const fp of fingerprints) {
144
573
  let absPath;
@@ -183,23 +612,23 @@ export function verifySingleRun(workspaceRoot, fingerprints) {
183
612
  }
184
613
  return { valid: true };
185
614
  }
186
- function sleepSync(ms) {
615
+ function sleepAsync(ms) {
187
616
  if (ms <= 0)
188
- return;
189
- const sab = new SharedArrayBuffer(4);
190
- const int32 = new Int32Array(sab);
191
- Atomics.wait(int32, 0, 0, ms);
617
+ return Promise.resolve();
618
+ return new Promise((resolve) => setTimeout(resolve, ms));
192
619
  }
193
620
  /**
194
- * Verifies all file fingerprints. If a content/size mismatch is detected on the first read,
195
- * waits `retryDelayMs` (default 150ms) and re-checks once to rule out transient IDE buffer flushes.
621
+ * Verifies all file fingerprints asynchronously (FC-203).
622
+ * If a content/size/existence mismatch is detected on the first read,
623
+ * yields to the event loop for `retryDelayMs` (default 150ms) without blocking
624
+ * timers or I/O, then re-checks once to rule out transient IDE buffer flushes.
196
625
  */
197
- export function verifyFingerprintsWithRetry(workspaceRoot, fingerprints, retryDelayMs = 150) {
626
+ export async function verifyFingerprintsWithRetry(workspaceRoot, fingerprints, retryDelayMs = 150) {
198
627
  const firstCheck = verifySingleRun(workspaceRoot, fingerprints);
199
628
  if (firstCheck.valid || firstCheck.reason === 'SECURITY_REJECTED') {
200
629
  return firstCheck;
201
630
  }
202
- sleepSync(retryDelayMs);
631
+ await sleepAsync(retryDelayMs);
203
632
  return verifySingleRun(workspaceRoot, fingerprints);
204
633
  }
205
634
  //# sourceMappingURL=fingerprint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ function loadPackageVersion() {
9
9
  try {
10
10
  const pkgPath = fileURLToPath(new URL('../package.json', import.meta.url));
11
11
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
12
- return pkg.version ?? '0.3.3';
12
+ return pkg.version ?? '0.5.0';
13
13
  }
14
14
  catch {
15
15
  return '0.3.2';
@@ -45,8 +45,11 @@ Exposed MCP Tools (8):
45
45
  fail_contract Mark CLAIMED contract as terminal FAILED with reason
46
46
  inspect_mesh_state Read-only query of contracts by status, ID, or target_agent
47
47
 
48
- For CLI command usage (dispatch/poll/fulfill/verify/release/extend/fail/inspect/worker), run:
49
- ferrycat-cli --help`);
48
+ CLI Subcommands (same binary: \`npx ferrycat <command>\`):
49
+ demo Zero-config sandbox walkthrough of the full lifecycle (no MCP setup)
50
+ init Detect installed MCP hosts and add FerryCat to their configs
51
+ dispatch | poll | verify | fulfill | release | extend | fail | inspect | worker | daemon
52
+ Run \`ferrycat-cli --help\` (after a global install) for the full CLI reference.`);
50
53
  process.exit(0);
51
54
  }
52
55
  const engine = new FerryCatEngine();
@@ -112,7 +115,7 @@ Retrieves and claims next available contract work for the current agent, transit
112
115
  - When work is claimed: { ok: true, has_task: true, status: 'CLAIMED', contract: { contract_id, requester_agent, target_agent, task_type, title, context_summary, workspace_root, pointers, contract_schema, claimed_at, exec_ttl_sec } }.
113
116
  - When queue is empty: { ok: true, has_task: false, message: 'No pending contracts for agent "<agent_id>"' }.`, PollNextTaskShape, async (args) => {
114
117
  try {
115
- const result = engine.pollNextTask(args);
118
+ const result = await engine.pollNextTask(args);
116
119
  return {
117
120
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
118
121
  };