@prestyj/cli 4.3.161 → 4.3.200
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/dist/cli.d.ts +1 -1
- package/dist/cli.js +112 -27
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session.d.ts +50 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +175 -20
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +6 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +112 -3
- package/dist/core/agents.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +20 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/claude-code-version.d.ts +10 -0
- package/dist/core/claude-code-version.d.ts.map +1 -0
- package/dist/core/claude-code-version.js +106 -0
- package/dist/core/claude-code-version.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +13 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +20 -1
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +12 -1
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/language-detector.d.ts +32 -0
- package/dist/core/language-detector.d.ts.map +1 -0
- package/dist/core/language-detector.js +191 -0
- package/dist/core/language-detector.js.map +1 -0
- package/dist/core/language-detector.test.d.ts +2 -0
- package/dist/core/language-detector.test.d.ts.map +1 -0
- package/dist/core/language-detector.test.js +109 -0
- package/dist/core/language-detector.test.js.map +1 -0
- package/dist/core/model-registry.d.ts +30 -2
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +41 -26
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-registry.test.d.ts +2 -0
- package/dist/core/model-registry.test.d.ts.map +1 -0
- package/dist/core/model-registry.test.js +19 -0
- package/dist/core/model-registry.test.js.map +1 -0
- package/dist/core/oauth/anthropic.d.ts.map +1 -1
- package/dist/core/oauth/anthropic.js +64 -42
- package/dist/core/oauth/anthropic.js.map +1 -1
- package/dist/core/oauth/openai.js +1 -1
- package/dist/core/oauth/openai.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +569 -96
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.d.ts +2 -0
- package/dist/core/prompt-commands.test.d.ts.map +1 -0
- package/dist/core/prompt-commands.test.js +33 -0
- package/dist/core/prompt-commands.test.js.map +1 -0
- package/dist/core/repomap-context.d.ts +11 -0
- package/dist/core/repomap-context.d.ts.map +1 -0
- package/dist/core/repomap-context.js +68 -0
- package/dist/core/repomap-context.js.map +1 -0
- package/dist/core/repomap-context.test.d.ts +2 -0
- package/dist/core/repomap-context.test.d.ts.map +1 -0
- package/dist/core/repomap-context.test.js +47 -0
- package/dist/core/repomap-context.test.js.map +1 -0
- package/dist/core/repomap.d.ts +74 -0
- package/dist/core/repomap.d.ts.map +1 -0
- package/dist/core/repomap.js +897 -0
- package/dist/core/repomap.js.map +1 -0
- package/dist/core/repomap.test.d.ts +2 -0
- package/dist/core/repomap.test.d.ts.map +1 -0
- package/dist/core/repomap.test.js +444 -0
- package/dist/core/repomap.test.js.map +1 -0
- package/dist/core/session-compaction.d.ts +15 -0
- package/dist/core/session-compaction.d.ts.map +1 -0
- package/dist/core/session-compaction.js +31 -0
- package/dist/core/session-compaction.js.map +1 -0
- package/dist/core/session-compaction.test.d.ts +2 -0
- package/dist/core/session-compaction.test.d.ts.map +1 -0
- package/dist/core/session-compaction.test.js +70 -0
- package/dist/core/session-compaction.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +3 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +6 -5
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/setup-history.d.ts +13 -0
- package/dist/core/setup-history.d.ts.map +1 -0
- package/dist/core/setup-history.js +71 -0
- package/dist/core/setup-history.js.map +1 -0
- package/dist/core/setup-history.test.d.ts +2 -0
- package/dist/core/setup-history.test.d.ts.map +1 -0
- package/dist/core/setup-history.test.js +74 -0
- package/dist/core/setup-history.test.js.map +1 -0
- package/dist/core/slash-commands.d.ts +2 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +15 -14
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/style-packs/index.d.ts +19 -0
- package/dist/core/style-packs/index.d.ts.map +1 -0
- package/dist/core/style-packs/index.js +69 -0
- package/dist/core/style-packs/index.js.map +1 -0
- package/dist/core/style-packs/packs.d.ts +18 -0
- package/dist/core/style-packs/packs.d.ts.map +1 -0
- package/dist/core/style-packs/packs.js +229 -0
- package/dist/core/style-packs/packs.js.map +1 -0
- package/dist/core/verify-commands.d.ts +35 -0
- package/dist/core/verify-commands.d.ts.map +1 -0
- package/dist/core/verify-commands.js +209 -0
- package/dist/core/verify-commands.js.map +1 -0
- package/dist/core/verify-commands.test.d.ts +2 -0
- package/dist/core/verify-commands.test.d.ts.map +1 -0
- package/dist/core/verify-commands.test.js +85 -0
- package/dist/core/verify-commands.test.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +12 -6
- package/dist/interactive.js.map +1 -1
- package/dist/modes/json-mode.d.ts +7 -0
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +9 -1
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/system-prompt.d.ts +2 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +116 -92
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.d.ts +2 -0
- package/dist/system-prompt.test.d.ts.map +1 -0
- package/dist/system-prompt.test.js +107 -0
- package/dist/system-prompt.test.js.map +1 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +1 -0
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit-diff.d.ts +66 -1
- package/dist/tools/edit-diff.d.ts.map +1 -1
- package/dist/tools/edit-diff.js +208 -10
- package/dist/tools/edit-diff.js.map +1 -1
- package/dist/tools/edit-diff.test.js +175 -15
- package/dist/tools/edit-diff.test.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +190 -44
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +392 -3
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/enter-plan.d.ts.map +1 -1
- package/dist/tools/enter-plan.js +1 -0
- package/dist/tools/enter-plan.js.map +1 -1
- package/dist/tools/exit-plan.d.ts.map +1 -1
- package/dist/tools/exit-plan.js +1 -0
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +6 -4
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read.d.ts +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +2 -1
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/subagent.d.ts +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +55 -2
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +1 -0
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +1 -0
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +96 -6
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.d.ts +2 -0
- package/dist/tools/web-fetch.test.d.ts.map +1 -0
- package/dist/tools/web-fetch.test.js +90 -0
- package/dist/tools/web-fetch.test.js.map +1 -0
- package/dist/tools/web-search.d.ts +1 -0
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +167 -27
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/web-search.test.d.ts +2 -0
- package/dist/tools/web-search.test.d.ts.map +1 -0
- package/dist/tools/web-search.test.js +119 -0
- package/dist/tools/web-search.test.js.map +1 -0
- package/dist/tools/write.d.ts +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +3 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/tools/write.test.js +23 -0
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts +74 -3
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +727 -223
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/activity-phrases.d.ts +2 -1
- package/dist/ui/activity-phrases.d.ts.map +1 -1
- package/dist/ui/activity-phrases.js +11 -1
- package/dist/ui/activity-phrases.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts +15 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +143 -44
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.test.d.ts +2 -0
- package/dist/ui/components/ActivityIndicator.test.d.ts.map +1 -0
- package/dist/ui/components/ActivityIndicator.test.js +40 -0
- package/dist/ui/components/ActivityIndicator.test.js.map +1 -0
- package/dist/ui/components/AnimationContext.d.ts +8 -2
- package/dist/ui/components/AnimationContext.d.ts.map +1 -1
- package/dist/ui/components/AnimationContext.js +94 -16
- package/dist/ui/components/AnimationContext.js.map +1 -1
- package/dist/ui/components/AssistantMessage.js +1 -1
- package/dist/ui/components/AssistantMessage.js.map +1 -1
- package/dist/ui/components/CompactionNotice.d.ts +5 -1
- package/dist/ui/components/CompactionNotice.d.ts.map +1 -1
- package/dist/ui/components/CompactionNotice.js +4 -6
- package/dist/ui/components/CompactionNotice.js.map +1 -1
- package/dist/ui/components/Footer.d.ts +10 -2
- package/dist/ui/components/Footer.d.ts.map +1 -1
- package/dist/ui/components/Footer.js +45 -8
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +76 -28
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/ServerToolExecution.d.ts +1 -0
- package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ServerToolExecution.js +21 -2
- package/dist/ui/components/ServerToolExecution.js.map +1 -1
- package/dist/ui/components/Spinner.d.ts +3 -1
- package/dist/ui/components/Spinner.d.ts.map +1 -1
- package/dist/ui/components/Spinner.js +10 -4
- package/dist/ui/components/Spinner.js.map +1 -1
- package/dist/ui/components/StreamingArea.js +1 -1
- package/dist/ui/components/StreamingArea.js.map +1 -1
- package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
- package/dist/ui/components/SubAgentPanel.js +3 -4
- package/dist/ui/components/SubAgentPanel.js.map +1 -1
- package/dist/ui/components/ToolExecution.d.ts +2 -0
- package/dist/ui/components/ToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolExecution.js +24 -5
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolGroupExecution.js +23 -2
- package/dist/ui/components/ToolGroupExecution.js.map +1 -1
- package/dist/ui/components/ToolUseLoader.d.ts +4 -2
- package/dist/ui/components/ToolUseLoader.d.ts.map +1 -1
- package/dist/ui/components/ToolUseLoader.js +3 -3
- package/dist/ui/components/ToolUseLoader.js.map +1 -1
- package/dist/ui/components/index.d.ts +1 -2
- package/dist/ui/components/index.d.ts.map +1 -1
- package/dist/ui/components/index.js +1 -2
- package/dist/ui/components/index.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +4 -1
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +110 -13
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/hooks/useBlink.d.ts.map +1 -1
- package/dist/ui/hooks/useBlink.js +3 -4
- package/dist/ui/hooks/useBlink.js.map +1 -1
- package/dist/ui/hooks/useTerminalSize.d.ts +12 -3
- package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
- package/dist/ui/hooks/useTerminalSize.js +16 -1
- package/dist/ui/hooks/useTerminalSize.js.map +1 -1
- package/dist/ui/pixel.js +1 -1
- package/dist/ui/pixel.test.js +1 -1
- package/dist/ui/pixel.test.js.map +1 -1
- package/dist/ui/render.d.ts +48 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +56 -6
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/theme/dark-ansi.json +2 -1
- package/dist/ui/theme/dark-daltonized.json +2 -1
- package/dist/ui/theme/dark.json +2 -1
- package/dist/ui/theme/light-ansi.json +2 -1
- package/dist/ui/theme/light-daltonized.json +2 -1
- package/dist/ui/theme/light.json +2 -1
- package/dist/ui/theme/theme.d.ts +1 -0
- package/dist/ui/theme/theme.d.ts.map +1 -1
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +2 -0
- package/dist/utils/error-handler.js.map +1 -1
- package/package.json +9 -6
- package/dist/ui/buddy/Buddy.d.ts +0 -15
- package/dist/ui/buddy/Buddy.d.ts.map +0 -1
- package/dist/ui/buddy/Buddy.js +0 -118
- package/dist/ui/buddy/Buddy.js.map +0 -1
- package/dist/ui/buddy/gacha.d.ts +0 -8
- package/dist/ui/buddy/gacha.d.ts.map +0 -1
- package/dist/ui/buddy/gacha.js +0 -94
- package/dist/ui/buddy/gacha.js.map +0 -1
- package/dist/ui/buddy/species.d.ts +0 -52
- package/dist/ui/buddy/species.d.ts.map +0 -1
- package/dist/ui/buddy/species.js +0 -257
- package/dist/ui/buddy/species.js.map +0 -1
- package/dist/ui/components/ThinkingIndicator.d.ts +0 -6
- package/dist/ui/components/ThinkingIndicator.d.ts.map +0 -1
- package/dist/ui/components/ThinkingIndicator.js +0 -145
- package/dist/ui/components/ThinkingIndicator.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet } from "./edit-diff.js";
|
|
2
|
+
import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet, findOccurrenceLines, stripLeadingBlankLine, applyDotdotdots, applyMissingLeadingWhitespace, } from "./edit-diff.js";
|
|
3
3
|
describe("fuzzyFindText", () => {
|
|
4
4
|
it("finds exact match with usedFuzzy=false", () => {
|
|
5
5
|
const content = "hello world\nfoo bar\n";
|
|
@@ -62,23 +62,29 @@ describe("findClosestSnippet", () => {
|
|
|
62
62
|
"}",
|
|
63
63
|
].join("\n");
|
|
64
64
|
it("finds the closest line by token overlap and returns numbered context", () => {
|
|
65
|
-
const
|
|
66
|
-
expect(
|
|
67
|
-
expect(snippet).toContain("useState(0)");
|
|
65
|
+
const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
|
|
66
|
+
expect(result).not.toBeNull();
|
|
67
|
+
expect(result.snippet).toContain("useState(0)");
|
|
68
68
|
// Numbered (cat -n style)
|
|
69
|
-
expect(snippet).toMatch(/^\s+\d+\t/m);
|
|
69
|
+
expect(result.snippet).toMatch(/^\s+\d+\t/m);
|
|
70
|
+
});
|
|
71
|
+
it("returns the 1-based line of the strongest candidate for read-suggestion use", () => {
|
|
72
|
+
const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
|
|
73
|
+
expect(result).not.toBeNull();
|
|
74
|
+
// Line 4 of `content` is ` const [count, setCount] = useState(0);`
|
|
75
|
+
expect(result.topLine).toBe(4);
|
|
70
76
|
});
|
|
71
77
|
it("returns null when there are no shared tokens", () => {
|
|
72
|
-
const
|
|
73
|
-
expect(
|
|
78
|
+
const result = findClosestSnippet(content, "completely unrelated zzzqqq xxx");
|
|
79
|
+
expect(result).toBeNull();
|
|
74
80
|
});
|
|
75
81
|
it("returns null on empty oldText", () => {
|
|
76
82
|
expect(findClosestSnippet(content, "")).toBeNull();
|
|
77
83
|
expect(findClosestSnippet(content, " \n\n")).toBeNull();
|
|
78
84
|
});
|
|
79
85
|
it("respects contextLines", () => {
|
|
80
|
-
const
|
|
81
|
-
expect(snippet).toBe(" 4\t const [count, setCount] = useState(0);");
|
|
86
|
+
const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 0);
|
|
87
|
+
expect(result.snippet).toBe(" 4\t const [count, setCount] = useState(0);");
|
|
82
88
|
});
|
|
83
89
|
it("returns multiple matches separated by --- when several regions tie", () => {
|
|
84
90
|
const multi = [
|
|
@@ -94,20 +100,174 @@ describe("findClosestSnippet", () => {
|
|
|
94
100
|
" setCount(count * 2);",
|
|
95
101
|
"}",
|
|
96
102
|
].join("\n");
|
|
97
|
-
const
|
|
98
|
-
expect(
|
|
99
|
-
const parts = snippet.split("\n---\n");
|
|
103
|
+
const result = findClosestSnippet(multi, "setCount(count - 1);", 0, 3);
|
|
104
|
+
expect(result).not.toBeNull();
|
|
105
|
+
const parts = result.snippet.split("\n---\n");
|
|
100
106
|
expect(parts.length).toBeGreaterThanOrEqual(2);
|
|
101
107
|
// Every part should reference setCount
|
|
102
108
|
for (const p of parts)
|
|
103
109
|
expect(p).toContain("setCount");
|
|
104
110
|
});
|
|
105
111
|
it("keeps a single match when one candidate dominates", () => {
|
|
106
|
-
const
|
|
112
|
+
const result = findClosestSnippet(content, "const [count, setCount] = useState(1);", 1);
|
|
107
113
|
// Only line 4 has the full token set; line 1 (just `useState`) is dropped
|
|
108
114
|
// by the bestScore/3 cutoff.
|
|
109
|
-
expect(
|
|
110
|
-
expect(snippet.split("\n---\n")).toHaveLength(1);
|
|
115
|
+
expect(result).not.toBeNull();
|
|
116
|
+
expect(result.snippet.split("\n---\n")).toHaveLength(1);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe("findOccurrenceLines", () => {
|
|
120
|
+
it("returns 1-indexed line numbers and trimmed previews for every match", () => {
|
|
121
|
+
const css = [
|
|
122
|
+
".timer { color: white; }",
|
|
123
|
+
".button { color: black; }",
|
|
124
|
+
".label { color: white; }",
|
|
125
|
+
".footer { color: white; }",
|
|
126
|
+
].join("\n");
|
|
127
|
+
const matches = findOccurrenceLines(css, "color: white;");
|
|
128
|
+
expect(matches).toEqual([
|
|
129
|
+
{ line: 1, preview: ".timer { color: white; }" },
|
|
130
|
+
{ line: 3, preview: ".label { color: white; }" },
|
|
131
|
+
{ line: 4, preview: ".footer { color: white; }" },
|
|
132
|
+
]);
|
|
133
|
+
});
|
|
134
|
+
it("caps results at `max` so dozens of matches stay compact", () => {
|
|
135
|
+
const lines = Array.from({ length: 20 }, (_, i) => `row ${i} }`);
|
|
136
|
+
const matches = findOccurrenceLines(lines.join("\n"), "}", 4);
|
|
137
|
+
expect(matches).toHaveLength(4);
|
|
138
|
+
expect(matches[0].line).toBe(1);
|
|
139
|
+
});
|
|
140
|
+
it("falls back to fuzzy matching when exact yields zero", () => {
|
|
141
|
+
const content = "say “hi”";
|
|
142
|
+
const matches = findOccurrenceLines(content, 'say "hi"');
|
|
143
|
+
expect(matches).toHaveLength(1);
|
|
144
|
+
expect(matches[0].line).toBe(1);
|
|
145
|
+
});
|
|
146
|
+
it("returns empty array for no matches at all", () => {
|
|
147
|
+
expect(findOccurrenceLines("hello world", "missing")).toEqual([]);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe("applyMissingLeadingWhitespace", () => {
|
|
151
|
+
it("returns null when text matches exactly (caller already handled it)", () => {
|
|
152
|
+
// The whole point of this strategy is to handle MIS-indented text.
|
|
153
|
+
// When indentation matches, this returns null too — but in practice
|
|
154
|
+
// the primary exact matcher catches that case first.
|
|
155
|
+
const file = " function foo() {\n return 1;\n }\n";
|
|
156
|
+
const old = "function foo() {\n return 1;\n}";
|
|
157
|
+
const next = "function foo() {\n return 2;\n}";
|
|
158
|
+
const result = applyMissingLeadingWhitespace(file, old, next);
|
|
159
|
+
expect(result).not.toBeNull();
|
|
160
|
+
expect(result).toContain("return 2;");
|
|
161
|
+
// File's 2-space prefix was preserved on the rewritten lines.
|
|
162
|
+
expect(result).toContain(" function foo() {");
|
|
163
|
+
expect(result).toContain(" return 2;");
|
|
164
|
+
expect(result).toContain(" }");
|
|
165
|
+
});
|
|
166
|
+
it("model omits indentation entirely; file has 4 spaces — apply 4-space prefix to new", () => {
|
|
167
|
+
const file = " const x = 1;\n const y = 2;\n const z = 3;\n";
|
|
168
|
+
const old = "const x = 1;\nconst y = 2;\nconst z = 3;";
|
|
169
|
+
const next = "const x = 10;\nconst y = 20;\nconst z = 30;";
|
|
170
|
+
const result = applyMissingLeadingWhitespace(file, old, next);
|
|
171
|
+
expect(result).toBe(" const x = 10;\n const y = 20;\n const z = 30;\n");
|
|
172
|
+
});
|
|
173
|
+
it("model used 2-space indent but file uses 4 — outdents both, finds match, re-indents new", () => {
|
|
174
|
+
const file = " if (x) {\n return y;\n }\n";
|
|
175
|
+
const old = " if (x) {\n return y;\n }";
|
|
176
|
+
const next = " if (x) {\n return z;\n }";
|
|
177
|
+
const result = applyMissingLeadingWhitespace(file, old, next);
|
|
178
|
+
expect(result).toContain(" if (x) {");
|
|
179
|
+
expect(result).toContain(" return z;");
|
|
180
|
+
expect(result).toContain(" }");
|
|
181
|
+
});
|
|
182
|
+
it("returns null when non-leading content differs", () => {
|
|
183
|
+
const file = " function foo() {\n return 1;\n }\n";
|
|
184
|
+
const old = "function bar() {\n return 1;\n}";
|
|
185
|
+
const next = "function bar() {\n return 2;\n}";
|
|
186
|
+
expect(applyMissingLeadingWhitespace(file, old, next)).toBeNull();
|
|
187
|
+
});
|
|
188
|
+
it("returns null when leading-whitespace delta is non-uniform across lines", () => {
|
|
189
|
+
// File has 4 spaces on line 1, 6 on line 2 (irregular block).
|
|
190
|
+
const file = " line one\n line two\n";
|
|
191
|
+
const old = "line one\nline two";
|
|
192
|
+
const next = "LINE ONE\nLINE TWO";
|
|
193
|
+
// The delta is " " for line 1 but " " for line 2 — non-uniform.
|
|
194
|
+
expect(applyMissingLeadingWhitespace(file, old, next)).toBeNull();
|
|
195
|
+
});
|
|
196
|
+
it("returns null on multiple matches (ambiguous)", () => {
|
|
197
|
+
const file = " foo();\n bar();\n\n foo();\n bar();\n";
|
|
198
|
+
const old = "foo();\nbar();";
|
|
199
|
+
const next = "FOO();\nBAR();";
|
|
200
|
+
expect(applyMissingLeadingWhitespace(file, old, next)).toBeNull();
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
describe("applyDotdotdots", () => {
|
|
204
|
+
const file = [
|
|
205
|
+
"function foo() {",
|
|
206
|
+
" console.log('keep this');",
|
|
207
|
+
" doStuff();",
|
|
208
|
+
" return bar;",
|
|
209
|
+
"}",
|
|
210
|
+
"",
|
|
211
|
+
"function unrelated() { return 0; }",
|
|
212
|
+
].join("\n");
|
|
213
|
+
it("returns null when old_text has no `...` lines", () => {
|
|
214
|
+
expect(applyDotdotdots(file, "function foo() {", "function FOO() {")).toBeNull();
|
|
215
|
+
});
|
|
216
|
+
it("matches bookends and preserves the elided middle", () => {
|
|
217
|
+
const old = "function foo() {\n ...\n return bar;\n}";
|
|
218
|
+
const next = "function foo() {\n ...\n return baz;\n}";
|
|
219
|
+
const result = applyDotdotdots(file, old, next);
|
|
220
|
+
expect(result).not.toBeNull();
|
|
221
|
+
expect(result).toContain("return baz;");
|
|
222
|
+
expect(result).not.toContain("return bar;");
|
|
223
|
+
// Middle preserved verbatim.
|
|
224
|
+
expect(result).toContain("console.log('keep this');");
|
|
225
|
+
expect(result).toContain("doStuff();");
|
|
226
|
+
});
|
|
227
|
+
it("returns null when piece counts mismatch (ambiguous elision)", () => {
|
|
228
|
+
const old = "function foo() {\n ...\n return bar;\n}";
|
|
229
|
+
const next = "function foo() {\n ...\n ...\n return baz;\n}";
|
|
230
|
+
expect(applyDotdotdots(file, old, next)).toBeNull();
|
|
231
|
+
});
|
|
232
|
+
it("returns null when bookend piece is missing in the file", () => {
|
|
233
|
+
const old = "function MISSING() {\n ...\n return bar;\n}";
|
|
234
|
+
const next = "function MISSING() {\n ...\n return baz;\n}";
|
|
235
|
+
expect(applyDotdotdots(file, old, next)).toBeNull();
|
|
236
|
+
});
|
|
237
|
+
it("returns null when a piece would be empty (`...` at boundary)", () => {
|
|
238
|
+
const old = "...\nfunction foo() {";
|
|
239
|
+
const next = "...\nfunction FOO() {";
|
|
240
|
+
expect(applyDotdotdots(file, old, next)).toBeNull();
|
|
241
|
+
});
|
|
242
|
+
it("supports multiple `...` blocks", () => {
|
|
243
|
+
const old = "function foo() {\n ...\n doStuff();\n ...\n return bar;\n}";
|
|
244
|
+
const next = "function foo() {\n ...\n doStuff();\n ...\n return baz;\n}";
|
|
245
|
+
const result = applyDotdotdots(file, old, next);
|
|
246
|
+
expect(result).not.toBeNull();
|
|
247
|
+
expect(result).toContain("return baz;");
|
|
248
|
+
// First and second middles both preserved.
|
|
249
|
+
expect(result).toContain("console.log('keep this');");
|
|
250
|
+
});
|
|
251
|
+
it("ignores inline `...` (only line-only dots count)", () => {
|
|
252
|
+
// Inline ... like JS spread should NOT trigger dotdotdots.
|
|
253
|
+
expect(applyDotdotdots(file, "doStuff(...args);", "doStuff(...newArgs);")).toBeNull();
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe("stripLeadingBlankLine", () => {
|
|
257
|
+
it("returns null when there is no leading blank line", () => {
|
|
258
|
+
expect(stripLeadingBlankLine("foo\nbar")).toBeNull();
|
|
259
|
+
});
|
|
260
|
+
it("strips a single leading newline", () => {
|
|
261
|
+
expect(stripLeadingBlankLine("\nfoo\nbar")).toBe("foo\nbar");
|
|
262
|
+
});
|
|
263
|
+
it("strips a leading whitespace-only line", () => {
|
|
264
|
+
expect(stripLeadingBlankLine(" \nfoo")).toBe("foo");
|
|
265
|
+
});
|
|
266
|
+
it("returns null on empty input", () => {
|
|
267
|
+
expect(stripLeadingBlankLine("")).toBeNull();
|
|
268
|
+
});
|
|
269
|
+
it("returns null when the text is a single line", () => {
|
|
270
|
+
expect(stripLeadingBlankLine("only one line")).toBeNull();
|
|
111
271
|
});
|
|
112
272
|
});
|
|
113
273
|
describe("generateDiff", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-diff.test.js","sourceRoot":"","sources":["../../src/tools/edit-diff.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"edit-diff.test.js","sourceRoot":"","sources":["../../src/tools/edit-diff.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/edit.d.ts
CHANGED
|
@@ -7,10 +7,12 @@ declare const EditParams: z.ZodObject<{
|
|
|
7
7
|
edits: z.ZodPreprocess<z.ZodArray<z.ZodObject<{
|
|
8
8
|
old_text: z.ZodString;
|
|
9
9
|
new_text: z.ZodString;
|
|
10
|
+
replace_all: z.ZodOptional<z.ZodBoolean>;
|
|
10
11
|
}, z.core.$strip>>>;
|
|
12
|
+
atomic: z.ZodOptional<z.ZodBoolean>;
|
|
11
13
|
}, z.core.$strip>;
|
|
12
14
|
export declare function createEditTool(cwd: string, readFiles?: ReadTracker, ops?: ToolOperations, planModeRef?: {
|
|
13
15
|
current: boolean;
|
|
14
|
-
}): AgentTool<typeof EditParams>;
|
|
16
|
+
}, onFileMutated?: (filePath: string) => void | Promise<void>): AgentTool<typeof EditParams>;
|
|
15
17
|
export {};
|
|
16
18
|
//# sourceMappingURL=edit.d.ts.map
|
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":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
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;AAYhD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA2B/E,QAAA,MAAM,UAAU;;;;;;;;iBAgBd,CAAC;AA4CH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,WAAW,EACvB,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAClC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzD,SAAS,CAAC,OAAO,UAAU,CAAC,CAiN9B"}
|
package/dist/tools/edit.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { resolvePath, rejectSymlink } from "./path-utils.js";
|
|
4
|
-
import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet } from "./edit-diff.js";
|
|
4
|
+
import { fuzzyFindText, countOccurrences, generateDiff, findClosestSnippet, findOccurrenceLines, stripLeadingBlankLine, applyDotdotdots, applyMissingLeadingWhitespace, } from "./edit-diff.js";
|
|
5
5
|
import { localOperations } from "./operations.js";
|
|
6
6
|
import { assertFresh, recordWrite } from "./read-tracker.js";
|
|
7
7
|
const EditItem = z.object({
|
|
8
8
|
old_text: z.string().describe("The exact text to find and replace"),
|
|
9
9
|
new_text: z.string().describe("The replacement text"),
|
|
10
|
+
replace_all: z
|
|
11
|
+
.boolean()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Replace every occurrence of old_text instead of requiring a unique match. " +
|
|
14
|
+
"Use for renames or repeated tokens. Defaults to false."),
|
|
10
15
|
});
|
|
11
16
|
// Some models (Opus 4.6, GLM-5.1) occasionally send `edits` as a JSON string
|
|
12
17
|
// instead of a real array, which trips Zod and makes the model fall back to
|
|
@@ -26,19 +31,45 @@ const EditParams = z.object({
|
|
|
26
31
|
file_path: z.string().describe("The file path to edit"),
|
|
27
32
|
edits: z
|
|
28
33
|
.preprocess(coerceStringifiedEdits, z.array(EditItem).min(1))
|
|
29
|
-
.describe("One or more edits applied in order. Each edit operates on the result of the previous one.
|
|
30
|
-
|
|
34
|
+
.describe("One or more edits applied in order. Each edit operates on the result of the previous one."),
|
|
35
|
+
atomic: z
|
|
36
|
+
.boolean()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("If true, fail the whole batch when any edit fails — no changes written. " +
|
|
39
|
+
"Default false: partial-apply, keep every successful edit and report failures " +
|
|
40
|
+
"for retry. Use atomic only when later edits depend on earlier ones in a way " +
|
|
41
|
+
"where a half-applied state would be worse than nothing."),
|
|
31
42
|
});
|
|
32
|
-
|
|
43
|
+
function tryMatch(working, old, next, replaceAll) {
|
|
44
|
+
if (old.length === 0)
|
|
45
|
+
return { ok: false, reason: "not_found" };
|
|
46
|
+
if (replaceAll && working.includes(old)) {
|
|
47
|
+
return { ok: true, newWorking: working.split(old).join(next) };
|
|
48
|
+
}
|
|
49
|
+
const occurrences = countOccurrences(working, old);
|
|
50
|
+
if (occurrences === 0)
|
|
51
|
+
return { ok: false, reason: "not_found" };
|
|
52
|
+
if (occurrences > 1)
|
|
53
|
+
return { ok: false, reason: "ambiguous", occurrences };
|
|
54
|
+
const match = fuzzyFindText(working, old);
|
|
55
|
+
if (!match.found)
|
|
56
|
+
return { ok: false, reason: "not_found" };
|
|
57
|
+
return {
|
|
58
|
+
ok: true,
|
|
59
|
+
newWorking: working.slice(0, match.index) + next + working.slice(match.index + match.matchLength),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function createEditTool(cwd, readFiles, ops = localOperations, planModeRef, onFileMutated) {
|
|
33
63
|
return {
|
|
34
64
|
name: "edit",
|
|
35
|
-
description: "Replace
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
65
|
+
description: "Replace text in a file via { old_text, new_text } edits applied sequentially. Read the file first. " +
|
|
66
|
+
"Each old_text must uniquely match exactly one location — set replace_all: true to swap every occurrence (renames). " +
|
|
67
|
+
"For long blocks, a line containing only `...` in BOTH old_text and new_text elides a middle preserved verbatim. " +
|
|
68
|
+
"Partial-apply by default: failed edits are listed for retry, successful ones are still written — " +
|
|
69
|
+
"re-issue ONLY the listed failures, not the whole batch. Returns a unified diff.",
|
|
40
70
|
parameters: EditParams,
|
|
41
|
-
|
|
71
|
+
executionMode: "sequential",
|
|
72
|
+
async execute({ file_path, edits, atomic = false }) {
|
|
42
73
|
if (planModeRef?.current) {
|
|
43
74
|
return "Error: edit is restricted in plan mode. Use read-only tools to explore the codebase, then write your plan to .ezcoder/plans/.";
|
|
44
75
|
}
|
|
@@ -50,55 +81,170 @@ export function createEditTool(cwd, readFiles, ops = localOperations, planModeRe
|
|
|
50
81
|
const originalNormalized = hasCRLF ? original.replace(/\r\n/g, "\n") : original;
|
|
51
82
|
let working = originalNormalized;
|
|
52
83
|
const fileName = path.basename(resolved);
|
|
53
|
-
const
|
|
84
|
+
const outcomes = new Array(edits.length);
|
|
54
85
|
for (let i = 0; i < edits.length; i++) {
|
|
55
|
-
const { old_text, new_text } = edits[i];
|
|
86
|
+
const { old_text, new_text, replace_all } = edits[i];
|
|
56
87
|
const normalizedOld = hasCRLF ? old_text.replace(/\r\n/g, "\n") : old_text;
|
|
57
88
|
const normalizedNew = hasCRLF ? new_text.replace(/\r\n/g, "\n") : new_text;
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
errors.push(`old_text not found in ${fileName}${label}. ` +
|
|
64
|
-
"Text must match verbatim — do not paraphrase. Re-read the file if unsure." +
|
|
65
|
-
hintLine);
|
|
89
|
+
const replaceAll = replace_all ?? false;
|
|
90
|
+
// Reject no-op edits before they consume a write or silently "succeed"
|
|
91
|
+
// — usually the model paraphrased the new_text to be identical to old.
|
|
92
|
+
if (normalizedOld === normalizedNew) {
|
|
93
|
+
outcomes[i] = { ok: false, failure: { reason: "noop" } };
|
|
66
94
|
continue;
|
|
67
95
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
96
|
+
// Aider's full fallback ladder, run only when the primary match
|
|
97
|
+
// returns "not_found". Ambiguous matches deliberately don't fall
|
|
98
|
+
// through — the model needs to add context, not paraphrase further.
|
|
99
|
+
// Order mirrors aider/coders/editblock_coder.py:
|
|
100
|
+
// 1. exact + smart-quote/dash fuzzy (in tryMatch)
|
|
101
|
+
// 2. indent-flex (model omitted/shortened leading whitespace)
|
|
102
|
+
// 3. drop leading blank line, retry 1+2
|
|
103
|
+
// 4. dotdotdots (`...` elision with preserved middle)
|
|
104
|
+
let result = tryMatch(working, normalizedOld, normalizedNew, replaceAll);
|
|
105
|
+
const tryFallbacks = (oldText) => {
|
|
106
|
+
const flexed = applyMissingLeadingWhitespace(working, oldText, normalizedNew);
|
|
107
|
+
if (flexed !== null)
|
|
108
|
+
return flexed;
|
|
109
|
+
// Re-run primary matcher on the stripped variant as a cheap retry.
|
|
110
|
+
const exact = tryMatch(working, oldText, normalizedNew, replaceAll);
|
|
111
|
+
if (exact.ok)
|
|
112
|
+
return exact.newWorking;
|
|
113
|
+
return null;
|
|
114
|
+
};
|
|
115
|
+
if (!result.ok && result.reason === "not_found") {
|
|
116
|
+
const indentFlexed = applyMissingLeadingWhitespace(working, normalizedOld, normalizedNew);
|
|
117
|
+
if (indentFlexed !== null) {
|
|
118
|
+
result = { ok: true, newWorking: indentFlexed };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (!result.ok && result.reason === "not_found") {
|
|
122
|
+
const stripped = stripLeadingBlankLine(normalizedOld);
|
|
123
|
+
if (stripped !== null) {
|
|
124
|
+
const candidate = tryFallbacks(stripped);
|
|
125
|
+
if (candidate !== null)
|
|
126
|
+
result = { ok: true, newWorking: candidate };
|
|
127
|
+
}
|
|
72
128
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
129
|
+
if (!result.ok && result.reason === "not_found") {
|
|
130
|
+
const elided = applyDotdotdots(working, normalizedOld, normalizedNew);
|
|
131
|
+
if (elided !== null)
|
|
132
|
+
result = { ok: true, newWorking: elided };
|
|
133
|
+
}
|
|
134
|
+
if (result.ok) {
|
|
135
|
+
working = result.newWorking;
|
|
136
|
+
outcomes[i] = { ok: true };
|
|
76
137
|
continue;
|
|
77
138
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
139
|
+
if (result.reason === "not_found") {
|
|
140
|
+
// Capture the closest-match snippet eagerly against the current
|
|
141
|
+
// working buffer; we'll decide whether to render it post-loop based
|
|
142
|
+
// on whether other edits in this batch succeeded.
|
|
143
|
+
const closest = findClosestSnippet(working, normalizedOld);
|
|
144
|
+
outcomes[i] = {
|
|
145
|
+
ok: false,
|
|
146
|
+
failure: {
|
|
147
|
+
reason: "not_found",
|
|
148
|
+
closestSnippet: closest?.snippet ?? null,
|
|
149
|
+
closestLine: closest?.topLine ?? null,
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const occurrences = result.occurrences ?? 0;
|
|
155
|
+
const matches = findOccurrenceLines(working, normalizedOld);
|
|
156
|
+
const matchLines = matches.map((m) => ` line ${m.line}: ${m.preview}`).join("\n");
|
|
157
|
+
const more = occurrences > matches.length ? `\n …and ${occurrences - matches.length} more` : "";
|
|
158
|
+
outcomes[i] = {
|
|
159
|
+
ok: false,
|
|
160
|
+
failure: { reason: "ambiguous", occurrences, matchLines, more },
|
|
161
|
+
};
|
|
162
|
+
}
|
|
82
163
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
164
|
+
const failures = outcomes
|
|
165
|
+
.map((o, i) => (o.ok || !o.failure ? null : { index: i, failure: o.failure }))
|
|
166
|
+
.filter((x) => x !== null);
|
|
167
|
+
const successCount = outcomes.length - failures.length;
|
|
168
|
+
const hasNotFound = failures.some((f) => f.failure.reason === "not_found");
|
|
169
|
+
// Closest-match snippets only get suppressed when successes will ACTUALLY
|
|
170
|
+
// be persisted (partial-apply with at least one win). In atomic mode we
|
|
171
|
+
// throw before writing, so the model retries against an unchanged file
|
|
172
|
+
// and the snippet is its only guidance — keep it.
|
|
173
|
+
const willPersistSuccesses = successCount > 0 && !atomic;
|
|
174
|
+
const formatFailureMessage = (f) => {
|
|
175
|
+
if (f.reason === "noop") {
|
|
176
|
+
return `old_text and new_text are identical in ${fileName} — this edit would be a no-op. Either fix new_text or drop this edit.`;
|
|
177
|
+
}
|
|
178
|
+
if (f.reason === "ambiguous") {
|
|
179
|
+
return (`old_text found ${f.occurrences} times in ${fileName}. ` +
|
|
180
|
+
"Include more surrounding context to make the match unique, " +
|
|
181
|
+
"or set replace_all: true to swap every occurrence.\n" +
|
|
182
|
+
"Matches at:\n" +
|
|
183
|
+
f.matchLines +
|
|
184
|
+
f.more);
|
|
185
|
+
}
|
|
186
|
+
const base = `old_text not found in ${fileName}. ` +
|
|
187
|
+
"Text must match verbatim — do not paraphrase. " +
|
|
188
|
+
"The cached read for this file has been invalidated; call `read` before another edit.";
|
|
189
|
+
// Build a bounded read suggestion around the closest-match line so the
|
|
190
|
+
// model can re-read just that region (e.g. ±25 lines) instead of the
|
|
191
|
+
// whole file. Skipped when willPersistSuccesses — see comment above.
|
|
192
|
+
const readHint = f.closestLine !== null && !willPersistSuccesses
|
|
193
|
+
? `\nSuggested re-read: \`read file_path="${file_path}" offset=${Math.max(1, f.closestLine - 25)} limit=50\``
|
|
194
|
+
: "";
|
|
195
|
+
if (willPersistSuccesses || !f.closestSnippet)
|
|
196
|
+
return base + readHint;
|
|
197
|
+
return `${base}${readHint}\nClosest match in file:\n${f.closestSnippet}`;
|
|
198
|
+
};
|
|
199
|
+
const formatFailures = () => {
|
|
200
|
+
if (failures.length === 1 && edits.length === 1) {
|
|
201
|
+
return formatFailureMessage(failures[0].failure);
|
|
202
|
+
}
|
|
203
|
+
return failures
|
|
204
|
+
.map((f) => `[edit ${f.index + 1}/${edits.length}] ${formatFailureMessage(f.failure)}`)
|
|
205
|
+
.join("\n\n");
|
|
206
|
+
};
|
|
207
|
+
// Atomic-mode failure, OR partial-mode failure where literally nothing
|
|
208
|
+
// succeeded. Either way nothing should be written and we throw to make
|
|
209
|
+
// the model retry the whole batch.
|
|
210
|
+
if (failures.length > 0 && (atomic || successCount === 0)) {
|
|
211
|
+
// Hard guardrail: a not_found failure means the model's mental model
|
|
212
|
+
// of the file is wrong. Invalidate the tracker so the next edit fails
|
|
213
|
+
// with "File must be read first" — forces a re-read instead of
|
|
214
|
+
// letting the model burn turns retrying paraphrased variants.
|
|
215
|
+
if (hasNotFound)
|
|
216
|
+
readFiles?.delete(resolved);
|
|
217
|
+
const header = atomic && failures.length > 0
|
|
218
|
+
? `${failures.length} of ${edits.length} edit${edits.length === 1 ? "" : "s"} failed; no changes written (atomic).\n\n`
|
|
219
|
+
: edits.length > 1
|
|
220
|
+
? `${failures.length} of ${edits.length} edits failed; no changes written.\n\n`
|
|
221
|
+
: "";
|
|
222
|
+
throw new Error(header + formatFailures());
|
|
89
223
|
}
|
|
90
224
|
const finalContent = hasCRLF ? working.replace(/\n/g, "\r\n") : working;
|
|
91
225
|
await ops.writeFile(resolved, finalContent);
|
|
92
226
|
await recordWrite(readFiles, resolved, finalContent, ops);
|
|
227
|
+
await onFileMutated?.(resolved);
|
|
228
|
+
// Partial-apply with a not_found in the mix: recordWrite just refreshed
|
|
229
|
+
// the tracker, but we still want to force a re-read for the next batch
|
|
230
|
+
// because the model's view of at least one region is wrong.
|
|
231
|
+
if (hasNotFound)
|
|
232
|
+
readFiles?.delete(resolved);
|
|
93
233
|
const relPath = path.relative(cwd, resolved);
|
|
94
234
|
const diff = generateDiff(originalNormalized, working, relPath);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
content: summary,
|
|
100
|
-
|
|
101
|
-
|
|
235
|
+
if (failures.length === 0) {
|
|
236
|
+
const summary = edits.length > 1
|
|
237
|
+
? `Successfully applied ${edits.length} edits to ${relPath}.`
|
|
238
|
+
: `Successfully replaced text in ${relPath}.`;
|
|
239
|
+
return { content: summary, details: { diff } };
|
|
240
|
+
}
|
|
241
|
+
// Partial success — the loud header is deliberate: the model has to know
|
|
242
|
+
// that work was saved AND that only the listed edits need to be retried.
|
|
243
|
+
const noun = failures.length === 1 ? "edit" : "edits";
|
|
244
|
+
const content = `Applied ${successCount} of ${edits.length} edits to ${relPath}.\n` +
|
|
245
|
+
`${failures.length} ${noun} skipped — re-issue ONLY these (the rest are already done, do not redo them):\n\n` +
|
|
246
|
+
formatFailures();
|
|
247
|
+
return { content, details: { diff } };
|
|
102
248
|
},
|
|
103
249
|
};
|
|
104
250
|
}
|
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,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
|