@spool-lab/session-kit 0.6.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.
package/LICENSE ADDED
@@ -0,0 +1,32 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Spool Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ TRADEMARK NOTICE
26
+
27
+ "Spool" and the Spool logo are trademarks of TypeSafe Limited. The MIT
28
+ License above governs the source code only; it does not grant any right or
29
+ license to use the "Spool" name, the Spool logo, or any other TypeSafe
30
+ Limited trademark. Forks and redistributions must not use the "Spool" name
31
+ or logo in a way that suggests endorsement by, or affiliation with,
32
+ TypeSafe Limited.
@@ -0,0 +1,4 @@
1
+ export declare function sha256(bytes: Uint8Array): Promise<Uint8Array<ArrayBuffer>>;
2
+ export declare function bytesToHex(bytes: Uint8Array): string;
3
+ export declare function hexToBytes(hex: string): Uint8Array;
4
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAMhF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAUlD"}
package/dist/crypto.js ADDED
@@ -0,0 +1,28 @@
1
+ const HEX_BYTE = /^[0-9a-f]{2}$/;
2
+ export async function sha256(bytes) {
3
+ const subtle = globalThis.crypto?.subtle;
4
+ if (!subtle)
5
+ throw new Error('WebCrypto crypto.subtle is required');
6
+ const input = new Uint8Array(bytes.byteLength);
7
+ input.set(bytes);
8
+ return new Uint8Array(await subtle.digest('SHA-256', input.buffer));
9
+ }
10
+ export function bytesToHex(bytes) {
11
+ let result = '';
12
+ for (const byte of bytes)
13
+ result += byte.toString(16).padStart(2, '0');
14
+ return result;
15
+ }
16
+ export function hexToBytes(hex) {
17
+ if (hex.length !== 64)
18
+ throw new TypeError('OID must be 64 lowercase hexadecimal characters');
19
+ const bytes = new Uint8Array(32);
20
+ for (let index = 0; index < bytes.length; index += 1) {
21
+ const pair = hex.slice(index * 2, index * 2 + 2);
22
+ if (!HEX_BYTE.test(pair))
23
+ throw new TypeError('OID must be 64 lowercase hexadecimal characters');
24
+ bytes[index] = Number.parseInt(pair, 16);
25
+ }
26
+ return bytes;
27
+ }
28
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,eAAe,CAAA;AAEhC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAiB;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAA;IACxC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACnE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC9C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAChB,OAAO,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtE,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;IAE7F,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;QAChG,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { EditEvent, SessionDiff } from './types.js';
2
+ export declare function composeSessionDiff(events: readonly EditEvent[]): SessionDiff;
3
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,SAAS,EACT,WAAW,EAGZ,MAAM,YAAY,CAAA;AAgCnB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,WAAW,CAyB5E"}
package/dist/diff.js ADDED
@@ -0,0 +1,438 @@
1
+ const HUNK_CONTEXT = 2;
2
+ export function composeSessionDiff(events) {
3
+ const grouped = new Map();
4
+ for (const event of events) {
5
+ const existing = grouped.get(event.path);
6
+ if (existing)
7
+ existing.push(event);
8
+ else
9
+ grouped.set(event.path, [event]);
10
+ }
11
+ const files = [];
12
+ let totalAdds = 0;
13
+ let totalDels = 0;
14
+ for (const [path, fileEvents] of grouped) {
15
+ fileEvents.sort((left, right) => left.recordIndex - right.recordIndex
16
+ || left.resultRecordIndex - right.resultRecordIndex);
17
+ const file = composeFile(path, fileEvents);
18
+ files.push(file);
19
+ totalAdds += file.adds;
20
+ totalDels += file.dels;
21
+ }
22
+ return {
23
+ files,
24
+ diffstat: { files: files.length, adds: totalAdds, dels: totalDels },
25
+ };
26
+ }
27
+ function composeFile(path, events) {
28
+ const first = events[0];
29
+ if (!first) {
30
+ return { path, events: [], oldText: '', newText: '', hunks: [], adds: 0, dels: 0 };
31
+ }
32
+ const inferred = first.before === undefined ? inferInitialText(events) : null;
33
+ const oldText = first.before ?? inferred?.text ?? '';
34
+ const originalLines = splitLines(oldText);
35
+ let tracked = originalLines.map((line, index) => ({
36
+ line,
37
+ originalIndices: [index],
38
+ recordIndices: [],
39
+ }));
40
+ const deletedBy = new Map();
41
+ for (const event of events) {
42
+ const currentText = tracked.map(item => item.line).join('');
43
+ const after = event.after ?? applyReplacements(currentText, event.replacements, inferred?.occurrenceByReplacement);
44
+ tracked = applyTrackedChange(tracked, after, event.recordIndex, deletedBy);
45
+ }
46
+ const newText = tracked.map(item => item.line).join('');
47
+ const positioned = positionFinalDiff(originalLines, tracked, deletedBy);
48
+ const adds = positioned.filter(line => line.kind === 'add').length;
49
+ const dels = positioned.filter(line => line.kind === 'del').length;
50
+ const usesFragments = first.before === undefined;
51
+ const hunks = applyKnownCoordinates(makeHunks(positioned, usesFragments ? 0 : HUNK_CONTEXT), events, usesFragments);
52
+ // Both call and result indices: this is the reader's fetch list for
53
+ // reconstructing the file's edits client-side (pairing needs both records).
54
+ const eventIndices = [...new Set(events.flatMap(event => [event.recordIndex, event.resultRecordIndex]))].sort(numberAscending);
55
+ return { path, events: eventIndices, oldText, newText, hunks, adds, dels };
56
+ }
57
+ function applyTrackedChange(current, afterText, recordIndex, deletedBy) {
58
+ const atoms = diffLines(current.map(item => item.line), splitLines(afterText));
59
+ const result = [];
60
+ let oldIndex = 0;
61
+ let deleted = [];
62
+ let added = [];
63
+ const flush = () => {
64
+ if (deleted.length === 0 && added.length === 0)
65
+ return;
66
+ const lineage = new Set([recordIndex]);
67
+ for (const item of deleted) {
68
+ for (const sourceRecord of item.recordIndices)
69
+ lineage.add(sourceRecord);
70
+ }
71
+ const recordIndices = [...lineage].sort(numberAscending);
72
+ for (const item of deleted) {
73
+ for (const originalIndex of item.originalIndices) {
74
+ const existing = deletedBy.get(originalIndex) ?? new Set();
75
+ for (const sourceRecord of recordIndices)
76
+ existing.add(sourceRecord);
77
+ deletedBy.set(originalIndex, existing);
78
+ }
79
+ }
80
+ for (const line of added) {
81
+ result.push({ line, originalIndices: [], recordIndices });
82
+ }
83
+ deleted = [];
84
+ added = [];
85
+ };
86
+ for (const atom of atoms) {
87
+ if (atom.kind === 'equal') {
88
+ flush();
89
+ const retained = current[oldIndex];
90
+ if (retained)
91
+ result.push(retained);
92
+ oldIndex += 1;
93
+ }
94
+ else if (atom.kind === 'del') {
95
+ const removed = current[oldIndex];
96
+ if (removed)
97
+ deleted.push(removed);
98
+ oldIndex += 1;
99
+ }
100
+ else {
101
+ added.push(atom.line);
102
+ }
103
+ }
104
+ flush();
105
+ return result;
106
+ }
107
+ function positionFinalDiff(originalLines, finalLines, deletedBy) {
108
+ const atoms = diffLines(originalLines, finalLines.map(item => item.line));
109
+ const result = [];
110
+ let oldIndex = 0;
111
+ let newIndex = 0;
112
+ for (const atom of atoms) {
113
+ const beforeOld = oldIndex;
114
+ const beforeNew = newIndex;
115
+ if (atom.kind === 'equal') {
116
+ result.push({
117
+ kind: 'context',
118
+ text: stripLineEnding(atom.line),
119
+ recordIndices: [],
120
+ oldLine: oldIndex + 1,
121
+ newLine: newIndex + 1,
122
+ beforeOld,
123
+ beforeNew,
124
+ });
125
+ oldIndex += 1;
126
+ newIndex += 1;
127
+ }
128
+ else if (atom.kind === 'del') {
129
+ result.push({
130
+ kind: 'del',
131
+ text: stripLineEnding(atom.line),
132
+ recordIndices: [...(deletedBy.get(oldIndex) ?? [])].sort(numberAscending),
133
+ oldLine: oldIndex + 1,
134
+ beforeOld,
135
+ beforeNew,
136
+ });
137
+ oldIndex += 1;
138
+ }
139
+ else {
140
+ result.push({
141
+ kind: 'add',
142
+ text: stripLineEnding(atom.line),
143
+ recordIndices: finalLines[newIndex]?.recordIndices ?? [],
144
+ newLine: newIndex + 1,
145
+ beforeOld,
146
+ beforeNew,
147
+ });
148
+ newIndex += 1;
149
+ }
150
+ }
151
+ return result;
152
+ }
153
+ function makeHunks(lines, context) {
154
+ const changed = lines.flatMap((line, index) => line.kind === 'context' ? [] : [index]);
155
+ if (changed.length === 0)
156
+ return [];
157
+ const windows = [];
158
+ for (const index of changed) {
159
+ const start = Math.max(0, index - context);
160
+ const end = Math.min(lines.length - 1, index + context);
161
+ const previous = windows[windows.length - 1];
162
+ if (previous && start <= previous.end + 1)
163
+ previous.end = Math.max(previous.end, end);
164
+ else
165
+ windows.push({ start, end });
166
+ }
167
+ return windows.map(({ start, end }) => {
168
+ const selected = lines.slice(start, end + 1);
169
+ const first = selected[0];
170
+ const oldLines = selected.filter(line => line.kind !== 'add').length;
171
+ const newLines = selected.filter(line => line.kind !== 'del').length;
172
+ const recordIndices = [...new Set(selected.flatMap(line => line.recordIndices))].sort(numberAscending);
173
+ return {
174
+ oldStart: first.beforeOld + 1,
175
+ oldLines,
176
+ newStart: first.beforeNew + 1,
177
+ newLines,
178
+ lines: selected.map(stripPosition),
179
+ recordIndices,
180
+ };
181
+ });
182
+ }
183
+ function stripPosition(line) {
184
+ const { beforeOld: _beforeOld, beforeNew: _beforeNew, ...publicLine } = line;
185
+ return publicLine;
186
+ }
187
+ function applyReplacements(initial, replacements, occurrenceByReplacement) {
188
+ let result = initial;
189
+ for (const replacement of replacements) {
190
+ if (replacement.oldText === '')
191
+ continue;
192
+ if (replacement.replaceAll) {
193
+ result = result.split(replacement.oldText).join(replacement.newText);
194
+ continue;
195
+ }
196
+ const occurrences = findOccurrences(result, replacement.oldText);
197
+ const occurrence = occurrenceByReplacement?.get(replacement) ?? 0;
198
+ const index = occurrences[Math.min(occurrence, occurrences.length - 1)] ?? -1;
199
+ if (index >= 0) {
200
+ result = result.slice(0, index)
201
+ + replacement.newText
202
+ + result.slice(index + replacement.oldText.length);
203
+ }
204
+ }
205
+ return result;
206
+ }
207
+ function inferInitialText(events) {
208
+ const fragments = [];
209
+ const targetByReplacement = new Map();
210
+ let order = 0;
211
+ for (const event of events) {
212
+ for (const replacement of event.replacements) {
213
+ if (replacement.oldText === '')
214
+ continue;
215
+ const candidates = fragments.filter(fragment => fragment.current.includes(replacement.oldText));
216
+ let target = replacement.oldStart === undefined
217
+ ? candidates[0]
218
+ : candidates.find(fragment => coordinateFallsWithin(fragment, replacement.oldStart));
219
+ if (!target) {
220
+ target = {
221
+ initial: replacement.oldText,
222
+ current: replacement.oldText,
223
+ oldStart: replacement.oldStart ?? 1_000_000_000 + order,
224
+ order,
225
+ };
226
+ order += 1;
227
+ fragments.push(target);
228
+ }
229
+ targetByReplacement.set(replacement, target);
230
+ target.current = replacement.replaceAll
231
+ ? target.current.split(replacement.oldText).join(replacement.newText)
232
+ : replaceFirst(target.current, replacement.oldText, replacement.newText);
233
+ }
234
+ }
235
+ fragments.sort((left, right) => left.oldStart - right.oldStart || left.order - right.order);
236
+ const occurrenceByReplacement = new Map();
237
+ for (const event of events) {
238
+ for (const replacement of event.replacements) {
239
+ const target = targetByReplacement.get(replacement);
240
+ if (!target)
241
+ continue;
242
+ const candidates = fragments.filter(fragment => fragment.current.includes(replacement.oldText)
243
+ || fragment === target);
244
+ occurrenceByReplacement.set(replacement, Math.max(0, candidates.indexOf(target)));
245
+ }
246
+ }
247
+ return {
248
+ text: fragments.map(fragment => fragment.initial).join(''),
249
+ occurrenceByReplacement,
250
+ };
251
+ }
252
+ function replaceFirst(value, search, replacement) {
253
+ const index = value.indexOf(search);
254
+ if (index < 0)
255
+ return value;
256
+ return value.slice(0, index) + replacement + value.slice(index + search.length);
257
+ }
258
+ function coordinateFallsWithin(fragment, oldStart) {
259
+ const lines = Math.max(1, splitLines(fragment.current).length);
260
+ return oldStart >= fragment.oldStart && oldStart < fragment.oldStart + lines;
261
+ }
262
+ function findOccurrences(value, search) {
263
+ const result = [];
264
+ let from = 0;
265
+ while (from <= value.length - search.length) {
266
+ const index = value.indexOf(search, from);
267
+ if (index < 0)
268
+ break;
269
+ result.push(index);
270
+ from = index + Math.max(1, search.length);
271
+ }
272
+ return result;
273
+ }
274
+ function applyKnownCoordinates(hunks, events, usesFragments) {
275
+ if (!usesFragments || hunks.length === 0)
276
+ return [...hunks];
277
+ const coordinateChanges = [];
278
+ const positioned = [];
279
+ const sortedEvents = events.slice().sort((left, right) => left.recordIndex - right.recordIndex);
280
+ for (const event of sortedEvents) {
281
+ const eventChanges = [];
282
+ for (const replacement of event.replacements) {
283
+ if (replacement.oldStart === undefined || replacement.newStart === undefined)
284
+ continue;
285
+ const baseStart = mapCurrentLineToBaseline(replacement.oldStart, coordinateChanges);
286
+ const oldLines = replacement.oldLines ?? 1;
287
+ eventChanges.push({
288
+ baseStart,
289
+ delta: (replacement.newLines ?? 1) - oldLines,
290
+ });
291
+ positioned.push({ event, baseStart, baseEnd: baseStart + Math.max(1, oldLines) - 1 });
292
+ }
293
+ coordinateChanges.push(...eventChanges);
294
+ }
295
+ if (positioned.length === 0)
296
+ return [...hunks];
297
+ positioned.sort((left, right) => left.baseStart - right.baseStart
298
+ || left.event.recordIndex - right.event.recordIndex);
299
+ const regions = [];
300
+ for (const item of positioned) {
301
+ const oldStart = item.baseStart;
302
+ const oldEnd = item.baseEnd;
303
+ const previous = regions[regions.length - 1];
304
+ if (previous && oldStart <= previous.oldEnd && oldEnd >= previous.oldStart) {
305
+ previous.oldStart = Math.min(previous.oldStart, oldStart);
306
+ previous.oldEnd = Math.max(previous.oldEnd, oldEnd);
307
+ if (item.event.recordIndex >= previous.lastRecordIndex) {
308
+ previous.newStart = finalLineForBaseline(oldStart, coordinateChanges);
309
+ previous.lastRecordIndex = item.event.recordIndex;
310
+ }
311
+ }
312
+ else {
313
+ regions.push({
314
+ oldStart,
315
+ oldEnd,
316
+ newStart: finalLineForBaseline(oldStart, coordinateChanges),
317
+ lastRecordIndex: item.event.recordIndex,
318
+ });
319
+ }
320
+ }
321
+ if (regions.length !== hunks.length)
322
+ return [...hunks];
323
+ return hunks.map((hunk, index) => {
324
+ const region = regions[index];
325
+ const oldOffset = region.oldStart - hunk.oldStart;
326
+ const newOffset = region.newStart - hunk.newStart;
327
+ return {
328
+ ...hunk,
329
+ oldStart: region.oldStart,
330
+ newStart: region.newStart,
331
+ lines: hunk.lines.map(line => ({
332
+ ...line,
333
+ ...(line.oldLine === undefined ? {} : { oldLine: line.oldLine + oldOffset }),
334
+ ...(line.newLine === undefined ? {} : { newLine: line.newLine + newOffset }),
335
+ })),
336
+ };
337
+ });
338
+ }
339
+ function mapCurrentLineToBaseline(currentLine, changes) {
340
+ let baseline = currentLine;
341
+ for (let iteration = 0; iteration <= changes.length; iteration += 1) {
342
+ const deltaBefore = changes
343
+ .filter(change => change.baseStart < baseline)
344
+ .reduce((total, change) => total + change.delta, 0);
345
+ const next = currentLine - deltaBefore;
346
+ if (next === baseline)
347
+ break;
348
+ baseline = next;
349
+ }
350
+ return baseline;
351
+ }
352
+ function finalLineForBaseline(baselineLine, changes) {
353
+ return baselineLine + changes
354
+ .filter(change => change.baseStart < baselineLine)
355
+ .reduce((total, change) => total + change.delta, 0);
356
+ }
357
+ function splitLines(value) {
358
+ if (value.length === 0)
359
+ return [];
360
+ const lines = [];
361
+ let start = 0;
362
+ for (let index = 0; index < value.length; index += 1) {
363
+ if (value[index] === '\n') {
364
+ lines.push(value.slice(start, index + 1));
365
+ start = index + 1;
366
+ }
367
+ }
368
+ if (start < value.length)
369
+ lines.push(value.slice(start));
370
+ return lines;
371
+ }
372
+ function stripLineEnding(line) {
373
+ return line.endsWith('\r\n') ? line.slice(0, -2)
374
+ : line.endsWith('\n') ? line.slice(0, -1)
375
+ : line;
376
+ }
377
+ function diffLines(before, after) {
378
+ const max = before.length + after.length;
379
+ let frontier = new Map([[1, 0]]);
380
+ const trace = [];
381
+ for (let distance = 0; distance <= max; distance += 1) {
382
+ trace.push(new Map(frontier));
383
+ for (let diagonal = -distance; diagonal <= distance; diagonal += 2) {
384
+ const down = frontier.get(diagonal + 1) ?? Number.NEGATIVE_INFINITY;
385
+ const right = frontier.get(diagonal - 1) ?? Number.NEGATIVE_INFINITY;
386
+ let x = diagonal === -distance || (diagonal !== distance && right < down)
387
+ ? down
388
+ : right + 1;
389
+ if (!Number.isFinite(x))
390
+ x = 0;
391
+ let y = x - diagonal;
392
+ while (x < before.length && y < after.length && before[x] === after[y]) {
393
+ x += 1;
394
+ y += 1;
395
+ }
396
+ frontier.set(diagonal, x);
397
+ if (x >= before.length && y >= after.length)
398
+ return backtrack(trace, before, after);
399
+ }
400
+ }
401
+ return [];
402
+ }
403
+ function backtrack(trace, before, after) {
404
+ let x = before.length;
405
+ let y = after.length;
406
+ const reversed = [];
407
+ for (let distance = trace.length - 1; distance >= 0; distance -= 1) {
408
+ const frontier = trace[distance];
409
+ const diagonal = x - y;
410
+ const down = frontier.get(diagonal + 1) ?? Number.NEGATIVE_INFINITY;
411
+ const right = frontier.get(diagonal - 1) ?? Number.NEGATIVE_INFINITY;
412
+ const previousDiagonal = diagonal === -distance || (diagonal !== distance && right < down)
413
+ ? diagonal + 1
414
+ : diagonal - 1;
415
+ const previousX = frontier.get(previousDiagonal) ?? 0;
416
+ const previousY = previousX - previousDiagonal;
417
+ while (x > previousX && y > previousY) {
418
+ reversed.push({ kind: 'equal', line: before[x - 1] });
419
+ x -= 1;
420
+ y -= 1;
421
+ }
422
+ if (distance === 0)
423
+ break;
424
+ if (x === previousX) {
425
+ reversed.push({ kind: 'add', line: after[y - 1] });
426
+ y -= 1;
427
+ }
428
+ else {
429
+ reversed.push({ kind: 'del', line: before[x - 1] });
430
+ x -= 1;
431
+ }
432
+ }
433
+ return reversed.reverse();
434
+ }
435
+ function numberAscending(left, right) {
436
+ return left - right;
437
+ }
438
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { EditEvent, SessionProvider, SessionRecord, SessionRecordsOptions } from './types.js';
2
+ export declare function extractEditEvents(provider: SessionProvider, records: readonly SessionRecord[]): EditEvent[];
3
+ export declare function extractEditEvents(records: readonly SessionRecord[], options: SessionRecordsOptions): EditEvent[];
4
+ //# sourceMappingURL=edits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edits.d.ts","sourceRoot":"","sources":["../src/edits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAET,eAAe,EACf,aAAa,EACb,qBAAqB,EAEtB,MAAM,YAAY,CAAA;AAanB,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,SAAS,EAAE,CAAA;AACd,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,OAAO,EAAE,qBAAqB,GAC7B,SAAS,EAAE,CAAA"}