clanka 0.2.9 → 0.2.11
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/dist/AgentExecutor.d.ts.map +1 -1
- package/dist/AgentExecutor.js +25 -3
- package/dist/AgentExecutor.js.map +1 -1
- package/dist/CodeChunker.js.map +1 -1
- package/dist/CodeChunker.test.js +2 -1
- package/dist/CodeChunker.test.js.map +1 -1
- package/dist/OutputFormatter.d.ts +3 -1
- package/dist/OutputFormatter.d.ts.map +1 -1
- package/dist/OutputFormatter.js +60 -47
- package/dist/OutputFormatter.js.map +1 -1
- package/dist/ScriptPreprocessing.d.ts +2 -0
- package/dist/ScriptPreprocessing.d.ts.map +1 -0
- package/dist/ScriptPreprocessing.js +314 -0
- package/dist/ScriptPreprocessing.js.map +1 -0
- package/dist/ScriptPreprocessing.test.d.ts +2 -0
- package/dist/ScriptPreprocessing.test.d.ts.map +1 -0
- package/dist/ScriptPreprocessing.test.js +108 -0
- package/dist/ScriptPreprocessing.test.js.map +1 -0
- package/package.json +3 -3
- package/src/AgentExecutor.ts +27 -3
- package/src/CodeChunker.test.ts +2 -1
- package/src/CodeChunker.ts +1 -1
- package/src/OutputFormatter.ts +75 -57
- package/src/ScriptPreprocessing.test.ts +171 -0
- package/src/ScriptPreprocessing.ts +420 -0
- package/src/fixtures/patch-broken.txt +187 -0
- package/src/fixtures/patch-fixed.txt +187 -0
- package/src/fixtures/patch2-broken.txt +257 -0
- package/src/fixtures/patch2-fixed.txt +257 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
const isIdentifierChar = (char) => char !== undefined && /[A-Za-z0-9_$]/.test(char);
|
|
2
|
+
const isIdentifierStartChar = (char) => char !== undefined && /[A-Za-z_$]/.test(char);
|
|
3
|
+
const hasIdentifierBoundary = (text, index, length) => !isIdentifierChar(text[index - 1]) && !isIdentifierChar(text[index + length]);
|
|
4
|
+
const findNextIdentifier = (text, identifier, from) => {
|
|
5
|
+
let index = text.indexOf(identifier, from);
|
|
6
|
+
while (index !== -1) {
|
|
7
|
+
if (hasIdentifierBoundary(text, index, identifier.length)) {
|
|
8
|
+
return index;
|
|
9
|
+
}
|
|
10
|
+
index = text.indexOf(identifier, index + identifier.length);
|
|
11
|
+
}
|
|
12
|
+
return -1;
|
|
13
|
+
};
|
|
14
|
+
const skipWhitespace = (text, start) => {
|
|
15
|
+
let i = start;
|
|
16
|
+
while (i < text.length && /\s/.test(text[i])) {
|
|
17
|
+
i++;
|
|
18
|
+
}
|
|
19
|
+
return i;
|
|
20
|
+
};
|
|
21
|
+
const parseIdentifier = (text, start) => {
|
|
22
|
+
if (!isIdentifierStartChar(text[start])) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
let end = start + 1;
|
|
26
|
+
while (end < text.length && isIdentifierChar(text[end])) {
|
|
27
|
+
end++;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
name: text.slice(start, end),
|
|
31
|
+
end,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const isEscaped = (text, index) => {
|
|
35
|
+
let slashCount = 0;
|
|
36
|
+
let i = index - 1;
|
|
37
|
+
while (i >= 0 && text[i] === "\\") {
|
|
38
|
+
slashCount++;
|
|
39
|
+
i--;
|
|
40
|
+
}
|
|
41
|
+
return slashCount % 2 === 1;
|
|
42
|
+
};
|
|
43
|
+
const needsTemplateEscaping = (text) => {
|
|
44
|
+
for (let i = 0; i < text.length; i++) {
|
|
45
|
+
const char = text[i];
|
|
46
|
+
if (char === "`" && !isEscaped(text, i)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
if (char === "$" && text[i + 1] === "{" && !isEscaped(text, i)) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
};
|
|
55
|
+
const escapeTemplateLiteralContent = (text) => {
|
|
56
|
+
if (!needsTemplateEscaping(text)) {
|
|
57
|
+
return text;
|
|
58
|
+
}
|
|
59
|
+
let out = "";
|
|
60
|
+
for (let i = 0; i < text.length; i++) {
|
|
61
|
+
const char = text[i];
|
|
62
|
+
if (char === "\\") {
|
|
63
|
+
out += "\\\\";
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (char === "`" && !isEscaped(text, i)) {
|
|
67
|
+
out += "\\`";
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (char === "$" && text[i + 1] === "{" && !isEscaped(text, i)) {
|
|
71
|
+
out += "\\$";
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
out += char;
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
};
|
|
78
|
+
const findTemplateEnd = (text, start, isTerminator) => {
|
|
79
|
+
for (let i = start + 1; i < text.length; i++) {
|
|
80
|
+
if (text[i] !== "`" || isEscaped(text, i)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const next = skipWhitespace(text, i + 1);
|
|
84
|
+
if (isTerminator(text[next])) {
|
|
85
|
+
return i;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return -1;
|
|
89
|
+
};
|
|
90
|
+
const findTypeAnnotationAssignment = (text, start) => {
|
|
91
|
+
let i = start;
|
|
92
|
+
while (i < text.length) {
|
|
93
|
+
const char = text[i];
|
|
94
|
+
if (char === "=") {
|
|
95
|
+
return i;
|
|
96
|
+
}
|
|
97
|
+
if (char === "\n" || char === ";") {
|
|
98
|
+
return -1;
|
|
99
|
+
}
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
return -1;
|
|
103
|
+
};
|
|
104
|
+
const fixCallTemplateArgument = (script, functionName, isTerminator) => {
|
|
105
|
+
let out = script;
|
|
106
|
+
let cursor = 0;
|
|
107
|
+
while (cursor < out.length) {
|
|
108
|
+
const callStart = findNextIdentifier(out, functionName, cursor);
|
|
109
|
+
if (callStart === -1) {
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
const openParen = skipWhitespace(out, callStart + functionName.length);
|
|
113
|
+
if (out[openParen] !== "(") {
|
|
114
|
+
cursor = callStart + functionName.length;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const templateStart = skipWhitespace(out, openParen + 1);
|
|
118
|
+
if (out[templateStart] !== "`") {
|
|
119
|
+
cursor = openParen + 1;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const templateEnd = findTemplateEnd(out, templateStart, isTerminator);
|
|
123
|
+
if (templateEnd === -1) {
|
|
124
|
+
cursor = templateStart + 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const original = out.slice(templateStart + 1, templateEnd);
|
|
128
|
+
const escaped = escapeTemplateLiteralContent(original);
|
|
129
|
+
if (escaped !== original) {
|
|
130
|
+
out = `${out.slice(0, templateStart + 1)}${escaped}${out.slice(templateEnd)}`;
|
|
131
|
+
cursor = templateEnd + (escaped.length - original.length) + 1;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
cursor = templateEnd + 1;
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
};
|
|
138
|
+
const collectCallArgumentIdentifiers = (script, functionName) => {
|
|
139
|
+
const out = new Set();
|
|
140
|
+
let cursor = 0;
|
|
141
|
+
while (cursor < script.length) {
|
|
142
|
+
const callStart = findNextIdentifier(script, functionName, cursor);
|
|
143
|
+
if (callStart === -1) {
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
const openParen = skipWhitespace(script, callStart + functionName.length);
|
|
147
|
+
if (script[openParen] !== "(") {
|
|
148
|
+
cursor = callStart + functionName.length;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const argumentStart = skipWhitespace(script, openParen + 1);
|
|
152
|
+
const identifier = parseIdentifier(script, argumentStart);
|
|
153
|
+
if (identifier === undefined) {
|
|
154
|
+
cursor = openParen + 1;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const argumentEnd = skipWhitespace(script, identifier.end);
|
|
158
|
+
if (script[argumentEnd] === ")" || script[argumentEnd] === ",") {
|
|
159
|
+
out.add(identifier.name);
|
|
160
|
+
}
|
|
161
|
+
cursor = identifier.end;
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
};
|
|
165
|
+
const fixWriteFileContentTemplates = (script) => {
|
|
166
|
+
let out = script;
|
|
167
|
+
let cursor = 0;
|
|
168
|
+
while (cursor < out.length) {
|
|
169
|
+
const callStart = findNextIdentifier(out, "writeFile", cursor);
|
|
170
|
+
if (callStart === -1) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
const openParen = skipWhitespace(out, callStart + "writeFile".length);
|
|
174
|
+
if (out[openParen] !== "(") {
|
|
175
|
+
cursor = callStart + "writeFile".length;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const contentKey = findNextIdentifier(out, "content", openParen + 1);
|
|
179
|
+
if (contentKey === -1) {
|
|
180
|
+
cursor = openParen + 1;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const colon = skipWhitespace(out, contentKey + "content".length);
|
|
184
|
+
if (out[colon] !== ":") {
|
|
185
|
+
cursor = contentKey + "content".length;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const templateStart = skipWhitespace(out, colon + 1);
|
|
189
|
+
if (out[templateStart] !== "`") {
|
|
190
|
+
cursor = templateStart + 1;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const templateEnd = findTemplateEnd(out, templateStart, (char) => char === "}" || char === ",");
|
|
194
|
+
if (templateEnd === -1) {
|
|
195
|
+
cursor = templateStart + 1;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const original = out.slice(templateStart + 1, templateEnd);
|
|
199
|
+
const escaped = escapeTemplateLiteralContent(original);
|
|
200
|
+
if (escaped !== original) {
|
|
201
|
+
out = `${out.slice(0, templateStart + 1)}${escaped}${out.slice(templateEnd)}`;
|
|
202
|
+
cursor = templateEnd + (escaped.length - original.length) + 1;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
cursor = templateEnd + 1;
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
};
|
|
209
|
+
const collectWriteFileContentIdentifiers = (script) => {
|
|
210
|
+
const out = new Set();
|
|
211
|
+
let cursor = 0;
|
|
212
|
+
while (cursor < script.length) {
|
|
213
|
+
const callStart = findNextIdentifier(script, "writeFile", cursor);
|
|
214
|
+
if (callStart === -1) {
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
const openParen = skipWhitespace(script, callStart + "writeFile".length);
|
|
218
|
+
if (script[openParen] !== "(") {
|
|
219
|
+
cursor = callStart + "writeFile".length;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const contentKey = findNextIdentifier(script, "content", openParen + 1);
|
|
223
|
+
if (contentKey === -1) {
|
|
224
|
+
cursor = openParen + 1;
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const afterContent = skipWhitespace(script, contentKey + "content".length);
|
|
228
|
+
if (script[afterContent] === ":") {
|
|
229
|
+
const valueStart = skipWhitespace(script, afterContent + 1);
|
|
230
|
+
const identifier = parseIdentifier(script, valueStart);
|
|
231
|
+
if (identifier !== undefined) {
|
|
232
|
+
const valueEnd = skipWhitespace(script, identifier.end);
|
|
233
|
+
if (script[valueEnd] === "}" || script[valueEnd] === ",") {
|
|
234
|
+
out.add(identifier.name);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
cursor = valueStart + 1;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (script[afterContent] === "}" || script[afterContent] === ",") {
|
|
241
|
+
out.add("content");
|
|
242
|
+
cursor = afterContent + 1;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
cursor = afterContent + 1;
|
|
246
|
+
}
|
|
247
|
+
return out;
|
|
248
|
+
};
|
|
249
|
+
const fixAssignedTemplate = (script, variableName) => {
|
|
250
|
+
let out = script;
|
|
251
|
+
let cursor = 0;
|
|
252
|
+
while (cursor < out.length) {
|
|
253
|
+
const variableStart = findNextIdentifier(out, variableName, cursor);
|
|
254
|
+
if (variableStart === -1) {
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
let assignmentStart = skipWhitespace(out, variableStart + variableName.length);
|
|
258
|
+
if (out[assignmentStart] === ":") {
|
|
259
|
+
assignmentStart = findTypeAnnotationAssignment(out, assignmentStart + 1);
|
|
260
|
+
if (assignmentStart === -1) {
|
|
261
|
+
cursor = variableStart + variableName.length;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (out[assignmentStart] !== "=" ||
|
|
266
|
+
out[assignmentStart + 1] === "=" ||
|
|
267
|
+
out[assignmentStart + 1] === ">") {
|
|
268
|
+
cursor = variableStart + variableName.length;
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const templateStart = skipWhitespace(out, assignmentStart + 1);
|
|
272
|
+
if (out[templateStart] !== "`") {
|
|
273
|
+
cursor = templateStart + 1;
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const templateEnd = findTemplateEnd(out, templateStart, (char) => char === undefined ||
|
|
277
|
+
char === ";" ||
|
|
278
|
+
char === "," ||
|
|
279
|
+
char === ")" ||
|
|
280
|
+
char === "}" ||
|
|
281
|
+
char === "]");
|
|
282
|
+
if (templateEnd === -1) {
|
|
283
|
+
cursor = templateStart + 1;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const original = out.slice(templateStart + 1, templateEnd);
|
|
287
|
+
const escaped = escapeTemplateLiteralContent(original);
|
|
288
|
+
if (escaped !== original) {
|
|
289
|
+
out = `${out.slice(0, templateStart + 1)}${escaped}${out.slice(templateEnd)}`;
|
|
290
|
+
cursor = templateEnd + (escaped.length - original.length) + 1;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
cursor = templateEnd + 1;
|
|
294
|
+
}
|
|
295
|
+
return out;
|
|
296
|
+
};
|
|
297
|
+
const fixAssignedTemplatesForToolCalls = (script) => {
|
|
298
|
+
const identifiers = new Set();
|
|
299
|
+
for (const functionName of ["applyPatch", "taskComplete"]) {
|
|
300
|
+
for (const identifier of collectCallArgumentIdentifiers(script, functionName)) {
|
|
301
|
+
identifiers.add(identifier);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
for (const identifier of collectWriteFileContentIdentifiers(script)) {
|
|
305
|
+
identifiers.add(identifier);
|
|
306
|
+
}
|
|
307
|
+
let out = script;
|
|
308
|
+
for (const identifier of identifiers) {
|
|
309
|
+
out = fixAssignedTemplate(out, identifier);
|
|
310
|
+
}
|
|
311
|
+
return out;
|
|
312
|
+
};
|
|
313
|
+
export const preprocessScript = (script) => fixAssignedTemplatesForToolCalls(["applyPatch", "taskComplete"].reduce((current, functionName) => fixCallTemplateArgument(current, functionName, (char) => char === ")"), fixWriteFileContentTemplates(script)));
|
|
314
|
+
//# sourceMappingURL=ScriptPreprocessing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScriptPreprocessing.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScriptPreprocessing.test.d.ts","sourceRoot":"","sources":["../src/ScriptPreprocessing.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { assert, describe, it } from "@effect/vitest";
|
|
2
|
+
import { preprocessScript } from "./ScriptPreprocessing.js";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
const tick = "`";
|
|
6
|
+
const escaped = "\\`";
|
|
7
|
+
const escapedInterpolation = "\\${";
|
|
8
|
+
const wrapTemplate = (value) => `${tick}${value}${tick}`;
|
|
9
|
+
describe("preprocessScript", () => {
|
|
10
|
+
it("escapes internal backticks in applyPatch templates", () => {
|
|
11
|
+
const input = [
|
|
12
|
+
"await applyPatch(`",
|
|
13
|
+
"*** Begin Patch",
|
|
14
|
+
"*** Update File: src/example.ts",
|
|
15
|
+
"@@",
|
|
16
|
+
"-const oldValue = `old`",
|
|
17
|
+
"+const newValue = `new`",
|
|
18
|
+
"*** End Patch",
|
|
19
|
+
"`)",
|
|
20
|
+
].join("\n");
|
|
21
|
+
const output = preprocessScript(input);
|
|
22
|
+
assert.strictEqual(output.includes(`-const oldValue = ${escaped}old${escaped}`), true);
|
|
23
|
+
assert.strictEqual(output.includes(`+const newValue = ${escaped}new${escaped}`), true);
|
|
24
|
+
});
|
|
25
|
+
it("escapes internal interpolations in applyPatch templates", () => {
|
|
26
|
+
const input = [
|
|
27
|
+
"await applyPatch(`",
|
|
28
|
+
"*** Begin Patch",
|
|
29
|
+
"*** Update File: src/example.ts",
|
|
30
|
+
"@@",
|
|
31
|
+
"+const value = ${nextValue}",
|
|
32
|
+
"*** End Patch",
|
|
33
|
+
"`)",
|
|
34
|
+
].join("\n");
|
|
35
|
+
const output = preprocessScript(input);
|
|
36
|
+
assert.strictEqual(output.includes(`+const value = ${escapedInterpolation}nextValue}`), true);
|
|
37
|
+
});
|
|
38
|
+
it("escapes internal backticks in writeFile content templates", () => {
|
|
39
|
+
const input = [
|
|
40
|
+
"await writeFile({",
|
|
41
|
+
' path: "src/example.ts",',
|
|
42
|
+
" content: `const value = `next``,",
|
|
43
|
+
"})",
|
|
44
|
+
].join("\n");
|
|
45
|
+
const output = preprocessScript(input);
|
|
46
|
+
assert.strictEqual(output.includes(`content: ${wrapTemplate(`const value = ${escaped}next${escaped}`)},`), true);
|
|
47
|
+
});
|
|
48
|
+
it("escapes internal backticks in taskComplete templates", () => {
|
|
49
|
+
const input = "await taskComplete(`Implemented `TypeBuilder` updates.`)";
|
|
50
|
+
const output = preprocessScript(input);
|
|
51
|
+
assert.strictEqual(output, `await taskComplete(${wrapTemplate(`Implemented ${escaped}TypeBuilder${escaped} updates.`)})`);
|
|
52
|
+
});
|
|
53
|
+
it("does not change scripts when target templates are already escaped", () => {
|
|
54
|
+
const input = [
|
|
55
|
+
`await applyPatch(${wrapTemplate(`const value = ${escaped}safe${escaped}`)})`,
|
|
56
|
+
`await applyPatch(${wrapTemplate(`const value = ${escapedInterpolation}safe}`)})`,
|
|
57
|
+
`await writeFile({ path: "src/example.ts", content: ${wrapTemplate(`already ${escaped}safe${escaped}`)} })`,
|
|
58
|
+
`await taskComplete(${wrapTemplate(`All done with ${escaped}safe${escaped} backticks.`)})`,
|
|
59
|
+
].join("\n");
|
|
60
|
+
assert.strictEqual(preprocessScript(input), input);
|
|
61
|
+
});
|
|
62
|
+
it("does not modify non-target function calls", () => {
|
|
63
|
+
const input = "await otherTool(`Keep `this` untouched.`)";
|
|
64
|
+
assert.strictEqual(preprocessScript(input), input);
|
|
65
|
+
});
|
|
66
|
+
it("escapes internal backticks in applyPatch templates assigned to variables", () => {
|
|
67
|
+
const input = [
|
|
68
|
+
"const patch = `*** Begin Patch",
|
|
69
|
+
"*** Update File: src/example.ts",
|
|
70
|
+
"@@",
|
|
71
|
+
"-const oldValue = `old`",
|
|
72
|
+
"+const newValue = `new`",
|
|
73
|
+
"*** End Patch`;",
|
|
74
|
+
"await applyPatch(patch)",
|
|
75
|
+
].join("\n");
|
|
76
|
+
const output = preprocessScript(input);
|
|
77
|
+
assert.strictEqual(output.includes(`-const oldValue = ${escaped}old${escaped}`), true);
|
|
78
|
+
assert.strictEqual(output.includes(`+const newValue = ${escaped}new${escaped}`), true);
|
|
79
|
+
});
|
|
80
|
+
it("escapes internal backticks in taskComplete templates assigned to variables", () => {
|
|
81
|
+
const input = [
|
|
82
|
+
"const summary = `Implemented `TypeBuilder` updates.`;",
|
|
83
|
+
"await taskComplete(summary)",
|
|
84
|
+
].join("\n");
|
|
85
|
+
const output = preprocessScript(input);
|
|
86
|
+
assert.strictEqual(output, [
|
|
87
|
+
`const summary = ${wrapTemplate(`Implemented ${escaped}TypeBuilder${escaped} updates.`)};`,
|
|
88
|
+
"await taskComplete(summary)",
|
|
89
|
+
].join("\n"));
|
|
90
|
+
});
|
|
91
|
+
it("escapes internal backticks in writeFile content assigned to variables", () => {
|
|
92
|
+
const input = [
|
|
93
|
+
"const body = `const value = `next``;",
|
|
94
|
+
"await writeFile({",
|
|
95
|
+
' path: "src/example.ts",',
|
|
96
|
+
" content: body,",
|
|
97
|
+
"})",
|
|
98
|
+
].join("\n");
|
|
99
|
+
const output = preprocessScript(input);
|
|
100
|
+
assert.strictEqual(output.includes(`const body = ${wrapTemplate(`const value = ${escaped}next${escaped}`)};`), true);
|
|
101
|
+
});
|
|
102
|
+
it.each(["patch", "patch2"])("fixes broken %s", (fixture) => {
|
|
103
|
+
const content = readFileSync(join(__dirname, "fixtures", `${fixture}-broken.txt`), "utf-8");
|
|
104
|
+
const fixed = readFileSync(join(__dirname, "fixtures", `${fixture}-fixed.txt`), "utf-8");
|
|
105
|
+
assert.equal(preprocessScript(content), fixed);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=ScriptPreprocessing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScriptPreprocessing.test.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clanka",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.11",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"@vscode/ripgrep": "^1.17.1",
|
|
28
28
|
"chalk": "^5.6.2",
|
|
29
29
|
"glob": "^13.0.6",
|
|
30
|
-
"tree-sitter": "^0.
|
|
31
|
-
"tree-sitter-javascript": "^0.
|
|
30
|
+
"tree-sitter": "^0.21.0",
|
|
31
|
+
"tree-sitter-javascript": "^0.23.1",
|
|
32
32
|
"tree-sitter-typescript": "^0.23.2",
|
|
33
33
|
"turndown": "^7.2.2"
|
|
34
34
|
},
|
package/src/AgentExecutor.ts
CHANGED
|
@@ -38,6 +38,7 @@ import * as RpcGroup from "effect/unstable/rpc/RpcGroup"
|
|
|
38
38
|
import * as Rpc from "effect/unstable/rpc/Rpc"
|
|
39
39
|
import * as Result from "effect/Result"
|
|
40
40
|
import { SemanticSearch } from "./SemanticSearch.ts"
|
|
41
|
+
import { preprocessScript } from "./ScriptPreprocessing.ts"
|
|
41
42
|
import * as References from "effect/References"
|
|
42
43
|
|
|
43
44
|
/**
|
|
@@ -144,9 +145,7 @@ export const makeLocal = Effect.fnUntraced(function* <
|
|
|
144
145
|
const console = yield* Console.Console
|
|
145
146
|
let running = 0
|
|
146
147
|
|
|
147
|
-
const vmScript =
|
|
148
|
-
${opts.script}
|
|
149
|
-
}`)
|
|
148
|
+
const vmScript = compileScript(opts.script)
|
|
150
149
|
const sandbox: ScriptSandbox = {
|
|
151
150
|
main: defaultMain,
|
|
152
151
|
console,
|
|
@@ -433,6 +432,31 @@ interface ScriptSandbox {
|
|
|
433
432
|
[toolName: string]: unknown
|
|
434
433
|
}
|
|
435
434
|
|
|
435
|
+
const wrapScript = (script: string): string => `async function main() {
|
|
436
|
+
${script}
|
|
437
|
+
}`
|
|
438
|
+
|
|
439
|
+
const compileScript = (script: string): NodeVm.Script => {
|
|
440
|
+
try {
|
|
441
|
+
return new NodeVm.Script(wrapScript(script))
|
|
442
|
+
} catch (error) {
|
|
443
|
+
if (!(error instanceof SyntaxError)) {
|
|
444
|
+
throw error
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const preprocessed = preprocessScript(script)
|
|
448
|
+
if (preprocessed === script) {
|
|
449
|
+
throw error
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
try {
|
|
453
|
+
return new NodeVm.Script(wrapScript(preprocessed))
|
|
454
|
+
} catch {
|
|
455
|
+
throw error
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
436
460
|
const defaultMain = () => Promise.resolve()
|
|
437
461
|
|
|
438
462
|
const makeConsole = Effect.fn(function* (
|
package/src/CodeChunker.test.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
isProbablyMinified,
|
|
6
6
|
} from "./CodeChunker.ts"
|
|
7
7
|
import { readFileSync } from "node:fs"
|
|
8
|
+
import { join } from "node:path"
|
|
8
9
|
|
|
9
10
|
describe("isMeaningfulFile", () => {
|
|
10
11
|
it("keeps source and documentation files", () => {
|
|
@@ -322,7 +323,7 @@ describe("chunkFileContent", () => {
|
|
|
322
323
|
|
|
323
324
|
it("seperates class methods into their own chunks", () => {
|
|
324
325
|
const fixture = readFileSync(
|
|
325
|
-
"
|
|
326
|
+
join(__dirname, "fixtures", "fiber.txt"),
|
|
326
327
|
"utf-8",
|
|
327
328
|
)
|
|
328
329
|
const chunks = chunkFileContent("src/fiber.ts", fixture, {
|
package/src/CodeChunker.ts
CHANGED
|
@@ -534,7 +534,7 @@ const collectAstRanges = (
|
|
|
534
534
|
|
|
535
535
|
try {
|
|
536
536
|
const parser = new TreeSitter()
|
|
537
|
-
parser.setLanguage(language
|
|
537
|
+
parser.setLanguage(language)
|
|
538
538
|
const tree = parser.parse(content, undefined, {
|
|
539
539
|
bufferSize: 1024 * 1024,
|
|
540
540
|
})
|