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.
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ScriptPreprocessing.test.d.ts.map
@@ -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.9",
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.22.4",
31
- "tree-sitter-javascript": "^0.25.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
  },
@@ -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 = new NodeVm.Script(`async function main() {
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* (
@@ -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
- "/Volumes/Code/effect/effect-smol/packages/effect/src/internal/effect.ts",
326
+ join(__dirname, "fixtures", "fiber.txt"),
326
327
  "utf-8",
327
328
  )
328
329
  const chunks = chunkFileContent("src/fiber.ts", fixture, {
@@ -534,7 +534,7 @@ const collectAstRanges = (
534
534
 
535
535
  try {
536
536
  const parser = new TreeSitter()
537
- parser.setLanguage(language as TreeSitter.Language)
537
+ parser.setLanguage(language)
538
538
  const tree = parser.parse(content, undefined, {
539
539
  bufferSize: 1024 * 1024,
540
540
  })