ai-agent-test 0.9.10 → 0.10.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 +9 -6
- package/SYSTEM.md +3 -1
- package/TODOs.md +4 -1
- package/bin/ai +10 -0
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/edit.d.ts +13 -3
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +80 -7
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/index.d.ts +9 -3
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/read.d.ts +3 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +21 -4
- package/dist/tools/read.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,15 +6,17 @@ A lightweight, extensible agentic workflow system built with TypeScript and the
|
|
|
6
6
|
|
|
7
7
|
It works well with highend models like MiniMax too (OpenRouter). The agent sends minimum context which means a lot less money spent 💰.
|
|
8
8
|
|
|
9
|
+
See [TODOs.md](./TODOs.md) for roadmap, features in development, and known bugs.
|
|
10
|
+
|
|
9
11
|
## 🌟 Features
|
|
10
12
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
13
|
+
- Agentic Architecture: Multi-iteration agent loop with tool calling capabilities
|
|
14
|
+
- Local LLM Support: Connect to any OpenAI-compatible API endpoint or Google Generative AI
|
|
15
|
+
- Extensible Tools: Built-in tools for file operations, bash execution, web search, and more
|
|
14
16
|
- See [src/tools/](./src/tools/) for all available tools
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
17
|
+
- Interactive CLI: Real-time chat interface with streaming responses
|
|
18
|
+
- Session Management: Session logs are stored in `~/.ai/logs/` to track agent behavior and progress. Agent can also restore previous sessions to continue conversations.
|
|
19
|
+
- Custom System Prompt: Create `~/.ai/SYSTEM.md` or use `--system` CLI option to provide custom instructions that augment the agent's system prompt
|
|
18
20
|
|
|
19
21
|
## 🛠️ Prerequisites
|
|
20
22
|
|
|
@@ -101,6 +103,7 @@ ai
|
|
|
101
103
|
### Additional Environment Variables
|
|
102
104
|
|
|
103
105
|
- `BRAVE_API_KEY`: (Required) API key for Brave Search for the internet search tool
|
|
106
|
+
- `AI_SYSTEM_PROMPT`: Additional system prompt content (set via `--system` CLI option)
|
|
104
107
|
|
|
105
108
|
### Session Management
|
|
106
109
|
|
package/SYSTEM.md
CHANGED
package/TODOs.md
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
- 1. [x] find user's machine's ~/.ai/SYSTEM.md file and concat to ai-agent's system prompt.
|
|
4
4
|
- 2. [x] add doc retrival tool. To get latest lib info so the agent can solve tasks more effectively. Not just library, it can be doc for technologies like postgres. so approach should be broader not just like npm library. and check internet_search tool if you can extract logic and have shared code. also improve SYSTEM.md once it's done.
|
|
5
5
|
- 3. [ ] improve loop with testing tools so the agent can complete tasks in better shape.
|
|
6
|
+
- 4. [ ] Compaction-like feature, but not exactly compaction that is in other coding agents. Summarize current conversation and save to a file, then restart a new session with the summary.
|
|
7
|
+
- 5. [ ] one-off CLI command to run a task without starting the agent loop. For example, `ai-agent run "write a function to reverse a string in python"`. This may evolve into a sub-agent feature.
|
|
6
8
|
|
|
7
9
|
## Backlog ideas
|
|
8
10
|
|
|
@@ -10,5 +12,6 @@
|
|
|
10
12
|
|
|
11
13
|
## Bugs
|
|
12
14
|
|
|
13
|
-
- 1. [
|
|
15
|
+
- 1. [x] user can backspace to delete even "Prompt: ".
|
|
14
16
|
- 2. [ ] when user input gets to next line, the cursor can't come back to the first line with backspace. Backspace seems actually deleting but it's not visible to user.
|
|
17
|
+
- 3. [x] edit tool (or read tool) doesn't work well when there is backslash in the content that they need to handle. for example the codebase had a line like `systemPrompt += "\n\n---\n\nCLI System Prompt\n\" + cliSystemPrompt` and couldn't resolve it because there was a backslash before closing quote.
|
package/bin/ai
CHANGED
|
@@ -31,6 +31,11 @@ const args = yargs(hideBin(argv))
|
|
|
31
31
|
type: "number",
|
|
32
32
|
describe: "Resume with session index from `ai sessions`",
|
|
33
33
|
})
|
|
34
|
+
.option("system", {
|
|
35
|
+
alias: "sys",
|
|
36
|
+
type: "string",
|
|
37
|
+
describe: "Additional system prompt content to append",
|
|
38
|
+
})
|
|
34
39
|
.command(
|
|
35
40
|
"models",
|
|
36
41
|
"List all available models",
|
|
@@ -120,6 +125,11 @@ if (args.session !== undefined) {
|
|
|
120
125
|
console.log(`Loaded session ${sessionIndex} from ${sessionFile}`)
|
|
121
126
|
}
|
|
122
127
|
|
|
128
|
+
// Handle additional system prompt from --system option
|
|
129
|
+
if (args.system !== undefined) {
|
|
130
|
+
process.env.AI_SYSTEM_PROMPT = args.system
|
|
131
|
+
}
|
|
132
|
+
|
|
123
133
|
// Load config after setting model index
|
|
124
134
|
const config = loadConfig()
|
|
125
135
|
process.env.AI_MODEL_APITYPE = config.modelApiType
|
package/dist/index.js
CHANGED
|
@@ -74,15 +74,26 @@ const userSystemPromptPath = join(homedir(), ".ai", "SYSTEM.md");
|
|
|
74
74
|
let userSystemPrompt = "";
|
|
75
75
|
try {
|
|
76
76
|
userSystemPrompt = fs.readFileSync(userSystemPromptPath, "utf-8");
|
|
77
|
-
systemPrompt += "\n\n---\n\nUser Custom System Prompt
|
|
77
|
+
systemPrompt += "\n\n---\n\nUser Custom System Prompt:\n" + userSystemPrompt;
|
|
78
78
|
}
|
|
79
79
|
catch {
|
|
80
80
|
// User's SYSTEM.md doesn't exist, which is fine
|
|
81
81
|
}
|
|
82
|
+
// Check for additional system prompt from --system CLI option
|
|
83
|
+
const cliSystemPrompt = process.env.AI_SYSTEM_PROMPT || "";
|
|
84
|
+
if (cliSystemPrompt) {
|
|
85
|
+
systemPrompt += "\n\n---\n\nCLI System Prompt\n" + cliSystemPrompt;
|
|
86
|
+
}
|
|
82
87
|
systemPrompt = systemPrompt
|
|
83
88
|
.replace("{date}", new Date().toLocaleString())
|
|
84
89
|
.replace("{pwd}", process.cwd())
|
|
85
|
-
.replace("{ls}", fs.readdirSync(process.cwd()).join(", "))
|
|
90
|
+
.replace("{ls}", fs.readdirSync(process.cwd()).join(", "))
|
|
91
|
+
.replace("{ls src}", fs.existsSync(path.join(__dirname, "../src"))
|
|
92
|
+
? fs.readdirSync(path.join(__dirname, "../src")).join(", ")
|
|
93
|
+
: "not found")
|
|
94
|
+
.replace("{ls packages}", fs.existsSync(path.join(__dirname, "../packages"))
|
|
95
|
+
? fs.readdirSync(path.join(__dirname, "../packages")).join(", ")
|
|
96
|
+
: "not found");
|
|
86
97
|
let interruptRequested = false;
|
|
87
98
|
// Check for loaded messages from a previous session via env var
|
|
88
99
|
const messages = [];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAuC,MAAM,IAAI,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,UAAU,EACV,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,2DAA2D;AAC3D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,6DAA6D;AAC7D,SAAS,WAAW,CAAC,OAAqB;IACxC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtB,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED,8DAA8D;AAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAuC,CAAA;AACzE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAA;AACjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAA;AACjD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAA;AAE3C,IAAI,KAAsB,CAAA;AAC1B,IAAI,aAAa,GAAW,CAAC,CAAA,CAAC,0BAA0B;AAExD,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;IAC/B,KAAK,GAAG,wBAAwB,CAAC;QAC/B,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,MAAM;KACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACpB,CAAC;KAAM,CAAC;IACN,KAAK,GAAG,YAAY,CAAC;QACnB,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,MAAM;KACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACpB,CAAC;AAED,gEAAgE;AAChE,KAAK,UAAU,kBAAkB;IAC/B,gDAAgD;IAChD,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;YAChD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;SACF,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,+DAA+D;QAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;QACrC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;QAElE,IAAI,SAAS,EAAE,CAAC;YACd,gDAAgD;YAChD,aAAa,GAAG,SAAS,CAAC,cAAc,IAAI,CAAC,CAAA;YAC7C,OAAO,aAAa,CAAA;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IACD,OAAO,aAAa,CAAA,CAAC,wBAAwB;AAC/C,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;AAC7D,IAAI,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;AAE7D,mEAAmE;AACnE,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAA;AAChE,IAAI,gBAAgB,GAAG,EAAE,CAAA;AACzB,IAAI,CAAC;IACH,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAA;IACjE,YAAY,IAAI,yCAAyC,GAAG,gBAAgB,CAAA;AAC9E,CAAC;AAAC,MAAM,CAAC;IACP,gDAAgD;AAClD,CAAC;AAED,8DAA8D;AAC9D,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAA;AAC1D,IAAI,eAAe,EAAE,CAAC;IACpB,YAAY,IAAI,gCAAgC,GAAG,eAAe,CAAA;AACpE,CAAC;AAED,YAAY,GAAG,YAAY;KACxB,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;KAC9C,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC/B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACzD,OAAO,CACN,UAAU,EACV,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3D,CAAC,CAAC,WAAW,CAChB;KACA,OAAO,CACN,eAAe,EACf,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAChD,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,CAAC,CAAC,WAAW,CAChB,CAAA;AAEH,IAAI,kBAAkB,GAAG,KAAK,CAAA;AAE9B,gEAAgE;AAChE,MAAM,QAAQ,GAAmB,EAAE,CAAA;AACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;AAC/C,IAAI,WAAW,EAAE,CAAC;IAChB,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAC/C,IAAI,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAA;QAChC,WAAW,CAAC;YACV,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kDAAkD,WAAW,4FAA4F;SACnK,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,UAAU,QAAQ,CAAC,MAAM,kCAAkC,CAAC,CACzE,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,MAAc;IACnC,WAAW,CAAC;QACV,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;IAEF,uBAAuB;IACvB,kBAAkB,GAAG,KAAK,CAAA;IAE1B,0BAA0B;IAC1B,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YAC9B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;YACtB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QACtC,CAAC;IACH,CAAC,CAAA;IAED,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YAChD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;QACjC,kBAAkB;QAClB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAA;YACvD,kBAAkB,GAAG,IAAI,CAAA;QAC3B,CAAC;IACH,CAAC,CAAA;IAED,gBAAgB,EAAE,CAAA;IAElB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;YAC3B,KAAK;YACL,QAAQ;YACR,KAAK;YACL,MAAM,EAAE,YAAY;SACrB,CAAC,CAAA;QAEF,IAAI,QAAQ,GAAG,EAAE,CAAA;QACjB,MAAM,kBAAkB,GAAU,EAAE,CAAA;QACpC,MAAM,iBAAiB,GAAgB,EAAE,CAAA;QAEzC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACxC,IAAI,kBAAkB,EAAE,CAAC;gBACvB,kBAAkB,EAAE,CAAA;gBACpB,OAAM;YACR,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;gBACnD,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC/B,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAA;YACvB,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACrC,kBAAkB,CAAC,IAAI,CAAC;oBACtB,IAAI,EAAE,WAAW;oBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAA;YACJ,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAI,IAAY,CAAC,MAAM,CAAA;gBACnC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC7B,iBAAiB,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,aAAa;wBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,MAAM,EAAE;4BACN,IAAI,EAAE,MAAM;4BACZ,KAAK,EACH,MAAM,CAAC,MAAM;gCACb,CAAC,MAAM,CAAC,QAAQ;oCACd,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;oCAClD,CAAC,CAAC,EAAE,CAAC;yBACV;qBACF,CAAC,CAAA;gBACJ,CAAC;qBAAM,CAAC;oBACN,iBAAiB,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,aAAa;wBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,MAAM,EAAE;4BACN,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE,KAAK,IAAI,eAAe;yBAC1D;qBACF,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAE,MAAc,CAAC,UAAU,CAAC,CAC9D,CAAA;QACD,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,yCAAyC,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,QAAQ,GAAG,CACtF,CACF,CAAA;gBACD,iBAAiB,CAAC,IAAI,CAAC;oBACrB,IAAI,EAAE,aAAa;oBACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,MAAM,EAAE;wBACN,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,uDAAuD,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,QAAQ,IAAI;qBAC5G;iBACF,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAA;QAE7B,MAAM,gBAAgB,GAAU,EAAE,CAAA;QAClC,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;YAC1C,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjC,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,WAAW,CAAC;gBACV,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,WAAW,CAAC;gBACV,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAA;QACJ,CAAC;QAED,wDAAwD;QACxD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,CACjB,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC;gBAC1C,GAAG,CACJ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YACZ,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,QAAQ,SAAS,YAAY,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,UAAU,IAAI,CACvE,CACF,CAAA;QACH,CAAC;aAAM,CAAC;YACN,2EAA2E;YAC3E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,QAAQ,SAAS,YAAY,KAAK,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,CAClE,CAAA;QACH,CAAC;QACD,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,MAAK;QACP,CAAC;QACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CACxC,CAAC,MAAM,EAAE,EAAE,CAAE,MAAc,CAAC,QAAQ,KAAK,SAAS,CAAC,cAAc,CAClE,CAAA;QACD,IAAI,WAAW,IAAK,WAAmB,CAAC,MAAM,EAAE,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;YACnD,MAAK;QACP,CAAC;QACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CACxC,CAAC,MAAM,EAAE,EAAE,CAAE,MAAc,CAAC,QAAQ,KAAK,SAAS,CAAC,eAAe,CACnE,CAAA;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAA;YAC7D,MAAK;QACP,CAAC;QACD,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAK;QACP,CAAC;IACH,CAAC;IAED,kBAAkB,EAAE,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3E,MAAM,QAAQ,GAAG,sCAAsC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEjC,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAA;IACzC,IAAI,UAAU,EAAE,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,6CAA6C,UAAU,CAAC,cAAc,OAAO,UAAU,CAAC,aAAa,GAAG,CACzG,CACF,CAAA;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAClE,CACF,CAAA;IAED,kDAAkD;IAClD,MAAM,kBAAkB,EAAE,CAAA;IAE1B,OAAO,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAA;QAEhD,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACxC,MAAK;QACP,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,uBAAwB,KAAe,CAAC,OAAO,EAAE,CAAC,CAC7D,CAAA;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACzD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
|
package/dist/tools/edit.d.ts
CHANGED
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export interface
|
|
2
|
+
export interface ReplaceEdit {
|
|
3
3
|
oldText: string;
|
|
4
4
|
newText: string;
|
|
5
5
|
useReplaceAll?: boolean;
|
|
6
6
|
}
|
|
7
|
+
export interface LineEdit {
|
|
8
|
+
startLine: number;
|
|
9
|
+
endLine?: number;
|
|
10
|
+
newText: string;
|
|
11
|
+
}
|
|
12
|
+
export type Edit = ReplaceEdit | LineEdit;
|
|
7
13
|
export declare const editTool: {
|
|
8
14
|
description: string;
|
|
9
15
|
inputSchema: z.ZodObject<{
|
|
10
16
|
path: z.ZodString;
|
|
11
|
-
edits: z.ZodArray<z.ZodObject<{
|
|
17
|
+
edits: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
12
18
|
oldText: z.ZodString;
|
|
13
19
|
newText: z.ZodString;
|
|
14
20
|
useReplaceAll: z.ZodOptional<z.ZodBoolean>;
|
|
15
|
-
}, z.core.$strip
|
|
21
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
22
|
+
startLine: z.ZodNumber;
|
|
23
|
+
endLine: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
newText: z.ZodString;
|
|
25
|
+
}, z.core.$strip>]>>;
|
|
16
26
|
}, z.core.$strip>;
|
|
17
27
|
execute: ({ path: filePath, edits, }: {
|
|
18
28
|
path: string;
|
package/dist/tools/edit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,IAAI,GAAG,WAAW,GAAG,QAAQ,CAAA;AAiFzC,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;0CAchB;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,IAAI,EAAE,CAAA;KACd;;;;;;;;;;;;;;;CAiFF,CAAA"}
|
package/dist/tools/edit.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import chalk from "chalk";
|
|
5
|
-
const
|
|
5
|
+
const replaceEditSchema = z.object({
|
|
6
6
|
oldText: z.string().describe("The exact text for JS's `replace()` function"),
|
|
7
7
|
newText: z.string().describe("The new text to insert"),
|
|
8
8
|
useReplaceAll: z
|
|
@@ -10,11 +10,67 @@ const editSchema = z.object({
|
|
|
10
10
|
.optional()
|
|
11
11
|
.describe("If true, replace all occurrences instead of just the first one"),
|
|
12
12
|
});
|
|
13
|
+
const lineEditSchema = z.object({
|
|
14
|
+
startLine: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.positive()
|
|
18
|
+
.describe("The 1-indexed line number where replacement should start. Use this when exact text contains many escape characters."),
|
|
19
|
+
endLine: z
|
|
20
|
+
.number()
|
|
21
|
+
.int()
|
|
22
|
+
.positive()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("The 1-indexed line number where replacement should end. Defaults to startLine."),
|
|
25
|
+
newText: z
|
|
26
|
+
.string()
|
|
27
|
+
.describe("The replacement text for the specified line range."),
|
|
28
|
+
});
|
|
29
|
+
const editSchema = z.union([replaceEditSchema, lineEditSchema]);
|
|
30
|
+
function isReplaceEdit(edit) {
|
|
31
|
+
return "oldText" in edit;
|
|
32
|
+
}
|
|
33
|
+
function applyLineEdit(content, edit) {
|
|
34
|
+
const lines = content.split("\n");
|
|
35
|
+
const startLine = edit.startLine;
|
|
36
|
+
const endLine = edit.endLine ?? startLine;
|
|
37
|
+
if (endLine < startLine) {
|
|
38
|
+
return {
|
|
39
|
+
success: false,
|
|
40
|
+
error: `Invalid line range: endLine (${endLine}) must be greater than or equal to startLine (${startLine}).`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (startLine > lines.length) {
|
|
44
|
+
return {
|
|
45
|
+
success: false,
|
|
46
|
+
error: `Invalid line range: startLine ${startLine} is beyond the end of the file (${lines.length} lines).`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (endLine > lines.length) {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
error: `Invalid line range: endLine ${endLine} is beyond the end of the file (${lines.length} lines).`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const replacementLines = edit.newText.split("\n");
|
|
56
|
+
const updatedLines = [
|
|
57
|
+
...lines.slice(0, startLine - 1),
|
|
58
|
+
...replacementLines,
|
|
59
|
+
...lines.slice(endLine),
|
|
60
|
+
];
|
|
61
|
+
const updatedContent = updatedLines.join("\n");
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
content: updatedContent,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
13
67
|
export const editTool = {
|
|
14
|
-
description: "Make precise, targeted edits to existing files.
|
|
68
|
+
description: "Make precise, targeted edits to existing files. Use exact text replacement for simple changes, or replace a line range when escaped characters make exact matching unreliable.",
|
|
15
69
|
inputSchema: z.object({
|
|
16
70
|
path: z.string().describe("The path to the file to edit"),
|
|
17
|
-
edits: z
|
|
71
|
+
edits: z
|
|
72
|
+
.array(editSchema)
|
|
73
|
+
.describe("Array of edits to apply. Each edit can be an exact text replacement or a line-range replacement."),
|
|
18
74
|
}),
|
|
19
75
|
execute: async ({ path: filePath, edits, }) => {
|
|
20
76
|
console.log(chalk.yellow(`\n[TOOL - edit] Editing file: ${filePath} (edits: ${edits.length})`));
|
|
@@ -30,18 +86,35 @@ export const editTool = {
|
|
|
30
86
|
let editsApplied = 0;
|
|
31
87
|
for (const edit of edits) {
|
|
32
88
|
let newContent = content;
|
|
33
|
-
if (edit
|
|
34
|
-
|
|
89
|
+
if (isReplaceEdit(edit)) {
|
|
90
|
+
if (edit.useReplaceAll) {
|
|
91
|
+
newContent = content.replaceAll(edit.oldText, edit.newText);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
newContent = content.replace(edit.oldText, edit.newText);
|
|
95
|
+
}
|
|
35
96
|
}
|
|
36
97
|
else {
|
|
37
|
-
|
|
98
|
+
const lineEditResult = applyLineEdit(content, edit);
|
|
99
|
+
if (!lineEditResult.success) {
|
|
100
|
+
return {
|
|
101
|
+
success: false,
|
|
102
|
+
error: lineEditResult.error,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
newContent = lineEditResult.content;
|
|
38
106
|
}
|
|
39
107
|
if (newContent !== content) {
|
|
40
108
|
editsApplied++;
|
|
41
109
|
content = newContent;
|
|
42
110
|
}
|
|
43
111
|
else {
|
|
44
|
-
|
|
112
|
+
if (isReplaceEdit(edit)) {
|
|
113
|
+
console.warn(chalk.yellow(`[TOOL - edit] ⚠️ oldText not found in file: ${edit.oldText.substring(0, 50)}...`));
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
console.warn(chalk.yellow(`[TOOL - edit] ⚠️ line range ${edit.startLine}-${edit.endLine ?? edit.startLine} produced no change.`));
|
|
117
|
+
}
|
|
45
118
|
}
|
|
46
119
|
}
|
|
47
120
|
fs.writeFileSync(fullPath, content, "utf-8");
|
package/dist/tools/edit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,MAAM,OAAO,CAAA;AAgBzB,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC5E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACtD,aAAa,EAAE,CAAC;SACb,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,gEAAgE,CAAC;CAC9E,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,CACP,qHAAqH,CACtH;IACH,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CACP,gFAAgF,CACjF;IACH,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,oDAAoD,CAAC;CAClE,CAAC,CAAA;AAEF,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAA;AAE/D,SAAS,aAAa,CAAC,IAAU;IAC/B,OAAO,SAAS,IAAI,IAAI,CAAA;AAC1B,CAAC;AAED,SAAS,aAAa,CACpB,OAAe,EACf,IAAc;IAEd,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,CAAA;IAEzC,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,gCAAgC,OAAO,iDAAiD,SAAS,IAAI;SAC7G,CAAA;IACH,CAAC;IAED,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iCAAiC,SAAS,mCAAmC,KAAK,CAAC,MAAM,UAAU;SAC3G,CAAA;IACH,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAA+B,OAAO,mCAAmC,KAAK,CAAC,MAAM,UAAU;SACvG,CAAA;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjD,MAAM,YAAY,GAAG;QACnB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC;QAChC,GAAG,gBAAgB;QACnB,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KACxB,CAAA;IACD,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE9C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,cAAc;KACxB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,WAAW,EACT,gLAAgL;IAClL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACzD,KAAK,EAAE,CAAC;aACL,KAAK,CAAC,UAAU,CAAC;aACjB,QAAQ,CACP,kGAAkG,CACnG;KACJ,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EACd,IAAI,EAAE,QAAQ,EACd,KAAK,GAIN,EAAE,EAAE;QACH,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,iCAAiC,QAAQ,YAAY,KAAK,CAAC,MAAM,GAAG,CACrE,CACF,CAAA;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAEvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,mBAAmB,QAAQ,EAAE;iBACrC,CAAA;YACH,CAAC;YAED,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAChD,IAAI,YAAY,GAAG,CAAC,CAAA;YAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,UAAU,GAAG,OAAO,CAAA;gBAExB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACvB,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC7D,CAAC;yBAAM,CAAC;wBACN,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC1D,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;oBACnD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;wBAC5B,OAAO;4BACL,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,cAAc,CAAC,KAAK;yBAC5B,CAAA;oBACH,CAAC;oBACD,UAAU,GAAG,cAAc,CAAC,OAAO,CAAA;gBACrC,CAAC;gBAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBAC3B,YAAY,EAAE,CAAA;oBACd,OAAO,GAAG,UAAU,CAAA;gBACtB,CAAC;qBAAM,CAAC;oBACN,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBACxB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,+CAA+C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAClF,CACF,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,+BAA+B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,sBAAsB,CACtG,CACF,CAAA;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YAE5C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,SAAS,QAAQ,0CAA0C,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE;gBACxG,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,YAAY;oBACxB,UAAU,EAAE,KAAK,CAAC,MAAM;iBACzB;aACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,yCAAyC,KAAK,CAAC,OAAO,EAAE,CAAC,CACpE,CAAA;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAA;QACH,CAAC;IACH,CAAC;CACF,CAAA"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -110,11 +110,13 @@ export declare const tools: {
|
|
|
110
110
|
path: import("zod").ZodString;
|
|
111
111
|
offset: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
112
112
|
limit: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
113
|
+
includeLineNumbers: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
113
114
|
}, import("zod/v4/core").$strip>;
|
|
114
|
-
execute: ({ path: filePath, offset, limit, }: {
|
|
115
|
+
execute: ({ path: filePath, offset, limit, includeLineNumbers, }: {
|
|
115
116
|
path: string;
|
|
116
117
|
offset?: number;
|
|
117
118
|
limit?: number;
|
|
119
|
+
includeLineNumbers?: boolean;
|
|
118
120
|
}) => Promise<{
|
|
119
121
|
success: boolean;
|
|
120
122
|
output: string;
|
|
@@ -153,11 +155,15 @@ export declare const tools: {
|
|
|
153
155
|
description: string;
|
|
154
156
|
inputSchema: import("zod").ZodObject<{
|
|
155
157
|
path: import("zod").ZodString;
|
|
156
|
-
edits: import("zod").ZodArray<import("zod").ZodObject<{
|
|
158
|
+
edits: import("zod").ZodArray<import("zod").ZodUnion<readonly [import("zod").ZodObject<{
|
|
157
159
|
oldText: import("zod").ZodString;
|
|
158
160
|
newText: import("zod").ZodString;
|
|
159
161
|
useReplaceAll: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
160
|
-
}, import("zod/v4/core").$strip
|
|
162
|
+
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
163
|
+
startLine: import("zod").ZodNumber;
|
|
164
|
+
endLine: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
165
|
+
newText: import("zod").ZodString;
|
|
166
|
+
}, import("zod/v4/core").$strip>]>>;
|
|
161
167
|
}, import("zod/v4/core").$strip>;
|
|
162
168
|
execute: ({ path: filePath, edits, }: {
|
|
163
169
|
path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,SAAS;;;;;;;;;;CAUZ,CAAA;AAEV,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAAL,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAW69L,CAAC;4BAA+B,CAAC;sBAAyB,CAAC;6BAA8B,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,SAAS;;;;;;;;;;CAUZ,CAAA;AAEV,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAAL,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAW69L,CAAC;4BAA+B,CAAC;sBAAyB,CAAC;6BAA8B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAA1uL,CAAC;iBAAkB,CAAC;8BAA+B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CADlX,CAAA"}
|
package/dist/tools/read.d.ts
CHANGED
|
@@ -5,11 +5,13 @@ export declare const readTool: {
|
|
|
5
5
|
path: z.ZodString;
|
|
6
6
|
offset: z.ZodOptional<z.ZodNumber>;
|
|
7
7
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
includeLineNumbers: z.ZodOptional<z.ZodBoolean>;
|
|
8
9
|
}, z.core.$strip>;
|
|
9
|
-
execute: ({ path: filePath, offset, limit, }: {
|
|
10
|
+
execute: ({ path: filePath, offset, limit, includeLineNumbers, }: {
|
|
10
11
|
path: string;
|
|
11
12
|
offset?: number;
|
|
12
13
|
limit?: number;
|
|
14
|
+
includeLineNumbers?: boolean;
|
|
13
15
|
}) => Promise<{
|
|
14
16
|
success: boolean;
|
|
15
17
|
output: string;
|
package/dist/tools/read.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,eAAO,MAAM,QAAQ;;;;;;;;sEA6BhB;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAC7B;;;;;;;;;CAgEF,CAAA"}
|
package/dist/tools/read.js
CHANGED
|
@@ -2,8 +2,18 @@ import { z } from "zod";
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import chalk from "chalk";
|
|
5
|
+
function formatLineNumberedOutput(lines, startIndex) {
|
|
6
|
+
const lastLineNumber = startIndex + lines.length;
|
|
7
|
+
const width = String(lastLineNumber).length;
|
|
8
|
+
return lines
|
|
9
|
+
.map((line, index) => {
|
|
10
|
+
const lineNumber = String(startIndex + index + 1).padStart(width, " ");
|
|
11
|
+
return `${lineNumber}| ${line}`;
|
|
12
|
+
})
|
|
13
|
+
.join("\n");
|
|
14
|
+
}
|
|
5
15
|
export const readTool = {
|
|
6
|
-
description: "Read a file and return its contents. Useful for viewing source code, configuration files, documentation, or any text-based files.",
|
|
16
|
+
description: "Read a file and return its contents. Useful for viewing source code, configuration files, documentation, or any text-based files. You can optionally include line numbers when you need to make precise edits to escape-heavy content.",
|
|
7
17
|
inputSchema: z.object({
|
|
8
18
|
path: z.string().describe("The path to the file to read"),
|
|
9
19
|
offset: z
|
|
@@ -14,9 +24,13 @@ export const readTool = {
|
|
|
14
24
|
.number()
|
|
15
25
|
.optional()
|
|
16
26
|
.describe("Maximum number of lines to read. If not specified, reads the entire file."),
|
|
27
|
+
includeLineNumbers: z
|
|
28
|
+
.boolean()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("If true, prefix each returned line with its 1-indexed line number. Useful when escaped content makes exact text matching difficult."),
|
|
17
31
|
}),
|
|
18
|
-
execute: async ({ path: filePath, offset = 1, limit, }) => {
|
|
19
|
-
console.log(chalk.yellow(`\n[TOOL - read] Reading file: ${filePath} (offset: ${offset}, limit: ${limit ?? "none"})`));
|
|
32
|
+
execute: async ({ path: filePath, offset = 1, limit, includeLineNumbers = false, }) => {
|
|
33
|
+
console.log(chalk.yellow(`\n[TOOL - read] Reading file: ${filePath} (offset: ${offset}, limit: ${limit ?? "none"}, includeLineNumbers: ${includeLineNumbers})`));
|
|
20
34
|
try {
|
|
21
35
|
// Resolve the path relative to current working directory
|
|
22
36
|
const fullPath = path.resolve(filePath);
|
|
@@ -40,7 +54,9 @@ export const readTool = {
|
|
|
40
54
|
};
|
|
41
55
|
}
|
|
42
56
|
const selectedLines = lines.slice(startIndex, endIndex);
|
|
43
|
-
const resultContent =
|
|
57
|
+
const resultContent = includeLineNumbers
|
|
58
|
+
? formatLineNumberedOutput(selectedLines, startIndex)
|
|
59
|
+
: selectedLines.join("\n");
|
|
44
60
|
let metadata = `\n\n[Read tool metadata:`;
|
|
45
61
|
metadata += `\n File: ${fullPath}`;
|
|
46
62
|
metadata += `\n Total lines in file: ${lines.length}`;
|
|
@@ -48,6 +64,7 @@ export const readTool = {
|
|
|
48
64
|
if (limit) {
|
|
49
65
|
metadata += `\n Limit: ${limit}`;
|
|
50
66
|
}
|
|
67
|
+
metadata += `\n Include line numbers: ${includeLineNumbers}`;
|
|
51
68
|
metadata += `\n Lines returned: ${selectedLines.length}`;
|
|
52
69
|
metadata += `\n]`;
|
|
53
70
|
return {
|
package/dist/tools/read.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
|