@chiwanpark/pi-squared-agent 0.1.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/README.md +13 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +144 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/auth-store.d.ts +36 -0
- package/dist/runtime/auth-store.d.ts.map +1 -0
- package/dist/runtime/auth-store.js +131 -0
- package/dist/runtime/auth-store.js.map +1 -0
- package/dist/runtime/config-store.d.ts +44 -0
- package/dist/runtime/config-store.d.ts.map +1 -0
- package/dist/runtime/config-store.js +138 -0
- package/dist/runtime/config-store.js.map +1 -0
- package/dist/runtime/messages.d.ts +12 -0
- package/dist/runtime/messages.d.ts.map +1 -0
- package/dist/runtime/messages.js +101 -0
- package/dist/runtime/messages.js.map +1 -0
- package/dist/runtime/model-resolver.d.ts +52 -0
- package/dist/runtime/model-resolver.d.ts.map +1 -0
- package/dist/runtime/model-resolver.js +175 -0
- package/dist/runtime/model-resolver.js.map +1 -0
- package/dist/runtime/pi-agent.d.ts +83 -0
- package/dist/runtime/pi-agent.d.ts.map +1 -0
- package/dist/runtime/pi-agent.js +405 -0
- package/dist/runtime/pi-agent.js.map +1 -0
- package/dist/runtime/status-store.d.ts +50 -0
- package/dist/runtime/status-store.d.ts.map +1 -0
- package/dist/runtime/status-store.js +65 -0
- package/dist/runtime/status-store.js.map +1 -0
- package/dist/runtime/system-prompt.d.ts +11 -0
- package/dist/runtime/system-prompt.d.ts.map +1 -0
- package/dist/runtime/system-prompt.js +43 -0
- package/dist/runtime/system-prompt.js.map +1 -0
- package/dist/runtime/tools/bash.d.ts +23 -0
- package/dist/runtime/tools/bash.d.ts.map +1 -0
- package/dist/runtime/tools/bash.js +206 -0
- package/dist/runtime/tools/bash.js.map +1 -0
- package/dist/runtime/tools/child-process.d.ts +13 -0
- package/dist/runtime/tools/child-process.d.ts.map +1 -0
- package/dist/runtime/tools/child-process.js +75 -0
- package/dist/runtime/tools/child-process.js.map +1 -0
- package/dist/runtime/tools/output-accumulator.d.ts +52 -0
- package/dist/runtime/tools/output-accumulator.d.ts.map +1 -0
- package/dist/runtime/tools/output-accumulator.js +160 -0
- package/dist/runtime/tools/output-accumulator.js.map +1 -0
- package/dist/runtime/tools/shell.d.ts +26 -0
- package/dist/runtime/tools/shell.d.ts.map +1 -0
- package/dist/runtime/tools/shell.js +116 -0
- package/dist/runtime/tools/shell.js.map +1 -0
- package/dist/runtime/tools/truncate.d.ts +38 -0
- package/dist/runtime/tools/truncate.d.ts.map +1 -0
- package/dist/runtime/tools/truncate.js +98 -0
- package/dist/runtime/tools/truncate.js.map +1 -0
- package/dist/tools/bash/child-process.d.ts +13 -0
- package/dist/tools/bash/child-process.d.ts.map +1 -0
- package/dist/tools/bash/child-process.js +79 -0
- package/dist/tools/bash/child-process.js.map +1 -0
- package/dist/tools/bash/output-accumulator.d.ts +54 -0
- package/dist/tools/bash/output-accumulator.d.ts.map +1 -0
- package/dist/tools/bash/output-accumulator.js +171 -0
- package/dist/tools/bash/output-accumulator.js.map +1 -0
- package/dist/tools/bash/shell.d.ts +26 -0
- package/dist/tools/bash/shell.d.ts.map +1 -0
- package/dist/tools/bash/shell.js +129 -0
- package/dist/tools/bash/shell.js.map +1 -0
- package/dist/tools/bash/tool.d.ts +23 -0
- package/dist/tools/bash/tool.d.ts.map +1 -0
- package/dist/tools/bash/tool.js +219 -0
- package/dist/tools/bash/tool.js.map +1 -0
- package/dist/tools/bash/truncate.d.ts +50 -0
- package/dist/tools/bash/truncate.d.ts.map +1 -0
- package/dist/tools/bash/truncate.js +184 -0
- package/dist/tools/bash/truncate.js.map +1 -0
- package/dist/tools/external-tool.d.ts +2 -0
- package/dist/tools/external-tool.d.ts.map +1 -0
- package/dist/tools/external-tool.js +15 -0
- package/dist/tools/external-tool.js.map +1 -0
- package/dist/tools/file/edit-diff.d.ts +27 -0
- package/dist/tools/file/edit-diff.d.ts.map +1 -0
- package/dist/tools/file/edit-diff.js +196 -0
- package/dist/tools/file/edit-diff.js.map +1 -0
- package/dist/tools/file/edit.d.ts +26 -0
- package/dist/tools/file/edit.d.ts.map +1 -0
- package/dist/tools/file/edit.js +106 -0
- package/dist/tools/file/edit.js.map +1 -0
- package/dist/tools/file/find.d.ts +27 -0
- package/dist/tools/file/find.d.ts.map +1 -0
- package/dist/tools/file/find.js +150 -0
- package/dist/tools/file/find.js.map +1 -0
- package/dist/tools/file/glob.d.ts +6 -0
- package/dist/tools/file/glob.d.ts.map +1 -0
- package/dist/tools/file/glob.js +50 -0
- package/dist/tools/file/glob.js.map +1 -0
- package/dist/tools/file/grep.d.ts +29 -0
- package/dist/tools/file/grep.d.ts.map +1 -0
- package/dist/tools/file/grep.js +220 -0
- package/dist/tools/file/grep.js.map +1 -0
- package/dist/tools/file/index.d.ts +7 -0
- package/dist/tools/file/index.d.ts.map +1 -0
- package/dist/tools/file/index.js +7 -0
- package/dist/tools/file/index.js.map +1 -0
- package/dist/tools/file/ls.d.ts +27 -0
- package/dist/tools/file/ls.d.ts.map +1 -0
- package/dist/tools/file/ls.js +82 -0
- package/dist/tools/file/ls.js.map +1 -0
- package/dist/tools/file/read.d.ts +23 -0
- package/dist/tools/file/read.d.ts.map +1 -0
- package/dist/tools/file/read.js +98 -0
- package/dist/tools/file/read.js.map +1 -0
- package/dist/tools/file/write.d.ts +17 -0
- package/dist/tools/file/write.d.ts.map +1 -0
- package/dist/tools/file/write.js +45 -0
- package/dist/tools/file/write.js.map +1 -0
- package/dist/tools/file-mutation-queue.d.ts +3 -0
- package/dist/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/tools/file-mutation-queue.js +47 -0
- package/dist/tools/file-mutation-queue.js.map +1 -0
- package/dist/tools/path-utils.d.ts +5 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +79 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/web/index.d.ts +2 -0
- package/dist/tools/web/index.d.ts.map +1 -0
- package/dist/tools/web/index.js +2 -0
- package/dist/tools/web/index.js.map +1 -0
- package/dist/tools/web/search.d.ts +44 -0
- package/dist/tools/web/search.d.ts.map +1 -0
- package/dist/tools/web/search.js +209 -0
- package/dist/tools/web/search.js.map +1 -0
- package/dist/tui/box.d.ts +11 -0
- package/dist/tui/box.d.ts.map +1 -0
- package/dist/tui/box.js +24 -0
- package/dist/tui/box.js.map +1 -0
- package/dist/tui/chat-screen.d.ts +29 -0
- package/dist/tui/chat-screen.d.ts.map +1 -0
- package/dist/tui/chat-screen.js +475 -0
- package/dist/tui/chat-screen.js.map +1 -0
- package/dist/tui/commands.d.ts +34 -0
- package/dist/tui/commands.d.ts.map +1 -0
- package/dist/tui/commands.js +691 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/interactive.d.ts +9 -0
- package/dist/tui/interactive.d.ts.map +1 -0
- package/dist/tui/interactive.js +88 -0
- package/dist/tui/interactive.js.map +1 -0
- package/dist/tui/overlays.d.ts +39 -0
- package/dist/tui/overlays.d.ts.map +1 -0
- package/dist/tui/overlays.js +157 -0
- package/dist/tui/overlays.js.map +1 -0
- package/dist/tui/theme.d.ts +40 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +120 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/welcome.d.ts +3 -0
- package/dist/tui/welcome.d.ts.map +1 -0
- package/dist/tui/welcome.js +37 -0
- package/dist/tui/welcome.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
export function findExecutable(candidates) {
|
|
3
|
+
for (const candidate of candidates) {
|
|
4
|
+
const result = spawnSync(process.platform === "win32" ? "where" : "command", process.platform === "win32" ? [candidate] : ["-v", candidate], {
|
|
5
|
+
encoding: "utf-8",
|
|
6
|
+
shell: process.platform !== "win32",
|
|
7
|
+
timeout: 2000,
|
|
8
|
+
windowsHide: true,
|
|
9
|
+
});
|
|
10
|
+
if (result.status === 0 && result.stdout.trim())
|
|
11
|
+
return result.stdout.trim().split(/\r?\n/)[0];
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=external-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-tool.js","sourceRoot":"","sources":["../../src/tools/external-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,cAAc,CAAC,UAAoB;IACjD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,SAAS,CACtB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAClD,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAC9D;YACE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACnC,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,IAAI;SAClB,CACF,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Shared diff computation utilities for the edit tool. */
|
|
2
|
+
export interface Edit {
|
|
3
|
+
oldText: string;
|
|
4
|
+
newText: string;
|
|
5
|
+
}
|
|
6
|
+
export interface AppliedEditsResult {
|
|
7
|
+
baseContent: string;
|
|
8
|
+
newContent: string;
|
|
9
|
+
}
|
|
10
|
+
export interface EditDiffResult {
|
|
11
|
+
diff: string;
|
|
12
|
+
firstChangedLine: number | undefined;
|
|
13
|
+
}
|
|
14
|
+
export declare function detectLineEnding(content: string): "\r\n" | "\n";
|
|
15
|
+
export declare function normalizeToLF(text: string): string;
|
|
16
|
+
export declare function restoreLineEndings(text: string, ending: "\r\n" | "\n"): string;
|
|
17
|
+
export declare function stripBom(content: string): {
|
|
18
|
+
bom: string;
|
|
19
|
+
text: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function applyEditsToNormalizedContent(normalizedContent: string, edits: Edit[], path: string): AppliedEditsResult;
|
|
22
|
+
export declare function generateDiffString(oldContent: string, newContent: string, _contextLines?: number): {
|
|
23
|
+
diff: string;
|
|
24
|
+
firstChangedLine: number | undefined;
|
|
25
|
+
};
|
|
26
|
+
export declare function generateUnifiedPatch(path: string, oldContent: string, newContent: string): string;
|
|
27
|
+
//# sourceMappingURL=edit-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-diff.d.ts","sourceRoot":"","sources":["../../../src/tools/file/edit-diff.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE9E;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAEvE;AAsED,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,EAAE,MAAM,GACX,kBAAkB,CA0DpB;AAmDD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,aAAa,SAAI,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAkCxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQjG"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/** Shared diff computation utilities for the edit tool. */
|
|
2
|
+
export function detectLineEnding(content) {
|
|
3
|
+
const crlfIdx = content.indexOf("\r\n");
|
|
4
|
+
const lfIdx = content.indexOf("\n");
|
|
5
|
+
if (lfIdx === -1 || crlfIdx === -1)
|
|
6
|
+
return "\n";
|
|
7
|
+
return crlfIdx < lfIdx ? "\r\n" : "\n";
|
|
8
|
+
}
|
|
9
|
+
export function normalizeToLF(text) {
|
|
10
|
+
return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
11
|
+
}
|
|
12
|
+
export function restoreLineEndings(text, ending) {
|
|
13
|
+
return ending === "\r\n" ? text.replace(/\n/g, "\r\n") : text;
|
|
14
|
+
}
|
|
15
|
+
export function stripBom(content) {
|
|
16
|
+
return content.startsWith("\uFEFF") ? { bom: "\uFEFF", text: content.slice(1) } : { bom: "", text: content };
|
|
17
|
+
}
|
|
18
|
+
function normalizeForFuzzyMatch(text) {
|
|
19
|
+
return text
|
|
20
|
+
.normalize("NFKC")
|
|
21
|
+
.split("\n")
|
|
22
|
+
.map((line) => line.trimEnd())
|
|
23
|
+
.join("\n")
|
|
24
|
+
.replace(/[\u2018\u2019\u201A\u201B]/g, "'")
|
|
25
|
+
.replace(/[\u201C\u201D\u201E\u201F]/g, '"')
|
|
26
|
+
.replace(/[\u2010\u2011\u2012\u2013\u2014\u2015\u2212]/g, "-")
|
|
27
|
+
.replace(/[\u00A0\u2002-\u200A\u202F\u205F\u3000]/g, " ");
|
|
28
|
+
}
|
|
29
|
+
function findText(content, oldText) {
|
|
30
|
+
const exactIndex = content.indexOf(oldText);
|
|
31
|
+
if (exactIndex !== -1) {
|
|
32
|
+
return { found: true, index: exactIndex, matchLength: oldText.length, usedFuzzyMatch: false };
|
|
33
|
+
}
|
|
34
|
+
const fuzzyContent = normalizeForFuzzyMatch(content);
|
|
35
|
+
const fuzzyOldText = normalizeForFuzzyMatch(oldText);
|
|
36
|
+
const fuzzyIndex = fuzzyContent.indexOf(fuzzyOldText);
|
|
37
|
+
if (fuzzyIndex === -1)
|
|
38
|
+
return { found: false, index: -1, matchLength: 0, usedFuzzyMatch: false };
|
|
39
|
+
return { found: true, index: fuzzyIndex, matchLength: fuzzyOldText.length, usedFuzzyMatch: true };
|
|
40
|
+
}
|
|
41
|
+
function countOccurrences(content, oldText) {
|
|
42
|
+
const fuzzyContent = normalizeForFuzzyMatch(content);
|
|
43
|
+
const fuzzyOldText = normalizeForFuzzyMatch(oldText);
|
|
44
|
+
if (fuzzyOldText.length === 0)
|
|
45
|
+
return 0;
|
|
46
|
+
return fuzzyContent.split(fuzzyOldText).length - 1;
|
|
47
|
+
}
|
|
48
|
+
function notFoundError(path, editIndex, totalEdits) {
|
|
49
|
+
if (totalEdits === 1) {
|
|
50
|
+
return new Error(`Could not find the exact text in ${path}. The old text must match exactly including all whitespace and newlines.`);
|
|
51
|
+
}
|
|
52
|
+
return new Error(`Could not find edits[${editIndex}] in ${path}. The oldText must match exactly including all whitespace and newlines.`);
|
|
53
|
+
}
|
|
54
|
+
function duplicateError(path, editIndex, totalEdits, occurrences) {
|
|
55
|
+
if (totalEdits === 1) {
|
|
56
|
+
return new Error(`Found ${occurrences} occurrences of the text in ${path}. The text must be unique. Please provide more context to make it unique.`);
|
|
57
|
+
}
|
|
58
|
+
return new Error(`Found ${occurrences} occurrences of edits[${editIndex}] in ${path}. Each oldText must be unique. Please provide more context to make it unique.`);
|
|
59
|
+
}
|
|
60
|
+
export function applyEditsToNormalizedContent(normalizedContent, edits, path) {
|
|
61
|
+
const normalizedEdits = edits.map((edit) => ({
|
|
62
|
+
oldText: normalizeToLF(edit.oldText),
|
|
63
|
+
newText: normalizeToLF(edit.newText),
|
|
64
|
+
}));
|
|
65
|
+
for (let i = 0; i < normalizedEdits.length; i += 1) {
|
|
66
|
+
if ((normalizedEdits[i]?.oldText ?? "").length === 0) {
|
|
67
|
+
throw new Error(normalizedEdits.length === 1
|
|
68
|
+
? `oldText must not be empty in ${path}.`
|
|
69
|
+
: `edits[${i}].oldText must not be empty in ${path}.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const usesFuzzy = normalizedEdits.some((edit) => findText(normalizedContent, edit.oldText).usedFuzzyMatch);
|
|
73
|
+
const baseContent = usesFuzzy ? normalizeForFuzzyMatch(normalizedContent) : normalizedContent;
|
|
74
|
+
const matchedEdits = [];
|
|
75
|
+
for (let i = 0; i < normalizedEdits.length; i += 1) {
|
|
76
|
+
const edit = normalizedEdits[i];
|
|
77
|
+
const match = findText(baseContent, edit.oldText);
|
|
78
|
+
if (!match.found)
|
|
79
|
+
throw notFoundError(path, i, normalizedEdits.length);
|
|
80
|
+
const occurrences = countOccurrences(baseContent, edit.oldText);
|
|
81
|
+
if (occurrences > 1)
|
|
82
|
+
throw duplicateError(path, i, normalizedEdits.length, occurrences);
|
|
83
|
+
matchedEdits.push({ editIndex: i, matchIndex: match.index, matchLength: match.matchLength, newText: edit.newText });
|
|
84
|
+
}
|
|
85
|
+
matchedEdits.sort((a, b) => a.matchIndex - b.matchIndex);
|
|
86
|
+
for (let i = 1; i < matchedEdits.length; i += 1) {
|
|
87
|
+
const previous = matchedEdits[i - 1];
|
|
88
|
+
const current = matchedEdits[i];
|
|
89
|
+
if (previous.matchIndex + previous.matchLength > current.matchIndex) {
|
|
90
|
+
throw new Error(`edits[${previous.editIndex}] and edits[${current.editIndex}] overlap in ${path}. Merge them into one edit or target disjoint regions.`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
let newContent = baseContent;
|
|
94
|
+
for (let i = matchedEdits.length - 1; i >= 0; i -= 1) {
|
|
95
|
+
const edit = matchedEdits[i];
|
|
96
|
+
newContent =
|
|
97
|
+
newContent.slice(0, edit.matchIndex) + edit.newText + newContent.slice(edit.matchIndex + edit.matchLength);
|
|
98
|
+
}
|
|
99
|
+
if (baseContent === newContent) {
|
|
100
|
+
throw new Error(normalizedEdits.length === 1
|
|
101
|
+
? `No changes made to ${path}. The replacement produced identical content.`
|
|
102
|
+
: `No changes made to ${path}. The replacements produced identical content.`);
|
|
103
|
+
}
|
|
104
|
+
return { baseContent, newContent };
|
|
105
|
+
}
|
|
106
|
+
function splitForDiff(content) {
|
|
107
|
+
const lines = content.split("\n");
|
|
108
|
+
if (content.endsWith("\n"))
|
|
109
|
+
lines.pop();
|
|
110
|
+
return lines;
|
|
111
|
+
}
|
|
112
|
+
function lineDiff(oldLines, newLines) {
|
|
113
|
+
const m = oldLines.length;
|
|
114
|
+
const n = newLines.length;
|
|
115
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
116
|
+
for (let i = m - 1; i >= 0; i -= 1) {
|
|
117
|
+
for (let j = n - 1; j >= 0; j -= 1) {
|
|
118
|
+
dp[i][j] = oldLines[i] === newLines[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const parts = [];
|
|
122
|
+
const push = (part) => {
|
|
123
|
+
const last = parts[parts.length - 1];
|
|
124
|
+
if (last && last.added === part.added && last.removed === part.removed)
|
|
125
|
+
last.value.push(...part.value);
|
|
126
|
+
else
|
|
127
|
+
parts.push(part);
|
|
128
|
+
};
|
|
129
|
+
let i = 0;
|
|
130
|
+
let j = 0;
|
|
131
|
+
while (i < m && j < n) {
|
|
132
|
+
if (oldLines[i] === newLines[j]) {
|
|
133
|
+
push({ value: [oldLines[i] ?? ""] });
|
|
134
|
+
i += 1;
|
|
135
|
+
j += 1;
|
|
136
|
+
}
|
|
137
|
+
else if (dp[i + 1][j] >= dp[i][j + 1]) {
|
|
138
|
+
push({ value: [oldLines[i] ?? ""], removed: true });
|
|
139
|
+
i += 1;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
push({ value: [newLines[j] ?? ""], added: true });
|
|
143
|
+
j += 1;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
while (i < m)
|
|
147
|
+
push({ value: [oldLines[i++] ?? ""], removed: true });
|
|
148
|
+
while (j < n)
|
|
149
|
+
push({ value: [newLines[j++] ?? ""], added: true });
|
|
150
|
+
return parts;
|
|
151
|
+
}
|
|
152
|
+
export function generateDiffString(oldContent, newContent, _contextLines = 4) {
|
|
153
|
+
const oldLines = splitForDiff(oldContent);
|
|
154
|
+
const newLines = splitForDiff(newContent);
|
|
155
|
+
const parts = lineDiff(oldLines, newLines);
|
|
156
|
+
const maxLineNum = Math.max(oldLines.length, newLines.length, 1);
|
|
157
|
+
const lineNumWidth = String(maxLineNum).length;
|
|
158
|
+
const output = [];
|
|
159
|
+
let oldLineNum = 1;
|
|
160
|
+
let newLineNum = 1;
|
|
161
|
+
let firstChangedLine;
|
|
162
|
+
for (const part of parts) {
|
|
163
|
+
if (part.added || part.removed) {
|
|
164
|
+
if (firstChangedLine === undefined)
|
|
165
|
+
firstChangedLine = newLineNum;
|
|
166
|
+
for (const line of part.value) {
|
|
167
|
+
if (part.added) {
|
|
168
|
+
output.push(`+${String(newLineNum).padStart(lineNumWidth, " ")} ${line}`);
|
|
169
|
+
newLineNum += 1;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
output.push(`-${String(oldLineNum).padStart(lineNumWidth, " ")} ${line}`);
|
|
173
|
+
oldLineNum += 1;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
for (const line of part.value) {
|
|
179
|
+
output.push(` ${String(oldLineNum).padStart(lineNumWidth, " ")} ${line}`);
|
|
180
|
+
oldLineNum += 1;
|
|
181
|
+
newLineNum += 1;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { diff: output.join("\n"), firstChangedLine };
|
|
185
|
+
}
|
|
186
|
+
export function generateUnifiedPatch(path, oldContent, newContent) {
|
|
187
|
+
const parts = lineDiff(splitForDiff(oldContent), splitForDiff(newContent));
|
|
188
|
+
const lines = [`--- ${path}`, `+++ ${path}`];
|
|
189
|
+
for (const part of parts) {
|
|
190
|
+
const prefix = part.added ? "+" : part.removed ? "-" : " ";
|
|
191
|
+
for (const line of part.value)
|
|
192
|
+
lines.push(`${prefix}${line}`);
|
|
193
|
+
}
|
|
194
|
+
return `${lines.join("\n")}\n`;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=edit-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-diff.js","sourceRoot":"","sources":["../../../src/tools/file/edit-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type Static, Type } from "typebox";
|
|
3
|
+
declare const editSchema: Type.TObject<{
|
|
4
|
+
path: Type.TString;
|
|
5
|
+
edits: Type.TArray<Type.TObject<{
|
|
6
|
+
oldText: Type.TString;
|
|
7
|
+
newText: Type.TString;
|
|
8
|
+
}>>;
|
|
9
|
+
}>;
|
|
10
|
+
export type EditToolInput = Static<typeof editSchema>;
|
|
11
|
+
export interface EditToolDetails {
|
|
12
|
+
diff: string;
|
|
13
|
+
patch: string;
|
|
14
|
+
firstChangedLine?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface EditOperations {
|
|
17
|
+
readFile: (absolutePath: string) => Promise<Buffer>;
|
|
18
|
+
writeFile: (absolutePath: string, content: string) => Promise<void>;
|
|
19
|
+
access: (absolutePath: string) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface EditToolOptions {
|
|
22
|
+
operations?: EditOperations;
|
|
23
|
+
}
|
|
24
|
+
export declare function createEditTool(cwd: string, options?: EditToolOptions): AgentTool<typeof editSchema, EditToolDetails>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/tools/file/edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AA0B5C,QAAA,MAAM,UAAU;;;;;;EASf,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAItD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAQD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAgCD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,EAAE,eAAe,CAAC,CAyDpH"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access as fsAccess, readFile as fsReadFile, writeFile as fsWriteFile } from "node:fs/promises";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { withFileMutationQueue } from "../file-mutation-queue.js";
|
|
5
|
+
import { resolveToCwd } from "../path-utils.js";
|
|
6
|
+
import { applyEditsToNormalizedContent, detectLineEnding, generateDiffString, generateUnifiedPatch, normalizeToLF, restoreLineEndings, stripBom, } from "./edit-diff.js";
|
|
7
|
+
const replaceEditSchema = Type.Object({
|
|
8
|
+
oldText: Type.String({
|
|
9
|
+
description: "Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call.",
|
|
10
|
+
}),
|
|
11
|
+
newText: Type.String({ description: "Replacement text for this targeted edit." }),
|
|
12
|
+
}, { additionalProperties: false });
|
|
13
|
+
const editSchema = Type.Object({
|
|
14
|
+
path: Type.String({ description: "Path to the file to edit (relative or absolute)" }),
|
|
15
|
+
edits: Type.Array(replaceEditSchema, {
|
|
16
|
+
description: "One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits.",
|
|
17
|
+
}),
|
|
18
|
+
}, { additionalProperties: false });
|
|
19
|
+
const defaultEditOperations = {
|
|
20
|
+
readFile: (path) => fsReadFile(path),
|
|
21
|
+
writeFile: (path, content) => fsWriteFile(path, content, "utf-8"),
|
|
22
|
+
access: (path) => fsAccess(path, constants.R_OK | constants.W_OK),
|
|
23
|
+
};
|
|
24
|
+
function prepareEditArguments(input) {
|
|
25
|
+
if (!input || typeof input !== "object")
|
|
26
|
+
return input;
|
|
27
|
+
const args = { ...input };
|
|
28
|
+
if (typeof args.edits === "string") {
|
|
29
|
+
try {
|
|
30
|
+
const parsed = JSON.parse(args.edits);
|
|
31
|
+
if (Array.isArray(parsed))
|
|
32
|
+
args.edits = parsed;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Leave validation to the schema/execute path.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const legacy = args;
|
|
39
|
+
if (typeof legacy.oldText !== "string" || typeof legacy.newText !== "string")
|
|
40
|
+
return args;
|
|
41
|
+
const edits = Array.isArray(legacy.edits) ? [...legacy.edits] : [];
|
|
42
|
+
edits.push({ oldText: legacy.oldText, newText: legacy.newText });
|
|
43
|
+
delete args.oldText;
|
|
44
|
+
delete args.newText;
|
|
45
|
+
return { ...args, edits };
|
|
46
|
+
}
|
|
47
|
+
function validateEditInput(input) {
|
|
48
|
+
if (!Array.isArray(input.edits) || input.edits.length === 0) {
|
|
49
|
+
throw new Error("Edit tool input is invalid. edits must contain at least one replacement.");
|
|
50
|
+
}
|
|
51
|
+
return { path: input.path, edits: input.edits };
|
|
52
|
+
}
|
|
53
|
+
export function createEditTool(cwd, options) {
|
|
54
|
+
const ops = options?.operations ?? defaultEditOperations;
|
|
55
|
+
return {
|
|
56
|
+
name: "edit",
|
|
57
|
+
label: "edit",
|
|
58
|
+
description: "Edit a file by replacing one or more exact text blocks. oldText must match uniquely in the original file. Preserves existing line endings.",
|
|
59
|
+
parameters: editSchema,
|
|
60
|
+
prepareArguments: prepareEditArguments,
|
|
61
|
+
executionMode: "sequential",
|
|
62
|
+
execute: async (_toolCallId, input, signal) => {
|
|
63
|
+
const { path, edits } = validateEditInput(input);
|
|
64
|
+
const absolutePath = resolveToCwd(path, cwd);
|
|
65
|
+
return withFileMutationQueue(absolutePath, async () => {
|
|
66
|
+
const throwIfAborted = () => {
|
|
67
|
+
if (signal?.aborted)
|
|
68
|
+
throw new Error("Operation aborted");
|
|
69
|
+
};
|
|
70
|
+
throwIfAborted();
|
|
71
|
+
try {
|
|
72
|
+
await ops.access(absolutePath);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throwIfAborted();
|
|
76
|
+
const errorMessage = error instanceof Error && "code" in error
|
|
77
|
+
? `Error code: ${error.code}`
|
|
78
|
+
: String(error);
|
|
79
|
+
throw new Error(`Could not edit file: ${path}. ${errorMessage}.`);
|
|
80
|
+
}
|
|
81
|
+
throwIfAborted();
|
|
82
|
+
const buffer = await ops.readFile(absolutePath);
|
|
83
|
+
const rawContent = buffer.toString("utf-8");
|
|
84
|
+
throwIfAborted();
|
|
85
|
+
const { bom, text: content } = stripBom(rawContent);
|
|
86
|
+
const originalEnding = detectLineEnding(content);
|
|
87
|
+
const normalizedContent = normalizeToLF(content);
|
|
88
|
+
const { baseContent, newContent } = applyEditsToNormalizedContent(normalizedContent, edits, path);
|
|
89
|
+
throwIfAborted();
|
|
90
|
+
const finalContent = bom + restoreLineEndings(newContent, originalEnding);
|
|
91
|
+
await ops.writeFile(absolutePath, finalContent);
|
|
92
|
+
throwIfAborted();
|
|
93
|
+
const diffResult = generateDiffString(baseContent, newContent);
|
|
94
|
+
const patch = generateUnifiedPatch(path, baseContent, newContent);
|
|
95
|
+
const details = { diff: diffResult.diff, patch };
|
|
96
|
+
if (diffResult.firstChangedLine !== undefined)
|
|
97
|
+
details.firstChangedLine = diffResult.firstChangedLine;
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: "text", text: `Successfully replaced ${edits.length} block(s) in ${path}.` }],
|
|
100
|
+
details,
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/file/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type Static, Type } from "typebox";
|
|
3
|
+
import { type TruncationResult } from "../bash/truncate.js";
|
|
4
|
+
declare const findSchema: Type.TObject<{
|
|
5
|
+
pattern: Type.TString;
|
|
6
|
+
path: Type.TOptional<Type.TString>;
|
|
7
|
+
limit: Type.TOptional<Type.TNumber>;
|
|
8
|
+
}>;
|
|
9
|
+
export type FindToolInput = Static<typeof findSchema>;
|
|
10
|
+
export interface FindToolDetails {
|
|
11
|
+
truncation?: TruncationResult;
|
|
12
|
+
resultLimitReached?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface FindOperations {
|
|
15
|
+
exists: (absolutePath: string) => Promise<boolean> | boolean;
|
|
16
|
+
glob: (pattern: string, cwd: string, options: {
|
|
17
|
+
ignore: string[];
|
|
18
|
+
limit: number;
|
|
19
|
+
}) => Promise<string[]> | string[];
|
|
20
|
+
}
|
|
21
|
+
export interface FindToolOptions {
|
|
22
|
+
operations?: FindOperations;
|
|
23
|
+
fdPath?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function createFindTool(cwd: string, options?: FindToolOptions): AgentTool<typeof findSchema, FindToolDetails | undefined>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=find.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../src/tools/file/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI/D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAA+C,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKzG,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAItD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CACpH;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACxB,SAAS,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CA8B3D"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { Type } from "typebox";
|
|
5
|
+
import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from "../bash/truncate.js";
|
|
6
|
+
import { findExecutable } from "../external-tool.js";
|
|
7
|
+
import { pathExists, resolveToCwd } from "../path-utils.js";
|
|
8
|
+
import { toPosixPath } from "./glob.js";
|
|
9
|
+
const findSchema = Type.Object({
|
|
10
|
+
pattern: Type.String({ description: "Glob pattern to match files, e.g. '*.ts', '**/*.json', or 'src/**/*.spec.ts'" }),
|
|
11
|
+
path: Type.Optional(Type.String({ description: "Directory to search in (default: current directory)" })),
|
|
12
|
+
limit: Type.Optional(Type.Number({ description: "Maximum number of results (default: 1000)" })),
|
|
13
|
+
});
|
|
14
|
+
const DEFAULT_LIMIT = 1000;
|
|
15
|
+
export function createFindTool(cwd, options) {
|
|
16
|
+
const customOps = options?.operations;
|
|
17
|
+
return {
|
|
18
|
+
name: "find",
|
|
19
|
+
label: "find",
|
|
20
|
+
description: `Search for files by glob pattern using fd. Returns matching file paths relative to the search directory. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} results or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,
|
|
21
|
+
parameters: findSchema,
|
|
22
|
+
execute: async (_toolCallId, { pattern, path: searchDir, limit }, signal) => {
|
|
23
|
+
if (signal?.aborted)
|
|
24
|
+
throw new Error("Operation aborted");
|
|
25
|
+
const searchPath = resolveToCwd(searchDir || ".", cwd);
|
|
26
|
+
const effectiveLimit = Math.max(1, Math.floor(limit ?? DEFAULT_LIMIT));
|
|
27
|
+
if (customOps) {
|
|
28
|
+
if (!(await customOps.exists(searchPath)))
|
|
29
|
+
throw new Error(`Path not found: ${searchPath}`);
|
|
30
|
+
const found = await customOps.glob(pattern, searchPath, {
|
|
31
|
+
ignore: ["**/node_modules/**", "**/.git/**"],
|
|
32
|
+
limit: effectiveLimit,
|
|
33
|
+
});
|
|
34
|
+
return formatResults(relativizeResults(found, searchPath), effectiveLimit);
|
|
35
|
+
}
|
|
36
|
+
if (!(await pathExists(searchPath)))
|
|
37
|
+
throw new Error(`Path not found: ${searchPath}`);
|
|
38
|
+
const fdPath = options?.fdPath ?? findExecutable(["fd", "fdfind"]);
|
|
39
|
+
if (!fdPath)
|
|
40
|
+
throw new Error("fd is not available. Install fd (or fdfind) to use the find tool.");
|
|
41
|
+
const args = buildFdArgs(pattern, searchPath, effectiveLimit);
|
|
42
|
+
const lines = await runLineCommand(fdPath, args, signal, "fd");
|
|
43
|
+
return formatResults(relativizeResults(lines, searchPath), effectiveLimit);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function buildFdArgs(pattern, searchPath, limit) {
|
|
48
|
+
const args = [
|
|
49
|
+
"--glob",
|
|
50
|
+
"--color=never",
|
|
51
|
+
"--hidden",
|
|
52
|
+
"--no-require-git",
|
|
53
|
+
"--exclude",
|
|
54
|
+
".git",
|
|
55
|
+
"--exclude",
|
|
56
|
+
"node_modules",
|
|
57
|
+
"--max-results",
|
|
58
|
+
String(limit),
|
|
59
|
+
];
|
|
60
|
+
let effectivePattern = pattern;
|
|
61
|
+
if (pattern.includes("/")) {
|
|
62
|
+
args.push("--full-path");
|
|
63
|
+
if (!pattern.startsWith("/") && !pattern.startsWith("**/") && pattern !== "**")
|
|
64
|
+
effectivePattern = `**/${pattern}`;
|
|
65
|
+
}
|
|
66
|
+
args.push("--", effectivePattern, searchPath);
|
|
67
|
+
return args;
|
|
68
|
+
}
|
|
69
|
+
function runLineCommand(command, args, signal, name) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
|
|
72
|
+
const rl = createInterface({ input: child.stdout });
|
|
73
|
+
const lines = [];
|
|
74
|
+
let stderr = "";
|
|
75
|
+
let settled = false;
|
|
76
|
+
const cleanup = () => {
|
|
77
|
+
rl.close();
|
|
78
|
+
signal?.removeEventListener("abort", onAbort);
|
|
79
|
+
};
|
|
80
|
+
const settle = (fn) => {
|
|
81
|
+
if (settled)
|
|
82
|
+
return;
|
|
83
|
+
settled = true;
|
|
84
|
+
cleanup();
|
|
85
|
+
fn();
|
|
86
|
+
};
|
|
87
|
+
const onAbort = () => {
|
|
88
|
+
if (!child.killed)
|
|
89
|
+
child.kill();
|
|
90
|
+
settle(() => reject(new Error("Operation aborted")));
|
|
91
|
+
};
|
|
92
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
93
|
+
child.stderr?.on("data", (chunk) => {
|
|
94
|
+
stderr += chunk.toString();
|
|
95
|
+
});
|
|
96
|
+
rl.on("line", (line) => lines.push(line));
|
|
97
|
+
child.on("error", (error) => settle(() => reject(new Error(`Failed to run ${name}: ${error.message}`))));
|
|
98
|
+
child.on("close", (code) => {
|
|
99
|
+
if (signal?.aborted) {
|
|
100
|
+
settle(() => reject(new Error("Operation aborted")));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (code !== 0 && lines.length === 0) {
|
|
104
|
+
settle(() => reject(new Error(stderr.trim() || `${name} exited with code ${code}`)));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
settle(() => resolve(lines));
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function relativizeResults(results, searchPath) {
|
|
112
|
+
const output = [];
|
|
113
|
+
for (const raw of results) {
|
|
114
|
+
const line = raw.replace(/\r$/, "").trim();
|
|
115
|
+
if (!line)
|
|
116
|
+
continue;
|
|
117
|
+
const hadTrailingSlash = line.endsWith("/") || line.endsWith("\\");
|
|
118
|
+
let relativePath = path.isAbsolute(line) ? path.relative(searchPath, line) : line;
|
|
119
|
+
if (relativePath.startsWith(searchPath))
|
|
120
|
+
relativePath = relativePath.slice(searchPath.length + 1);
|
|
121
|
+
if (hadTrailingSlash && !relativePath.endsWith("/"))
|
|
122
|
+
relativePath += "/";
|
|
123
|
+
output.push(toPosixPath(relativePath));
|
|
124
|
+
}
|
|
125
|
+
return output;
|
|
126
|
+
}
|
|
127
|
+
function formatResults(results, effectiveLimit) {
|
|
128
|
+
if (results.length === 0)
|
|
129
|
+
return { content: [{ type: "text", text: "No files found matching pattern" }], details: undefined };
|
|
130
|
+
const resultLimitReached = results.length >= effectiveLimit;
|
|
131
|
+
const truncation = truncateHead(results.join("\n"), { maxLines: Number.MAX_SAFE_INTEGER });
|
|
132
|
+
let output = truncation.content;
|
|
133
|
+
const details = {};
|
|
134
|
+
const notices = [];
|
|
135
|
+
if (resultLimitReached) {
|
|
136
|
+
notices.push(`${effectiveLimit} results limit reached. Use limit=${effectiveLimit * 2} for more, or refine pattern`);
|
|
137
|
+
details.resultLimitReached = effectiveLimit;
|
|
138
|
+
}
|
|
139
|
+
if (truncation.truncated) {
|
|
140
|
+
notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
|
|
141
|
+
details.truncation = truncation;
|
|
142
|
+
}
|
|
143
|
+
if (notices.length > 0)
|
|
144
|
+
output += `\n\n[${notices.join(". ")}]`;
|
|
145
|
+
return {
|
|
146
|
+
content: [{ type: "text", text: output }],
|
|
147
|
+
details: Object.keys(details).length > 0 ? details : undefined,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=find.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/tools/file/find.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8EAA8E,EAAE,CAAC;IACrH,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC,CAAC;IACxG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC,CAAC;CAChG,CAAC,CAAC;AAIH,MAAM,aAAa,GAAG,IAAI,CAAC;AAiB3B,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,OAAyB;IAEzB,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,CAAC;IACtC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,wJAAwJ,aAAa,eAAe,iBAAiB,GAAG,IAAI,8BAA8B;QACvP,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE;YAC1E,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC;YAEvE,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;gBAC5F,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE;oBACtD,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC;oBAC5C,KAAK,EAAE,cAAc;iBACtB,CAAC,CAAC;gBACH,OAAO,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;YACtF,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;YAElG,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/D,OAAO,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC;QAC7E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,UAAkB,EAAE,KAAa;IACrE,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,eAAe;QACf,UAAU;QACV,kBAAkB;QAClB,WAAW;QACX,MAAM;QACN,WAAW;QACX,cAAc;QACd,eAAe;QACf,MAAM,CAAC,KAAK,CAAC;KACd,CAAC;IAEF,IAAI,gBAAgB,GAAG,OAAO,CAAC;IAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,IAAI;YAAE,gBAAgB,GAAG,MAAM,OAAO,EAAE,CAAC;IACrH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACrB,OAAe,EACf,IAAc,EACd,MAA+B,EAC/B,IAAY;IAEZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,EAAc,EAAQ,EAAE;YACtC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,CAAC;YACV,EAAE,EAAE,CAAC;QACP,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAiB,EAAE,UAAkB;IAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClF,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClG,IAAI,gBAAgB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,YAAY,IAAI,GAAG,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,OAAiB,EAAE,cAAsB;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAE/G,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAC5D,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC3F,IAAI,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;IAChC,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CACV,GAAG,cAAc,qCAAqC,cAAc,GAAG,CAAC,8BAA8B,CACvG,CAAC;QACF,OAAO,CAAC,kBAAkB,GAAG,cAAc,CAAC;IAC9C,CAAC;IACD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QAC/D,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAChE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClD,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function toPosixPath(value: string): string;
|
|
2
|
+
export declare function globToRegExp(pattern: string): RegExp;
|
|
3
|
+
export declare function matchesGlob(posixRelativePath: string, pattern: string): boolean;
|
|
4
|
+
export declare function relativePosix(from: string, to: string): string;
|
|
5
|
+
export declare function shouldSkipDirectory(name: string): boolean;
|
|
6
|
+
//# sourceMappingURL=glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/tools/file/glob.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBpD;AAED,wBAAgB,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAK/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|