@jx-grxf/patchpilot 0.2.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/.env.example +13 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +71 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent.d.ts +21 -0
- package/dist/core/agent.js +346 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/codex.d.ts +22 -0
- package/dist/core/codex.js +242 -0
- package/dist/core/codex.js.map +1 -0
- package/dist/core/compute.d.ts +9 -0
- package/dist/core/compute.js +18 -0
- package/dist/core/compute.js.map +1 -0
- package/dist/core/doctor.d.ts +7 -0
- package/dist/core/doctor.js +226 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/env.d.ts +6 -0
- package/dist/core/env.js +103 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/gemini.d.ts +20 -0
- package/dist/core/gemini.js +177 -0
- package/dist/core/gemini.js.map +1 -0
- package/dist/core/json.d.ts +3 -0
- package/dist/core/json.js +95 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/modelClient.d.ts +8 -0
- package/dist/core/modelClient.js +42 -0
- package/dist/core/modelClient.js.map +1 -0
- package/dist/core/nvidia.d.ts +19 -0
- package/dist/core/nvidia.js +160 -0
- package/dist/core/nvidia.js.map +1 -0
- package/dist/core/ollama.d.ts +31 -0
- package/dist/core/ollama.js +176 -0
- package/dist/core/ollama.js.map +1 -0
- package/dist/core/openrouter.d.ts +27 -0
- package/dist/core/openrouter.js +168 -0
- package/dist/core/openrouter.js.map +1 -0
- package/dist/core/subagents.d.ts +14 -0
- package/dist/core/subagents.js +89 -0
- package/dist/core/subagents.js.map +1 -0
- package/dist/core/tokenAccounting.d.ts +6 -0
- package/dist/core/tokenAccounting.js +134 -0
- package/dist/core/tokenAccounting.js.map +1 -0
- package/dist/core/types.d.ts +90 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/workspace.d.ts +28 -0
- package/dist/core/workspace.js +616 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/tui/App.d.ts +6 -0
- package/dist/tui/App.js +1717 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/commands.d.ts +14 -0
- package/dist/tui/commands.js +210 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/components/CommandSuggestions.d.ts +12 -0
- package/dist/tui/components/CommandSuggestions.js +12 -0
- package/dist/tui/components/CommandSuggestions.js.map +1 -0
- package/dist/tui/components/Composer.d.ts +13 -0
- package/dist/tui/components/Composer.js +29 -0
- package/dist/tui/components/Composer.js.map +1 -0
- package/dist/tui/components/Header.d.ts +25 -0
- package/dist/tui/components/Header.js +62 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/OnboardingPanel.d.ts +38 -0
- package/dist/tui/components/OnboardingPanel.js +85 -0
- package/dist/tui/components/OnboardingPanel.js.map +1 -0
- package/dist/tui/components/Sidebar.d.ts +22 -0
- package/dist/tui/components/Sidebar.js +133 -0
- package/dist/tui/components/Sidebar.js.map +1 -0
- package/dist/tui/components/Transcript.d.ts +10 -0
- package/dist/tui/components/Transcript.js +111 -0
- package/dist/tui/components/Transcript.js.map +1 -0
- package/dist/tui/format.d.ts +29 -0
- package/dist/tui/format.js +202 -0
- package/dist/tui/format.js.map +1 -0
- package/dist/tui/hosts.d.ts +34 -0
- package/dist/tui/hosts.js +338 -0
- package/dist/tui/hosts.js.map +1 -0
- package/dist/tui/inputRouting.d.ts +8 -0
- package/dist/tui/inputRouting.js +94 -0
- package/dist/tui/inputRouting.js.map +1 -0
- package/dist/tui/platform.d.ts +2 -0
- package/dist/tui/platform.js +13 -0
- package/dist/tui/platform.js.map +1 -0
- package/dist/tui/systemStats.d.ts +25 -0
- package/dist/tui/systemStats.js +88 -0
- package/dist/tui/systemStats.js.map +1 -0
- package/dist/tui/types.d.ts +16 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/docs/showcase/patchpilot-showcase.svg +39 -0
- package/package.json +63 -0
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access, lstat, mkdir, readdir, readFile, realpath, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
import { platform } from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { inflateRawSync } from "node:zlib";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
const ignoredDirectories = new Set([
|
|
10
|
+
".git",
|
|
11
|
+
"node_modules",
|
|
12
|
+
"dist",
|
|
13
|
+
"coverage",
|
|
14
|
+
".next",
|
|
15
|
+
".turbo",
|
|
16
|
+
".vite",
|
|
17
|
+
"build",
|
|
18
|
+
"out",
|
|
19
|
+
"DerivedData"
|
|
20
|
+
]);
|
|
21
|
+
const textFileExtensions = new Set([
|
|
22
|
+
".c",
|
|
23
|
+
".cc",
|
|
24
|
+
".cpp",
|
|
25
|
+
".css",
|
|
26
|
+
".h",
|
|
27
|
+
".hpp",
|
|
28
|
+
".html",
|
|
29
|
+
".js",
|
|
30
|
+
".json",
|
|
31
|
+
".jsx",
|
|
32
|
+
".md",
|
|
33
|
+
".mjs",
|
|
34
|
+
".mts",
|
|
35
|
+
".py",
|
|
36
|
+
".swift",
|
|
37
|
+
".ts",
|
|
38
|
+
".tsx",
|
|
39
|
+
".txt",
|
|
40
|
+
".java",
|
|
41
|
+
".kt",
|
|
42
|
+
".go",
|
|
43
|
+
".rs",
|
|
44
|
+
".php",
|
|
45
|
+
".rb",
|
|
46
|
+
".sh",
|
|
47
|
+
".bash",
|
|
48
|
+
".zsh",
|
|
49
|
+
".xml",
|
|
50
|
+
".toml",
|
|
51
|
+
".ini",
|
|
52
|
+
".csv",
|
|
53
|
+
".tsv",
|
|
54
|
+
".yml",
|
|
55
|
+
".yaml"
|
|
56
|
+
]);
|
|
57
|
+
const blockedPathNames = new Set([
|
|
58
|
+
".env",
|
|
59
|
+
".env.local",
|
|
60
|
+
".env.development",
|
|
61
|
+
".env.production",
|
|
62
|
+
".env.test",
|
|
63
|
+
".npmrc",
|
|
64
|
+
".pypirc",
|
|
65
|
+
".netrc",
|
|
66
|
+
"id_rsa",
|
|
67
|
+
"id_ed25519",
|
|
68
|
+
"known_hosts"
|
|
69
|
+
]);
|
|
70
|
+
export class WorkspaceTools {
|
|
71
|
+
root;
|
|
72
|
+
rootRealPath;
|
|
73
|
+
allowWrite;
|
|
74
|
+
allowShell;
|
|
75
|
+
timeoutMs;
|
|
76
|
+
signal;
|
|
77
|
+
constructor(options) {
|
|
78
|
+
this.root = path.resolve(options.root);
|
|
79
|
+
this.rootRealPath = realpath(this.root).catch(() => this.root);
|
|
80
|
+
this.allowWrite = options.allowWrite;
|
|
81
|
+
this.allowShell = options.allowShell;
|
|
82
|
+
this.timeoutMs = options.timeoutMs ?? 60_000;
|
|
83
|
+
this.signal = options.signal;
|
|
84
|
+
}
|
|
85
|
+
async execute(call) {
|
|
86
|
+
try {
|
|
87
|
+
switch (call.name) {
|
|
88
|
+
case "list_files":
|
|
89
|
+
return await this.listFiles(readString(call.arguments.path, "."));
|
|
90
|
+
case "read_file":
|
|
91
|
+
return await this.readFile(readString(call.arguments.path, ""));
|
|
92
|
+
case "search_text":
|
|
93
|
+
return await this.searchText(readString(call.arguments.query, ""));
|
|
94
|
+
case "inspect_document":
|
|
95
|
+
return await this.inspectDocument(readString(call.arguments.path, ""));
|
|
96
|
+
case "write_file":
|
|
97
|
+
return await this.writeFile(readString(call.arguments.path, ""), readString(call.arguments.content, ""));
|
|
98
|
+
case "run_shell":
|
|
99
|
+
return await this.runShell(readString(call.arguments.command, ""));
|
|
100
|
+
default:
|
|
101
|
+
return denied(`unknown tool: ${String(call.name ?? "unknown")}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
return denied(error instanceof Error ? error.message : String(error));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
resolveInsideWorkspace(requestedPath) {
|
|
109
|
+
const workspaceRelativePath = this.normalizeWorkspaceRelativePath(requestedPath);
|
|
110
|
+
const absolutePath = path.resolve(this.root, workspaceRelativePath);
|
|
111
|
+
const relativePath = path.relative(this.root, absolutePath);
|
|
112
|
+
if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
|
|
113
|
+
throw new Error(`Path escapes workspace: ${requestedPath}`);
|
|
114
|
+
}
|
|
115
|
+
return absolutePath;
|
|
116
|
+
}
|
|
117
|
+
normalizeWorkspaceRelativePath(requestedPath) {
|
|
118
|
+
const trimmedPath = requestedPath.trim();
|
|
119
|
+
if (!trimmedPath || trimmedPath === ".") {
|
|
120
|
+
return ".";
|
|
121
|
+
}
|
|
122
|
+
const normalizedRequestedPath = trimmedPath.replaceAll("\\", "/");
|
|
123
|
+
const normalizedRoot = this.root.replaceAll("\\", "/");
|
|
124
|
+
if (path.isAbsolute(trimmedPath)) {
|
|
125
|
+
const relativePath = path.relative(this.root, trimmedPath);
|
|
126
|
+
if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
|
|
127
|
+
throw new Error(`Path escapes workspace: ${requestedPath}`);
|
|
128
|
+
}
|
|
129
|
+
return normalizeSlashPath(relativePath || ".");
|
|
130
|
+
}
|
|
131
|
+
const workspaceLabel = path.basename(this.root);
|
|
132
|
+
if (workspaceLabel &&
|
|
133
|
+
(normalizedRequestedPath === workspaceLabel || normalizedRequestedPath.startsWith(`${workspaceLabel}/`))) {
|
|
134
|
+
return normalizedRequestedPath.slice(workspaceLabel.length).replace(/^\/+/, "") || ".";
|
|
135
|
+
}
|
|
136
|
+
if (normalizedRequestedPath.startsWith(`${normalizedRoot}/`)) {
|
|
137
|
+
return normalizedRequestedPath.slice(normalizedRoot.length).replace(/^\/+/, "") || ".";
|
|
138
|
+
}
|
|
139
|
+
return normalizedRequestedPath;
|
|
140
|
+
}
|
|
141
|
+
async listFiles(requestedPath) {
|
|
142
|
+
const rootPath = await this.resolveReadPath(requestedPath);
|
|
143
|
+
const entries = await walkFiles(rootPath, this.root, await this.rootRealPath, 3, 160);
|
|
144
|
+
return {
|
|
145
|
+
ok: true,
|
|
146
|
+
summary: `listed ${entries.length} files`,
|
|
147
|
+
content: entries.join("\n")
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async readFile(requestedPath) {
|
|
151
|
+
if (!requestedPath) {
|
|
152
|
+
return denied("read_file requires a path.");
|
|
153
|
+
}
|
|
154
|
+
if (isPlaceholderPath(requestedPath)) {
|
|
155
|
+
return denied(`read_file denied placeholder path: ${requestedPath}`);
|
|
156
|
+
}
|
|
157
|
+
if (isSensitivePath(requestedPath)) {
|
|
158
|
+
return denied(`read_file denied sensitive path: ${requestedPath}`);
|
|
159
|
+
}
|
|
160
|
+
const absolutePath = await this.resolveReadPath(requestedPath);
|
|
161
|
+
if (!isLikelyTextFile(absolutePath)) {
|
|
162
|
+
return denied(`read_file supports text/code files. Use inspect_document for ${path.extname(absolutePath) || "this file"} files.`);
|
|
163
|
+
}
|
|
164
|
+
const content = await readFile(absolutePath, "utf8").catch((error) => {
|
|
165
|
+
throw new Error(`file not found or unreadable: ${requestedPath} (${error instanceof Error ? error.message : String(error)})`);
|
|
166
|
+
});
|
|
167
|
+
const clippedContent = clip(content, 20_000);
|
|
168
|
+
return {
|
|
169
|
+
ok: true,
|
|
170
|
+
summary: `read ${path.relative(this.root, absolutePath)}`,
|
|
171
|
+
content: clippedContent
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
async inspectDocument(requestedPath) {
|
|
175
|
+
if (!requestedPath) {
|
|
176
|
+
return denied("inspect_document requires a path.");
|
|
177
|
+
}
|
|
178
|
+
if (isPlaceholderPath(requestedPath)) {
|
|
179
|
+
return denied(`inspect_document denied placeholder path: ${requestedPath}`);
|
|
180
|
+
}
|
|
181
|
+
if (isSensitivePath(requestedPath)) {
|
|
182
|
+
return denied(`inspect_document denied sensitive path: ${requestedPath}`);
|
|
183
|
+
}
|
|
184
|
+
const absolutePath = await this.resolveReadPath(requestedPath);
|
|
185
|
+
const extension = path.extname(absolutePath).toLowerCase();
|
|
186
|
+
if (isLikelyTextFile(absolutePath)) {
|
|
187
|
+
return await this.readFile(requestedPath);
|
|
188
|
+
}
|
|
189
|
+
if (extension === ".pdf") {
|
|
190
|
+
return await extractPdfText(absolutePath, this.timeoutMs, this.signal);
|
|
191
|
+
}
|
|
192
|
+
if (extension === ".docx") {
|
|
193
|
+
return await extractDocxText(absolutePath);
|
|
194
|
+
}
|
|
195
|
+
return denied(`inspect_document does not support ${extension || "this file type"} yet.`);
|
|
196
|
+
}
|
|
197
|
+
async searchText(query) {
|
|
198
|
+
if (!query.trim()) {
|
|
199
|
+
return denied("search_text requires a non-empty query.");
|
|
200
|
+
}
|
|
201
|
+
const ripgrepResult = await searchTextWithRipgrep(this.root, query);
|
|
202
|
+
if (ripgrepResult) {
|
|
203
|
+
return ripgrepResult;
|
|
204
|
+
}
|
|
205
|
+
const rootRealPath = await this.rootRealPath;
|
|
206
|
+
const files = await walkFiles(this.root, this.root, rootRealPath, 8, 800);
|
|
207
|
+
const matches = [];
|
|
208
|
+
for (const filePath of files) {
|
|
209
|
+
const absolutePath = this.resolveInsideWorkspace(filePath);
|
|
210
|
+
if (!isLikelyTextFile(absolutePath)) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
const content = await readFile(absolutePath, "utf8").catch(() => "");
|
|
214
|
+
const lines = content.split(/\r?\n/);
|
|
215
|
+
lines.forEach((line, index) => {
|
|
216
|
+
if (line.toLowerCase().includes(query.toLowerCase())) {
|
|
217
|
+
matches.push(`${filePath}:${index + 1}: ${line.trim()}`);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
if (matches.length >= 80) {
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
ok: true,
|
|
226
|
+
summary: `found ${matches.length} matches`,
|
|
227
|
+
content: matches.join("\n") || "No matches."
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
async writeFile(requestedPath, content) {
|
|
231
|
+
if (!this.allowWrite) {
|
|
232
|
+
return denied("write_file denied. Restart with --apply to allow workspace writes.");
|
|
233
|
+
}
|
|
234
|
+
if (!requestedPath) {
|
|
235
|
+
return denied("write_file requires a path.");
|
|
236
|
+
}
|
|
237
|
+
if (isPlaceholderPath(requestedPath)) {
|
|
238
|
+
return denied(`write_file denied placeholder path: ${requestedPath}`);
|
|
239
|
+
}
|
|
240
|
+
if (isSensitivePath(requestedPath)) {
|
|
241
|
+
return denied(`write_file denied sensitive path: ${requestedPath}`);
|
|
242
|
+
}
|
|
243
|
+
const absolutePath = await this.resolveWritePath(requestedPath);
|
|
244
|
+
await mkdir(path.dirname(absolutePath), { recursive: true });
|
|
245
|
+
await writeFile(absolutePath, content, "utf8");
|
|
246
|
+
return {
|
|
247
|
+
ok: true,
|
|
248
|
+
summary: `wrote ${path.relative(this.root, absolutePath)}`,
|
|
249
|
+
content: `Wrote ${content.length} characters.`
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
async runShell(command) {
|
|
253
|
+
if (!this.allowShell) {
|
|
254
|
+
return denied("run_shell denied. Restart with --allow-shell to allow commands.");
|
|
255
|
+
}
|
|
256
|
+
if (!command.trim()) {
|
|
257
|
+
return denied("run_shell requires a command.");
|
|
258
|
+
}
|
|
259
|
+
const shellSafetyError = validateShellCommand(command);
|
|
260
|
+
if (shellSafetyError) {
|
|
261
|
+
return denied(`run_shell denied. ${shellSafetyError}`);
|
|
262
|
+
}
|
|
263
|
+
const output = await runCommand(command, this.root, this.timeoutMs, this.signal);
|
|
264
|
+
return {
|
|
265
|
+
ok: output.exitCode === 0,
|
|
266
|
+
summary: `command exited ${output.exitCode}`,
|
|
267
|
+
content: clip(output.output, 20_000)
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
async resolveReadPath(requestedPath) {
|
|
271
|
+
const absolutePath = this.resolveInsideWorkspace(requestedPath);
|
|
272
|
+
const resolvedPath = await realpath(absolutePath).catch((error) => {
|
|
273
|
+
throw new Error(`file not found or unreadable: ${requestedPath} (${error instanceof Error ? error.message : String(error)})`);
|
|
274
|
+
});
|
|
275
|
+
await assertInsideWorkspace(await this.rootRealPath, resolvedPath, requestedPath);
|
|
276
|
+
return resolvedPath;
|
|
277
|
+
}
|
|
278
|
+
async resolveWritePath(requestedPath) {
|
|
279
|
+
const absolutePath = this.resolveInsideWorkspace(requestedPath);
|
|
280
|
+
const rootRealPath = await this.rootRealPath;
|
|
281
|
+
const existingParent = await findNearestExistingParent(absolutePath);
|
|
282
|
+
const parentRealPath = await realpath(existingParent);
|
|
283
|
+
await assertInsideWorkspace(rootRealPath, parentRealPath, requestedPath);
|
|
284
|
+
const targetStat = await lstat(absolutePath).catch(() => null);
|
|
285
|
+
if (targetStat) {
|
|
286
|
+
const resolvedTargetPath = await realpath(absolutePath).catch((error) => {
|
|
287
|
+
throw new Error(`file not writable: ${requestedPath} (${error instanceof Error ? error.message : String(error)})`);
|
|
288
|
+
});
|
|
289
|
+
await assertInsideWorkspace(rootRealPath, resolvedTargetPath, requestedPath);
|
|
290
|
+
}
|
|
291
|
+
return absolutePath;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async function walkFiles(startPath, workspaceRoot, workspaceRealRoot, maxDepth, maxEntries) {
|
|
295
|
+
const results = [];
|
|
296
|
+
async function visit(currentPath, depth) {
|
|
297
|
+
if (results.length >= maxEntries || depth > maxDepth) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
const currentStat = await lstat(currentPath);
|
|
301
|
+
if (currentStat.isSymbolicLink()) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (currentStat.isFile()) {
|
|
305
|
+
results.push(normalizeRelative(workspaceRoot, currentPath));
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
if (!currentStat.isDirectory()) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
await assertInsideWorkspace(workspaceRealRoot, await realpath(currentPath), normalizeRelative(workspaceRoot, currentPath));
|
|
312
|
+
const entries = await readdir(currentPath, { withFileTypes: true });
|
|
313
|
+
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
314
|
+
if (results.length >= maxEntries) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (entry.isDirectory() && ignoredDirectories.has(entry.name)) {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (isSensitivePath(entry.name)) {
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
await visit(path.join(currentPath, entry.name), depth + 1);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
await access(startPath, constants.R_OK);
|
|
327
|
+
await visit(startPath, 0);
|
|
328
|
+
return results;
|
|
329
|
+
}
|
|
330
|
+
async function searchTextWithRipgrep(workspaceRoot, query) {
|
|
331
|
+
const ignoreGlobs = [
|
|
332
|
+
"!.git/**",
|
|
333
|
+
"!node_modules/**",
|
|
334
|
+
"!dist/**",
|
|
335
|
+
"!coverage/**",
|
|
336
|
+
"!.next/**",
|
|
337
|
+
"!.turbo/**",
|
|
338
|
+
"!.vite/**",
|
|
339
|
+
"!build/**",
|
|
340
|
+
"!out/**",
|
|
341
|
+
"!DerivedData/**",
|
|
342
|
+
"!.env",
|
|
343
|
+
"!.env.*",
|
|
344
|
+
"!.npmrc",
|
|
345
|
+
"!.pypirc",
|
|
346
|
+
"!.netrc",
|
|
347
|
+
"!**/.env",
|
|
348
|
+
"!**/.env.*",
|
|
349
|
+
"!**/.npmrc",
|
|
350
|
+
"!**/.pypirc",
|
|
351
|
+
"!**/.netrc",
|
|
352
|
+
"!**/id_rsa",
|
|
353
|
+
"!**/id_ed25519",
|
|
354
|
+
"!**/known_hosts"
|
|
355
|
+
];
|
|
356
|
+
return new Promise((resolve) => {
|
|
357
|
+
const child = spawn("rg", [
|
|
358
|
+
"--line-number",
|
|
359
|
+
"--ignore-case",
|
|
360
|
+
"--no-heading",
|
|
361
|
+
"--color",
|
|
362
|
+
"never",
|
|
363
|
+
"--max-count",
|
|
364
|
+
"80",
|
|
365
|
+
...ignoreGlobs.flatMap((glob) => ["--glob", glob]),
|
|
366
|
+
query,
|
|
367
|
+
"."
|
|
368
|
+
], {
|
|
369
|
+
cwd: workspaceRoot,
|
|
370
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
371
|
+
windowsHide: true
|
|
372
|
+
});
|
|
373
|
+
let stdout = "";
|
|
374
|
+
let stderr = "";
|
|
375
|
+
child.stdout.on("data", (chunk) => {
|
|
376
|
+
stdout += chunk.toString("utf8");
|
|
377
|
+
});
|
|
378
|
+
child.stderr.on("data", (chunk) => {
|
|
379
|
+
stderr += chunk.toString("utf8");
|
|
380
|
+
});
|
|
381
|
+
child.on("error", () => {
|
|
382
|
+
resolve(null);
|
|
383
|
+
});
|
|
384
|
+
child.on("close", (exitCode) => {
|
|
385
|
+
if (exitCode === 0 || exitCode === 1) {
|
|
386
|
+
const content = stdout.trim();
|
|
387
|
+
const lines = content ? content.split(/\r?\n/).slice(0, 80) : [];
|
|
388
|
+
resolve({
|
|
389
|
+
ok: true,
|
|
390
|
+
summary: `found ${lines.length} matches`,
|
|
391
|
+
content: lines.join("\n") || "No matches."
|
|
392
|
+
});
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (stderr.trim()) {
|
|
396
|
+
resolve({
|
|
397
|
+
ok: false,
|
|
398
|
+
summary: "ripgrep search failed",
|
|
399
|
+
content: clip(stderr.trim(), 1200)
|
|
400
|
+
});
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
resolve(null);
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
async function assertInsideWorkspace(workspaceRealRoot, candidatePath, requestedPath) {
|
|
408
|
+
const relativePath = path.relative(workspaceRealRoot, candidatePath);
|
|
409
|
+
if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
|
|
410
|
+
throw new Error(`Path escapes workspace: ${requestedPath}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
async function findNearestExistingParent(absolutePath) {
|
|
414
|
+
let currentPath = path.dirname(absolutePath);
|
|
415
|
+
while (true) {
|
|
416
|
+
const currentStat = await stat(currentPath).catch(() => null);
|
|
417
|
+
if (currentStat?.isDirectory()) {
|
|
418
|
+
return currentPath;
|
|
419
|
+
}
|
|
420
|
+
const parentPath = path.dirname(currentPath);
|
|
421
|
+
if (parentPath === currentPath) {
|
|
422
|
+
return currentPath;
|
|
423
|
+
}
|
|
424
|
+
currentPath = parentPath;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
function runCommand(command, cwd, timeoutMs, signal) {
|
|
428
|
+
const isWindows = platform() === "win32";
|
|
429
|
+
const shellExecutable = isWindows ? "powershell.exe" : "bash";
|
|
430
|
+
const shellArgs = isWindows ? ["-NoProfile", "-Command", command] : ["-lc", command];
|
|
431
|
+
return new Promise((resolve) => {
|
|
432
|
+
const child = spawn(shellExecutable, shellArgs, {
|
|
433
|
+
cwd,
|
|
434
|
+
signal,
|
|
435
|
+
windowsHide: true
|
|
436
|
+
});
|
|
437
|
+
let output = "";
|
|
438
|
+
const timeout = setTimeout(() => {
|
|
439
|
+
output += `\nCommand timed out after ${timeoutMs}ms.`;
|
|
440
|
+
child.kill();
|
|
441
|
+
}, timeoutMs);
|
|
442
|
+
child.stdout.on("data", (chunk) => {
|
|
443
|
+
output += chunk.toString("utf8");
|
|
444
|
+
});
|
|
445
|
+
child.stderr.on("data", (chunk) => {
|
|
446
|
+
output += chunk.toString("utf8");
|
|
447
|
+
});
|
|
448
|
+
child.on("error", (error) => {
|
|
449
|
+
clearTimeout(timeout);
|
|
450
|
+
resolve({
|
|
451
|
+
exitCode: error.name === "AbortError" ? null : 1,
|
|
452
|
+
output: error.name === "AbortError" ? "Command aborted." : error.message
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
child.on("close", (exitCode) => {
|
|
456
|
+
clearTimeout(timeout);
|
|
457
|
+
resolve({ exitCode, output });
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
function readString(value, fallback) {
|
|
462
|
+
return typeof value === "string" ? value : fallback;
|
|
463
|
+
}
|
|
464
|
+
function isPlaceholderPath(value) {
|
|
465
|
+
const normalizedValue = value.trim().toLowerCase().replaceAll("\\", "/");
|
|
466
|
+
return ["relative/path", "path/to/file", "file/path", "<path>", "<file>", "filename"].includes(normalizedValue);
|
|
467
|
+
}
|
|
468
|
+
function isSensitivePath(value) {
|
|
469
|
+
const normalizedPath = value.trim().replaceAll("\\", "/");
|
|
470
|
+
return normalizedPath
|
|
471
|
+
.split("/")
|
|
472
|
+
.filter(Boolean)
|
|
473
|
+
.some((part) => blockedPathNames.has(part.toLowerCase()));
|
|
474
|
+
}
|
|
475
|
+
function denied(message) {
|
|
476
|
+
return {
|
|
477
|
+
ok: false,
|
|
478
|
+
summary: message,
|
|
479
|
+
content: message
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
function isLikelyTextFile(filePath) {
|
|
483
|
+
return textFileExtensions.has(path.extname(filePath).toLowerCase());
|
|
484
|
+
}
|
|
485
|
+
async function extractPdfText(filePath, timeoutMs, signal) {
|
|
486
|
+
try {
|
|
487
|
+
const { stdout } = await execFileAsync("pdftotext", ["-layout", filePath, "-"], {
|
|
488
|
+
timeout: timeoutMs,
|
|
489
|
+
maxBuffer: 2_000_000,
|
|
490
|
+
signal,
|
|
491
|
+
windowsHide: true
|
|
492
|
+
});
|
|
493
|
+
return {
|
|
494
|
+
ok: true,
|
|
495
|
+
summary: `extracted text from ${path.basename(filePath)}`,
|
|
496
|
+
content: clip(stdout.trim() || "No extractable PDF text found.", 20_000)
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
catch (error) {
|
|
500
|
+
return denied(`PDF text extraction needs pdftotext on PATH or a text-based PDF. ${error instanceof Error ? error.message : String(error)}`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
async function extractDocxText(filePath) {
|
|
504
|
+
try {
|
|
505
|
+
const archive = await readFile(filePath);
|
|
506
|
+
const xml = readZipEntryText(archive, "word/document.xml");
|
|
507
|
+
const text = wordXmlToText(xml);
|
|
508
|
+
return {
|
|
509
|
+
ok: true,
|
|
510
|
+
summary: `extracted text from ${path.basename(filePath)}`,
|
|
511
|
+
content: clip(text || "No extractable DOCX text found.", 20_000)
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
return denied(`DOCX text extraction needs unzip on PATH and a valid .docx file. ${error instanceof Error ? error.message : String(error)}`);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
function readZipEntryText(archive, entryName) {
|
|
519
|
+
const endOfCentralDirectoryOffset = findEndOfCentralDirectory(archive);
|
|
520
|
+
if (endOfCentralDirectoryOffset < 0) {
|
|
521
|
+
throw new Error("invalid zip archive");
|
|
522
|
+
}
|
|
523
|
+
const centralDirectoryOffset = archive.readUInt32LE(endOfCentralDirectoryOffset + 16);
|
|
524
|
+
const centralDirectoryEntries = archive.readUInt16LE(endOfCentralDirectoryOffset + 10);
|
|
525
|
+
let offset = centralDirectoryOffset;
|
|
526
|
+
for (let index = 0; index < centralDirectoryEntries; index += 1) {
|
|
527
|
+
if (archive.readUInt32LE(offset) !== 0x02014b50) {
|
|
528
|
+
throw new Error("invalid zip central directory");
|
|
529
|
+
}
|
|
530
|
+
const compressionMethod = archive.readUInt16LE(offset + 10);
|
|
531
|
+
const compressedSize = archive.readUInt32LE(offset + 20);
|
|
532
|
+
const fileNameLength = archive.readUInt16LE(offset + 28);
|
|
533
|
+
const extraLength = archive.readUInt16LE(offset + 30);
|
|
534
|
+
const commentLength = archive.readUInt16LE(offset + 32);
|
|
535
|
+
const localHeaderOffset = archive.readUInt32LE(offset + 42);
|
|
536
|
+
const fileName = archive.subarray(offset + 46, offset + 46 + fileNameLength).toString("utf8");
|
|
537
|
+
if (fileName === entryName) {
|
|
538
|
+
if (archive.readUInt32LE(localHeaderOffset) !== 0x04034b50) {
|
|
539
|
+
throw new Error("invalid zip local header");
|
|
540
|
+
}
|
|
541
|
+
const localFileNameLength = archive.readUInt16LE(localHeaderOffset + 26);
|
|
542
|
+
const localExtraLength = archive.readUInt16LE(localHeaderOffset + 28);
|
|
543
|
+
const dataStart = localHeaderOffset + 30 + localFileNameLength + localExtraLength;
|
|
544
|
+
const compressedData = archive.subarray(dataStart, dataStart + compressedSize);
|
|
545
|
+
if (compressionMethod === 0) {
|
|
546
|
+
return compressedData.toString("utf8");
|
|
547
|
+
}
|
|
548
|
+
if (compressionMethod === 8) {
|
|
549
|
+
return inflateRawSync(compressedData).toString("utf8");
|
|
550
|
+
}
|
|
551
|
+
throw new Error(`unsupported zip compression method ${compressionMethod}`);
|
|
552
|
+
}
|
|
553
|
+
offset += 46 + fileNameLength + extraLength + commentLength;
|
|
554
|
+
}
|
|
555
|
+
throw new Error(`${entryName} not found`);
|
|
556
|
+
}
|
|
557
|
+
function findEndOfCentralDirectory(archive) {
|
|
558
|
+
for (let offset = archive.length - 22; offset >= Math.max(0, archive.length - 65_557); offset -= 1) {
|
|
559
|
+
if (archive.readUInt32LE(offset) === 0x06054b50) {
|
|
560
|
+
return offset;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return -1;
|
|
564
|
+
}
|
|
565
|
+
function wordXmlToText(xml) {
|
|
566
|
+
return xml
|
|
567
|
+
.replace(/<w:tab\/>/g, "\t")
|
|
568
|
+
.replace(/<\/w:p>/g, "\n")
|
|
569
|
+
.replace(/<[^>]+>/g, "")
|
|
570
|
+
.replace(/</g, "<")
|
|
571
|
+
.replace(/>/g, ">")
|
|
572
|
+
.replace(/&/g, "&")
|
|
573
|
+
.replace(/"/g, "\"")
|
|
574
|
+
.replace(/'/g, "'")
|
|
575
|
+
.trim();
|
|
576
|
+
}
|
|
577
|
+
function normalizeRelative(root, filePath) {
|
|
578
|
+
return path.relative(root, filePath).split(path.sep).join("/");
|
|
579
|
+
}
|
|
580
|
+
function normalizeSlashPath(value) {
|
|
581
|
+
return value.split(path.sep).join("/");
|
|
582
|
+
}
|
|
583
|
+
function clip(content, maxLength) {
|
|
584
|
+
if (content.length <= maxLength) {
|
|
585
|
+
return content;
|
|
586
|
+
}
|
|
587
|
+
return `${content.slice(0, maxLength)}\n...[clipped ${content.length - maxLength} chars]`;
|
|
588
|
+
}
|
|
589
|
+
function validateShellCommand(command) {
|
|
590
|
+
const trimmedCommand = command.trim();
|
|
591
|
+
if (/[;&|><`$\n\r]/.test(trimmedCommand)) {
|
|
592
|
+
return "shell metacharacters are blocked; run a single simple command.";
|
|
593
|
+
}
|
|
594
|
+
const tokens = trimmedCommand.match(/"[^"]*"|'[^']*'|\S+/g) ?? [];
|
|
595
|
+
if (tokens.length === 0) {
|
|
596
|
+
return "command is empty.";
|
|
597
|
+
}
|
|
598
|
+
const executable = stripQuotes(tokens[0] ?? "").toLowerCase();
|
|
599
|
+
if (["bash", "sh", "zsh", "fish", "pwsh", "powershell", "powershell.exe", "python", "python3", "node", "ruby", "perl"].includes(executable)) {
|
|
600
|
+
return `executable "${executable}" is blocked.`;
|
|
601
|
+
}
|
|
602
|
+
for (const token of tokens.slice(1)) {
|
|
603
|
+
const normalizedToken = stripQuotes(token);
|
|
604
|
+
if (normalizedToken.startsWith("/") || normalizedToken.startsWith("~")) {
|
|
605
|
+
return "absolute and home-relative paths are blocked.";
|
|
606
|
+
}
|
|
607
|
+
if (/(^|[\\/])\.\.([\\/]|$)/.test(normalizedToken)) {
|
|
608
|
+
return "parent directory traversal is blocked.";
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
return null;
|
|
612
|
+
}
|
|
613
|
+
function stripQuotes(value) {
|
|
614
|
+
return value.replace(/^['"]|['"]$/g, "");
|
|
615
|
+
}
|
|
616
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"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"}
|