@chances-ai/engine 28.0.0 → 29.0.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 (123) hide show
  1. package/dist/ai/adapters/ai-sdk-stream.js +15 -0
  2. package/dist/ai/adapters/ai-sdk-stream.js.map +1 -1
  3. package/dist/ai/types.d.ts +12 -0
  4. package/dist/ai/types.d.ts.map +1 -1
  5. package/dist/core/engine.d.ts +14 -0
  6. package/dist/core/engine.d.ts.map +1 -1
  7. package/dist/core/engine.js +48 -2
  8. package/dist/core/engine.js.map +1 -1
  9. package/dist/hashline/apply.d.ts +9 -0
  10. package/dist/hashline/apply.d.ts.map +1 -0
  11. package/dist/hashline/apply.js +523 -0
  12. package/dist/hashline/apply.js.map +1 -0
  13. package/dist/hashline/block.d.ts +25 -0
  14. package/dist/hashline/block.d.ts.map +1 -0
  15. package/dist/hashline/block.js +71 -0
  16. package/dist/hashline/block.js.map +1 -0
  17. package/dist/hashline/format.d.ts +106 -0
  18. package/dist/hashline/format.d.ts.map +1 -0
  19. package/dist/hashline/format.js +191 -0
  20. package/dist/hashline/format.js.map +1 -0
  21. package/dist/hashline/fs.d.ts +87 -0
  22. package/dist/hashline/fs.d.ts.map +1 -0
  23. package/dist/hashline/fs.js +123 -0
  24. package/dist/hashline/fs.js.map +1 -0
  25. package/dist/hashline/index.d.ts +27 -0
  26. package/dist/hashline/index.d.ts.map +1 -0
  27. package/dist/hashline/index.js +27 -0
  28. package/dist/hashline/index.js.map +1 -0
  29. package/dist/hashline/input.d.ts +101 -0
  30. package/dist/hashline/input.d.ts.map +1 -0
  31. package/dist/hashline/input.js +378 -0
  32. package/dist/hashline/input.js.map +1 -0
  33. package/dist/hashline/messages.d.ts +87 -0
  34. package/dist/hashline/messages.d.ts.map +1 -0
  35. package/dist/hashline/messages.js +94 -0
  36. package/dist/hashline/messages.js.map +1 -0
  37. package/dist/hashline/mismatch.d.ts +45 -0
  38. package/dist/hashline/mismatch.d.ts.map +1 -0
  39. package/dist/hashline/mismatch.js +118 -0
  40. package/dist/hashline/mismatch.js.map +1 -0
  41. package/dist/hashline/normalize.d.ts +22 -0
  42. package/dist/hashline/normalize.d.ts.map +1 -0
  43. package/dist/hashline/normalize.js +31 -0
  44. package/dist/hashline/normalize.js.map +1 -0
  45. package/dist/hashline/parser.d.ts +24 -0
  46. package/dist/hashline/parser.d.ts.map +1 -0
  47. package/dist/hashline/parser.js +295 -0
  48. package/dist/hashline/parser.js.map +1 -0
  49. package/dist/hashline/patcher.d.ts +111 -0
  50. package/dist/hashline/patcher.d.ts.map +1 -0
  51. package/dist/hashline/patcher.js +332 -0
  52. package/dist/hashline/patcher.js.map +1 -0
  53. package/dist/hashline/recovery.d.ts +41 -0
  54. package/dist/hashline/recovery.d.ts.map +1 -0
  55. package/dist/hashline/recovery.js +175 -0
  56. package/dist/hashline/recovery.js.map +1 -0
  57. package/dist/hashline/snapshots.d.ts +62 -0
  58. package/dist/hashline/snapshots.d.ts.map +1 -0
  59. package/dist/hashline/snapshots.js +127 -0
  60. package/dist/hashline/snapshots.js.map +1 -0
  61. package/dist/hashline/tokenizer.d.ts +66 -0
  62. package/dist/hashline/tokenizer.d.ts.map +1 -0
  63. package/dist/hashline/tokenizer.js +408 -0
  64. package/dist/hashline/tokenizer.js.map +1 -0
  65. package/dist/hashline/types.d.ts +117 -0
  66. package/dist/hashline/types.d.ts.map +1 -0
  67. package/dist/hashline/types.js +13 -0
  68. package/dist/hashline/types.js.map +1 -0
  69. package/dist/tools/builtins/_hashline-fs.d.ts +16 -0
  70. package/dist/tools/builtins/_hashline-fs.d.ts.map +1 -0
  71. package/dist/tools/builtins/_hashline-fs.js +62 -0
  72. package/dist/tools/builtins/_hashline-fs.js.map +1 -0
  73. package/dist/tools/builtins/_image.d.ts +26 -0
  74. package/dist/tools/builtins/_image.d.ts.map +1 -0
  75. package/dist/tools/builtins/_image.js +76 -0
  76. package/dist/tools/builtins/_image.js.map +1 -0
  77. package/dist/tools/builtins/_login-shell.d.ts +17 -0
  78. package/dist/tools/builtins/_login-shell.d.ts.map +1 -0
  79. package/dist/tools/builtins/_login-shell.js +66 -0
  80. package/dist/tools/builtins/_login-shell.js.map +1 -0
  81. package/dist/tools/builtins/_notebook.d.ts +15 -0
  82. package/dist/tools/builtins/_notebook.d.ts.map +1 -0
  83. package/dist/tools/builtins/_notebook.js +81 -0
  84. package/dist/tools/builtins/_notebook.js.map +1 -0
  85. package/dist/tools/builtins/_pdf.d.ts +19 -0
  86. package/dist/tools/builtins/_pdf.d.ts.map +1 -0
  87. package/dist/tools/builtins/_pdf.js +42 -0
  88. package/dist/tools/builtins/_pdf.js.map +1 -0
  89. package/dist/tools/builtins/_shared.d.ts +11 -0
  90. package/dist/tools/builtins/_shared.d.ts.map +1 -1
  91. package/dist/tools/builtins/_shared.js +40 -1
  92. package/dist/tools/builtins/_shared.js.map +1 -1
  93. package/dist/tools/builtins/ast-edit.d.ts +18 -0
  94. package/dist/tools/builtins/ast-edit.d.ts.map +1 -0
  95. package/dist/tools/builtins/ast-edit.js +109 -0
  96. package/dist/tools/builtins/ast-edit.js.map +1 -0
  97. package/dist/tools/builtins/ast-grep.d.ts +6 -0
  98. package/dist/tools/builtins/ast-grep.d.ts.map +1 -0
  99. package/dist/tools/builtins/ast-grep.js +67 -0
  100. package/dist/tools/builtins/ast-grep.js.map +1 -0
  101. package/dist/tools/builtins/bash.d.ts.map +1 -1
  102. package/dist/tools/builtins/bash.js +13 -2
  103. package/dist/tools/builtins/bash.js.map +1 -1
  104. package/dist/tools/builtins/edit.d.ts.map +1 -1
  105. package/dist/tools/builtins/edit.js +112 -31
  106. package/dist/tools/builtins/edit.js.map +1 -1
  107. package/dist/tools/builtins/read.d.ts.map +1 -1
  108. package/dist/tools/builtins/read.js +187 -11
  109. package/dist/tools/builtins/read.js.map +1 -1
  110. package/dist/tools/builtins.d.ts.map +1 -1
  111. package/dist/tools/builtins.js +4 -0
  112. package/dist/tools/builtins.js.map +1 -1
  113. package/dist/tools/file-lock.d.ts +8 -0
  114. package/dist/tools/file-lock.d.ts.map +1 -1
  115. package/dist/tools/file-lock.js +22 -0
  116. package/dist/tools/file-lock.js.map +1 -1
  117. package/dist/tools/index.d.ts +1 -1
  118. package/dist/tools/index.d.ts.map +1 -1
  119. package/dist/tools/index.js.map +1 -1
  120. package/dist/tools/types.d.ts +26 -0
  121. package/dist/tools/types.d.ts.map +1 -1
  122. package/dist/tools/types.js.map +1 -1
  123. package/package.json +8 -3
@@ -0,0 +1,523 @@
1
+ /**
2
+ * Apply a parsed list of {@link Edit}s to a text body and return the
3
+ * post-edit lines plus any diagnostic warnings. Pure function: no FS, no
4
+ * mutation of the input. Ported from oh-my-pi `packages/hashline/src/apply.ts`.
5
+ *
6
+ * Replacement groups are first normalized by {@link repairReplacementBoundaries},
7
+ * which absorbs common model mistakes where a payload restates unchanged range
8
+ * boundaries or duplicates/drops structural closers (the "model #1 editing
9
+ * defect" the 7.9 task calls out).
10
+ */
11
+ import { formatNearestAnchors } from "./format.js";
12
+ import { UNRESOLVED_BLOCK_INTERNAL } from "./messages.js";
13
+ import { cloneCursor } from "./tokenizer.js";
14
+ function isReplacementInsert(edit) {
15
+ return edit.kind === "insert" && edit.mode === "replacement";
16
+ }
17
+ function getCursorAnchors(cursor) {
18
+ return cursor.kind === "before_anchor" || cursor.kind === "after_anchor" ? [cursor.anchor] : [];
19
+ }
20
+ function getEditAnchors(edit) {
21
+ if (edit.kind === "delete")
22
+ return [edit.anchor];
23
+ return getCursorAnchors(edit.cursor);
24
+ }
25
+ /**
26
+ * Verify every anchored edit points at an existing line. File-version binding is
27
+ * checked once per section via the header hash before this function runs.
28
+ */
29
+ function validateLineBounds(edits, fileLines) {
30
+ for (const edit of edits) {
31
+ for (const anchor of getEditAnchors(edit)) {
32
+ if (anchor.line < 1 || anchor.line > fileLines.length) {
33
+ throw new Error(`Line ${anchor.line} does not exist (file has ${fileLines.length} lines).` +
34
+ formatNearestAnchors(fileLines, anchor.line));
35
+ }
36
+ }
37
+ }
38
+ }
39
+ function cloneAppliedEdit(edit, index) {
40
+ if (edit.kind === "delete")
41
+ return { ...edit, anchor: { ...edit.anchor }, index };
42
+ return { ...edit, cursor: cloneCursor(edit.cursor), index };
43
+ }
44
+ function insertAtStart(fileLines, lineOrigins, lines) {
45
+ if (lines.length === 0)
46
+ return;
47
+ const origins = lines.map(() => "insert");
48
+ if (fileLines.length === 1 && fileLines[0] === "") {
49
+ fileLines.splice(0, 1, ...lines);
50
+ lineOrigins.splice(0, 1, ...origins);
51
+ return;
52
+ }
53
+ fileLines.splice(0, 0, ...lines);
54
+ lineOrigins.splice(0, 0, ...origins);
55
+ }
56
+ function insertAtEnd(fileLines, lineOrigins, lines) {
57
+ if (lines.length === 0)
58
+ return undefined;
59
+ const origins = lines.map(() => "insert");
60
+ if (fileLines.length === 1 && fileLines[0] === "") {
61
+ fileLines.splice(0, 1, ...lines);
62
+ lineOrigins.splice(0, 1, ...origins);
63
+ return 1;
64
+ }
65
+ const hasTrailingNewline = fileLines.length > 0 && fileLines[fileLines.length - 1] === "";
66
+ const insertIndex = hasTrailingNewline ? fileLines.length - 1 : fileLines.length;
67
+ fileLines.splice(insertIndex, 0, ...lines);
68
+ lineOrigins.splice(insertIndex, 0, ...origins);
69
+ return insertIndex + 1;
70
+ }
71
+ function bucketAnchorEditsByLine(edits) {
72
+ const byLine = new Map();
73
+ for (const entry of edits) {
74
+ const line = entry.edit.kind === "delete"
75
+ ? entry.edit.anchor.line
76
+ : entry.edit.cursor.kind === "before_anchor" || entry.edit.cursor.kind === "after_anchor"
77
+ ? entry.edit.cursor.anchor.line
78
+ : 0;
79
+ const bucket = byLine.get(line);
80
+ if (bucket)
81
+ bucket.push(entry);
82
+ else
83
+ byLine.set(line, [entry]);
84
+ }
85
+ return byLine;
86
+ }
87
+ // ═══════════════════════════════════════════════════════════════════════════
88
+ // Replacement-boundary repair
89
+ //
90
+ // Models routinely miscount a replacement range's edges. Sometimes the payload
91
+ // re-states unchanged lines that still live on both sides of the range
92
+ // (duplicating a function header and final statement); sometimes it only
93
+ // re-states or omits a structural closer, which leaves delimiter balance broken.
94
+ //
95
+ // A balance-neutral boundary-echo repair fires only when both the leading and
96
+ // trailing payload edges are exact copies of the surviving lines outside the
97
+ // range. One-sided content echoes are left alone unless delimiter-balance repair
98
+ // proves they are duplicated structural boundaries. This preserves intended
99
+ // duplicate statements while absorbing the common "body includes the unchanged
100
+ // wrapper" mistake.
101
+ /** A line that is nothing but closing delimiters: `}`, `)`, `];`, `})`, `},`. */
102
+ const STRUCTURAL_CLOSER_RE = /^\s*[)\]}]+[;,]?\s*$/;
103
+ /**
104
+ * Net `()` / `[]` / `{}` delta across `lines`, skipping delimiters inside line
105
+ * comments (`//`), block comments, and string/template literals. Block-comment
106
+ * and backtick-template state carry across lines; `"` / `'` reset at EOL since
107
+ * they cannot span lines. Deliberately language-light: constructs it cannot
108
+ * classify (e.g. regex literals) are counted naively, which can only suppress a
109
+ * repair (the safe direction), never force one.
110
+ */
111
+ function computeDelimiterBalance(lines) {
112
+ const balance = { paren: 0, bracket: 0, brace: 0 };
113
+ let inBlockComment = false;
114
+ let quote = "";
115
+ for (const line of lines) {
116
+ for (let i = 0; i < line.length; i++) {
117
+ const ch = line[i];
118
+ if (inBlockComment) {
119
+ if (ch === "*" && line[i + 1] === "/") {
120
+ inBlockComment = false;
121
+ i++;
122
+ }
123
+ continue;
124
+ }
125
+ if (quote) {
126
+ if (ch === "\\")
127
+ i++;
128
+ else if (ch === quote)
129
+ quote = "";
130
+ continue;
131
+ }
132
+ if (ch === '"' || ch === "'" || ch === "`") {
133
+ quote = ch;
134
+ continue;
135
+ }
136
+ if (ch === "/" && line[i + 1] === "/")
137
+ break;
138
+ if (ch === "/" && line[i + 1] === "*") {
139
+ inBlockComment = true;
140
+ i++;
141
+ continue;
142
+ }
143
+ switch (ch) {
144
+ case "(":
145
+ balance.paren++;
146
+ break;
147
+ case ")":
148
+ balance.paren--;
149
+ break;
150
+ case "[":
151
+ balance.bracket++;
152
+ break;
153
+ case "]":
154
+ balance.bracket--;
155
+ break;
156
+ case "{":
157
+ balance.brace++;
158
+ break;
159
+ case "}":
160
+ balance.brace--;
161
+ break;
162
+ }
163
+ }
164
+ // `"` / `'` cannot span lines; only backtick templates and block comments do.
165
+ if (quote === '"' || quote === "'")
166
+ quote = "";
167
+ }
168
+ return balance;
169
+ }
170
+ function balanceDelta(a, b) {
171
+ return { paren: a.paren - b.paren, bracket: a.bracket - b.bracket, brace: a.brace - b.brace };
172
+ }
173
+ function balanceNegate(a) {
174
+ return { paren: -a.paren, bracket: -a.bracket, brace: -a.brace };
175
+ }
176
+ function balanceEqual(a, b) {
177
+ return a.paren === b.paren && a.bracket === b.bracket && a.brace === b.brace;
178
+ }
179
+ function balanceIsZero(a) {
180
+ return a.paren === 0 && a.bracket === 0 && a.brace === 0;
181
+ }
182
+ /**
183
+ * Detect a replacement group starting at `start`: a run of `before_anchor`
184
+ * replacement inserts sharing one source op line, immediately followed by the
185
+ * contiguous range deletes for that same op. Mirrors how the parser lowers an
186
+ * `replace N..M:` hunk with a body.
187
+ */
188
+ function findReplacementGroup(edits, start) {
189
+ const first = edits[start];
190
+ if (first?.kind !== "insert" || first.mode !== "replacement" || first.cursor.kind !== "before_anchor") {
191
+ return undefined;
192
+ }
193
+ const { lineNum } = first;
194
+ const anchorLine = first.cursor.anchor.line;
195
+ const insertIndices = [];
196
+ const payload = [];
197
+ let i = start;
198
+ for (; i < edits.length; i++) {
199
+ const edit = edits[i];
200
+ if (!edit || edit.kind !== "insert" || edit.mode !== "replacement" || edit.lineNum !== lineNum)
201
+ break;
202
+ if (edit.cursor.kind !== "before_anchor" || edit.cursor.anchor.line !== anchorLine)
203
+ break;
204
+ insertIndices.push(i);
205
+ payload.push(edit.text);
206
+ }
207
+ const deleteIndices = [];
208
+ let expectedLine = anchorLine;
209
+ for (; i < edits.length; i++) {
210
+ const edit = edits[i];
211
+ if (!edit || edit.kind !== "delete" || edit.lineNum !== lineNum || edit.anchor.line !== expectedLine)
212
+ break;
213
+ deleteIndices.push(i);
214
+ expectedLine++;
215
+ }
216
+ if (deleteIndices.length === 0)
217
+ return undefined;
218
+ return {
219
+ insertIndices,
220
+ deleteIndices,
221
+ payload,
222
+ startLine: anchorLine,
223
+ endLine: anchorLine + deleteIndices.length - 1,
224
+ };
225
+ }
226
+ /**
227
+ * Largest `k` such that the payload's last `k` lines exactly equal the `k`
228
+ * surviving file lines just below the range AND dropping them zeroes `delta`.
229
+ * Requires a non-zero `delta`: a zero-balance candidate can never account for
230
+ * the imbalance, so intentional duplicates of ordinary statements stay intact,
231
+ * while duplicated structural lines (closers like `});`, openers like `foo(`)
232
+ * are dropped when they exactly explain the imbalance.
233
+ */
234
+ function findDuplicateSuffix(group, fileLines, delta) {
235
+ if (balanceIsZero(delta))
236
+ return 0;
237
+ const { payload, endLine } = group;
238
+ const maxK = Math.min(payload.length, fileLines.length - endLine);
239
+ for (let k = maxK; k >= 1; k--) {
240
+ let matches = true;
241
+ for (let t = 0; t < k; t++) {
242
+ if (payload[payload.length - k + t] !== fileLines[endLine + t]) {
243
+ matches = false;
244
+ break;
245
+ }
246
+ }
247
+ if (!matches)
248
+ continue;
249
+ if (balanceEqual(computeDelimiterBalance(payload.slice(payload.length - k)), delta))
250
+ return k;
251
+ }
252
+ return 0;
253
+ }
254
+ /**
255
+ * Largest `j` such that the payload's first `j` lines exactly equal the `j`
256
+ * surviving file lines just above the range AND dropping them zeroes `delta`.
257
+ * Requires a non-zero `delta`; see {@link findDuplicateSuffix}.
258
+ */
259
+ function findDuplicatePrefix(group, fileLines, delta) {
260
+ if (balanceIsZero(delta))
261
+ return 0;
262
+ const { payload, startLine } = group;
263
+ const maxJ = Math.min(payload.length, startLine - 1);
264
+ for (let j = maxJ; j >= 1; j--) {
265
+ let matches = true;
266
+ for (let t = 0; t < j; t++) {
267
+ if (payload[t] !== fileLines[startLine - 1 - j + t]) {
268
+ matches = false;
269
+ break;
270
+ }
271
+ }
272
+ if (!matches)
273
+ continue;
274
+ if (balanceEqual(computeDelimiterBalance(payload.slice(0, j)), delta))
275
+ return j;
276
+ }
277
+ return 0;
278
+ }
279
+ /**
280
+ * Smallest `m` such that the range's last `m` deleted lines are all pure
281
+ * structural closers and sparing them (keeping instead of deleting) zeroes
282
+ * `delta`. The mirror mistake: a range that swallows a closing delimiter the
283
+ * payload never restates.
284
+ */
285
+ function findDroppedSuffixClosers(group, fileLines, delta) {
286
+ const wanted = balanceNegate(delta);
287
+ const maxM = group.deleteIndices.length;
288
+ for (let m = 1; m <= maxM; m++) {
289
+ if (!STRUCTURAL_CLOSER_RE.test(fileLines[group.endLine - m] ?? ""))
290
+ break;
291
+ if (balanceEqual(computeDelimiterBalance(fileLines.slice(group.endLine - m, group.endLine)), wanted))
292
+ return m;
293
+ }
294
+ return 0;
295
+ }
296
+ function hasNonWhitespace(text) {
297
+ for (let i = 0; i < text.length; i++) {
298
+ const code = text.charCodeAt(i);
299
+ if (code !== 9 && code !== 10 && code !== 11 && code !== 12 && code !== 13 && code !== 32)
300
+ return true;
301
+ }
302
+ return false;
303
+ }
304
+ function countDuplicateLeadingBoundaryLines(group, fileLines) {
305
+ const { payload, startLine } = group;
306
+ const max = Math.min(payload.length, startLine - 1);
307
+ for (let count = max; count >= 1; count--) {
308
+ let matches = true;
309
+ let hasContent = false;
310
+ for (let offset = 0; offset < count; offset++) {
311
+ const line = payload[offset];
312
+ if (line === undefined || line !== fileLines[startLine - 1 - count + offset]) {
313
+ matches = false;
314
+ break;
315
+ }
316
+ hasContent ||= hasNonWhitespace(line);
317
+ }
318
+ if (matches && hasContent)
319
+ return count;
320
+ }
321
+ return 0;
322
+ }
323
+ function countDuplicateTrailingBoundaryLines(group, fileLines) {
324
+ const { payload, endLine } = group;
325
+ const max = Math.min(payload.length, fileLines.length - endLine);
326
+ for (let count = max; count >= 1; count--) {
327
+ let matches = true;
328
+ let hasContent = false;
329
+ for (let offset = 0; offset < count; offset++) {
330
+ const line = payload[payload.length - count + offset];
331
+ if (line === undefined || line !== fileLines[endLine + offset]) {
332
+ matches = false;
333
+ break;
334
+ }
335
+ hasContent ||= hasNonWhitespace(line);
336
+ }
337
+ if (matches && hasContent)
338
+ return count;
339
+ }
340
+ return 0;
341
+ }
342
+ function findBoundaryEcho(group, fileLines) {
343
+ const leadingMax = countDuplicateLeadingBoundaryLines(group, fileLines);
344
+ if (leadingMax === 0)
345
+ return undefined;
346
+ const trailingMax = countDuplicateTrailingBoundaryLines(group, fileLines);
347
+ if (trailingMax === 0)
348
+ return undefined;
349
+ // Bail when every payload line could be claimed by a boundary echo: any
350
+ // repair would strip explicit replacement content with no signal that the
351
+ // payload was a mistake rather than an intentional duplication.
352
+ if (leadingMax + trailingMax >= group.payload.length)
353
+ return undefined;
354
+ return { leading: leadingMax, trailing: trailingMax };
355
+ }
356
+ function describeBoundaryEchoRepair(group, echo) {
357
+ return (`Auto-repaired a replacement boundary echo at line ${group.startLine}: ` +
358
+ `dropped ${echo.leading} leading and ${echo.trailing} trailing payload line(s) already present outside the range. ` +
359
+ `Issue the payload as the final desired content for the selected range only — never restate unchanged lines bordering the range.`);
360
+ }
361
+ function describeBoundaryRepair(group, action) {
362
+ return (`Auto-repaired a delimiter-balance mismatch in the replacement at line ${group.startLine}: ${action}. ` +
363
+ `Issue the payload as the final desired content only — never restate or omit a closing bracket bordering the range.`);
364
+ }
365
+ /**
366
+ * Normalize replacement groups so common off-by-one boundaries do not duplicate
367
+ * unchanged surrounding lines or structural closers. Returns the repaired edit
368
+ * list plus one warning per repaired group.
369
+ */
370
+ function repairReplacementBoundaries(edits, fileLines) {
371
+ const out = [];
372
+ const warnings = [];
373
+ let i = 0;
374
+ while (i < edits.length) {
375
+ const group = findReplacementGroup(edits, i);
376
+ if (!group) {
377
+ // `i < edits.length` guarantees presence; `!` placates noUncheckedIndexedAccess.
378
+ out.push(edits[i]);
379
+ i++;
380
+ continue;
381
+ }
382
+ // Indices originate from `findReplacementGroup`, which only records existing
383
+ // positions — the `!` is safe under noUncheckedIndexedAccess.
384
+ const inserts = group.insertIndices.map((idx) => edits[idx]);
385
+ const deletes = group.deleteIndices.map((idx) => edits[idx]);
386
+ i = group.deleteIndices[group.deleteIndices.length - 1] + 1;
387
+ const boundaryEcho = findBoundaryEcho(group, fileLines);
388
+ if (boundaryEcho) {
389
+ warnings.push(describeBoundaryEchoRepair(group, boundaryEcho));
390
+ out.push(...inserts.slice(boundaryEcho.leading, inserts.length - boundaryEcho.trailing), ...deletes);
391
+ continue;
392
+ }
393
+ const delta = balanceDelta(computeDelimiterBalance(group.payload), computeDelimiterBalance(fileLines.slice(group.startLine - 1, group.endLine)));
394
+ if (balanceIsZero(delta)) {
395
+ out.push(...inserts, ...deletes);
396
+ continue;
397
+ }
398
+ const dupSuffix = findDuplicateSuffix(group, fileLines, delta);
399
+ if (dupSuffix > 0) {
400
+ warnings.push(describeBoundaryRepair(group, `dropped ${dupSuffix} duplicated trailing payload line(s) already present below the range`));
401
+ out.push(...inserts.slice(0, inserts.length - dupSuffix), ...deletes);
402
+ continue;
403
+ }
404
+ const dupPrefix = findDuplicatePrefix(group, fileLines, delta);
405
+ if (dupPrefix > 0) {
406
+ warnings.push(describeBoundaryRepair(group, `dropped ${dupPrefix} duplicated leading payload line(s) already present above the range`));
407
+ out.push(...inserts.slice(dupPrefix), ...deletes);
408
+ continue;
409
+ }
410
+ const droppedClosers = findDroppedSuffixClosers(group, fileLines, delta);
411
+ if (droppedClosers > 0) {
412
+ warnings.push(describeBoundaryRepair(group, `kept ${droppedClosers} structural closing line(s) the range deleted without restating`));
413
+ out.push(...inserts, ...deletes.slice(0, deletes.length - droppedClosers));
414
+ continue;
415
+ }
416
+ out.push(...inserts, ...deletes);
417
+ }
418
+ return { edits: out, warnings };
419
+ }
420
+ /**
421
+ * Apply a parsed list of edits to a text body. Pure function — no I/O.
422
+ *
423
+ * Returns the post-edit text and the first changed line number (1-indexed).
424
+ * Throws if an anchor is out of bounds.
425
+ */
426
+ export function applyEdits(text, edits) {
427
+ if (edits.length === 0)
428
+ return { text, firstChangedLine: undefined };
429
+ // Block edits are deferred until `resolveBlockEdits` expands them into
430
+ // concrete inserts + deletes. Reaching the applier with one still present
431
+ // is an internal wiring bug, not authored-input error.
432
+ for (const edit of edits) {
433
+ if (edit.kind === "block")
434
+ throw new Error(UNRESOLVED_BLOCK_INTERNAL);
435
+ }
436
+ const appliedEdits = edits;
437
+ const fileLines = text.split("\n");
438
+ const lineOrigins = fileLines.map(() => "original");
439
+ let firstChangedLine;
440
+ const trackFirstChanged = (line) => {
441
+ if (firstChangedLine === undefined || line < firstChangedLine)
442
+ firstChangedLine = line;
443
+ };
444
+ const targetEdits = appliedEdits.map((edit, index) => cloneAppliedEdit(edit, index));
445
+ validateLineBounds(targetEdits, fileLines);
446
+ const { edits: repaired, warnings } = repairReplacementBoundaries(targetEdits, fileLines);
447
+ // Partition edits into bof, eof, and anchor-targeted buckets.
448
+ const bofLines = [];
449
+ const eofLines = [];
450
+ const anchorEdits = [];
451
+ repaired.forEach((edit, idx) => {
452
+ if (edit.kind === "insert" && edit.cursor.kind === "bof") {
453
+ bofLines.push(edit.text);
454
+ }
455
+ else if (edit.kind === "insert" && edit.cursor.kind === "eof") {
456
+ eofLines.push(edit.text);
457
+ }
458
+ else {
459
+ anchorEdits.push({ edit, idx });
460
+ }
461
+ });
462
+ // Apply per-line buckets bottom-up so earlier indices stay valid.
463
+ const byLine = bucketAnchorEditsByLine(anchorEdits);
464
+ for (const line of [...byLine.keys()].sort((a, b) => b - a)) {
465
+ const bucket = byLine.get(line);
466
+ if (!bucket)
467
+ continue;
468
+ bucket.sort((a, b) => a.idx - b.idx);
469
+ const idx = line - 1;
470
+ const currentLine = fileLines[idx] ?? "";
471
+ const beforeInsertLines = [];
472
+ const afterInsertLines = [];
473
+ const replacementLines = [];
474
+ let deleteLine = false;
475
+ for (const { edit } of bucket) {
476
+ if (isReplacementInsert(edit)) {
477
+ replacementLines.push(edit.text);
478
+ }
479
+ else if (edit.kind === "insert" && edit.cursor.kind === "after_anchor") {
480
+ afterInsertLines.push(edit.text);
481
+ }
482
+ else if (edit.kind === "insert") {
483
+ beforeInsertLines.push(edit.text);
484
+ }
485
+ else if (edit.kind === "delete") {
486
+ deleteLine = true;
487
+ }
488
+ }
489
+ if (beforeInsertLines.length === 0 &&
490
+ replacementLines.length === 0 &&
491
+ afterInsertLines.length === 0 &&
492
+ !deleteLine)
493
+ continue;
494
+ const replacement = deleteLine
495
+ ? [...beforeInsertLines, ...replacementLines, ...afterInsertLines]
496
+ : [...beforeInsertLines, ...replacementLines, currentLine, ...afterInsertLines];
497
+ const origins = [];
498
+ for (let i = 0; i < beforeInsertLines.length; i++)
499
+ origins.push("insert");
500
+ for (let i = 0; i < replacementLines.length; i++)
501
+ origins.push(deleteLine ? "replacement" : "insert");
502
+ if (!deleteLine)
503
+ origins.push(lineOrigins[idx] ?? "original");
504
+ for (let i = 0; i < afterInsertLines.length; i++)
505
+ origins.push("insert");
506
+ fileLines.splice(idx, 1, ...replacement);
507
+ lineOrigins.splice(idx, 1, ...origins);
508
+ trackFirstChanged(line);
509
+ }
510
+ if (bofLines.length > 0) {
511
+ insertAtStart(fileLines, lineOrigins, bofLines);
512
+ trackFirstChanged(1);
513
+ }
514
+ const eofChangedLine = insertAtEnd(fileLines, lineOrigins, eofLines);
515
+ if (eofChangedLine !== undefined)
516
+ trackFirstChanged(eofChangedLine);
517
+ return {
518
+ text: fileLines.join("\n"),
519
+ firstChangedLine,
520
+ ...(warnings.length > 0 ? { warnings } : {}),
521
+ };
522
+ }
523
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/hashline/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { BlockResolver, Edit } from "./types.js";
2
+ export interface ResolveBlockEditsOptions {
3
+ /**
4
+ * How to handle a block edit that cannot be resolved (missing resolver or a
5
+ * `null` span). `"throw"` (default) raises a `blockUnresolvedMessage` error —
6
+ * used by the authoritative apply + final preview paths. `"drop"` silently
7
+ * skips the edit — used by the streaming preview, where a half-written file
8
+ * or transient parse error must not throw.
9
+ */
10
+ onUnresolved?: "throw" | "drop";
11
+ }
12
+ /** True when at least one edit is an unresolved `replace block N:` edit. */
13
+ export declare function hasBlockEdit(edits: readonly Edit[]): boolean;
14
+ /**
15
+ * Resolve every `replace block N:` edit in `edits` against `text` (parsed as
16
+ * the language inferred from `path`). Non-block edits pass through untouched.
17
+ * Returns a fresh edit list with no `block` variants. The fast path returns the
18
+ * input unchanged when there is nothing to resolve.
19
+ *
20
+ * Synthesized inserts/deletes carry sequential `index` values for readability
21
+ * only — {@link applyEdits} re-derives every edit's index from array order, so
22
+ * the passthrough edits keeping their original indices is harmless.
23
+ */
24
+ export declare function resolveBlockEdits(edits: readonly Edit[], text: string, path: string, resolver: BlockResolver | undefined, options?: ResolveBlockEditsOptions): readonly Edit[];
25
+ //# sourceMappingURL=block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/hashline/block.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAU,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACjC;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,OAAO,CAE5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,OAAO,GAAE,wBAA6B,GACrC,SAAS,IAAI,EAAE,CAwCjB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Expand deferred `replace block N:` edits into concrete inserts + deletes.
3
+ * Ported from oh-my-pi `packages/hashline/src/block.ts`.
4
+ *
5
+ * The hashline parser cannot expand a block edit on its own — the line span is
6
+ * unknown until file text + path (→ language) are available. This transform
7
+ * runs at every apply/preview boundary that has text: it calls the injected
8
+ * {@link BlockResolver} (in chances-cli backed by `native.blockRangeAt`) to
9
+ * resolve each block's `[start, end]` span, then emits the exact same
10
+ * `before_anchor` replacement inserts + range deletes that `replace start..end:`
11
+ * produces. After it runs, no `block` edits remain, so {@link applyEdits} (and
12
+ * recovery) only ever see resolved edits.
13
+ */
14
+ import { formatNearestAnchors } from "./format.js";
15
+ import { BLOCK_RESOLVER_UNAVAILABLE, blockUnresolvedMessage } from "./messages.js";
16
+ /** True when at least one edit is an unresolved `replace block N:` edit. */
17
+ export function hasBlockEdit(edits) {
18
+ return edits.some((edit) => edit.kind === "block");
19
+ }
20
+ /**
21
+ * Resolve every `replace block N:` edit in `edits` against `text` (parsed as
22
+ * the language inferred from `path`). Non-block edits pass through untouched.
23
+ * Returns a fresh edit list with no `block` variants. The fast path returns the
24
+ * input unchanged when there is nothing to resolve.
25
+ *
26
+ * Synthesized inserts/deletes carry sequential `index` values for readability
27
+ * only — {@link applyEdits} re-derives every edit's index from array order, so
28
+ * the passthrough edits keeping their original indices is harmless.
29
+ */
30
+ export function resolveBlockEdits(edits, text, path, resolver, options = {}) {
31
+ if (!hasBlockEdit(edits))
32
+ return edits;
33
+ const onUnresolved = options.onUnresolved ?? "throw";
34
+ const resolved = [];
35
+ let synthIndex = 0;
36
+ for (const edit of edits) {
37
+ if (edit.kind !== "block") {
38
+ resolved.push(edit);
39
+ continue;
40
+ }
41
+ const span = resolver ? resolver({ path, text, line: edit.anchor.line }) : null;
42
+ if (span === null) {
43
+ if (onUnresolved === "drop")
44
+ continue;
45
+ // Nearest-anchor "did you mean" (7.9 [5.2] / §3.8): show real lines around
46
+ // the failed block anchor so the model can switch to `replace N..M:`.
47
+ const hint = formatNearestAnchors(text.split("\n"), edit.anchor.line);
48
+ throw new Error(`line ${edit.lineNum}: ${resolver ? blockUnresolvedMessage(edit.anchor.line) : BLOCK_RESOLVER_UNAVAILABLE}${hint}`);
49
+ }
50
+ // Mirror the parser's `replace start..end:` expansion exactly: one
51
+ // `before_anchor` replacement insert per payload row at `span.start`,
52
+ // then one delete per line across `[span.start, span.end]`. An empty
53
+ // `payloads` (from `delete block N`) emits no inserts — a pure deletion.
54
+ for (const payload of edit.payloads) {
55
+ const cursor = { kind: "before_anchor", anchor: { line: span.start } };
56
+ resolved.push({
57
+ kind: "insert",
58
+ cursor,
59
+ text: payload,
60
+ lineNum: edit.lineNum,
61
+ index: synthIndex++,
62
+ mode: "replacement",
63
+ });
64
+ }
65
+ for (let line = span.start; line <= span.end; line++) {
66
+ resolved.push({ kind: "delete", anchor: { line }, lineNum: edit.lineNum, index: synthIndex++ });
67
+ }
68
+ }
69
+ return resolved;
70
+ }
71
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/hashline/block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAcnF,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,KAAsB;IACjD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAsB,EACtB,IAAY,EACZ,IAAY,EACZ,QAAmC,EACnC,UAAoC,EAAE;IAEtC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC;IACrD,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,YAAY,KAAK,MAAM;gBAAE,SAAS;YACtC,2EAA2E;YAC3E,sEAAsE;YACtE,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,0BAA0B,GAAG,IAAI,EAAE,CACnH,CAAC;QACJ,CAAC;QACD,mEAAmE;QACnE,sEAAsE;QACtE,qEAAqE;QACrE,yEAAyE;QACzE,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/E,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ;gBACd,MAAM;gBACN,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,UAAU,EAAE;gBACnB,IAAI,EAAE,aAAa;aACpB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}