@ikarmic/forge-core 4.4.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/agent.d.ts.map +1 -1
  3. package/dist/agent/agent.js +64 -31
  4. package/dist/agent/agent.js.map +1 -1
  5. package/dist/agent/architect.d.ts +3 -0
  6. package/dist/agent/architect.d.ts.map +1 -1
  7. package/dist/agent/architect.js +1 -0
  8. package/dist/agent/architect.js.map +1 -1
  9. package/dist/agent/cost-router.d.ts.map +1 -1
  10. package/dist/agent/cost-router.js +2 -0
  11. package/dist/agent/cost-router.js.map +1 -1
  12. package/dist/attachments.d.ts +47 -0
  13. package/dist/attachments.d.ts.map +1 -0
  14. package/dist/attachments.js +179 -0
  15. package/dist/attachments.js.map +1 -0
  16. package/dist/code-index/builder.d.ts.map +1 -1
  17. package/dist/code-index/builder.js +4 -0
  18. package/dist/code-index/builder.js.map +1 -1
  19. package/dist/commands/custom-commands.d.ts +25 -0
  20. package/dist/commands/custom-commands.d.ts.map +1 -0
  21. package/dist/commands/custom-commands.js +99 -0
  22. package/dist/commands/custom-commands.js.map +1 -0
  23. package/dist/context/compaction.d.ts.map +1 -1
  24. package/dist/context/compaction.js +11 -1
  25. package/dist/context/compaction.js.map +1 -1
  26. package/dist/context/mask.d.ts.map +1 -1
  27. package/dist/context/mask.js +1 -1
  28. package/dist/context/mask.js.map +1 -1
  29. package/dist/diff/unified-diff.js +42 -15
  30. package/dist/diff/unified-diff.js.map +1 -1
  31. package/dist/git/auto-commit.d.ts.map +1 -1
  32. package/dist/git/auto-commit.js +14 -2
  33. package/dist/git/auto-commit.js.map +1 -1
  34. package/dist/github/github-tools.d.ts +84 -0
  35. package/dist/github/github-tools.d.ts.map +1 -0
  36. package/dist/github/github-tools.js +176 -0
  37. package/dist/github/github-tools.js.map +1 -0
  38. package/dist/index.d.ts +18 -8
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +13 -4
  41. package/dist/index.js.map +1 -1
  42. package/dist/memory/memory-store.d.ts +57 -10
  43. package/dist/memory/memory-store.d.ts.map +1 -1
  44. package/dist/memory/memory-store.js +236 -69
  45. package/dist/memory/memory-store.js.map +1 -1
  46. package/dist/memory/rank.d.ts +21 -0
  47. package/dist/memory/rank.d.ts.map +1 -0
  48. package/dist/memory/rank.js +65 -0
  49. package/dist/memory/rank.js.map +1 -0
  50. package/dist/memory/stale.d.ts +19 -0
  51. package/dist/memory/stale.d.ts.map +1 -0
  52. package/dist/memory/stale.js +46 -0
  53. package/dist/memory/stale.js.map +1 -0
  54. package/dist/orchestrator/specialists.js +5 -5
  55. package/dist/orchestrator/specialists.js.map +1 -1
  56. package/dist/semantic/semantic-index.d.ts.map +1 -1
  57. package/dist/semantic/semantic-index.js +4 -0
  58. package/dist/semantic/semantic-index.js.map +1 -1
  59. package/dist/sessions/index.d.ts +1 -0
  60. package/dist/sessions/index.d.ts.map +1 -1
  61. package/dist/sessions/index.js +1 -0
  62. package/dist/sessions/index.js.map +1 -1
  63. package/dist/sessions/search.d.ts +23 -0
  64. package/dist/sessions/search.d.ts.map +1 -0
  65. package/dist/sessions/search.js +67 -0
  66. package/dist/sessions/search.js.map +1 -0
  67. package/dist/specs/index.d.ts +2 -0
  68. package/dist/specs/index.d.ts.map +1 -1
  69. package/dist/specs/index.js +1 -0
  70. package/dist/specs/index.js.map +1 -1
  71. package/dist/specs/store.d.ts +7 -0
  72. package/dist/specs/store.d.ts.map +1 -1
  73. package/dist/specs/store.js +33 -0
  74. package/dist/specs/store.js.map +1 -1
  75. package/dist/specs/sync.d.ts +30 -0
  76. package/dist/specs/sync.d.ts.map +1 -0
  77. package/dist/specs/sync.js +156 -0
  78. package/dist/specs/sync.js.map +1 -0
  79. package/dist/specs/types.d.ts +2 -0
  80. package/dist/specs/types.d.ts.map +1 -1
  81. package/dist/tools/ignore-rules.d.ts +16 -0
  82. package/dist/tools/ignore-rules.d.ts.map +1 -0
  83. package/dist/tools/ignore-rules.js +85 -0
  84. package/dist/tools/ignore-rules.js.map +1 -0
  85. package/dist/tools/index.d.ts +3 -2
  86. package/dist/tools/index.d.ts.map +1 -1
  87. package/dist/tools/index.js +5 -2
  88. package/dist/tools/index.js.map +1 -1
  89. package/dist/tools/list-files.d.ts +3 -0
  90. package/dist/tools/list-files.d.ts.map +1 -1
  91. package/dist/tools/list-files.js +8 -0
  92. package/dist/tools/list-files.js.map +1 -1
  93. package/dist/tools/memory.d.ts +34 -1
  94. package/dist/tools/memory.d.ts.map +1 -1
  95. package/dist/tools/memory.js +118 -25
  96. package/dist/tools/memory.js.map +1 -1
  97. package/dist/tools/notebook.d.ts +70 -0
  98. package/dist/tools/notebook.d.ts.map +1 -0
  99. package/dist/tools/notebook.js +164 -0
  100. package/dist/tools/notebook.js.map +1 -0
  101. package/dist/tools/read-file.d.ts +8 -1
  102. package/dist/tools/read-file.d.ts.map +1 -1
  103. package/dist/tools/read-file.js +19 -1
  104. package/dist/tools/read-file.js.map +1 -1
  105. package/dist/tools/search-files.d.ts +5 -2
  106. package/dist/tools/search-files.d.ts.map +1 -1
  107. package/dist/tools/search-files.js +8 -0
  108. package/dist/tools/search-files.js.map +1 -1
  109. package/dist/tools/web-search.d.ts +56 -0
  110. package/dist/tools/web-search.d.ts.map +1 -0
  111. package/dist/tools/web-search.js +132 -0
  112. package/dist/tools/web-search.js.map +1 -0
  113. package/dist/types.d.ts +31 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/package.json +2 -1
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Files the user attaches to a chat turn (pasted screenshots, dropped PDFs, any other file).
3
+ *
4
+ * They travel in the turn's user message as native content parts, so vision and
5
+ * document-capable models see the real bytes instead of a read_image round trip:
6
+ * - images (PNG / JPEG / GIF / WebP) and PDFs become `file` parts;
7
+ * - text files are inlined as a fenced block;
8
+ * - any other binary is described in one line (name, type, size) so the model knows it exists.
9
+ */
10
+ import { readFile, stat } from 'node:fs/promises';
11
+ import path from 'node:path';
12
+ import { sniffMime } from './tools/read-image.js';
13
+ /** Same cap as read_image: what vision APIs accept without resampling. */
14
+ export const MAX_IMAGE_ATTACHMENT_BYTES = 5 * 1024 * 1024;
15
+ /** PDF APIs accept around 32 MB; stay well inside it. */
16
+ export const MAX_ATTACHMENT_BYTES = 20 * 1024 * 1024;
17
+ /** Text attachments past this are cut, with a note, so one log file can't fill the window. */
18
+ export const MAX_TEXT_ATTACHMENT_CHARS = 200_000;
19
+ const IMAGE_TYPES = new Set(['image/png', 'image/jpeg', 'image/gif', 'image/webp']);
20
+ export function attachmentKind(mediaType) {
21
+ if (IMAGE_TYPES.has(mediaType))
22
+ return 'image';
23
+ if (mediaType === 'application/pdf')
24
+ return 'pdf';
25
+ if (mediaType.startsWith('text/') || TEXTUAL_TYPES.has(mediaType))
26
+ return 'text';
27
+ return 'binary';
28
+ }
29
+ const TEXTUAL_TYPES = new Set([
30
+ 'application/json',
31
+ 'application/xml',
32
+ 'application/javascript',
33
+ 'application/x-yaml',
34
+ 'application/yaml',
35
+ 'application/toml',
36
+ 'application/sql',
37
+ 'image/svg+xml',
38
+ ]);
39
+ export function isPdf(buf) {
40
+ return buf.length >= 5 && buf[0] === 0x25 && buf[1] === 0x50 && buf[2] === 0x44 && buf[3] === 0x46 && buf[4] === 0x2d;
41
+ }
42
+ /** True when the first 8 KB have no NUL byte and decode as UTF-8. */
43
+ export function looksLikeText(buf) {
44
+ const sample = buf.subarray(0, Math.min(buf.length, 8192));
45
+ if (sample.includes(0))
46
+ return false;
47
+ try {
48
+ new TextDecoder('utf-8', { fatal: true }).decode(sample);
49
+ return true;
50
+ }
51
+ catch {
52
+ // A multi-byte character cut at the 8 KB boundary is still text.
53
+ return sample.length === 8192 && looksLikeText(sample.subarray(0, 8188));
54
+ }
55
+ }
56
+ /**
57
+ * Media type from the bytes: images and PDFs by their magic numbers, then text. The
58
+ * declared type (a browser's or an extension's guess) only names text and other
59
+ * binaries, so a mislabelled file is never sent to a provider as an image or PDF.
60
+ */
61
+ export function detectMediaType(buf, declared) {
62
+ // An empty name turns off sniffMime's extension fallback.
63
+ const image = sniffMime(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength), '');
64
+ if (image)
65
+ return image;
66
+ if (isPdf(buf))
67
+ return 'application/pdf';
68
+ const declaredKind = declared ? attachmentKind(declared) : 'binary';
69
+ if (looksLikeText(buf))
70
+ return declared && declaredKind === 'text' ? declared : 'text/plain';
71
+ return declared && declaredKind === 'binary' ? declared : 'application/octet-stream';
72
+ }
73
+ /** Why these bytes can't be attached, or null when they can. */
74
+ export function attachmentProblem(bytes, mediaType) {
75
+ if (bytes === 0)
76
+ return 'the file is empty';
77
+ if (attachmentKind(mediaType) === 'image' && bytes > MAX_IMAGE_ATTACHMENT_BYTES) {
78
+ return `images are limited to ${MAX_IMAGE_ATTACHMENT_BYTES / 1024 / 1024} MB`;
79
+ }
80
+ if (bytes > MAX_ATTACHMENT_BYTES)
81
+ return `attachments are limited to ${MAX_ATTACHMENT_BYTES / 1024 / 1024} MB`;
82
+ return null;
83
+ }
84
+ /** Build an attachment from raw bytes; throws with a readable reason when it can't be attached. */
85
+ export function makeAttachment(name, bytes, declaredType) {
86
+ const mediaType = detectMediaType(bytes, declaredType);
87
+ const problem = attachmentProblem(bytes.length, mediaType);
88
+ if (problem)
89
+ throw new Error(`Cannot attach ${name}: ${problem}`);
90
+ return { name, mediaType, data: Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString('base64') };
91
+ }
92
+ /** Read a file from disk as an attachment. */
93
+ export async function loadAttachment(filePath) {
94
+ const name = path.basename(filePath);
95
+ const info = await stat(filePath);
96
+ if (info.isDirectory())
97
+ throw new Error(`Cannot attach ${name}: it is a directory`);
98
+ // Check the size before reading so a 2 GB file isn't pulled into memory.
99
+ if (info.size > MAX_ATTACHMENT_BYTES)
100
+ throw new Error(`Cannot attach ${name}: attachments are limited to ${MAX_ATTACHMENT_BYTES / 1024 / 1024} MB`);
101
+ return makeAttachment(name, await readFile(filePath));
102
+ }
103
+ /** Decoded size of an attachment's data. */
104
+ export function attachmentBytes(a) {
105
+ const pad = a.data.endsWith('==') ? 2 : a.data.endsWith('=') ? 1 : 0;
106
+ return Math.floor((a.data.length * 3) / 4) - pad;
107
+ }
108
+ export function formatBytes(n) {
109
+ if (n < 1024)
110
+ return `${n} B`;
111
+ if (n < 1024 * 1024)
112
+ return `${(n / 1024).toFixed(1)} KB`;
113
+ return `${(n / 1024 / 1024).toFixed(2)} MB`;
114
+ }
115
+ /** One-line description, e.g. `screenshot.png (image/png, 120.4 KB)`. */
116
+ export function describeAttachment(a) {
117
+ return `${a.name} (${a.mediaType}, ${formatBytes(attachmentBytes(a))})`;
118
+ }
119
+ /** The content parts that carry the attachments in a user message. */
120
+ export function attachmentParts(attachments) {
121
+ const parts = [];
122
+ for (const a of attachments) {
123
+ const kind = attachmentKind(a.mediaType);
124
+ if (kind === 'image' || kind === 'pdf') {
125
+ parts.push({ type: 'text', text: `Attached file: ${describeAttachment(a)}` });
126
+ parts.push({ type: 'file', mediaType: a.mediaType, filename: a.name, data: { type: 'data', data: a.data } });
127
+ }
128
+ else if (kind === 'text') {
129
+ let text = Buffer.from(a.data, 'base64').toString('utf8');
130
+ let note = '';
131
+ if (text.length > MAX_TEXT_ATTACHMENT_CHARS) {
132
+ note = `\n[cut at ${MAX_TEXT_ATTACHMENT_CHARS} of ${text.length} characters]`;
133
+ text = text.slice(0, MAX_TEXT_ATTACHMENT_CHARS);
134
+ }
135
+ const fence = text.includes('```') ? '~~~~' : '```';
136
+ parts.push({ type: 'text', text: `Attached file: ${a.name}\n${fence}\n${text}\n${fence}${note}` });
137
+ }
138
+ else {
139
+ parts.push({
140
+ type: 'text',
141
+ text: `Attached file: ${describeAttachment(a)}. It is binary and can't be shown; ask the user what they need from it.`,
142
+ });
143
+ }
144
+ }
145
+ return parts;
146
+ }
147
+ /**
148
+ * Rough token cost of a non-text content part (an image is about 1,600 tokens on
149
+ * the major providers; a PDF page about the same, and PDFs run ~50 KB a page).
150
+ */
151
+ export function mediaPartTokens(part) {
152
+ if (!part || typeof part !== 'object')
153
+ return 0;
154
+ const p = part;
155
+ if (p.type === 'image' || p.type === 'image-data')
156
+ return 1600;
157
+ if (p.type !== 'file' && p.type !== 'file-data')
158
+ return 0;
159
+ const mediaType = typeof p.mediaType === 'string' ? p.mediaType : '';
160
+ if (mediaType.startsWith('image'))
161
+ return 1600;
162
+ const raw = p.data && typeof p.data === 'object' && 'data' in p.data ? p.data.data : p.data;
163
+ const len = typeof raw === 'string' ? raw.length : raw instanceof Uint8Array ? (raw.length * 4) / 3 : 0;
164
+ return Math.max(1600, Math.ceil(((len * 3) / 4 / 50_000) * 1600));
165
+ }
166
+ /** A short stand-in for a media part in transcripts (summaries, logs), never the bytes. */
167
+ export function mediaPartLabel(part) {
168
+ if (!part || typeof part !== 'object')
169
+ return null;
170
+ const p = part;
171
+ if (p.type === 'image' || p.type === 'image-data')
172
+ return '[image]';
173
+ if (p.type === 'file' || p.type === 'file-data') {
174
+ const name = typeof p.filename === 'string' ? `${p.filename}, ` : '';
175
+ return `[attached file: ${name}${typeof p.mediaType === 'string' ? p.mediaType : 'unknown type'}]`;
176
+ }
177
+ return null;
178
+ }
179
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/code-index/builder.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiDrE"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/code-index/builder.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmDrE"}
@@ -1,5 +1,6 @@
1
1
  import { readFile, readdir, stat } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
+ import { IgnoreRules } from '../tools/ignore-rules.js';
3
4
  import { DEFAULT_IGNORED_DIRS } from '../tools/shared.js';
4
5
  import { deleteEntry, getEntry, loadManifest, saveManifest, setEntry } from './index-store.js';
5
6
  import { parseSource } from './parser.js';
@@ -14,6 +15,7 @@ export async function ensureFresh(cwd) {
14
15
  const manifest = await loadManifest(cwd);
15
16
  const seen = new Set();
16
17
  let changed = false;
18
+ const rules = IgnoreRules.forRoot(cwd);
17
19
  async function walk(dir) {
18
20
  let entries;
19
21
  try {
@@ -28,6 +30,8 @@ export async function ensureFresh(cwd) {
28
30
  if (DEFAULT_IGNORED_DIRS.has(entry.name))
29
31
  continue;
30
32
  const abs = path.join(dir, entry.name);
33
+ if (rules.isIgnored(abs, entry.isDirectory()))
34
+ continue;
31
35
  if (entry.isDirectory()) {
32
36
  await walk(abs);
33
37
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/code-index/builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/code-index/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEvC,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACzC,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;gBAAE,SAAS;YACxD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEd,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;gBAAE,SAAS;YAErD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC3B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,OAAO;QAAE,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface CustomCommand {
2
+ /** Lowercase name used after the slash. */
3
+ name: string;
4
+ description?: string;
5
+ template: string;
6
+ source: 'user' | 'project';
7
+ /** Absolute path of the template file. */
8
+ file: string;
9
+ }
10
+ export declare function commandDirs(cwd: string, home?: string): Array<{
11
+ dir: string;
12
+ source: 'user' | 'project';
13
+ }>;
14
+ /** Split optional `---` front matter from the body and read its `description`. */
15
+ export declare function parseCommandFile(text: string): {
16
+ description?: string;
17
+ template: string;
18
+ };
19
+ /** Every custom command, keyed by name; project commands replace personal ones. */
20
+ export declare function loadCustomCommands(cwd: string, home?: string): Promise<Map<string, CustomCommand>>;
21
+ /** The message a command sends for these arguments. */
22
+ export declare function expandCustomCommand(command: Pick<CustomCommand, 'template'>, args: string): string;
23
+ /** `/name — description` lines for help output. */
24
+ export declare function formatCustomCommands(commands: Map<string, CustomCommand>): string;
25
+ //# sourceMappingURL=custom-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-commands.d.ts","sourceRoot":"","sources":["../../src/commands/custom-commands.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAqB,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAKxH;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAMzF;AAED,mFAAmF;AACnF,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CA4BxG;AAQD,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlG;AAED,mDAAmD;AACnD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,MAAM,CAKjF"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Custom slash commands: Markdown prompt templates the user keeps in
3
+ * `~/.forge/commands/<name>.md` (personal) or `<project>/.forge/commands/<name>.md`
4
+ * (shared with the repo; a project command overrides a personal one of the same name).
5
+ *
6
+ * `/<name> some args` sends the file's body as the message, with `$ARGUMENTS` replaced by
7
+ * everything after the name and `$1`..`$9` by its words (quotes group words). A template
8
+ * without `$ARGUMENTS` gets the arguments appended. An optional front matter block
9
+ * gives a `description` for /help:
10
+ *
11
+ * ---
12
+ * description: Review the staged diff for bugs
13
+ * ---
14
+ * Review `git diff --staged` ... $ARGUMENTS
15
+ *
16
+ * Templates are only text the user could have typed: nothing in them runs by itself.
17
+ */
18
+ import { readdir, readFile } from 'node:fs/promises';
19
+ import os from 'node:os';
20
+ import path from 'node:path';
21
+ /** Names are what parseSlashCommand accepts: a letter, then letters, digits, `-` or `_`. */
22
+ const NAME = /^[a-z][\w-]*$/;
23
+ /** A template larger than this is skipped: it's a prompt, not a document. */
24
+ const MAX_TEMPLATE_BYTES = 64 * 1024;
25
+ export function commandDirs(cwd, home = os.homedir()) {
26
+ return [
27
+ { dir: path.join(home, '.forge', 'commands'), source: 'user' },
28
+ { dir: path.join(cwd, '.forge', 'commands'), source: 'project' },
29
+ ];
30
+ }
31
+ /** Split optional `---` front matter from the body and read its `description`. */
32
+ export function parseCommandFile(text) {
33
+ const normalized = text.replace(/^/, '').replace(/\r\n/g, '\n');
34
+ const m = /^---\n([\s\S]*?)\n---\n?/.exec(normalized);
35
+ if (!m)
36
+ return { template: normalized.trim() };
37
+ const desc = /^description:\s*(.+)$/m.exec(m[1])?.[1]?.trim().replace(/^(['"])(.*)\1$/, '$2');
38
+ return { ...(desc ? { description: desc } : {}), template: normalized.slice(m[0].length).trim() };
39
+ }
40
+ /** Every custom command, keyed by name; project commands replace personal ones. */
41
+ export async function loadCustomCommands(cwd, home) {
42
+ const out = new Map();
43
+ for (const { dir, source } of commandDirs(cwd, home)) {
44
+ let files;
45
+ try {
46
+ files = await readdir(dir);
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ for (const f of files.sort()) {
52
+ if (!f.toLowerCase().endsWith('.md'))
53
+ continue;
54
+ const name = f.slice(0, -3).toLowerCase();
55
+ if (!NAME.test(name))
56
+ continue;
57
+ const file = path.join(dir, f);
58
+ let text;
59
+ try {
60
+ const buf = await readFile(file);
61
+ if (buf.length > MAX_TEMPLATE_BYTES)
62
+ continue;
63
+ text = buf.toString('utf8');
64
+ }
65
+ catch {
66
+ continue;
67
+ }
68
+ const parsed = parseCommandFile(text);
69
+ if (!parsed.template)
70
+ continue;
71
+ out.set(name, { name, ...parsed, source, file });
72
+ }
73
+ }
74
+ return out;
75
+ }
76
+ function words(args) {
77
+ const out = [];
78
+ for (const m of args.matchAll(/"([^"]*)"|'([^']*)'|(\S+)/g))
79
+ out.push(m[1] ?? m[2] ?? m[3]);
80
+ return out;
81
+ }
82
+ /** The message a command sends for these arguments. */
83
+ export function expandCustomCommand(command, args) {
84
+ const trimmed = args.trim();
85
+ const positional = words(trimmed);
86
+ const usesArguments = command.template.includes('$ARGUMENTS');
87
+ const usesPositional = /\$[1-9]/.test(command.template);
88
+ // One pass, so an argument that itself contains `$1` or `$ARGUMENTS` is left alone.
89
+ const body = command.template.replace(/\$ARGUMENTS|\$([1-9])/g, (_m, n) => n ? (positional[Number(n) - 1] ?? '') : trimmed);
90
+ return !usesArguments && !usesPositional && trimmed ? `${body}\n\n${trimmed}` : body;
91
+ }
92
+ /** `/name — description` lines for help output. */
93
+ export function formatCustomCommands(commands) {
94
+ return [...commands.values()]
95
+ .sort((a, b) => a.name.localeCompare(b.name))
96
+ .map((c) => `/${c.name}${c.description ? ` — ${c.description}` : ''}${c.source === 'project' ? ' (project)' : ''}`)
97
+ .join('\n');
98
+ }
99
+ //# sourceMappingURL=custom-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-commands.js","sourceRoot":"","sources":["../../src/commands/custom-commands.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAItD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAiE5C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAWxE;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAatE;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,aAAa,GACjD,UAAU,CAkEZ;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,iBAAiB,SAAM,GACtB,OAAO,CAGT;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1H;AAED,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,iBAAiB,SAAM,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAET;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,YAAY,EAAE,EAC3B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAwC3B"}
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAKtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAiE5C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAWxE;AAQD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAetE;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,aAAa,GACjD,UAAU,CAkEZ;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,iBAAiB,SAAM,GACtB,OAAO,CAGT;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1H;AAED,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,GAAG,WAAW,EAC3B,iBAAiB,SAAM,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAET;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,YAAY,EAAE,EAC3B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAwC3B"}
@@ -12,6 +12,7 @@
12
12
  * dedicated cheaper model or even a deterministic extractive summarizer.
13
13
  */
14
14
  import { generateText } from 'ai';
15
+ import { mediaPartLabel, mediaPartTokens } from '../attachments.js';
15
16
  import { createLanguageModel } from '../providers.js';
16
17
  /**
17
18
  * Approximate model context window (input) in tokens. Used to decide when
@@ -95,6 +96,12 @@ export function getModelWindowTokens(model) {
95
96
  }
96
97
  return DEFAULT_WINDOW_TOKENS;
97
98
  }
99
+ /** JSON.stringify replacer that keeps image and file bytes out of a summary prompt. */
100
+ function withoutMedia(_key, value) {
101
+ if (typeof value === 'string' && value.startsWith('data:') && value.length > 200)
102
+ return '[media bytes]';
103
+ return mediaPartLabel(value) ?? value;
104
+ }
98
105
  /** Approximate token count from a string. Rough: ~4 chars/token. */
99
106
  export function estimateTokens(text) {
100
107
  return Math.ceil(text.length / 4);
@@ -113,6 +120,9 @@ export function estimateMessageTokens(messages) {
113
120
  if (part && typeof part === 'object' && 'text' in part) {
114
121
  total += estimateTokens(String(part.text ?? ''));
115
122
  }
123
+ else {
124
+ total += mediaPartTokens(part);
125
+ }
116
126
  }
117
127
  }
118
128
  }
@@ -141,7 +151,7 @@ export function buildLlmSummarizer(model, modelFactory) {
141
151
  return p;
142
152
  if (p && typeof p === 'object' && 'text' in p)
143
153
  return String(p.text);
144
- return JSON.stringify(p);
154
+ return mediaPartLabel(p) ?? JSON.stringify(p, withoutMedia);
145
155
  })
146
156
  .join('\n');
147
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mask.d.ts","sourceRoot":"","sources":["../../src/context/mask.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAoE,CAAC;AAItH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iHAAiH;AACjH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAO/F;AAsBD,4GAA4G;AAC5G,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAwBzG;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAAG,UAAU,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7F,qFAAqF;IACrF,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAepE"}
1
+ {"version":3,"file":"mask.d.ts","sourceRoot":"","sources":["../../src/context/mask.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAqF,CAAC;AAIvI,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iHAAiH;AACjH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAO/F;AAsBD,4GAA4G;AAC5G,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAwBzG;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAAG,UAAU,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7F,qFAAqF;IACrF,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAepE"}
@@ -1,5 +1,5 @@
1
1
  /** Results that say what a change did are kept: they are small and the model must not forget them. */
2
- export const NEVER_MASK_TOOLS = new Set(['write_file', 'edit_file', 'run_command', 'sub_agent']);
2
+ export const NEVER_MASK_TOOLS = new Set(['write_file', 'edit_file', 'edit_notebook', 'run_command', 'sub_agent']);
3
3
  const STUB_MARK = 'result not shown to save context';
4
4
  /** Index of the first message of the last `keepRecentTurns` assistant turns (0 when there are not that many). */
5
5
  export function maskBoundary(messages, keepRecentTurns) {
@@ -1 +1 @@
1
- {"version":3,"file":"mask.js","sourceRoot":"","sources":["../../src/context/mask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mask.js","sourceRoot":"","sources":["../../src/context/mask.ts"],"names":[],"mappings":"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"}
@@ -121,21 +121,48 @@ function splitLines(s) {
121
121
  parts.pop();
122
122
  return parts;
123
123
  }
124
+ /** Past this many table cells the middle of the diff is reported as removed-then-added (about 64 MB at most). */
125
+ const MAX_LCS_CELLS = 4_000_000;
124
126
  /**
125
- * Compute the LCS table and walk it back to produce a flat list of
126
- * operations. Standard LCS-Diff algorithm: O(N*M) time + space.
127
- *
128
- * For very large files this allocates O(N*M) which can blow memory;
129
- * see the file-level docstring for the size guideline.
127
+ * Line diff as a flat list of operations. Lines shared at the start and end are matched directly, and
128
+ * only the middle goes through the standard O(N*M) LCS table; a middle too big for that (a rewritten
129
+ * file) is reported as everything removed, then everything added, so memory stays bounded.
130
130
  */
131
131
  function diffLines(oldLines, newLines) {
132
- const n = oldLines.length;
133
- const m = newLines.length;
134
- // lcs[i][j] = length of LCS of oldLines[0..i] and newLines[0..j].
132
+ let head = 0;
133
+ while (head < oldLines.length && head < newLines.length && oldLines[head] === newLines[head])
134
+ head++;
135
+ let tail = 0;
136
+ while (tail < oldLines.length - head &&
137
+ tail < newLines.length - head &&
138
+ oldLines[oldLines.length - 1 - tail] === newLines[newLines.length - 1 - tail]) {
139
+ tail++;
140
+ }
141
+ const out = [];
142
+ for (let i = 0; i < head; i++)
143
+ out.push({ kind: 'equal', oldIndex: i, newIndex: i });
144
+ for (const op of diffMiddle(oldLines, newLines, head, oldLines.length - tail, newLines.length - tail))
145
+ out.push(op);
146
+ for (let t = tail; t > 0; t--) {
147
+ out.push({ kind: 'equal', oldIndex: oldLines.length - t, newIndex: newLines.length - t });
148
+ }
149
+ return out;
150
+ }
151
+ /** LCS diff of oldLines[from..oldEnd) against newLines[from..newEnd); indexes stay relative to the full arrays. */
152
+ function diffMiddle(oldLines, newLines, from, oldEnd, newEnd) {
153
+ const n = oldEnd - from;
154
+ const m = newEnd - from;
155
+ const replaced = () => [
156
+ ...Array.from({ length: n }, (_, i) => ({ kind: 'remove', oldIndex: from + i })),
157
+ ...Array.from({ length: m }, (_, j) => ({ kind: 'add', newIndex: from + j })),
158
+ ];
159
+ if (n === 0 || m === 0 || (n + 1) * (m + 1) > MAX_LCS_CELLS)
160
+ return replaced();
161
+ // lcs[i][j] = length of LCS of the first i old lines and the first j new lines of the middle.
135
162
  const lcs = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
136
163
  for (let i = 1; i <= n; i++) {
137
164
  for (let j = 1; j <= m; j++) {
138
- if (oldLines[i - 1] === newLines[j - 1]) {
165
+ if (oldLines[from + i - 1] === newLines[from + j - 1]) {
139
166
  lcs[i][j] = lcs[i - 1][j - 1] + 1;
140
167
  }
141
168
  else {
@@ -148,26 +175,26 @@ function diffLines(oldLines, newLines) {
148
175
  let i = n;
149
176
  let j = m;
150
177
  while (i > 0 && j > 0) {
151
- if (oldLines[i - 1] === newLines[j - 1]) {
152
- out.push({ kind: 'equal', oldIndex: i - 1, newIndex: j - 1 });
178
+ if (oldLines[from + i - 1] === newLines[from + j - 1]) {
179
+ out.push({ kind: 'equal', oldIndex: from + i - 1, newIndex: from + j - 1 });
153
180
  i--;
154
181
  j--;
155
182
  }
156
183
  else if (lcs[i - 1][j] >= lcs[i][j - 1]) {
157
- out.push({ kind: 'remove', oldIndex: i - 1 });
184
+ out.push({ kind: 'remove', oldIndex: from + i - 1 });
158
185
  i--;
159
186
  }
160
187
  else {
161
- out.push({ kind: 'add', newIndex: j - 1 });
188
+ out.push({ kind: 'add', newIndex: from + j - 1 });
162
189
  j--;
163
190
  }
164
191
  }
165
192
  while (i > 0) {
166
- out.push({ kind: 'remove', oldIndex: i - 1 });
193
+ out.push({ kind: 'remove', oldIndex: from + i - 1 });
167
194
  i--;
168
195
  }
169
196
  while (j > 0) {
170
- out.push({ kind: 'add', newIndex: j - 1 });
197
+ out.push({ kind: 'add', newIndex: from + j - 1 });
171
198
  j--;
172
199
  }
173
200
  out.reverse();