@zhijiewang/openharness 0.9.3 → 0.11.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 +87 -24
- package/dist/Tool.d.ts.map +1 -1
- package/dist/Tool.js +7 -1
- package/dist/Tool.js.map +1 -1
- package/dist/Tool.test.js +8 -2
- package/dist/Tool.test.js.map +1 -1
- package/dist/agents/roles.d.ts +25 -0
- package/dist/agents/roles.d.ts.map +1 -0
- package/dist/agents/roles.js +116 -0
- package/dist/agents/roles.js.map +1 -0
- package/dist/agents/roles.test.d.ts +2 -0
- package/dist/agents/roles.test.d.ts.map +1 -0
- package/dist/agents/roles.test.js +38 -0
- package/dist/agents/roles.test.js.map +1 -0
- package/dist/commands/commands-new.test.d.ts +5 -0
- package/dist/commands/commands-new.test.d.ts.map +1 -0
- package/dist/commands/commands-new.test.js +132 -0
- package/dist/commands/commands-new.test.js.map +1 -0
- package/dist/commands/commands.test.js +31 -0
- package/dist/commands/commands.test.js.map +1 -1
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +199 -6
- package/dist/commands/index.js.map +1 -1
- package/dist/components/REPL.js +1 -1
- package/dist/components/REPL.js.map +1 -1
- package/dist/git/git.test.js +33 -1
- package/dist/git/git.test.js.map +1 -1
- package/dist/git/index.d.ts +12 -0
- package/dist/git/index.d.ts.map +1 -1
- package/dist/git/index.js +47 -2
- package/dist/git/index.js.map +1 -1
- package/dist/harness/checkpoints.d.ts +36 -0
- package/dist/harness/checkpoints.d.ts.map +1 -0
- package/dist/harness/checkpoints.js +156 -0
- package/dist/harness/checkpoints.js.map +1 -0
- package/dist/harness/config.d.ts +3 -0
- package/dist/harness/config.d.ts.map +1 -1
- package/dist/harness/config.js +35 -2
- package/dist/harness/config.js.map +1 -1
- package/dist/harness/config.test.js +21 -1
- package/dist/harness/config.test.js.map +1 -1
- package/dist/harness/hooks-env.test.d.ts +5 -0
- package/dist/harness/hooks-env.test.d.ts.map +1 -0
- package/dist/harness/hooks-env.test.js +41 -0
- package/dist/harness/hooks-env.test.js.map +1 -0
- package/dist/harness/hooks.d.ts +7 -0
- package/dist/harness/hooks.d.ts.map +1 -1
- package/dist/harness/hooks.js +14 -0
- package/dist/harness/hooks.js.map +1 -1
- package/dist/harness/keybindings.d.ts.map +1 -1
- package/dist/harness/keybindings.js +4 -0
- package/dist/harness/keybindings.js.map +1 -1
- package/dist/harness/memory.d.ts +19 -0
- package/dist/harness/memory.d.ts.map +1 -1
- package/dist/harness/memory.js +85 -0
- package/dist/harness/memory.js.map +1 -1
- package/dist/harness/onboarding.d.ts +1 -1
- package/dist/harness/onboarding.d.ts.map +1 -1
- package/dist/harness/onboarding.js +59 -4
- package/dist/harness/onboarding.js.map +1 -1
- package/dist/harness/onboarding.test.d.ts +5 -0
- package/dist/harness/onboarding.test.d.ts.map +1 -0
- package/dist/harness/onboarding.test.js +93 -0
- package/dist/harness/onboarding.test.js.map +1 -0
- package/dist/harness/rules.d.ts +6 -1
- package/dist/harness/rules.d.ts.map +1 -1
- package/dist/harness/rules.js +52 -5
- package/dist/harness/rules.js.map +1 -1
- package/dist/harness/rules.test.js +30 -1
- package/dist/harness/rules.test.js.map +1 -1
- package/dist/harness/session.d.ts +8 -1
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +13 -5
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/store.d.ts +46 -0
- package/dist/harness/store.d.ts.map +1 -0
- package/dist/harness/store.js +56 -0
- package/dist/harness/store.js.map +1 -0
- package/dist/harness/store.test.d.ts +2 -0
- package/dist/harness/store.test.d.ts.map +1 -0
- package/dist/harness/store.test.js +71 -0
- package/dist/harness/store.test.js.map +1 -0
- package/dist/harness/submit-handler.d.ts +2 -0
- package/dist/harness/submit-handler.d.ts.map +1 -1
- package/dist/harness/submit-handler.js +3 -0
- package/dist/harness/submit-handler.js.map +1 -1
- package/dist/main.js +153 -26
- package/dist/main.js.map +1 -1
- package/dist/mcp/client.d.ts +2 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +10 -2
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/loader.d.ts +2 -0
- package/dist/mcp/loader.d.ts.map +1 -1
- package/dist/mcp/loader.js +34 -18
- package/dist/mcp/loader.js.map +1 -1
- package/dist/mcp/loader.test.d.ts +7 -0
- package/dist/mcp/loader.test.d.ts.map +1 -0
- package/dist/mcp/loader.test.js +25 -0
- package/dist/mcp/loader.test.js.map +1 -0
- package/dist/providers/anthropic-convert.test.d.ts +5 -0
- package/dist/providers/anthropic-convert.test.d.ts.map +1 -0
- package/dist/providers/anthropic-convert.test.js +98 -0
- package/dist/providers/anthropic-convert.test.js.map +1 -0
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +23 -4
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/stream-parsing.test.d.ts +6 -0
- package/dist/providers/stream-parsing.test.d.ts.map +1 -0
- package/dist/providers/stream-parsing.test.js +174 -0
- package/dist/providers/stream-parsing.test.js.map +1 -0
- package/dist/query/compress.d.ts +17 -0
- package/dist/query/compress.d.ts.map +1 -0
- package/dist/query/compress.js +115 -0
- package/dist/query/compress.js.map +1 -0
- package/dist/query/errors.d.ts +10 -0
- package/dist/query/errors.d.ts.map +1 -0
- package/dist/query/errors.js +22 -0
- package/dist/query/errors.js.map +1 -0
- package/dist/query/index.d.ts +15 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +199 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/tools.d.ts +17 -0
- package/dist/query/tools.d.ts.map +1 -0
- package/dist/query/tools.js +129 -0
- package/dist/query/tools.js.map +1 -0
- package/dist/query/types.d.ts +31 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +5 -0
- package/dist/query/types.js.map +1 -0
- package/dist/query.d.ts +8 -38
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +7 -444
- package/dist/query.js.map +1 -1
- package/dist/query.test.js +1 -1
- package/dist/query.test.js.map +1 -1
- package/dist/renderer/cells.d.ts.map +1 -1
- package/dist/renderer/cells.js +15 -2
- package/dist/renderer/cells.js.map +1 -1
- package/dist/renderer/colors.d.ts +8 -0
- package/dist/renderer/colors.d.ts.map +1 -0
- package/dist/renderer/colors.js +18 -0
- package/dist/renderer/colors.js.map +1 -0
- package/dist/renderer/diff.test.d.ts +5 -0
- package/dist/renderer/diff.test.d.ts.map +1 -0
- package/dist/renderer/diff.test.js +140 -0
- package/dist/renderer/diff.test.js.map +1 -0
- package/dist/renderer/differ.d.ts +1 -5
- package/dist/renderer/differ.d.ts.map +1 -1
- package/dist/renderer/differ.js +3 -20
- package/dist/renderer/differ.js.map +1 -1
- package/dist/renderer/e2e.test.js +136 -53
- package/dist/renderer/e2e.test.js.map +1 -1
- package/dist/renderer/image.test.d.ts +5 -0
- package/dist/renderer/image.test.d.ts.map +1 -0
- package/dist/renderer/image.test.js +66 -0
- package/dist/renderer/image.test.js.map +1 -0
- package/dist/renderer/index.d.ts +28 -16
- package/dist/renderer/index.d.ts.map +1 -1
- package/dist/renderer/index.js +289 -222
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/layout.d.ts +14 -5
- package/dist/renderer/layout.d.ts.map +1 -1
- package/dist/renderer/layout.js +522 -388
- package/dist/renderer/layout.js.map +1 -1
- package/dist/renderer/markdown.d.ts.map +1 -1
- package/dist/renderer/markdown.js +42 -36
- package/dist/renderer/markdown.js.map +1 -1
- package/dist/renderer/perf.test.js +1 -4
- package/dist/renderer/perf.test.js.map +1 -1
- package/dist/renderer/session-browser.test.d.ts +6 -0
- package/dist/renderer/session-browser.test.d.ts.map +1 -0
- package/dist/renderer/session-browser.test.js +95 -0
- package/dist/renderer/session-browser.test.js.map +1 -0
- package/dist/renderer/ui-ux.test.d.ts +15 -0
- package/dist/renderer/ui-ux.test.d.ts.map +1 -0
- package/dist/renderer/ui-ux.test.js +470 -0
- package/dist/renderer/ui-ux.test.js.map +1 -0
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +192 -67
- package/dist/repl.js.map +1 -1
- package/dist/services/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/services/StreamingToolExecutor.js +4 -2
- package/dist/services/StreamingToolExecutor.js.map +1 -1
- package/dist/services/agent-messaging.d.ts +68 -0
- package/dist/services/agent-messaging.d.ts.map +1 -0
- package/dist/services/agent-messaging.js +121 -0
- package/dist/services/agent-messaging.js.map +1 -0
- package/dist/services/agent-messaging.test.d.ts +2 -0
- package/dist/services/agent-messaging.test.d.ts.map +1 -0
- package/dist/services/agent-messaging.test.js +88 -0
- package/dist/services/agent-messaging.test.js.map +1 -0
- package/dist/services/cron.d.ts +40 -0
- package/dist/services/cron.d.ts.map +1 -0
- package/dist/services/cron.js +90 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/cron.test.d.ts +2 -0
- package/dist/services/cron.test.d.ts.map +1 -0
- package/dist/services/cron.test.js +49 -0
- package/dist/services/cron.test.js.map +1 -0
- package/dist/tools/AgentTool/index.d.ts +9 -0
- package/dist/tools/AgentTool/index.d.ts.map +1 -1
- package/dist/tools/AgentTool/index.js +89 -6
- package/dist/tools/AgentTool/index.js.map +1 -1
- package/dist/tools/BashTool/index.d.ts +6 -0
- package/dist/tools/BashTool/index.d.ts.map +1 -1
- package/dist/tools/BashTool/index.js +39 -1
- package/dist/tools/BashTool/index.js.map +1 -1
- package/dist/tools/FileEditTool/index.js +4 -4
- package/dist/tools/FileEditTool/index.js.map +1 -1
- package/dist/tools/FileReadTool/index.d.ts +3 -0
- package/dist/tools/FileReadTool/index.d.ts.map +1 -1
- package/dist/tools/FileReadTool/index.js +102 -4
- package/dist/tools/FileReadTool/index.js.map +1 -1
- package/dist/tools/FileWriteTool/index.d.ts.map +1 -1
- package/dist/tools/FileWriteTool/index.js +20 -5
- package/dist/tools/FileWriteTool/index.js.map +1 -1
- package/dist/tools/GlobTool/index.d.ts.map +1 -1
- package/dist/tools/GlobTool/index.js +4 -61
- package/dist/tools/GlobTool/index.js.map +1 -1
- package/dist/tools/GrepTool/index.d.ts +30 -0
- package/dist/tools/GrepTool/index.d.ts.map +1 -1
- package/dist/tools/GrepTool/index.js +153 -72
- package/dist/tools/GrepTool/index.js.map +1 -1
- package/dist/tools/LSTool/index.d.ts +3 -0
- package/dist/tools/LSTool/index.d.ts.map +1 -1
- package/dist/tools/LSTool/index.js +44 -29
- package/dist/tools/LSTool/index.js.map +1 -1
- package/dist/tools/TaskCreateTool/index.d.ts +6 -0
- package/dist/tools/TaskCreateTool/index.d.ts.map +1 -1
- package/dist/tools/TaskCreateTool/index.js +8 -2
- package/dist/tools/TaskCreateTool/index.js.map +1 -1
- package/dist/tools/TaskGetTool/index.d.ts +12 -0
- package/dist/tools/TaskGetTool/index.d.ts.map +1 -0
- package/dist/tools/TaskGetTool/index.js +50 -0
- package/dist/tools/TaskGetTool/index.js.map +1 -0
- package/dist/tools/TaskOutputTool/index.d.ts +15 -0
- package/dist/tools/TaskOutputTool/index.d.ts.map +1 -0
- package/dist/tools/TaskOutputTool/index.js +45 -0
- package/dist/tools/TaskOutputTool/index.js.map +1 -0
- package/dist/tools/TaskStopTool/index.d.ts +15 -0
- package/dist/tools/TaskStopTool/index.d.ts.map +1 -0
- package/dist/tools/TaskStopTool/index.js +51 -0
- package/dist/tools/TaskStopTool/index.js.map +1 -0
- package/dist/tools/TaskUpdateTool/index.d.ts +21 -3
- package/dist/tools/TaskUpdateTool/index.d.ts.map +1 -1
- package/dist/tools/TaskUpdateTool/index.js +48 -3
- package/dist/tools/TaskUpdateTool/index.js.map +1 -1
- package/dist/tools/tools-basic.test.js +191 -2
- package/dist/tools/tools-basic.test.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +6 -0
- package/dist/tools.js.map +1 -1
- package/dist/types/permissions.d.ts +2 -2
- package/dist/types/permissions.d.ts.map +1 -1
- package/dist/types/permissions.js +59 -13
- package/dist/types/permissions.js.map +1 -1
- package/dist/types/permissions.test.js +57 -0
- package/dist/types/permissions.test.js.map +1 -1
- package/dist/utils/bash-safety.d.ts +18 -0
- package/dist/utils/bash-safety.d.ts.map +1 -0
- package/dist/utils/bash-safety.js +227 -0
- package/dist/utils/bash-safety.js.map +1 -0
- package/dist/utils/bash-safety.test.d.ts +2 -0
- package/dist/utils/bash-safety.test.d.ts.map +1 -0
- package/dist/utils/bash-safety.test.js +112 -0
- package/dist/utils/bash-safety.test.js.map +1 -0
- package/dist/utils/fs.d.ts +15 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +64 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/fs.test.d.ts +5 -0
- package/dist/utils/fs.test.d.ts.map +1 -0
- package/dist/utils/fs.test.js +82 -0
- package/dist/utils/fs.test.js.map +1 -0
- package/dist/utils/safe-env.d.ts +10 -0
- package/dist/utils/safe-env.d.ts.map +1 -0
- package/dist/utils/safe-env.js +40 -0
- package/dist/utils/safe-env.js.map +1 -0
- package/package.json +3 -1
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createWorktree, removeWorktree, isGitRepo } from "../../git/index.js";
|
|
2
|
+
import { createWorktree, removeWorktree, hasWorktreeChanges, isGitRepo } from "../../git/index.js";
|
|
3
3
|
const inputSchema = z.object({
|
|
4
4
|
prompt: z.string(),
|
|
5
5
|
description: z.string().optional(),
|
|
6
6
|
isolated: z.boolean().optional(),
|
|
7
|
+
run_in_background: z.boolean().optional(),
|
|
8
|
+
model: z.string().optional(),
|
|
9
|
+
subagent_type: z.string().optional(),
|
|
7
10
|
});
|
|
8
11
|
export const AgentTool = {
|
|
9
12
|
name: "Agent",
|
|
@@ -34,16 +37,87 @@ export const AgentTool = {
|
|
|
34
37
|
agentWorkingDir = worktreePath;
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
|
-
|
|
40
|
+
// Subagent type modifies the system prompt — check built-in types first, then agent roles
|
|
41
|
+
let systemPrompt = context.systemPrompt ?? "You are a sub-agent. Complete the delegated task concisely.";
|
|
42
|
+
if (input.subagent_type) {
|
|
43
|
+
const builtinHints = {
|
|
44
|
+
explore: "You are an exploration agent. Search the codebase to answer questions. Use only read-only tools (Read, Grep, Glob, LS). Do not modify any files.",
|
|
45
|
+
plan: "You are a planning agent. Analyze the codebase and design implementation plans. Use only read-only tools. Return a detailed step-by-step plan.",
|
|
46
|
+
};
|
|
47
|
+
const hint = builtinHints[input.subagent_type.toLowerCase()];
|
|
48
|
+
if (hint) {
|
|
49
|
+
systemPrompt = hint + "\n\n" + systemPrompt;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Check agent roles (code-reviewer, test-writer, debugger, etc.)
|
|
53
|
+
const { getRole } = await import("../../agents/roles.js");
|
|
54
|
+
const role = getRole(input.subagent_type.toLowerCase());
|
|
55
|
+
if (role) {
|
|
56
|
+
systemPrompt = role.systemPromptSupplement + "\n\n" + systemPrompt;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Model override for sub-agent
|
|
61
|
+
const agentModel = input.model ?? context.model;
|
|
38
62
|
const config = {
|
|
39
63
|
provider: context.provider,
|
|
40
64
|
tools: context.tools,
|
|
41
65
|
systemPrompt,
|
|
42
66
|
permissionMode: context.permissionMode ?? "trust",
|
|
43
|
-
model:
|
|
67
|
+
model: agentModel,
|
|
44
68
|
maxTurns: 20,
|
|
45
69
|
abortSignal: context.abortSignal,
|
|
46
70
|
};
|
|
71
|
+
// Background execution: start agent and return immediately
|
|
72
|
+
if (input.run_in_background) {
|
|
73
|
+
const bgId = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
74
|
+
const runAgent = async () => {
|
|
75
|
+
let finalText = "";
|
|
76
|
+
const originalCwd = process.cwd();
|
|
77
|
+
try {
|
|
78
|
+
if (worktreePath) {
|
|
79
|
+
try {
|
|
80
|
+
process.chdir(agentWorkingDir);
|
|
81
|
+
}
|
|
82
|
+
catch { /* ignore */ }
|
|
83
|
+
}
|
|
84
|
+
for await (const event of query(input.prompt, config)) {
|
|
85
|
+
if (event.type === "text_delta")
|
|
86
|
+
finalText += event.content;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
if (worktreePath) {
|
|
91
|
+
try {
|
|
92
|
+
process.chdir(originalCwd);
|
|
93
|
+
}
|
|
94
|
+
catch { /* ignore */ }
|
|
95
|
+
}
|
|
96
|
+
// Clean up worktree only if no changes were made
|
|
97
|
+
if (worktreePath) {
|
|
98
|
+
const hasChanges = hasWorktreeChanges(worktreePath);
|
|
99
|
+
if (!hasChanges) {
|
|
100
|
+
removeWorktree(worktreePath, context.workingDir);
|
|
101
|
+
}
|
|
102
|
+
else if (context.onOutputChunk && context.callId) {
|
|
103
|
+
context.onOutputChunk(context.callId, `\n[background:${bgId} worktree preserved at ${worktreePath} — agent made changes]`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (context.onOutputChunk && context.callId) {
|
|
108
|
+
context.onOutputChunk(context.callId, `\n[background:${bgId} completed]\n${finalText}`);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
runAgent().catch((err) => {
|
|
112
|
+
if (context.onOutputChunk && context.callId) {
|
|
113
|
+
context.onOutputChunk(context.callId, `\n[background:${bgId} failed: ${err instanceof Error ? err.message : String(err)}]`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
output: `Background agent started (id: ${bgId}). You will be notified when it completes.`,
|
|
118
|
+
isError: false,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
47
121
|
const outputChunks = [];
|
|
48
122
|
let finalText = "";
|
|
49
123
|
try {
|
|
@@ -93,9 +167,15 @@ export const AgentTool = {
|
|
|
93
167
|
};
|
|
94
168
|
}
|
|
95
169
|
finally {
|
|
96
|
-
// Clean up worktree
|
|
170
|
+
// Clean up worktree only if no changes were made
|
|
97
171
|
if (worktreePath) {
|
|
98
|
-
|
|
172
|
+
const hasChanges = hasWorktreeChanges(worktreePath);
|
|
173
|
+
if (!hasChanges) {
|
|
174
|
+
removeWorktree(worktreePath, context.workingDir);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
finalText += `\n\n[Worktree preserved at ${worktreePath} — agent made changes that can be reviewed/merged]`;
|
|
178
|
+
}
|
|
99
179
|
}
|
|
100
180
|
}
|
|
101
181
|
return { output: finalText || "(sub-agent completed with no text output)", isError: false };
|
|
@@ -104,7 +184,10 @@ export const AgentTool = {
|
|
|
104
184
|
return `Spawn a sub-agent with its own tool-use loop to handle a delegated task autonomously. The sub-agent runs in an isolated git worktree to prevent file conflicts. Parameters:
|
|
105
185
|
- prompt (string, required): The full instructions for the sub-agent.
|
|
106
186
|
- description (string, optional): A short label for what the sub-agent is doing.
|
|
107
|
-
- isolated (boolean, optional): Whether to use git worktree isolation (default: true if in a git repo)
|
|
187
|
+
- isolated (boolean, optional): Whether to use git worktree isolation (default: true if in a git repo).
|
|
188
|
+
- run_in_background (boolean, optional): Run the agent in the background. Returns immediately; you will be notified when it completes.
|
|
189
|
+
- model (string, optional): Override the model for this sub-agent (e.g., use a faster model for exploration).
|
|
190
|
+
- subagent_type (string, optional): Specialize the agent behavior. Types: "Explore" (read-only codebase search), "Plan" (design implementation plans), "code-reviewer" (review code for issues).`;
|
|
108
191
|
},
|
|
109
192
|
};
|
|
110
193
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/AgentTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/AgentTool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,19 @@ import { z } from "zod";
|
|
|
2
2
|
import type { Tool } from "../../Tool.js";
|
|
3
3
|
declare const inputSchema: z.ZodObject<{
|
|
4
4
|
command: z.ZodString;
|
|
5
|
+
description: z.ZodOptional<z.ZodString>;
|
|
5
6
|
timeout: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
run_in_background: z.ZodOptional<z.ZodBoolean>;
|
|
6
8
|
}, "strip", z.ZodTypeAny, {
|
|
7
9
|
command: string;
|
|
10
|
+
description?: string | undefined;
|
|
8
11
|
timeout?: number | undefined;
|
|
12
|
+
run_in_background?: boolean | undefined;
|
|
9
13
|
}, {
|
|
10
14
|
command: string;
|
|
15
|
+
description?: string | undefined;
|
|
11
16
|
timeout?: number | undefined;
|
|
17
|
+
run_in_background?: boolean | undefined;
|
|
12
18
|
}>;
|
|
13
19
|
export declare const BashTool: Tool<typeof inputSchema>;
|
|
14
20
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/BashTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/BashTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAGnE,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAKf,CAAC;AAMH,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,OAAO,WAAW,CAiI7C,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { spawn } from "child_process";
|
|
3
|
+
import { safeEnv } from "../../utils/safe-env.js";
|
|
3
4
|
const inputSchema = z.object({
|
|
4
5
|
command: z.string(),
|
|
6
|
+
description: z.string().optional(),
|
|
5
7
|
timeout: z.number().optional(),
|
|
8
|
+
run_in_background: z.boolean().optional(),
|
|
6
9
|
});
|
|
7
10
|
const MAX_OUTPUT = 100_000;
|
|
8
11
|
const DEFAULT_TIMEOUT = 120_000;
|
|
@@ -24,13 +27,46 @@ export const BashTool = {
|
|
|
24
27
|
const isWin = process.platform === "win32";
|
|
25
28
|
const shell = isWin ? "cmd.exe" : "/bin/bash";
|
|
26
29
|
const shellArgs = isWin ? ["/c", input.command] : ["-c", input.command];
|
|
30
|
+
// Background execution: spawn and return immediately
|
|
31
|
+
if (input.run_in_background) {
|
|
32
|
+
const bgId = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
33
|
+
const proc = spawn(shell, shellArgs, {
|
|
34
|
+
cwd: context.workingDir,
|
|
35
|
+
env: safeEnv(),
|
|
36
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
37
|
+
detached: false,
|
|
38
|
+
});
|
|
39
|
+
let stdout = "";
|
|
40
|
+
let stderr = "";
|
|
41
|
+
proc.stdout.on("data", (chunk) => { stdout += chunk.toString(); });
|
|
42
|
+
proc.stderr.on("data", (chunk) => { stderr += chunk.toString(); });
|
|
43
|
+
const timer = setTimeout(() => { proc.kill("SIGTERM"); }, timeoutMs);
|
|
44
|
+
if (context.abortSignal) {
|
|
45
|
+
context.abortSignal.addEventListener("abort", () => { proc.kill("SIGTERM"); });
|
|
46
|
+
}
|
|
47
|
+
proc.on("close", (code) => {
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
let output = stdout + (stderr ? "\n[stderr]\n" + stderr : "");
|
|
50
|
+
if (output.length > MAX_OUTPUT) {
|
|
51
|
+
output = output.slice(0, MAX_OUTPUT) + "\n... [truncated]";
|
|
52
|
+
}
|
|
53
|
+
// Notify via output chunk when background process completes
|
|
54
|
+
if (context.onOutputChunk && context.callId) {
|
|
55
|
+
context.onOutputChunk(context.callId, `\n[background:${bgId} completed, exit code ${code}]\n${output}`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return Promise.resolve({
|
|
59
|
+
output: `Background process started (id: ${bgId}, pid: ${proc.pid}). You will be notified when it completes.`,
|
|
60
|
+
isError: false,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
27
63
|
return new Promise((resolve) => {
|
|
28
64
|
let stdout = "";
|
|
29
65
|
let stderr = "";
|
|
30
66
|
let killed = false;
|
|
31
67
|
const proc = spawn(shell, shellArgs, {
|
|
32
68
|
cwd: context.workingDir,
|
|
33
|
-
env:
|
|
69
|
+
env: safeEnv(),
|
|
34
70
|
stdio: ["ignore", "pipe", "pipe"],
|
|
35
71
|
});
|
|
36
72
|
const timer = setTimeout(() => {
|
|
@@ -79,7 +115,9 @@ export const BashTool = {
|
|
|
79
115
|
prompt() {
|
|
80
116
|
return `Execute a bash command and return stdout/stderr. Parameters:
|
|
81
117
|
- command (string, required): The shell command to run.
|
|
118
|
+
- description (string, optional): A human-readable description of what the command does.
|
|
82
119
|
- timeout (number, optional): Timeout in seconds (default 120, max 600).
|
|
120
|
+
- run_in_background (boolean, optional): Run the command in the background. Returns immediately with a process ID. You will be notified when it completes.
|
|
83
121
|
Output is truncated at 100K characters.`;
|
|
84
122
|
},
|
|
85
123
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/BashTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/BashTool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,10 +61,10 @@ export const FileEditTool = {
|
|
|
61
61
|
},
|
|
62
62
|
prompt() {
|
|
63
63
|
return `Perform exact string replacement in a file. Parameters:
|
|
64
|
-
- file_path (string, required):
|
|
65
|
-
- old_string (string, required): The exact text to
|
|
66
|
-
- new_string (string, required): The replacement text.
|
|
67
|
-
- replace_all (boolean, optional): Replace all occurrences
|
|
64
|
+
- file_path (string, required): The absolute path to the file to modify.
|
|
65
|
+
- old_string (string, required): The exact text to replace. Must match the file content exactly, including indentation.
|
|
66
|
+
- new_string (string, required): The replacement text (must be different from old_string).
|
|
67
|
+
- replace_all (boolean, optional, default false): Replace all occurrences. If false, old_string must be unique in the file — if it appears multiple times, the edit will FAIL. Provide more surrounding context to make it unique, or use replace_all to change every instance. Use replace_all for renaming variables/functions across a file.`;
|
|
68
68
|
},
|
|
69
69
|
};
|
|
70
70
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/FileEditTool/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/FileEditTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAA6B;IACpD,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,uCAAuC;IACpD,WAAW;IACX,SAAS,EAAE,QAAQ;IAEnB,UAAU;QACR,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;YAC/C,CAAC,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAErD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,OAAO;oBACL,MAAM,EAAE,kCAAkC,QAAQ,GAAG;oBACrD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACtD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,OAAO;wBACL,MAAM,EAAE,sCAAsC,QAAQ,iHAAiH;wBACvK,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW;gBAClC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAExD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAElD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW;gBACnC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;gBAC5C,CAAC,CAAC,CAAC,CAAC;YAEN,OAAO;gBACL,MAAM,EAAE,UAAU,QAAQ,cAAc,WAAW,6BAA6B,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,UAAU,EAAE;gBAChI,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,MAAM,EAAE,0BAA0B,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACzE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO;;;;gVAIqU,CAAC;IAC/U,CAAC;CACF,CAAC"}
|
|
@@ -4,14 +4,17 @@ declare const inputSchema: z.ZodObject<{
|
|
|
4
4
|
file_path: z.ZodString;
|
|
5
5
|
offset: z.ZodOptional<z.ZodNumber>;
|
|
6
6
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
pages: z.ZodOptional<z.ZodString>;
|
|
7
8
|
}, "strip", z.ZodTypeAny, {
|
|
8
9
|
file_path: string;
|
|
9
10
|
offset?: number | undefined;
|
|
10
11
|
limit?: number | undefined;
|
|
12
|
+
pages?: string | undefined;
|
|
11
13
|
}, {
|
|
12
14
|
file_path: string;
|
|
13
15
|
offset?: number | undefined;
|
|
14
16
|
limit?: number | undefined;
|
|
17
|
+
pages?: string | undefined;
|
|
15
18
|
}>;
|
|
16
19
|
export declare const FileReadTool: Tool<typeof inputSchema>;
|
|
17
20
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/FileReadTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAEnE,QAAA,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/FileReadTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAEnE,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAKf,CAAC;AAwBH,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,OAAO,WAAW,CA8IjD,CAAC"}
|
|
@@ -5,11 +5,33 @@ const inputSchema = z.object({
|
|
|
5
5
|
file_path: z.string(),
|
|
6
6
|
offset: z.number().optional(),
|
|
7
7
|
limit: z.number().optional(),
|
|
8
|
+
pages: z.string().optional(),
|
|
8
9
|
});
|
|
9
10
|
const DEFAULT_LIMIT = 2000;
|
|
11
|
+
const IMAGE_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp", ".svg"]);
|
|
12
|
+
const NOTEBOOK_EXTENSION = ".ipynb";
|
|
13
|
+
function parsePageRange(pages) {
|
|
14
|
+
const result = [];
|
|
15
|
+
for (const part of pages.split(",")) {
|
|
16
|
+
const trimmed = part.trim();
|
|
17
|
+
if (trimmed.includes("-")) {
|
|
18
|
+
const [start, end] = trimmed.split("-").map(Number);
|
|
19
|
+
if (!isNaN(start) && !isNaN(end)) {
|
|
20
|
+
for (let i = start; i <= Math.min(end, start + 19); i++)
|
|
21
|
+
result.push(i);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
const n = Number(trimmed);
|
|
26
|
+
if (!isNaN(n))
|
|
27
|
+
result.push(n);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result.slice(0, 20); // Max 20 pages
|
|
31
|
+
}
|
|
10
32
|
export const FileReadTool = {
|
|
11
33
|
name: "Read",
|
|
12
|
-
description: "Read a file from the filesystem
|
|
34
|
+
description: "Read a file from the filesystem. Supports text files, images, PDFs, and Jupyter notebooks.",
|
|
13
35
|
inputSchema,
|
|
14
36
|
riskLevel: "low",
|
|
15
37
|
isReadOnly() {
|
|
@@ -27,6 +49,80 @@ export const FileReadTool = {
|
|
|
27
49
|
if (stat.isDirectory()) {
|
|
28
50
|
return { output: `Error: ${filePath} is a directory, not a file.`, isError: true };
|
|
29
51
|
}
|
|
52
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
53
|
+
// Image files: return as base64
|
|
54
|
+
if (IMAGE_EXTENSIONS.has(ext)) {
|
|
55
|
+
const buffer = await fs.readFile(filePath);
|
|
56
|
+
const base64 = buffer.toString("base64");
|
|
57
|
+
const mimeTypes = {
|
|
58
|
+
".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
|
|
59
|
+
".gif": "image/gif", ".webp": "image/webp", ".bmp": "image/bmp", ".svg": "image/svg+xml",
|
|
60
|
+
};
|
|
61
|
+
return { output: `__IMAGE__:${mimeTypes[ext] ?? "image/png"}:${base64}`, isError: false };
|
|
62
|
+
}
|
|
63
|
+
// PDF files: extract text per page (basic extraction)
|
|
64
|
+
if (ext === ".pdf") {
|
|
65
|
+
// Guard against very large PDFs without page filter
|
|
66
|
+
if (stat.size > 20 * 1024 * 1024 && !input.pages) {
|
|
67
|
+
return { output: `PDF is ${(stat.size / 1024 / 1024).toFixed(1)} MB. Provide a 'pages' parameter (e.g., "1-5") to read specific pages.`, isError: true };
|
|
68
|
+
}
|
|
69
|
+
const buffer = await fs.readFile(filePath);
|
|
70
|
+
// Basic PDF text extraction — look for text between BT/ET markers or stream content
|
|
71
|
+
const text = buffer.toString("latin1");
|
|
72
|
+
const pages = input.pages ? parsePageRange(input.pages) : undefined;
|
|
73
|
+
// Simple page boundary detection via /Page markers
|
|
74
|
+
const pageTexts = [];
|
|
75
|
+
const pageMatches = text.split(/\/Type\s*\/Page[^s]/);
|
|
76
|
+
// Skip first chunk (PDF header)
|
|
77
|
+
for (let i = 1; i < pageMatches.length; i++) {
|
|
78
|
+
if (pages && !pages.includes(i))
|
|
79
|
+
continue;
|
|
80
|
+
// Extract text content between parentheses in BT..ET blocks
|
|
81
|
+
const btEtRegex = /BT\s*([\s\S]*?)ET/g;
|
|
82
|
+
let pageText = "";
|
|
83
|
+
let match;
|
|
84
|
+
while ((match = btEtRegex.exec(pageMatches[i])) !== null) {
|
|
85
|
+
const tjRegex = /\(([^)]*)\)\s*Tj/g;
|
|
86
|
+
let tj;
|
|
87
|
+
while ((tj = tjRegex.exec(match[1])) !== null) {
|
|
88
|
+
pageText += tj[1];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (pageText.trim()) {
|
|
92
|
+
pageTexts.push(`--- Page ${i} ---\n${pageText.trim()}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (pageTexts.length > 0) {
|
|
96
|
+
return { output: pageTexts.join("\n\n"), isError: false };
|
|
97
|
+
}
|
|
98
|
+
// Fallback: return as base64 for multimodal analysis
|
|
99
|
+
const base64 = buffer.toString("base64");
|
|
100
|
+
return { output: `__IMAGE__:application/pdf:${base64}`, isError: false };
|
|
101
|
+
}
|
|
102
|
+
// Jupyter notebooks: render cells
|
|
103
|
+
if (ext === NOTEBOOK_EXTENSION) {
|
|
104
|
+
const raw = await fs.readFile(filePath, "utf-8");
|
|
105
|
+
const notebook = JSON.parse(raw);
|
|
106
|
+
const cells = notebook.cells ?? [];
|
|
107
|
+
const parts = [];
|
|
108
|
+
for (let i = 0; i < cells.length; i++) {
|
|
109
|
+
const cell = cells[i];
|
|
110
|
+
const source = Array.isArray(cell.source) ? cell.source.join("") : cell.source;
|
|
111
|
+
const cellType = cell.cell_type ?? "code";
|
|
112
|
+
parts.push(`[Cell ${i} - ${cellType}]\n${source}`);
|
|
113
|
+
// Include text outputs
|
|
114
|
+
if (cell.outputs) {
|
|
115
|
+
for (const out of cell.outputs) {
|
|
116
|
+
if (out.text) {
|
|
117
|
+
const text = Array.isArray(out.text) ? out.text.join("") : out.text;
|
|
118
|
+
parts.push(`[Output]\n${text}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { output: parts.join("\n\n"), isError: false };
|
|
124
|
+
}
|
|
125
|
+
// Default: text file
|
|
30
126
|
const content = await fs.readFile(filePath, "utf-8");
|
|
31
127
|
const allLines = content.split("\n");
|
|
32
128
|
const offset = Math.max(0, (input.offset ?? 1) - 1);
|
|
@@ -54,10 +150,12 @@ export const FileReadTool = {
|
|
|
54
150
|
}
|
|
55
151
|
},
|
|
56
152
|
prompt() {
|
|
57
|
-
return `Read a file and return its contents
|
|
153
|
+
return `Read a file and return its contents. Supports text files, images, PDFs, and Jupyter notebooks. Parameters:
|
|
58
154
|
- file_path (string, required): Absolute or relative path to the file.
|
|
59
|
-
- offset (number, optional): Line number to start from (1-based, default 1).
|
|
60
|
-
- limit (number, optional): Maximum number of lines to return (default 2000)
|
|
155
|
+
- offset (number, optional): Line number to start from (1-based, default 1). For text files only.
|
|
156
|
+
- limit (number, optional): Maximum number of lines to return (default 2000). For text files only.
|
|
157
|
+
- pages (string, optional): Page range for PDF files (e.g., "1-5", "3", "10-20"). Max 20 pages per request.
|
|
158
|
+
Images are returned as base64 for multimodal analysis. Jupyter notebooks show all cells with outputs.`;
|
|
61
159
|
},
|
|
62
160
|
};
|
|
63
161
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/FileReadTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,CAAC,MAAM,YAAY,GAA6B;IACpD,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/FileReadTool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/FileWriteTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAEnE,QAAA,MAAM,WAAW;;;;;;;;;EAGf,CAAC;AAEH,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,OAAO,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/FileWriteTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAEnE,QAAA,MAAM,WAAW;;;;;;;;;EAGf,CAAC;AAEH,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,OAAO,WAAW,CAoDlD,CAAC"}
|
|
@@ -22,10 +22,24 @@ export const FileWriteTool = {
|
|
|
22
22
|
: path.resolve(context.workingDir, input.file_path);
|
|
23
23
|
try {
|
|
24
24
|
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
25
|
-
|
|
25
|
+
// Try exclusive create first to detect overwrites
|
|
26
|
+
let existed = false;
|
|
27
|
+
try {
|
|
28
|
+
await fs.writeFile(filePath, input.content, { encoding: "utf-8", flag: "wx" });
|
|
29
|
+
}
|
|
30
|
+
catch (wxErr) {
|
|
31
|
+
if (wxErr.code === "EEXIST") {
|
|
32
|
+
existed = true;
|
|
33
|
+
await fs.writeFile(filePath, input.content, "utf-8");
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw wxErr;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
26
39
|
const lineCount = input.content.split("\n").length;
|
|
40
|
+
const prefix = existed ? "Overwrote" : "Created";
|
|
27
41
|
return {
|
|
28
|
-
output:
|
|
42
|
+
output: `${prefix} ${filePath} (${lineCount} lines).`,
|
|
29
43
|
isError: false,
|
|
30
44
|
};
|
|
31
45
|
}
|
|
@@ -34,9 +48,10 @@ export const FileWriteTool = {
|
|
|
34
48
|
}
|
|
35
49
|
},
|
|
36
50
|
prompt() {
|
|
37
|
-
return `Write content to a file, creating parent directories if needed.
|
|
38
|
-
- file_path (string, required):
|
|
39
|
-
- content (string, required): The full content to write
|
|
51
|
+
return `Write content to a file, creating parent directories if needed. This tool will overwrite existing files.
|
|
52
|
+
- file_path (string, required): The absolute path to the file to write.
|
|
53
|
+
- content (string, required): The full content to write to the file.
|
|
54
|
+
IMPORTANT: Prefer the Edit tool for modifying existing files — it only sends the diff. Only use Write to create new files or for complete rewrites. If the file already exists, you MUST use Read first to understand its current contents.`;
|
|
40
55
|
},
|
|
41
56
|
};
|
|
42
57
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/FileWriteTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,iEAAiE;IAC9E,WAAW;IACX,SAAS,EAAE,QAAQ;IAEnB,UAAU;QACR,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;YAC/C,CAAC,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/FileWriteTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,iEAAiE;IAC9E,WAAW;IACX,SAAS,EAAE,QAAQ;IAEnB,UAAU;QACR,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;YAC/C,CAAC,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,kDAAkD;YAClD,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5B,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACnD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YACjD,OAAO;gBACL,MAAM,EAAE,GAAG,MAAM,IAAI,QAAQ,KAAK,SAAS,UAAU;gBACrD,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO;;;4OAGiO,CAAC;IAC3O,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/GlobTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/GlobTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAGnE,QAAA,MAAM,WAAW;;;;;;;;;EAGf,CAAC;AAIH,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,OAAO,WAAW,CA+D7C,CAAC"}
|
|
@@ -1,69 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import * as fs from "fs/promises";
|
|
3
3
|
import * as path from "path";
|
|
4
|
+
import { walkDir, matchGlob } from "../../utils/fs.js";
|
|
4
5
|
const inputSchema = z.object({
|
|
5
6
|
pattern: z.string(),
|
|
6
7
|
path: z.string().optional(),
|
|
7
8
|
});
|
|
8
9
|
const MAX_RESULTS = 500;
|
|
9
|
-
async function walkDir(dir) {
|
|
10
|
-
const results = [];
|
|
11
|
-
try {
|
|
12
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
13
|
-
for (const entry of entries) {
|
|
14
|
-
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
15
|
-
continue;
|
|
16
|
-
const full = path.join(dir, entry.name);
|
|
17
|
-
if (entry.isDirectory()) {
|
|
18
|
-
results.push(...(await walkDir(full)));
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
results.push(full);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
// skip unreadable dirs
|
|
27
|
-
}
|
|
28
|
-
return results;
|
|
29
|
-
}
|
|
30
|
-
function matchGlob(filePath, pattern) {
|
|
31
|
-
// Convert glob pattern to regex
|
|
32
|
-
const regexStr = pattern
|
|
33
|
-
.replace(/\\/g, "/")
|
|
34
|
-
.replace(/\*\*/g, "{{GLOBSTAR}}")
|
|
35
|
-
.replace(/\*/g, "[^/]*")
|
|
36
|
-
.replace(/\?/g, "[^/]")
|
|
37
|
-
.replace(/{{GLOBSTAR}}/g, ".*")
|
|
38
|
-
.replace(/\./g, "\\.");
|
|
39
|
-
// Rebuild with escaped dots applied before star conversion artifacts
|
|
40
|
-
const escaped = pattern
|
|
41
|
-
.replace(/\\/g, "/")
|
|
42
|
-
.split("")
|
|
43
|
-
.map((c, i, arr) => {
|
|
44
|
-
if (c === "*" && arr[i + 1] === "*")
|
|
45
|
-
return null;
|
|
46
|
-
if (c === "*" && arr[i - 1] === "*")
|
|
47
|
-
return "GLOBSTAR";
|
|
48
|
-
if (c === "*")
|
|
49
|
-
return "[^/]*";
|
|
50
|
-
if (c === "?")
|
|
51
|
-
return "[^/]";
|
|
52
|
-
if (c === ".")
|
|
53
|
-
return "\\.";
|
|
54
|
-
return c;
|
|
55
|
-
})
|
|
56
|
-
.filter((c) => c !== null)
|
|
57
|
-
.join("")
|
|
58
|
-
.replace(/GLOBSTAR/g, ".*");
|
|
59
|
-
try {
|
|
60
|
-
const re = new RegExp("^" + escaped + "$");
|
|
61
|
-
return re.test(filePath.replace(/\\/g, "/"));
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
return filePath.includes(pattern.replace(/\*/g, ""));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
10
|
export const GlobTool = {
|
|
68
11
|
name: "Glob",
|
|
69
12
|
description: "Find files matching a glob pattern.",
|
|
@@ -117,10 +60,10 @@ export const GlobTool = {
|
|
|
117
60
|
}
|
|
118
61
|
},
|
|
119
62
|
prompt() {
|
|
120
|
-
return `
|
|
121
|
-
- pattern (string, required): Glob pattern (e.g. "**/*.ts", "src/**/*.js").
|
|
63
|
+
return `Fast file pattern matching tool. Use this instead of running 'find' or 'ls' via Bash. Parameters:
|
|
64
|
+
- pattern (string, required): Glob pattern (e.g. "**/*.ts", "src/**/*.js", "*.config.*").
|
|
122
65
|
- path (string, optional): Base directory to search in (default: working directory).
|
|
123
|
-
Returns up to 500 matching file paths, sorted alphabetically.`;
|
|
66
|
+
Returns up to 500 matching file paths, sorted alphabetically. Supports ** for recursive matching.`;
|
|
124
67
|
},
|
|
125
68
|
};
|
|
126
69
|
//# sourceMappingURL=index.js.map
|