@prestyj/cli 4.3.15 → 4.3.34

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.
Files changed (93) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +291 -25
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +39 -23
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/auth-storage.d.ts.map +1 -1
  8. package/dist/core/auth-storage.js +14 -2
  9. package/dist/core/auth-storage.js.map +1 -1
  10. package/dist/core/auto-update.d.ts +16 -3
  11. package/dist/core/auto-update.d.ts.map +1 -1
  12. package/dist/core/auto-update.js +126 -56
  13. package/dist/core/auto-update.js.map +1 -1
  14. package/dist/core/auto-update.test.d.ts +2 -0
  15. package/dist/core/auto-update.test.d.ts.map +1 -0
  16. package/dist/core/auto-update.test.js +205 -0
  17. package/dist/core/auto-update.test.js.map +1 -0
  18. package/dist/core/compaction/compactor.d.ts +4 -0
  19. package/dist/core/compaction/compactor.d.ts.map +1 -1
  20. package/dist/core/compaction/compactor.js +13 -0
  21. package/dist/core/compaction/compactor.js.map +1 -1
  22. package/dist/core/compaction/compactor.test.js +39 -6
  23. package/dist/core/compaction/compactor.test.js.map +1 -1
  24. package/dist/core/compaction/token-estimator.test.js +1 -1
  25. package/dist/core/model-registry.d.ts.map +1 -1
  26. package/dist/core/model-registry.js +15 -2
  27. package/dist/core/model-registry.js.map +1 -1
  28. package/dist/core/prompt-commands.d.ts.map +1 -1
  29. package/dist/core/prompt-commands.js +134 -0
  30. package/dist/core/prompt-commands.js.map +1 -1
  31. package/dist/core/settings-manager.d.ts +1 -0
  32. package/dist/core/settings-manager.d.ts.map +1 -1
  33. package/dist/core/settings-manager.js +3 -1
  34. package/dist/core/settings-manager.js.map +1 -1
  35. package/dist/modes/agent-home-mode.d.ts +21 -0
  36. package/dist/modes/agent-home-mode.d.ts.map +1 -0
  37. package/dist/modes/agent-home-mode.js +553 -0
  38. package/dist/modes/agent-home-mode.js.map +1 -0
  39. package/dist/system-prompt.d.ts.map +1 -1
  40. package/dist/system-prompt.js +74 -8
  41. package/dist/system-prompt.js.map +1 -1
  42. package/dist/tools/bash.js +1 -1
  43. package/dist/tools/bash.js.map +1 -1
  44. package/dist/tools/edit.d.ts +4 -2
  45. package/dist/tools/edit.d.ts.map +1 -1
  46. package/dist/tools/edit.js +48 -33
  47. package/dist/tools/edit.js.map +1 -1
  48. package/dist/tools/edit.test.js +80 -20
  49. package/dist/tools/edit.test.js.map +1 -1
  50. package/dist/tools/grep.d.ts.map +1 -1
  51. package/dist/tools/grep.js +12 -0
  52. package/dist/tools/grep.js.map +1 -1
  53. package/dist/tools/plan-mode.test.js +2 -2
  54. package/dist/tools/plan-mode.test.js.map +1 -1
  55. package/dist/tools/subagent.d.ts.map +1 -1
  56. package/dist/tools/subagent.js +20 -3
  57. package/dist/tools/subagent.js.map +1 -1
  58. package/dist/ui/App.d.ts.map +1 -1
  59. package/dist/ui/App.js +102 -48
  60. package/dist/ui/App.js.map +1 -1
  61. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  62. package/dist/ui/components/ActivityIndicator.js +0 -1
  63. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  64. package/dist/ui/components/Footer.js +1 -1
  65. package/dist/ui/components/InputArea.js +2 -2
  66. package/dist/ui/components/InputArea.js.map +1 -1
  67. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  68. package/dist/ui/components/ModelSelector.js +1 -0
  69. package/dist/ui/components/ModelSelector.js.map +1 -1
  70. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +2 -0
  71. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +1 -0
  72. package/dist/ui/hooks/stall-retry-duplicate.test.js +94 -0
  73. package/dist/ui/hooks/stall-retry-duplicate.test.js.map +1 -0
  74. package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
  75. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  76. package/dist/ui/hooks/useAgentLoop.js +19 -0
  77. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  78. package/dist/ui/login.d.ts.map +1 -1
  79. package/dist/ui/login.js +1 -0
  80. package/dist/ui/login.js.map +1 -1
  81. package/dist/ui/stores/create-store.d.ts +15 -0
  82. package/dist/ui/stores/create-store.d.ts.map +1 -0
  83. package/dist/ui/stores/create-store.js +30 -0
  84. package/dist/ui/stores/create-store.js.map +1 -0
  85. package/dist/ui/stores/index.d.ts +3 -0
  86. package/dist/ui/stores/index.d.ts.map +1 -0
  87. package/dist/ui/stores/index.js +3 -0
  88. package/dist/ui/stores/index.js.map +1 -0
  89. package/dist/ui/stores/taskbar-store.d.ts +19 -0
  90. package/dist/ui/stores/taskbar-store.d.ts.map +1 -0
  91. package/dist/ui/stores/taskbar-store.js +59 -0
  92. package/dist/ui/stores/taskbar-store.js.map +1 -0
  93. package/package.json +7 -5
@@ -41,7 +41,7 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath)
41
41
  `You are in PLAN MODE. Research and design an implementation plan before writing any code.\n\n` +
42
42
  `### Workflow\n` +
43
43
  `1. Explore: Use read, grep, find, ls to understand the codebase\n` +
44
- `2. Research: Use web_fetch for documentation and mcp__grep__searchGitHub to verify patterns against real codebases\n` +
44
+ `2. Research: Use web_search + web_fetch for official documentation, and mcp__grep__searchGitHub for real code samples\n` +
45
45
  `3. Draft: Write a structured plan to .ezcoder/plans/<name>.md\n` +
46
46
  `4. Submit: Call exit_plan with the plan path for user review\n\n` +
47
47
  `### Rules\n` +
@@ -88,19 +88,26 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath)
88
88
  `This updates the progress widget shown to the user.`);
89
89
  }
90
90
  }
91
- // 3. Code Quality
91
+ // 3. Research & Verification
92
+ sections.push(`## Research & Verification\n\n` +
93
+ `Your training data may be outdated. Do not assume you know the correct or current way to do something — verify first.\n\n` +
94
+ `- **Official documentation first** — use \`web_search\` to find docs, then \`web_fetch\` to read them. This is the most authoritative source when available.\n` +
95
+ `- **Real code samples second** — use \`mcp__grep__searchGitHub\` to see how real codebases implement something. This is especially valuable when docs don't exist, or to learn good patterns (UI, architecture, library usage, etc.).\n` +
96
+ `- **Not everything has docs.** Some things only have code samples. Some have both. Use judgment on what's available and reach for the right tool.\n` +
97
+ `- This applies to everything — backend, frontend, UI patterns, configs, library APIs, CLI flags, package versions. Not just "unfamiliar" code.\n` +
98
+ `- When you don't verify, you risk writing code based on stale training data — wrong API signatures, deprecated patterns, outdated conventions. This is unacceptable.`);
99
+ // 4. Code Quality
92
100
  sections.push(`## Code Quality\n\n` +
93
101
  `- Use descriptive file and function names that reveal intent.\n` +
94
102
  `- Define types and interfaces before implementation.\n` +
95
103
  `- No dead code, no commented-out code — delete what's unused.\n` +
96
104
  `- Handle errors at appropriate boundaries (I/O, user input, external APIs).\n` +
97
105
  `- Prefer existing dependencies over introducing new ones.\n` +
98
- `- Only refactor or restructure code when explicitly asked — don't split files, rename variables, or reorganize code unprompted.\n` +
99
- `- **Verify non-trivial implementations** — when using unfamiliar APIs, libraries, or complex patterns, use \`mcp__grep__searchGitHub\` to check how real codebases do it before writing or during planning. Skip this for simple edits, renames, and config changes.`);
100
- // 4. Tools
106
+ `- Only refactor or restructure code when explicitly asked — don't split files, rename variables, or reorganize code unprompted.`);
107
+ // 5. Tools
101
108
  sections.push(`## Tools\n\n` +
102
109
  `- **read**: Read file contents. Use offset/limit for large files.\n` +
103
- `- **edit**: Surgical changes to existing files. The old_text must uniquely match one location.\n` +
110
+ `- **edit**: Surgical changes to existing files. Pass \`edits\` as an array of { old_text, new_text } pairs; each old_text must uniquely match one location and edits apply in order.\n` +
104
111
  `- **write**: Create new files or complete rewrites. Prefer edit for small changes.\n` +
105
112
  `- **bash**: Run commands (tests, builds, git, installs). The shell already runs in the project working directory — don't \`cd\` into it redundantly. Check exit code and output for errors. Use non-interactive flags where needed (e.g. \`--yes\`, \`-y\`) to avoid blocking prompts. Set \`run_in_background=true\` for long-running processes (dev servers, watchers) — returns a process ID immediately.\n` +
106
113
  `- **find** / **ls**: Discover project structure and orient in unfamiliar directories.\n` +
@@ -115,7 +122,66 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath)
115
122
  ` - **prompt**: Standalone instruction sent to an agent with NO prior context. The agent must complete it from the prompt alone, so include specific file paths, what to change, and enough context to act without ambiguity. Be as long as needed for clarity, but no longer. If the task requires latest docs or APIs, tell the agent to research/fetch them.\n` +
116
123
  ` - **Ordering**: When creating multiple tasks (e.g. from a PRD or spec), add them in correct dependency order — foundational work first (types, schemas, config), then core logic, then integration, then UI, then tests. Each task should be completable independently given that prior tasks are done. Think like an engineer planning a project: what must exist before the next piece can be built?\n` +
117
124
  `- **skill**: Invoke a skill by name to get specialized instructions for a task. Skills are defined in \`.ezcoder/skills/\` as markdown files. Use this tool when a task matches an available skill.\n` +
118
- `- **mcp__grep__searchGitHub**: Search real-world code across 1M+ public GitHub repos. Use to verify your implementation against production patterns check correct API usage, library idioms, and common conventions before finalizing changes. Search for literal code patterns (e.g. \`StreamableHTTPClientTransport(\`, \`useEffect(() =>\`), not keywords.\n` +
119
- );
125
+ `- **mcp__grep__searchGitHub**: Search real-world code across 1M+ public GitHub repos. Use to learn patterns, see how things are built, and verify your implementations match real-world usage.\n` +
126
+ ` - **Query must be a single literal code snippet** that would appear verbatim in a source file (e.g. \`setFrame(CGRect(\`, \`useEffect(() =>\`, \`StreamableHTTPClientTransport(\`).\n` +
127
+ ` - **Never combine multiple identifiers** — \`clipsToBounds panel setFrame\` will match nothing. Pick the most specific single pattern.\n` +
128
+ ` - **One call at a time** — this API is rate-limited. Do not fire parallel/concurrent searchGitHub calls. Run them sequentially.\n` +
129
+ `- **enter_plan**: For complex multi-file tasks, call enter_plan to switch to plan mode for safe read-only exploration and planning.\n` +
130
+ `- **exit_plan**: Submit your plan for user review and exit plan mode.`);
131
+ // 6. Avoid
132
+ sections.push(`## Avoid\n\n` +
133
+ `- Don't assume changes worked without verifying.\n` +
134
+ `- Don't generate stubs or placeholder implementations unless asked.\n` +
135
+ `- Don't add TODOs for yourself — finish the work or state what's incomplete.\n` +
136
+ `- Don't pad responses with filler or repeat back what the user said.\n` +
137
+ `- Don't guess or make up file paths, function names, API methods, CLI flags, config options, or package versions — look them up.`);
138
+ // 7. Response Format
139
+ sections.push(`## Response Format\n\n` +
140
+ `- **Plain language** — most users are not deeply technical. Explain what you did and why in simple terms, not implementation jargon.\n` +
141
+ `- **Short and direct** — a few sentences, not paragraphs. No rambling, no filler, no repeating back what the user said.\n` +
142
+ `- **Next steps** — if the user needs to do something (test, review, decide), say so briefly. If not, don't pad.\n` +
143
+ `- For pure questions, answer directly.`);
144
+ // 8. Project context — walk from cwd to root looking for context files
145
+ const contextParts = [];
146
+ let dir = cwd;
147
+ const visited = new Set();
148
+ while (!visited.has(dir)) {
149
+ visited.add(dir);
150
+ for (const name of CONTEXT_FILES) {
151
+ const filePath = path.join(dir, name);
152
+ try {
153
+ const content = await fs.readFile(filePath, "utf-8");
154
+ const relPath = path.relative(cwd, filePath) || name;
155
+ contextParts.push(`### ${relPath}\n\n${content.trim()}`);
156
+ }
157
+ catch {
158
+ // File doesn't exist, skip
159
+ }
160
+ }
161
+ const parent = path.dirname(dir);
162
+ if (parent === dir)
163
+ break;
164
+ dir = parent;
165
+ }
166
+ if (contextParts.length > 0) {
167
+ sections.push(`## Project Context\n\n${contextParts.join("\n\n")}`);
168
+ }
169
+ // 9. Skills
170
+ if (skills && skills.length > 0) {
171
+ const skillsSection = formatSkillsForPrompt(skills);
172
+ if (skillsSection) {
173
+ sections.push(skillsSection);
174
+ }
175
+ }
176
+ // 10. Environment (static — cacheable)
177
+ sections.push(`## Environment\n\n` + `- Working directory: ${cwd}\n` + `- Platform: ${process.platform}`);
178
+ // Dynamic section (uncached) — separated by marker so the transform layer
179
+ // can split the system prompt into cached + uncached blocks.
180
+ const today = new Date();
181
+ const day = today.getDate();
182
+ const month = today.toLocaleString("en-US", { month: "long" });
183
+ const year = today.getFullYear();
184
+ sections.push(`<!-- uncached -->\nToday's date: ${day} ${month} ${year}`);
185
+ return sections.join("\n\n");
120
186
  }
121
187
  //# sourceMappingURL=system-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAc,MAAM,kBAAkB,CAAC;AAErE,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;AAEnF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW,EACX,MAAgB,EAChB,QAAkB,EAClB,gBAAyB;IAEzB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,cAAc;IACd,QAAQ,CAAC,IAAI,CACX,+FAA+F;QAC7F,iFAAiF;QACjF,oCAAoC,CACvC,CAAC;IAEF,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CACX,oBAAoB;QAClB,6BAA6B;QAC7B,2HAA2H;QAC3H,qDAAqD;QACrD,wFAAwF;QACxF,iGAAiG;QACjG,kEAAkE;QAClE,sBAAsB;QACtB,gGAAgG;QAChG,oEAAoE;QACpE,uEAAuE;QACvE,0DAA0D;QAC1D,4BAA4B;QAC5B,0EAA0E;QAC1E,mFAAmF;QACnF,gFAAgF;QAChF,6FAA6F;QAC7F,oEAAoE;QACpE,mNAAmN;QACnN,cAAc;QACd,uJAAuJ;QACvJ,iFAAiF;QACjF,8JAA8J,CACjK,CAAC;IAEF,gBAAgB;IAChB,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CACX,2BAA2B;YACzB,+FAA+F;YAC/F,gBAAgB;YAChB,mEAAmE;YAEnE,sHAAsH;YACtH,iEAAiE;YACjE,kEAAkE;YAClE,aAAa;YACb,iGAAiG;YACjG,sEAAsE;YACtE,4CAA4C;YAC5C,mBAAmB;YACnB,mFAAmF;YACnF,uFAAuF;YACvF,uFAAuF;YACvF,sFAAsF;YACtF,qDAAqD;YACrD,YAAY;YACZ,OAAO;YACP,YAAY;YACZ,2DAA2D;YAC3D,2CAA2C;YAC3C,gDAAgD;YAChD,OAAO;YACP,KAAK,CACR,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,IAAI,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CACX,sBAAsB;gBACpB,sGAAsG;gBACtG,kBAAkB,gBAAgB,MAAM;gBACxC,oBAAoB,WAAW,CAAC,IAAI,EAAE,wBAAwB;gBAC9D,aAAa;gBACb,yDAAyD;gBACzD,4DAA4D;gBAC5D,qEAAqE;gBACrE,yBAAyB;gBACzB,uFAAuF;gBACvF,6EAA6E;gBAC7E,gFAAgF;gBAChF,qDAAqD,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,QAAQ,CAAC,IAAI,CACX,qBAAqB;QACnB,iEAAiE;QACjE,wDAAwD;QACxD,iEAAiE;QACjE,+EAA+E;QAC/E,6DAA6D;QAC7D,mIAAmI;QACnI,sQAAsQ,CACzQ,CAAC;IAEF,WAAW;IACX,QAAQ,CAAC,IAAI,CACX,cAAc;QACZ,qEAAqE;QACrE,kGAAkG;QAClG,sFAAsF;QACtF,gZAAgZ;QAChZ,yFAAyF;QACzF,+GAA+G;QAC/G,gOAAgO;QAChO,wFAAwF;QACxF,yKAAyK;QACzK,kGAAkG;QAClG,4GAA4G;QAC5G,uXAAuX;QACvX,sEAAsE;QACtE,mWAAmW;QACnW,4YAA4Y;QAE5Y,uMAAuM;QACvM,mWAAmW;QA+EzW,AA/E2W,JAAA,CAAA,CAAA;AA+E3W,CAAC,AA/E0W"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
@@ -48,7 +48,7 @@ const ENV_ALLOWLIST = new Set([
48
48
  "RBENV_ROOT",
49
49
  ]);
50
50
  function getSafeEnv() {
51
- const env = { TERM: "dumb" };
51
+ const env = { TERM: "dumb", EZ_CODER: "true" };
52
52
  for (const key of ENV_ALLOWLIST) {
53
53
  if (process.env[key])
54
54
  env[key] = process.env[key];
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAuB,MAAM,iBAAiB,CAAC;AAEvE,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,cAAc;AAC/C,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,6CAA6C;AAExF,4GAA4G;AAC5G,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,gBAAgB;IAChB,UAAU;IACV,aAAa;IACb,yBAAyB;IACzB,WAAW;IACX,SAAS;IACT,mBAAmB;IACnB,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,cAAc;IACd,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAEH,SAAS,UAAU;IACjB,MAAM,GAAG,GAA2B,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACvE,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC3D,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,2CAA2C,CAAC;IACxD,iBAAiB,EAAE,CAAC;SACjB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,uEAAuE;QACrE,0DAA0D,CAC7D;CACJ,CAAC,CAAC;AAEH,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,cAA8B,EAC9B,MAAsB,eAAe,EACrC,WAAkC;IAElC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,6FAA6F;YAC7F,iFAAiF;YACjF,gDAAgD;YAChD,+DAA+D;YAC/D,wCAAwC;YACxC,iFAAiF;YACjF,kEAAkE;QACpE,UAAU,EAAE,UAAU;QACtB,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,OAAO;YACvE,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzB,OAAO,6GAA6G,CAAC;YACvH,CAAC;YACD,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACxD,OAAO,CACL,+BAA+B;oBAC/B,OAAO,MAAM,CAAC,EAAE,IAAI;oBACpB,QAAQ,MAAM,CAAC,GAAG,IAAI;oBACtB,QAAQ,MAAM,CAAC,OAAO,IAAI;oBAC1B,4BAA4B,MAAM,CAAC,EAAE,mBAAmB,CACzD,CAAC;YACJ,CAAC;YAED,MAAM,gBAAgB,GAAG,SAAS,IAAI,eAAe,CAAC;YAEtD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;oBAC/C,GAAG;oBACH,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;oBACjC,GAAG,EAAE,UAAU,EAAE;iBAClB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;gBACnB,IAAI,YAAY,GAAG,KAAK,CAAC;gBAEzB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;oBAC9B,IAAI,YAAY;wBAAE,OAAO;oBACzB,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC;oBAC1B,IAAI,UAAU,GAAG,gBAAgB,EAAE,CAAC;wBAClC,YAAY,GAAG,IAAI,CAAC;wBACpB,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAElB,gDAAgD;oBAChD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;wBACrB,OAAO,CAAC,QAAQ,CAAC;4BACf,IAAI,EAAE,eAAe;4BACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;4BAC9B,UAAU;yBACX,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC;gBACF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACjC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEjC,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;gBAErB,mBAAmB;gBACnB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,GAAG,IAAI,CAAC;oBACd,IAAI,KAAK,CAAC,GAAG;wBAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAErB,wBAAwB;gBACxB,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,MAAM,GAAG,IAAI,CAAC;oBACd,IAAI,KAAK,CAAC,GAAG;wBAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAElE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAErD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;oBAEvC,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;oBAC5B,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,GAAG,qBAAqB,gBAAgB,GAAG,IAAI,GAAG,IAAI,sCAAsC,MAAM,EAAE,CAAC;oBAC7G,CAAC;oBACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACrB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;wBAC9E,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3E,MAAM,GAAG,4BAA4B,MAAM,CAAC,SAAS,OAAO,MAAM,CAAC,UAAU,UAAU,cAAc,MAAM,MAAM,EAAE,CAAC;oBACtH,CAAC;oBAED,MAAM,QAAQ,GAAG,QAAQ;wBACvB,CAAC,CAAC,YAAY,gBAAgB,KAAK;wBACnC,CAAC,CAAC,MAAM;4BACN,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;oBAExB,OAAO,CAAC,cAAc,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACrD,OAAO,CAAC,kCAAkC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -3,8 +3,10 @@ import type { AgentTool } from "@prestyj/agent";
3
3
  import { type ToolOperations } from "./operations.js";
4
4
  declare const EditParams: z.ZodObject<{
5
5
  file_path: z.ZodString;
6
- old_text: z.ZodString;
7
- new_text: z.ZodString;
6
+ edits: z.ZodArray<z.ZodObject<{
7
+ old_text: z.ZodString;
8
+ new_text: z.ZodString;
9
+ }, z.core.$strip>>;
8
10
  }, z.core.$strip>;
9
11
  export declare function createEditTool(cwd: string, readFiles?: Set<string>, ops?: ToolOperations, planModeRef?: {
10
12
  current: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,QAAA,MAAM,UAAU;;;;iBAId,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC,SAAS,CAAC,OAAO,UAAU,CAAC,CAmE9B"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOvE,QAAA,MAAM,UAAU;;;;;;iBASd,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC,SAAS,CAAC,OAAO,UAAU,CAAC,CA2E9B"}
@@ -3,18 +3,28 @@ import { z } from "zod";
3
3
  import { resolvePath, rejectSymlink } from "./path-utils.js";
4
4
  import { fuzzyFindText, countOccurrences, generateDiff } from "./edit-diff.js";
5
5
  import { localOperations } from "./operations.js";
6
- const EditParams = z.object({
7
- file_path: z.string().describe("The file path to edit"),
6
+ const EditItem = z.object({
8
7
  old_text: z.string().describe("The exact text to find and replace"),
9
8
  new_text: z.string().describe("The replacement text"),
10
9
  });
10
+ const EditParams = z.object({
11
+ file_path: z.string().describe("The file path to edit"),
12
+ edits: z
13
+ .array(EditItem)
14
+ .min(1)
15
+ .describe("One or more edits applied in order. Each edit operates on the result of the previous one. " +
16
+ "Every old_text must uniquely match exactly one location in the file at the time it is applied."),
17
+ });
11
18
  export function createEditTool(cwd, readFiles, ops = localOperations, planModeRef) {
12
19
  return {
13
20
  name: "edit",
14
- description: "Replace a specific text string in a file. The file must be read first before editing. " +
15
- "The old_text must uniquely match exactly one location in the file. Returns a unified diff of the change.",
21
+ description: "Replace one or more text strings in a file. The file must be read first before editing. " +
22
+ "Pass `edits` as an array of { old_text, new_text } pairs; edits are applied sequentially " +
23
+ "so each subsequent match runs against the result of the prior edits. " +
24
+ "Every old_text must uniquely match exactly one location in the file when applied. " +
25
+ "Returns a unified diff of the combined change.",
16
26
  parameters: EditParams,
17
- async execute({ file_path, old_text, new_text }) {
27
+ async execute({ file_path, edits }) {
18
28
  if (planModeRef?.current) {
19
29
  return "Error: edit is restricted in plan mode. Use read-only tools to explore the codebase, then write your plan to .ezcoder/plans/.";
20
30
  }
@@ -23,38 +33,43 @@ export function createEditTool(cwd, readFiles, ops = localOperations, planModeRe
23
33
  if (readFiles && !readFiles.has(resolved)) {
24
34
  throw new Error("File must be read first before editing. Use the read tool first.");
25
35
  }
26
- const content = await ops.readFile(resolved);
27
- // Detect line endings
28
- const hasCRLF = content.includes("\r\n");
29
- // Normalize for matching
30
- const normalized = hasCRLF ? content.replace(/\r\n/g, "\n") : content;
31
- const normalizedOld = hasCRLF ? old_text.replace(/\r\n/g, "\n") : old_text;
32
- const normalizedNew = hasCRLF ? new_text.replace(/\r\n/g, "\n") : new_text;
33
- // Check uniqueness
34
- const occurrences = countOccurrences(normalized, normalizedOld);
35
- if (occurrences === 0) {
36
- throw new Error(`old_text not found in ${path.basename(resolved)}. ` +
37
- "Make sure the text matches exactly, including whitespace and indentation.");
38
- }
39
- if (occurrences > 1) {
40
- throw new Error(`old_text found ${occurrences} times in ${path.basename(resolved)}. ` +
41
- "Include more surrounding context to make the match unique.");
42
- }
43
- // Find and replace
44
- const match = fuzzyFindText(normalized, normalizedOld);
45
- if (!match.found) {
46
- throw new Error(`old_text not found in ${path.basename(resolved)}.`);
36
+ const original = await ops.readFile(resolved);
37
+ const hasCRLF = original.includes("\r\n");
38
+ const originalNormalized = hasCRLF ? original.replace(/\r\n/g, "\n") : original;
39
+ let working = originalNormalized;
40
+ const fileName = path.basename(resolved);
41
+ for (let i = 0; i < edits.length; i++) {
42
+ const { old_text, new_text } = edits[i];
43
+ const normalizedOld = hasCRLF ? old_text.replace(/\r\n/g, "\n") : old_text;
44
+ const normalizedNew = hasCRLF ? new_text.replace(/\r\n/g, "\n") : new_text;
45
+ const label = edits.length > 1 ? ` (edit ${i + 1}/${edits.length})` : "";
46
+ const occurrences = countOccurrences(working, normalizedOld);
47
+ if (occurrences === 0) {
48
+ throw new Error(`old_text not found in ${fileName}${label}. ` +
49
+ "Make sure the text matches exactly, including whitespace and indentation.");
50
+ }
51
+ if (occurrences > 1) {
52
+ throw new Error(`old_text found ${occurrences} times in ${fileName}${label}. ` +
53
+ "Include more surrounding context to make the match unique.");
54
+ }
55
+ const match = fuzzyFindText(working, normalizedOld);
56
+ if (!match.found) {
57
+ throw new Error(`old_text not found in ${fileName}${label}.`);
58
+ }
59
+ working =
60
+ working.slice(0, match.index) +
61
+ normalizedNew +
62
+ working.slice(match.index + match.matchLength);
47
63
  }
48
- const newContent = normalized.slice(0, match.index) +
49
- normalizedNew +
50
- normalized.slice(match.index + match.matchLength);
51
- // Restore line endings if needed
52
- const finalContent = hasCRLF ? newContent.replace(/\n/g, "\r\n") : newContent;
64
+ const finalContent = hasCRLF ? working.replace(/\n/g, "\r\n") : working;
53
65
  await ops.writeFile(resolved, finalContent);
54
66
  const relPath = path.relative(cwd, resolved);
55
- const diff = generateDiff(normalized, newContent, relPath);
67
+ const diff = generateDiff(originalNormalized, working, relPath);
68
+ const summary = edits.length > 1
69
+ ? `Successfully applied ${edits.length} edits to ${relPath}.`
70
+ : `Successfully replaced text in ${relPath}.`;
56
71
  return {
57
- content: `Successfully replaced text in ${relPath}.`,
72
+ content: summary,
58
73
  details: { diff },
59
74
  };
60
75
  },
@@ -1 +1 @@
1
- {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,15 @@ import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import os from "node:os";
5
5
  import { createEditTool } from "./edit.js";
6
+ function resultToString(result) {
7
+ if (typeof result === "string")
8
+ return result;
9
+ if (result && typeof result === "object" && "details" in result) {
10
+ const details = result.details;
11
+ return details?.diff ?? "";
12
+ }
13
+ return "";
14
+ }
6
15
  describe("createEditTool", () => {
7
16
  let tmpDir;
8
17
  beforeEach(async () => {
@@ -15,21 +24,65 @@ describe("createEditTool", () => {
15
24
  const filePath = path.join(tmpDir, "hello.txt");
16
25
  await fs.writeFile(filePath, "hello world\n");
17
26
  const tool = createEditTool(tmpDir);
18
- const result = await tool.execute({ file_path: "hello.txt", old_text: "hello", new_text: "goodbye" }, { signal: new AbortController().signal, toolCallId: "test-1" });
19
- expect(typeof result).toBe("string");
20
- expect(result).toContain("-hello world");
21
- expect(result).toContain("+goodbye world");
27
+ const result = await tool.execute({ file_path: "hello.txt", edits: [{ old_text: "hello", new_text: "goodbye" }] }, { signal: new AbortController().signal, toolCallId: "test-1" });
28
+ const diff = resultToString(result);
29
+ expect(diff).toContain("-hello world");
30
+ expect(diff).toContain("+goodbye world");
22
31
  const written = await fs.readFile(filePath, "utf-8");
23
32
  expect(written).toBe("goodbye world\n");
24
33
  });
34
+ it("applies multiple edits sequentially", async () => {
35
+ const filePath = path.join(tmpDir, "multi.txt");
36
+ await fs.writeFile(filePath, "alpha\nbeta\ngamma\n");
37
+ const tool = createEditTool(tmpDir);
38
+ const result = await tool.execute({
39
+ file_path: "multi.txt",
40
+ edits: [
41
+ { old_text: "alpha", new_text: "ALPHA" },
42
+ { old_text: "gamma", new_text: "GAMMA" },
43
+ ],
44
+ }, { signal: new AbortController().signal, toolCallId: "test-multi" });
45
+ const summary = typeof result === "string" ? result : result.content;
46
+ expect(summary).toContain("2 edits");
47
+ const written = await fs.readFile(filePath, "utf-8");
48
+ expect(written).toBe("ALPHA\nbeta\nGAMMA\n");
49
+ });
50
+ it("supports chained edits where later edits depend on earlier ones", async () => {
51
+ const filePath = path.join(tmpDir, "chain.txt");
52
+ await fs.writeFile(filePath, "foo\n");
53
+ const tool = createEditTool(tmpDir);
54
+ await tool.execute({
55
+ file_path: "chain.txt",
56
+ edits: [
57
+ { old_text: "foo", new_text: "bar" },
58
+ { old_text: "bar", new_text: "baz" },
59
+ ],
60
+ }, { signal: new AbortController().signal, toolCallId: "test-chain" });
61
+ const written = await fs.readFile(filePath, "utf-8");
62
+ expect(written).toBe("baz\n");
63
+ });
64
+ it("reports edit index on failure within a multi-edit batch", async () => {
65
+ const filePath = path.join(tmpDir, "batch.txt");
66
+ await fs.writeFile(filePath, "one two three\n");
67
+ const tool = createEditTool(tmpDir);
68
+ await expect(tool.execute({
69
+ file_path: "batch.txt",
70
+ edits: [
71
+ { old_text: "one", new_text: "1" },
72
+ { old_text: "missing", new_text: "x" },
73
+ ],
74
+ }, { signal: new AbortController().signal, toolCallId: "test-batch" })).rejects.toThrow(/edit 2\/2/);
75
+ // Nothing should have been written — atomic
76
+ const written = await fs.readFile(filePath, "utf-8");
77
+ expect(written).toBe("one two three\n");
78
+ });
25
79
  it("returns error string in plan mode", async () => {
26
80
  const filePath = path.join(tmpDir, "plan.txt");
27
81
  await fs.writeFile(filePath, "original\n");
28
82
  const planModeRef = { current: true };
29
83
  const tool = createEditTool(tmpDir, undefined, undefined, planModeRef);
30
- const result = await tool.execute({ file_path: "plan.txt", old_text: "original", new_text: "modified" }, { signal: new AbortController().signal, toolCallId: "test-2" });
84
+ const result = await tool.execute({ file_path: "plan.txt", edits: [{ old_text: "original", new_text: "modified" }] }, { signal: new AbortController().signal, toolCallId: "test-2" });
31
85
  expect(result).toContain("Error: edit is restricted in plan mode");
32
- // File should remain unchanged
33
86
  const content = await fs.readFile(filePath, "utf-8");
34
87
  expect(content).toBe("original\n");
35
88
  });
@@ -38,7 +91,7 @@ describe("createEditTool", () => {
38
91
  await fs.writeFile(filePath, "content\n");
39
92
  const readFiles = new Set();
40
93
  const tool = createEditTool(tmpDir, readFiles);
41
- await expect(tool.execute({ file_path: "unread.txt", old_text: "content", new_text: "new" }, { signal: new AbortController().signal, toolCallId: "test-3" })).rejects.toThrow("File must be read first");
94
+ await expect(tool.execute({ file_path: "unread.txt", edits: [{ old_text: "content", new_text: "new" }] }, { signal: new AbortController().signal, toolCallId: "test-3" })).rejects.toThrow("File must be read first");
42
95
  });
43
96
  it("allows edit when file is in readFiles set", async () => {
44
97
  const filePath = path.join(tmpDir, "tracked.txt");
@@ -46,9 +99,10 @@ describe("createEditTool", () => {
46
99
  const readFiles = new Set();
47
100
  readFiles.add(path.resolve(tmpDir, "tracked.txt"));
48
101
  const tool = createEditTool(tmpDir, readFiles);
49
- const result = await tool.execute({ file_path: "tracked.txt", old_text: "alpha", new_text: "gamma" }, { signal: new AbortController().signal, toolCallId: "test-4" });
50
- expect(result).toContain("-alpha beta");
51
- expect(result).toContain("+gamma beta");
102
+ const result = await tool.execute({ file_path: "tracked.txt", edits: [{ old_text: "alpha", new_text: "gamma" }] }, { signal: new AbortController().signal, toolCallId: "test-4" });
103
+ const diff = resultToString(result);
104
+ expect(diff).toContain("-alpha beta");
105
+ expect(diff).toContain("+gamma beta");
52
106
  const written = await fs.readFile(filePath, "utf-8");
53
107
  expect(written).toBe("gamma beta\n");
54
108
  });
@@ -56,27 +110,32 @@ describe("createEditTool", () => {
56
110
  const filePath = path.join(tmpDir, "missing.txt");
57
111
  await fs.writeFile(filePath, "some content here\n");
58
112
  const tool = createEditTool(tmpDir);
59
- await expect(tool.execute({ file_path: "missing.txt", old_text: "nonexistent text", new_text: "replacement" }, { signal: new AbortController().signal, toolCallId: "test-5" })).rejects.toThrow("old_text not found");
113
+ await expect(tool.execute({
114
+ file_path: "missing.txt",
115
+ edits: [{ old_text: "nonexistent text", new_text: "replacement" }],
116
+ }, { signal: new AbortController().signal, toolCallId: "test-5" })).rejects.toThrow("old_text not found");
60
117
  });
61
118
  it("throws when old_text matches multiple times", async () => {
62
119
  const filePath = path.join(tmpDir, "dupes.txt");
63
120
  await fs.writeFile(filePath, "foo bar foo baz foo\n");
64
121
  const tool = createEditTool(tmpDir);
65
- await expect(tool.execute({ file_path: "dupes.txt", old_text: "foo", new_text: "qux" }, { signal: new AbortController().signal, toolCallId: "test-6" })).rejects.toThrow(/found 3 times/);
122
+ await expect(tool.execute({ file_path: "dupes.txt", edits: [{ old_text: "foo", new_text: "qux" }] }, { signal: new AbortController().signal, toolCallId: "test-6" })).rejects.toThrow(/found 3 times/);
66
123
  });
67
124
  it("handles fuzzy matching with trailing whitespace and smart quotes", async () => {
68
125
  const filePath = path.join(tmpDir, "fuzzy.txt");
69
- // File has trailing whitespace and straight quotes
70
126
  await fs.writeFile(filePath, "const msg = 'hello'; \nend\n");
71
127
  const tool = createEditTool(tmpDir);
72
- // Search with no trailing whitespace and smart quotes
73
128
  const result = await tool.execute({
74
129
  file_path: "fuzzy.txt",
75
- old_text: "const msg = \u2018hello\u2019;",
76
- new_text: "const msg = 'goodbye';",
130
+ edits: [
131
+ {
132
+ old_text: "const msg = \u2018hello\u2019;",
133
+ new_text: "const msg = 'goodbye';",
134
+ },
135
+ ],
77
136
  }, { signal: new AbortController().signal, toolCallId: "test-7" });
78
- expect(typeof result).toBe("string");
79
- expect(result).toContain("+const msg = 'goodbye';");
137
+ const diff = resultToString(result);
138
+ expect(diff).toContain("+const msg = 'goodbye';");
80
139
  const written = await fs.readFile(filePath, "utf-8");
81
140
  expect(written).toContain("goodbye");
82
141
  });
@@ -84,8 +143,9 @@ describe("createEditTool", () => {
84
143
  const filePath = path.join(tmpDir, "crlf.txt");
85
144
  await fs.writeFile(filePath, "line one\r\nline two\r\nline three\r\n");
86
145
  const tool = createEditTool(tmpDir);
87
- const result = await tool.execute({ file_path: "crlf.txt", old_text: "line two", new_text: "line TWO" }, { signal: new AbortController().signal, toolCallId: "test-8" });
88
- expect(result).toContain("+line TWO");
146
+ const result = await tool.execute({ file_path: "crlf.txt", edits: [{ old_text: "line two", new_text: "line TWO" }] }, { signal: new AbortController().signal, toolCallId: "test-8" });
147
+ const diff = resultToString(result);
148
+ expect(diff).toContain("+line TWO");
89
149
  const written = await fs.readFile(filePath, "utf-8");
90
150
  expect(written).toBe("line one\r\nline TWO\r\nline three\r\n");
91
151
  });
@@ -1 +1 @@
1
- {"version":3,"file":"edit.test.js","sourceRoot":"","sources":["../../src/tools/edit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAClE,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAE3C,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,EACrE,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QAEnE,+BAA+B;QAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE1C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE/C,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CACV,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EACjE,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;QAEnD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAClE,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CACV,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,EACnF,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAEtD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CACV,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAC5D,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,mDAAmD;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,sDAAsD;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B;YACE,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,gCAAgC;YAC1C,QAAQ,EAAE,wBAAwB;SACnC,EACD,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;QAEvE,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,EACrE,EAAE,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAC/D,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAEtC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"edit.test.js","sourceRoot":"","sources":["../../src/tools/edit.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,QAAA,MAAM,UAAU;;;;;;iBAWd,CAAC;AAKH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,cAAgC,GACpC,SAAS,CAAC,OAAO,UAAU,CAAC,CAyD9B"}
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,QAAA,MAAM,UAAU;;;;;;iBAWd,CAAC;AAOH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,cAAgC,GACpC,SAAS,CAAC,OAAO,UAAU,CAAC,CAyD9B"}
@@ -18,6 +18,8 @@ const GrepParams = z.object({
18
18
  });
19
19
  const DEFAULT_MAX_RESULTS = 50;
20
20
  const MAX_LINE_LENGTH = 500;
21
+ /** Skip files larger than 10 MB — single-line files (minified JS, data blobs) can OOM readline */
22
+ const MAX_FILE_SIZE = 10 * 1024 * 1024;
21
23
  export function createGrepTool(cwd, ops = localOperations) {
22
24
  return {
23
25
  name: "grep",
@@ -68,6 +70,16 @@ export function createGrepTool(cwd, ops = localOperations) {
68
70
  async function searchFile(filePath, regex, cwd, maxResults, ops) {
69
71
  const results = [];
70
72
  const relPath = path.relative(cwd, filePath);
73
+ // Skip oversized files — readline buffers entire lines in memory, so a single-line
74
+ // file (minified JS, data blobs) can exceed V8's max string length and crash.
75
+ try {
76
+ const fileStat = await ops.stat(filePath);
77
+ if (fileStat.size > MAX_FILE_SIZE)
78
+ return results;
79
+ }
80
+ catch {
81
+ return results;
82
+ }
71
83
  const stream = ops.createReadStream(filePath, "utf-8");
72
84
  try {
73
85
  const rl = readline.createInterface({
@@ -1 +1 @@
1
- {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
@@ -116,7 +116,7 @@ describe("plan mode tool restrictions", () => {
116
116
  planModeRef.current = true;
117
117
  const readFiles = new Set();
118
118
  const tool = createEditTool(tmpDir, readFiles, undefined, planModeRef);
119
- const result = resultToString(await tool.execute({ file_path: "test.ts", old_text: "foo", new_text: "bar" }, mockContext));
119
+ const result = resultToString(await tool.execute({ file_path: "test.ts", edits: [{ old_text: "foo", new_text: "bar" }] }, mockContext));
120
120
  expect(result).toContain("Error");
121
121
  expect(result).toContain("restricted in plan mode");
122
122
  });
@@ -135,7 +135,7 @@ describe("plan mode tool restrictions", () => {
135
135
  const tool = createWriteTool(tmpDir, undefined, undefined, planModeRef);
136
136
  const result = resultToString(await tool.execute({ file_path: ".ezcoder/plans/my-plan.md", content: "# Plan\n\nDo stuff." }, mockContext));
137
137
  expect(result).toContain("Wrote");
138
- expect(result).toContain("bytes");
138
+ expect(result).toContain("lines");
139
139
  // Verify file was actually created
140
140
  const written = await fs.readFile(path.join(tmpDir, ".ezcoder", "plans", "my-plan.md"), "utf-8");
141
141
  expect(written).toBe("# Plan\n\nDo stuff.");