@zelari/core 2.23.0 → 2.25.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.
@@ -0,0 +1,250 @@
1
+ import { z } from 'zod';
2
+ import { promises as fs } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { typedOk, typedErr } from '../toolTypes.js';
5
+ import { replaceFileString, snapshotIdOf } from './filesystem.js';
6
+ import { splitLinesLF } from './newlines.js';
7
+ import { emitFileEvent, fileAppliedEvent, fileRejectedEvent, reReadHint } from './fileEvents.js';
8
+ // ────────────────────────────────────────────────────────────────────────────
9
+ // WriteReject — ADR-0033 day-1 structured reject (never prose)
10
+ // ────────────────────────────────────────────────────────────────────────────
11
+ /**
12
+ * Structured reject payload for write-path failures (ADR-0033).
13
+ * Every reject carries a machine action (`next`), never an essay.
14
+ */
15
+ export const WriteRejectSchema = z.object({
16
+ ok: z.literal(false),
17
+ status: z.enum(['stale_snapshot', 'hunk_mismatch', 'parse_error', 'file_exists']),
18
+ path: z.string(),
19
+ expectedHash: z.string().optional(),
20
+ actualHash: z.string().optional(),
21
+ span: z
22
+ .object({ startLine: z.number().int(), endLine: z.number().int() })
23
+ .optional(),
24
+ minimalDiff: z.string(),
25
+ next: z.object({ action: z.literal('re-read'), path: z.string() }),
26
+ });
27
+ /**
28
+ * ADR-0033 edit protocol, pure engine:
29
+ *
30
+ * Gate 1 — snapshot anchor. `expectedSnapshotId !== sha256(current)[:16]`
31
+ * → `stale_snapshot` WITHOUT any apply attempt. The caller re-reads;
32
+ * the engine never "tries nearby".
33
+ *
34
+ * Gate 2 — exact region match via `replaceFileString`. The ONLY tolerance is
35
+ * deterministic LF/CRLF normalization: the engine may normalize bytes,
36
+ * it may never move the region (zero relocation, zero context scanning).
37
+ * 0 occurrences → `hunk_mismatch` + `minimalDiff`, no write.
38
+ */
39
+ export function applyAnchoredEdit(input) {
40
+ const actualHash = snapshotIdOf(input.content);
41
+ const next = { action: 're-read', path: input.path };
42
+ // Gate 1: file-level snapshot. No match attempt happens on a stale anchor.
43
+ if (input.expectedSnapshotId !== actualHash) {
44
+ return {
45
+ ok: false,
46
+ reject: {
47
+ ok: false,
48
+ status: 'stale_snapshot',
49
+ path: input.path,
50
+ expectedHash: input.expectedSnapshotId,
51
+ actualHash,
52
+ minimalDiff: '', // no expected-content diff is possible from a hash alone
53
+ next,
54
+ },
55
+ };
56
+ }
57
+ // Gate 2: exact match (LF/CRLF-normalized), always on the anchored region.
58
+ const { occurrences, newContent } = replaceFileString(input.content, input.oldString, input.newString, input.replaceAll);
59
+ if (occurrences === 0) {
60
+ const { minimalDiff, span } = conflictMinimalDiff(input.content, input.oldString, input.path);
61
+ return {
62
+ ok: false,
63
+ reject: {
64
+ ok: false,
65
+ status: 'hunk_mismatch',
66
+ path: input.path,
67
+ ...(span ? { span } : {}),
68
+ minimalDiff,
69
+ next,
70
+ },
71
+ };
72
+ }
73
+ return {
74
+ ok: true,
75
+ newContent,
76
+ occurrencesReplaced: occurrences,
77
+ snapshotId: snapshotIdOf(newContent),
78
+ };
79
+ }
80
+ /**
81
+ * Minimal conflict context for `hunk_mismatch`: a short unified diff around
82
+ * the best APPROXIMATE match of oldString's first distinctive line, or — when
83
+ * nothing plausible exists — the first span of the file next to the first
84
+ * lines of oldString.
85
+ *
86
+ * DIAGNOSTIC ONLY: this scan never influences the apply path, which stays
87
+ * exact (ADR-0033: zero relocation).
88
+ */
89
+ function conflictMinimalDiff(content, oldString, pathLabel) {
90
+ const fileLines = splitLinesLF(content);
91
+ const oldLines = splitLinesLF(oldString);
92
+ const needle = oldLines.find((l) => l.trim().length > 0) ?? '';
93
+ let anchor = -1;
94
+ if (needle) {
95
+ anchor = fileLines.indexOf(needle);
96
+ if (anchor === -1) {
97
+ let best = 0.5;
98
+ for (let i = 0; i < fileLines.length; i++) {
99
+ const score = lineSimilarity(fileLines[i] ?? '', needle);
100
+ if (score > best) {
101
+ best = score;
102
+ anchor = i;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ if (anchor === -1) {
108
+ // No plausible anchor: show the first span of the file vs oldString's head.
109
+ const len = Math.min(fileLines.length, Math.max(1, oldLines.length));
110
+ const body = [
111
+ ...fileLines.slice(0, len).map((l) => ` ${l}`),
112
+ ...oldLines.slice(0, len).map((l) => `+${l}`),
113
+ ];
114
+ return {
115
+ minimalDiff: [
116
+ `--- ${pathLabel}`,
117
+ `+++ ${pathLabel}`,
118
+ `@@ -1,${len} +1,${len} @@`,
119
+ ...body,
120
+ ].join('\n'),
121
+ span: { startLine: 0, endLine: len },
122
+ };
123
+ }
124
+ const CTX = 3; // ~3 context lines around the approximate conflict site
125
+ const start = Math.max(0, anchor - CTX);
126
+ const end = Math.min(fileLines.length, anchor + Math.max(1, oldLines.length) + CTX);
127
+ const body = [];
128
+ for (let i = start; i < end; i++) {
129
+ const inClaim = i >= anchor && i < anchor + oldLines.length;
130
+ body.push(`${inClaim ? '-' : ' '}${fileLines[i] ?? ''}`);
131
+ }
132
+ for (const l of oldLines)
133
+ body.push(`+${l}`); // what the edit expected to find
134
+ return {
135
+ minimalDiff: [
136
+ `--- ${pathLabel}`,
137
+ `+++ ${pathLabel}`,
138
+ `@@ -${start + 1},${end - start} +${start + 1},${end - start} @@`,
139
+ ...body,
140
+ ].join('\n'),
141
+ span: { startLine: start, endLine: end },
142
+ };
143
+ }
144
+ /** Cheap bounded similarity (capped Levenshtein) for approximate anchoring of the conflict report. */
145
+ function lineSimilarity(a, b) {
146
+ if (a === b)
147
+ return 1;
148
+ const A = a.slice(0, 240);
149
+ const B = b.slice(0, 240);
150
+ const max = Math.max(A.length, B.length);
151
+ if (max === 0)
152
+ return 1;
153
+ // Length prefilter: wildly different lengths cannot be near-duplicates.
154
+ if (Math.abs(A.length - B.length) / max > 0.6)
155
+ return 0;
156
+ let prev = new Array(B.length + 1);
157
+ let curr = new Array(B.length + 1);
158
+ for (let j = 0; j <= B.length; j++)
159
+ prev[j] = j;
160
+ for (let i = 1; i <= A.length; i++) {
161
+ curr[0] = i;
162
+ for (let j = 1; j <= B.length; j++) {
163
+ curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + (A[i - 1] === B[j - 1] ? 0 : 1));
164
+ }
165
+ const swap = prev;
166
+ prev = curr;
167
+ curr = swap;
168
+ }
169
+ return 1 - prev[B.length] / max;
170
+ }
171
+ // ────────────────────────────────────────────────────────────────────────────
172
+ // edit tool — the anchored write surface for the model
173
+ // ────────────────────────────────────────────────────────────────────────────
174
+ export const EditArgsSchema = z.object({
175
+ path: z.string().min(1),
176
+ oldString: z.string().min(1),
177
+ newString: z.string(),
178
+ /** Anchor from the last read_file of this path (sha256 of full content, 16 hex chars). */
179
+ snapshotId: z.string().length(16),
180
+ replaceAll: z.boolean().default(false),
181
+ });
182
+ export const editTool = {
183
+ name: 'edit',
184
+ description: 'Anchored edit: requires the snapshotId returned by the last read_file of this path. ' +
185
+ 'Rejects (stale_snapshot) if the file changed since; never relocates the target region. ' +
186
+ 'Matching tolerates CRLF vs LF only; the file keeps its original line endings. ' +
187
+ 'Structured rejects ride in meta.reject (WriteReject) with next: {action: "re-read"}.',
188
+ permissions: ['write'],
189
+ sideEffect: 'local',
190
+ timeoutMs: 10000,
191
+ inputSchema: EditArgsSchema,
192
+ execute: async (args, ctx) => {
193
+ try {
194
+ const absPath = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
195
+ let text;
196
+ try {
197
+ const buf = await fs.readFile(absPath, { encoding: 'utf-8', signal: ctx.signal });
198
+ text = typeof buf === 'string' ? buf : buf.toString('utf-8');
199
+ }
200
+ catch (err) {
201
+ if (err?.code === 'ENOENT') {
202
+ // Named failure (repo convention), not a raw ENOENT dump.
203
+ return typedErr(`edit: file not found: ${args.path} (FILE_NOT_FOUND).`, {
204
+ status: 'failed',
205
+ warnings: ['FILE_NOT_FOUND'],
206
+ });
207
+ }
208
+ throw err;
209
+ }
210
+ const result = applyAnchoredEdit({
211
+ content: text,
212
+ expectedSnapshotId: args.snapshotId,
213
+ oldString: args.oldString,
214
+ newString: args.newString,
215
+ replaceAll: args.replaceAll,
216
+ path: absPath,
217
+ });
218
+ if (!result.ok) {
219
+ // Brief machine-prefixed message; the full structured payload is meta.reject.
220
+ const detail = result.reject.status === 'stale_snapshot'
221
+ ? `(expected ${result.reject.expectedHash}, actual ${result.reject.actualHash})`
222
+ : '(oldString not found — no relocation attempted)';
223
+ // ADR-0033 (t75): file.rejected telemetry — reason = WriteReject.status.
224
+ await emitFileEvent(ctx.emitSessionEvent, fileRejectedEvent(absPath, result.reject.status, reReadHint(result.reject)));
225
+ return typedErr(`edit: ${result.reject.status}: ${args.path} ${detail}`, {
226
+ status: 'failed',
227
+ warnings: [result.reject.status === 'stale_snapshot' ? 'STALE_SNAPSHOT' : 'HUNK_MISMATCH'],
228
+ reject: result.reject,
229
+ });
230
+ }
231
+ await fs.writeFile(absPath, result.newContent, {
232
+ encoding: 'utf-8',
233
+ signal: ctx.signal,
234
+ });
235
+ // ADR-0033 (t75): file.applied telemetry, after the durable write succeeded.
236
+ await emitFileEvent(ctx.emitSessionEvent, fileAppliedEvent(absPath, result.snapshotId, result.newContent.length));
237
+ return typedOk({
238
+ path: absPath,
239
+ applied: true,
240
+ occurrencesReplaced: result.occurrencesReplaced,
241
+ snapshotId: result.snapshotId,
242
+ bytesWritten: result.newContent.length,
243
+ });
244
+ }
245
+ catch (err) {
246
+ return typedErr(err instanceof Error ? err.message : String(err));
247
+ }
248
+ },
249
+ };
250
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * fileEvents — ADR-0033 (t75) spine emission for the core write path.
3
+ *
4
+ * Three state-only (never model-surface) kinds with a FIXED wire contract:
5
+ * file.read data = {path, snapshotId}
6
+ * file.applied data = {path, snapshotId, bytes}
7
+ * file.rejected data = {path, reason, hint?} reason = WriteReject.status
8
+ *
9
+ * Emission rides the optional `ToolContext.emitSessionEvent` seam (same
10
+ * signature as `ExecutionContext.appendSessionEvent`): hosts without a spine
11
+ * writer omit it and tools skip telemetry entirely. Emission is best-effort —
12
+ * a spine failure (lock, closed writer) never alters the tool result.
13
+ */
14
+ import type { SessionEventInput } from '../../../session/types.js';
15
+ import type { WriteReject } from './edit.js';
16
+ /** Same shape as ExecutionContext.appendSessionEvent / VerificationEngine.emit. */
17
+ export type FileEventEmitter = (input: SessionEventInput) => Promise<unknown>;
18
+ export declare function fileReadEvent(path: string, snapshotId: string): SessionEventInput;
19
+ export declare function fileAppliedEvent(path: string, snapshotId: string, bytes: number): SessionEventInput;
20
+ export declare function fileRejectedEvent(path: string, reason: WriteReject['status'], hint?: string): SessionEventInput;
21
+ /** Deterministic re-read suggestion from a WriteReject's machine action (ADR-0033). */
22
+ export declare function reReadHint(reject: WriteReject): string;
23
+ /** Best-effort emit: spine unavailability never fails the tool call. */
24
+ export declare function emitFileEvent(emit: FileEventEmitter | undefined, input: SessionEventInput): Promise<void>;
25
+ //# sourceMappingURL=fileEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileEvents.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/fileEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,mFAAmF;AACnF,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAEjF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAEnG;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC7B,IAAI,CAAC,EAAE,MAAM,GACZ,iBAAiB,CAMnB;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEtD;AAED,wEAAwE;AACxE,wBAAsB,aAAa,CACjC,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAClC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * fileEvents — ADR-0033 (t75) spine emission for the core write path.
3
+ *
4
+ * Three state-only (never model-surface) kinds with a FIXED wire contract:
5
+ * file.read data = {path, snapshotId}
6
+ * file.applied data = {path, snapshotId, bytes}
7
+ * file.rejected data = {path, reason, hint?} reason = WriteReject.status
8
+ *
9
+ * Emission rides the optional `ToolContext.emitSessionEvent` seam (same
10
+ * signature as `ExecutionContext.appendSessionEvent`): hosts without a spine
11
+ * writer omit it and tools skip telemetry entirely. Emission is best-effort —
12
+ * a spine failure (lock, closed writer) never alters the tool result.
13
+ */
14
+ export function fileReadEvent(path, snapshotId) {
15
+ return { kind: 'file.read', actor: { type: 'tool' }, data: { path, snapshotId } };
16
+ }
17
+ export function fileAppliedEvent(path, snapshotId, bytes) {
18
+ return { kind: 'file.applied', actor: { type: 'tool' }, data: { path, snapshotId, bytes } };
19
+ }
20
+ export function fileRejectedEvent(path, reason, hint) {
21
+ return {
22
+ kind: 'file.rejected',
23
+ actor: { type: 'tool' },
24
+ data: hint === undefined ? { path, reason } : { path, reason, hint },
25
+ };
26
+ }
27
+ /** Deterministic re-read suggestion from a WriteReject's machine action (ADR-0033). */
28
+ export function reReadHint(reject) {
29
+ return `re-read ${reject.next.path}, then retry with the fresh snapshotId`;
30
+ }
31
+ /** Best-effort emit: spine unavailability never fails the tool call. */
32
+ export async function emitFileEvent(emit, input) {
33
+ if (!emit)
34
+ return;
35
+ try {
36
+ await emit(input);
37
+ }
38
+ catch {
39
+ // telemetry only — swallow and let the tool result speak
40
+ }
41
+ }
42
+ //# sourceMappingURL=fileEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileEvents.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/fileEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAAkB;IAC5D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,UAAkB,EAAE,KAAa;IAC9E,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,MAA6B,EAC7B,IAAa;IAEb,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACvB,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,OAAO,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,wCAAwC,CAAC;AAC7E,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAkC,EAClC,KAAwB;IAExB,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;AACH,CAAC"}
@@ -1,5 +1,11 @@
1
1
  import { z } from 'zod';
2
2
  import { type ToolDefinition } from '../toolTypes.js';
3
+ /**
4
+ * ADR-0033 snapshot anchor: sha256 of the FULL (pre-truncation) content,
5
+ * hex, first 16 chars. Deterministic: same content → same id. `read_file`
6
+ * returns it; `edit` requires it back (optimistic lock between tentacles).
7
+ */
8
+ export declare function snapshotIdOf(content: string): string;
3
9
  declare const ReadFileArgsSchema: z.ZodObject<{
4
10
  path: z.ZodString;
5
11
  startLine: z.ZodOptional<z.ZodNumber>;
@@ -16,12 +22,15 @@ interface ReadFileResult {
16
22
  end: number;
17
23
  };
18
24
  sizeBytes: number;
25
+ /** ADR-0033 anchor: sha256 of the full (pre-truncation) content, 16 hex chars. */
26
+ snapshotId: string;
19
27
  }
20
28
  export declare const readFileTool: ToolDefinition<ReadFileArgs, ReadFileResult>;
21
29
  declare const WriteFileArgsSchema: z.ZodObject<{
22
30
  path: z.ZodString;
23
31
  content: z.ZodString;
24
32
  createDirs: z.ZodDefault<z.ZodBoolean>;
33
+ overwrite: z.ZodOptional<z.ZodBoolean>;
25
34
  }, z.core.$strip>;
26
35
  type WriteFileArgs = z.infer<typeof WriteFileArgsSchema>;
27
36
  interface WriteFileResult {
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGzE,QAAA,MAAM,kBAAkB;;;;;iBAetB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEvD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CA4DrE,CAAC;AAEF,QAAA,MAAM,mBAAmB;;;;iBAIvB,CAAC;AAEH,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEzD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,aAAa,EAAE,eAAe,CAmBxE,CAAC;AAEF,QAAA,MAAM,kBAAkB;;;;;iBAKtB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEvD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAO7C;AAqBD,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAgCrE,CAAC"}
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIzE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,QAAA,MAAM,kBAAkB;;;;;iBAetB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEvD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAoErE,CAAC;AAEF,QAAA,MAAM,mBAAmB;;;;;iBAWvB,CAAC;AAEH,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEzD,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAqBD,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,aAAa,EAAE,eAAe,CAkDxE,CAAC;AAEF,QAAA,MAAM,kBAAkB;;;;;iBAKtB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEvD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAO7C;AAqBD,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAgCrE,CAAC"}
@@ -1,8 +1,18 @@
1
1
  import { z } from 'zod';
2
+ import { createHash } from 'node:crypto';
2
3
  import { promises as fs } from 'node:fs';
3
4
  import path from 'node:path';
4
5
  import { typedOk, typedErr } from '../toolTypes.js';
5
- import { detectNewline, fromLF, toLF } from './newlines.js';
6
+ import { detectNewline, fromLF, splitLinesLF, toLF } from './newlines.js';
7
+ import { emitFileEvent, fileReadEvent } from './fileEvents.js';
8
+ /**
9
+ * ADR-0033 snapshot anchor: sha256 of the FULL (pre-truncation) content,
10
+ * hex, first 16 chars. Deterministic: same content → same id. `read_file`
11
+ * returns it; `edit` requires it back (optimistic lock between tentacles).
12
+ */
13
+ export function snapshotIdOf(content) {
14
+ return createHash('sha256').update(content, 'utf8').digest('hex').slice(0, 16);
15
+ }
6
16
  const ReadFileArgsSchema = z.object({
7
17
  path: z.string().min(1),
8
18
  startLine: z
@@ -23,7 +33,9 @@ export const readFileTool = {
23
33
  name: 'read_file',
24
34
  description: 'Read a file with optional 0-based line range (endLine exclusive). ' +
25
35
  'maxBytes caps the selected range, not a prefix of the file. ' +
26
- 'Returns content + metadata. Use before edit_file.',
36
+ 'Returns content + snapshotId (sha256 of the FULL content, first 16 hex chars): ' +
37
+ 'pass this anchor to the `edit` tool — it rejects with stale_snapshot if the file ' +
38
+ 'changed since this read. Use before edit.',
27
39
  permissions: ['read'],
28
40
  sideEffect: 'none',
29
41
  timeoutMs: 5000,
@@ -33,6 +45,10 @@ export const readFileTool = {
33
45
  const absPath = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
34
46
  const buf = await fs.readFile(absPath, { encoding: 'utf-8', signal: ctx.signal });
35
47
  const content = typeof buf === 'string' ? buf : buf.toString('utf-8');
48
+ // Anchor is computed on the INTEGR file, before any line-range/maxBytes cut.
49
+ const snapshotId = snapshotIdOf(content);
50
+ // ADR-0033 (t75): file.read telemetry — the read that produced this anchor.
51
+ await emitFileEvent(ctx.emitSessionEvent, fileReadEvent(absPath, snapshotId));
36
52
  const allLines = content.split('\n');
37
53
  const totalLines = allLines.length;
38
54
  const start = args.startLine ?? 0;
@@ -61,9 +77,11 @@ export const readFileTool = {
61
77
  totalLines,
62
78
  readLines: { start, end: readEnd },
63
79
  sizeBytes: content.length,
80
+ snapshotId,
64
81
  }, {
65
82
  status,
66
83
  counts: { bytes: content.length, lines: totalLines },
84
+ snapshotId,
67
85
  ...(warnings.length > 0 ? { warnings } : {}),
68
86
  ...(wasTruncated ? { truncated: true } : {}),
69
87
  });
@@ -82,10 +100,38 @@ const WriteFileArgsSchema = z.object({
82
100
  path: z.string().min(1),
83
101
  content: z.string(),
84
102
  createDirs: z.boolean().default(false),
103
+ /**
104
+ * ADR-0033 file_exists guard. Absent/false: an existing target is NEVER
105
+ * clobbered — the tool rejects with a structured `file_exists` WriteReject
106
+ * and writes nothing. Explicit `true` restores the legacy overwrite,
107
+ * on purpose and on record.
108
+ */
109
+ overwrite: z.boolean().optional(),
85
110
  });
111
+ /**
112
+ * ADR-0033 `file_exists` diagnostic: head of the on-disk content (`-`) vs
113
+ * head of the incoming content (`+`), unified-like, bounded (~10 existing
114
+ * lines, body capped at ~40). Diagnostic only — no write happened.
115
+ */
116
+ function fileExistsMinimalDiff(existing, incoming, pathLabel) {
117
+ const EXISTING_HEAD_LINES = 10;
118
+ const MAX_BODY_LINES = 40;
119
+ const oldHead = splitLinesLF(existing).slice(0, EXISTING_HEAD_LINES);
120
+ const newHead = splitLinesLF(incoming).slice(0, MAX_BODY_LINES - oldHead.length);
121
+ return [
122
+ `--- ${pathLabel}`,
123
+ `+++ ${pathLabel}`,
124
+ `@@ -1,${oldHead.length} +1,${newHead.length} @@`,
125
+ ...oldHead.map((l) => `-${l}`),
126
+ ...newHead.map((l) => `+${l}`),
127
+ ].join('\n');
128
+ }
86
129
  export const writeFileTool = {
87
130
  name: 'write_file',
88
- description: 'Write or create a file. Use createDirs=true to auto-create parent directories.',
131
+ description: 'Write or create a file. Use createDirs=true to auto-create parent directories. ' +
132
+ 'If the target already exists and overwrite is not true, rejects with a structured ' +
133
+ 'file_exists WriteReject (meta.reject) and writes nothing — read it first with read_file, ' +
134
+ 'then use edit with its snapshotId, or pass overwrite: true to replace it.',
89
135
  permissions: ['write'],
90
136
  sideEffect: 'local',
91
137
  timeoutMs: 10000,
@@ -93,6 +139,32 @@ export const writeFileTool = {
93
139
  execute: async (args, ctx) => {
94
140
  try {
95
141
  const absPath = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
142
+ if (!args.overwrite) {
143
+ // ADR-0033: write_file creates, it never silently clobbers.
144
+ let existing = null;
145
+ try {
146
+ const buf = await fs.readFile(absPath, { encoding: 'utf-8', signal: ctx.signal });
147
+ existing = typeof buf === 'string' ? buf : buf.toString('utf-8');
148
+ }
149
+ catch (err) {
150
+ if (err?.code !== 'ENOENT')
151
+ throw err;
152
+ }
153
+ if (existing !== null) {
154
+ return typedErr(`write_file: ${args.path} already exists (FILE_EXISTS). ` +
155
+ 'Read it with read_file and use edit with its snapshotId, or pass overwrite: true.', {
156
+ status: 'failed',
157
+ warnings: ['FILE_EXISTS'],
158
+ reject: {
159
+ ok: false,
160
+ status: 'file_exists',
161
+ path: absPath,
162
+ minimalDiff: fileExistsMinimalDiff(existing, args.content, absPath),
163
+ next: { action: 're-read', path: absPath },
164
+ },
165
+ });
166
+ }
167
+ }
96
168
  if (args.createDirs) {
97
169
  await fs.mkdir(path.dirname(absPath), { recursive: true });
98
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAuB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,WAAW,EAAE;SACb,QAAQ,EAAE;SACV,QAAQ,CAAC,mFAAmF,CAAC;IAChG,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,kFAAkF,CAAC;IAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;CACzE,CAAC,CAAC;AAYH,MAAM,CAAC,MAAM,YAAY,GAAiD;IACxE,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,oEAAoE;QACpE,8DAA8D;QAC9D,mDAAmD;IACrD,WAAW,EAAE,CAAC,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC3F,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE,UAAU,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;YACnC,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,UAAU,IAAI,YAAY,IAAI,KAAK,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACvE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;YACjD,IAAI,YAAY;gBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACtE,MAAM,OAAO,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC;YACzF,6EAA6E;YAC7E,MAAM,MAAM,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;YACrF,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,IAAI,KAAK;gBAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAClD,IAAI,YAAY;gBAAE,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACvD,OAAO,OAAO,CACZ;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI;gBACb,UAAU;gBACV,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE;gBAClC,SAAS,EAAE,OAAO,CAAC,MAAM;aAC1B,EACD;gBACE,MAAM;gBACN,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE;gBACpD,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAA6B,EAAE,IAAI,CAAC;YAClD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,4DAA4D;gBAC5D,OAAO,QAAQ,CACb,8BAA8B,IAAI,CAAC,IAAI,oBAAoB,EAC3D,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,CACnD,CAAC;YACJ,CAAC;YACD,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,aAAa,GAAmD;IAC3E,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,gFAAgF;IAC7F,WAAW,EAAE,CAAC,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO;IACnB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,mBAAmB;IAChC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC9F,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AASH;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,SAAiB,EACjB,SAAiB,EACjB,UAAmB;IAEnB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;IAC9F,IAAI,UAAU,CAAC,WAAW,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IACpD,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAY,EACZ,SAAiB,EACjB,SAAiB,EACjB,UAAmB;IAEnB,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5D,OAAO;QACL,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAiD;IACxE,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,8EAA8E;QAC9E,oEAAoE;IACtE,WAAW,EAAE,CAAC,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO;IACnB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC/F,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/E,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,iBAAiB,CACnD,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,UAAU,CAChB,CAAC;YACF,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,QAAQ,CACb,wCAAwC,IAAI,CAAC,IAAI,IAAI;oBACnD,uEAAuE,CAC1E,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,CAAC,CAAC;YAC5F,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/filesystem.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { ZodSchema } from 'zod';
2
+ import type { SessionEventInput } from '../../session/types.js';
3
+ import type { WriteReject } from './builtin/edit.js';
2
4
  /**
3
5
  * Ground Truth diagnostic envelope for observe tools (2026-07 plan, Fase 0).
4
6
  *
@@ -25,6 +27,10 @@ export interface ToolResultMeta {
25
27
  };
26
28
  warnings?: string[];
27
29
  truncated?: boolean;
30
+ /** ADR-0033: sha256[:16] anchor of the full (pre-truncation) content (read tools). */
31
+ snapshotId?: string;
32
+ /** ADR-0033: structured WriteReject payload for write-path failures (edit, apply_diff). */
33
+ reject?: WriteReject;
28
34
  }
29
35
  /** Discriminated union for tool execution results. */
30
36
  export type TypedResult<T> = {
@@ -76,6 +82,14 @@ export interface ToolContext {
76
82
  audit: (entry: AuditEntry) => void;
77
83
  /** Session id (for audit grouping). */
78
84
  sessionId: string;
85
+ /**
86
+ * ADR-0033 (t75): optional spine emitter for file.* lifecycle telemetry
87
+ * (file.read / file.applied / file.rejected). Same signature as
88
+ * ExecutionContext.appendSessionEvent — hosts wire it where tool results
89
+ * already pass; hosts without a spine writer omit it and tools skip
90
+ * emission. Best-effort: emission failures never fail the tool result.
91
+ */
92
+ emitSessionEvent?: (input: SessionEventInput) => Promise<unknown>;
79
93
  }
80
94
  export interface AuditEntry {
81
95
  tool: string;
@@ -1 +1 @@
1
- {"version":3,"file":"toolTypes.d.ts","sourceRoot":"","sources":["../../../src/core/tools/toolTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolTypes.d.ts","sourceRoot":"","sources":["../../../src/core/tools/toolTypes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolTypes.js","sourceRoot":"","sources":["../../../src/core/tools/toolTypes.ts"],"names":[],"mappings":"AAmFA,oDAAoD;AACpD,MAAM,UAAU,OAAO,CAAI,KAAQ,EAAE,IAAqB;IACxD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAY,KAAa,EAAE,IAAqB;IACtE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,IAAqB;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IACvF,MAAM,KAAK,GAAa,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,EAAE,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,kBAAkB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"toolTypes.js","sourceRoot":"","sources":["../../../src/core/tools/toolTypes.ts"],"names":[],"mappings":"AAiGA,oDAAoD;AACpD,MAAM,UAAU,OAAO,CAAI,KAAQ,EAAE,IAAqB;IACxD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAY,KAAa,EAAE,IAAqB;IACtE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,IAAqB;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IACvF,MAAM,KAAK,GAAa,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,EAAE,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,kBAAkB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nodeProviders.d.ts","sourceRoot":"","sources":["../../src/runtime/nodeProviders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA4BlH,qBAAa,cAAe,YAAW,UAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,iBAAiB;IAEnD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASrC,IAAI,CAAC,GAAG,SAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAqBzC;AAED,qBAAa,iBAAkB,YAAW,aAAa;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAGlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;CAkDlF"}
1
+ {"version":3,"file":"nodeProviders.d.ts","sourceRoot":"","sources":["../../src/runtime/nodeProviders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA4BlH,qBAAa,cAAe,YAAW,UAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,iBAAiB;IAEnD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASrC,IAAI,CAAC,GAAG,SAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAqBzC;AAED,qBAAa,iBAAkB,YAAW,aAAa;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAGlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;CAwDlF"}
@@ -100,6 +100,12 @@ export class NodeShellProvider {
100
100
  windowsHide: true,
101
101
  // POSIX: own process group so the timeout can kill grandchildren too.
102
102
  detached: !isWindows,
103
+ // stdin CLOSED by construction: verification commands (typecheck/
104
+ // test/build) must never read stdin. On win32, cmd.exe quoting can
105
+ // mangle a quoted -e argument and drop node into its REPL, which
106
+ // then waits forever on an inherited pipe nobody closes — the t39
107
+ // pack hang. EOF on stdin makes any accidental REPL exit instead.
108
+ stdio: ['ignore', 'pipe', 'pipe'],
103
109
  });
104
110
  let stdout = '';
105
111
  let stderr = '';