@osovv/vv-opencode 1.3.6-rc.2 → 1.3.6-rc.4

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.
@@ -1,246 +0,0 @@
1
- // FILE: src/plugins/hashline-edit/replace-engine.ts
2
- // VERSION: 0.1.0
3
- // START_MODULE_CONTRACT
4
- // PURPOSE: Apply oldString/newString replace edits with the native qwen/kimi harness contract: exact literal matching, limited visible fallback layers, uniqueness rules, and teaching errors. Tool-facing snake_case aliases (old_string/new_string) are resolved to this engine at the plugin layer.
5
- // SCOPE: Pure content-level replace application with exact, unicode-confusables, and trailing-whitespace layers; occurrence counting; replace-all mode; result formatting with bounded diff summary.
6
- // DEPENDS: [src/plugins/hashline-edit/diff-summary.ts]
7
- // LINKS: [M-PLUGIN-HASHLINE-EDIT]
8
- // ROLE: RUNTIME
9
- // MAP_MODE: EXPORTS
10
- // END_MODULE_CONTRACT
11
- //
12
- // START_MODULE_MAP
13
- // ReplaceEditParams - Tool-facing replace arguments (oldString, newString, replaceAll).
14
- // ReplaceMatchLayer - Which matching layer produced the applied match.
15
- // ReplaceApplyResult - Structured outcome: applied content with layer and replacement count, or a teaching error.
16
- // applyReplaceEdit - Apply a replace edit to file content with layered fail-closed matching.
17
- // formatReplaceSuccess - Render the success output with stats, warnings, and bounded diff.
18
- // END_MODULE_MAP
19
- //
20
- // START_CHANGE_SUMMARY
21
- // LAST_CHANGE: [v0.1.0 - Established the replace profile engine with exact, unicode-confusables, and trailing-whitespace layers adapted from the qwen-code contract (Apache-2.0).]
22
- // END_CHANGE_SUMMARY
23
- import { findFirstChangedLine, summarizeEditDiff } from "./diff-summary.js";
24
- // END_BLOCK_TYPES
25
- // START_BLOCK_CONFUSABLES
26
- // Character-level typography normalization adapted from qwen-code editHelper
27
- // (Apache-2.0). Every entry maps one code point to one code point so string
28
- // offsets are preserved between original and normalized text.
29
- const UNICODE_EQUIVALENT_MAP = {
30
- "\u2010": "-",
31
- "\u2011": "-",
32
- "\u2012": "-",
33
- "\u2013": "-",
34
- "\u2014": "-",
35
- "\u2015": "-",
36
- "\u2212": "-",
37
- "\u2018": "'",
38
- "\u2019": "'",
39
- "\u201A": "'",
40
- "\u201B": "'",
41
- "\u201C": '"',
42
- "\u201D": '"',
43
- "\u201E": '"',
44
- "\u201F": '"',
45
- "\u00A0": " ",
46
- "\u2002": " ",
47
- "\u2003": " ",
48
- "\u2004": " ",
49
- "\u2005": " ",
50
- "\u2006": " ",
51
- "\u2007": " ",
52
- "\u2008": " ",
53
- "\u2009": " ",
54
- "\u200A": " ",
55
- "\u202F": " ",
56
- "\u205F": " ",
57
- "\u3000": " ",
58
- };
59
- function normalizeConfusables(text) {
60
- let normalized = "";
61
- for (const char of text) {
62
- normalized += UNICODE_EQUIVALENT_MAP[char] ?? char;
63
- }
64
- return normalized;
65
- }
66
- // END_BLOCK_CONFUSABLES
67
- // START_BLOCK_MATCHING
68
- function countOccurrences(content, needle) {
69
- if (needle.length === 0) {
70
- return 0;
71
- }
72
- let count = 0;
73
- let position = 0;
74
- while (position < content.length) {
75
- const index = content.indexOf(needle, position);
76
- if (index === -1) {
77
- break;
78
- }
79
- count += 1;
80
- position = index + needle.length;
81
- }
82
- return count;
83
- }
84
- function matchTrailingWhitespaceBlocks(content, oldString) {
85
- const contentLines = content.split("\n");
86
- const searchLines = oldString.split("\n").map((line) => line.trimEnd());
87
- if (searchLines.every((line) => line === "")) {
88
- return [];
89
- }
90
- const offsets = [];
91
- let cursor = 0;
92
- for (const line of contentLines) {
93
- offsets.push(cursor);
94
- cursor += line.length + 1;
95
- }
96
- const blocks = [];
97
- for (let i = 0; i + searchLines.length <= contentLines.length; i += 1) {
98
- let matches = true;
99
- for (let j = 0; j < searchLines.length; j += 1) {
100
- if ((contentLines[i + j] ?? "").trimEnd() !== searchLines[j]) {
101
- matches = false;
102
- break;
103
- }
104
- }
105
- if (!matches) {
106
- continue;
107
- }
108
- const lastIndex = i + searchLines.length - 1;
109
- blocks.push({
110
- start: offsets[i],
111
- end: offsets[lastIndex] + (contentLines[lastIndex] ?? "").length,
112
- });
113
- i = lastIndex;
114
- }
115
- return blocks;
116
- }
117
- function ambiguityError(count) {
118
- return (`Failed to edit: oldString matches ${count} locations in the file. ` +
119
- "Provide more surrounding context to make the match unique, or set replaceAll to true to replace every occurrence.");
120
- }
121
- function notFoundError() {
122
- return ("Failed to edit: oldString not found. The exact text was not found in the file. " +
123
- "Check whitespace, indentation, and context, and use the Read tool to verify the current " +
124
- "content before retrying; the file may have changed since you last read it.");
125
- }
126
- // Offsets are identical in original and normalized text because every
127
- // confusable maps one code point to one code point.
128
- function replaceNormalizedOccurrences(original, normalized, normalizedNeedle, replacement, all) {
129
- let result = "";
130
- let cursor = 0;
131
- let position = 0;
132
- while (position < normalized.length) {
133
- const index = normalized.indexOf(normalizedNeedle, position);
134
- if (index === -1) {
135
- break;
136
- }
137
- result += original.slice(cursor, index) + replacement;
138
- cursor = index + normalizedNeedle.length;
139
- position = index + normalizedNeedle.length;
140
- if (!all) {
141
- break;
142
- }
143
- }
144
- result += original.slice(cursor);
145
- return result;
146
- }
147
- // END_BLOCK_MATCHING
148
- // START_BLOCK_APPLY
149
- export function applyReplaceEdit(content, params) {
150
- const warnings = [];
151
- const replaceAll = params.replaceAll ?? false;
152
- if (params.oldString === params.newString) {
153
- return {
154
- ok: false,
155
- error: "No changes to apply: oldString and newString are identical.",
156
- warnings,
157
- };
158
- }
159
- if (params.oldString === "") {
160
- return {
161
- ok: false,
162
- error: "oldString cannot be empty when editing an existing file. Provide the exact text to replace.",
163
- warnings,
164
- };
165
- }
166
- // Layer 1: exact literal match.
167
- const exactCount = countOccurrences(content, params.oldString);
168
- if (exactCount > 0) {
169
- if (!replaceAll && exactCount > 1) {
170
- return { ok: false, error: ambiguityError(exactCount), warnings };
171
- }
172
- const next = replaceAll
173
- ? content.split(params.oldString).join(params.newString)
174
- : content.replace(params.oldString, params.newString);
175
- return {
176
- ok: true,
177
- content: next,
178
- layer: "exact",
179
- replacements: replaceAll ? exactCount : 1,
180
- warnings,
181
- };
182
- }
183
- // Layer 2: unicode confusables (typography characters equated to ASCII).
184
- const normalizedContent = normalizeConfusables(content);
185
- const normalizedOld = normalizeConfusables(params.oldString);
186
- if (normalizedContent !== content || normalizedOld !== params.oldString) {
187
- const normalizedCount = countOccurrences(normalizedContent, normalizedOld);
188
- if (normalizedCount > 0) {
189
- if (!replaceAll && normalizedCount > 1) {
190
- return { ok: false, error: ambiguityError(normalizedCount), warnings };
191
- }
192
- warnings.push("oldString matched after unicode confusables normalization (typography characters such as curly quotes, dashes, or special spaces were equated to ASCII); the replacement was applied to the original bytes.");
193
- const next = replaceNormalizedOccurrences(content, normalizedContent, normalizedOld, params.newString, replaceAll);
194
- return {
195
- ok: true,
196
- content: next,
197
- layer: "unicode_confusables",
198
- replacements: replaceAll ? normalizedCount : 1,
199
- warnings,
200
- };
201
- }
202
- }
203
- // Layer 3: trailing whitespace ignored per line; indentation stays exact.
204
- const blocks = matchTrailingWhitespaceBlocks(content, params.oldString);
205
- if (blocks.length > 0) {
206
- if (!replaceAll && blocks.length > 1) {
207
- return { ok: false, error: ambiguityError(blocks.length), warnings };
208
- }
209
- warnings.push(`oldString matched after ignoring trailing whitespace on ${blocks.length} block(s); leading whitespace (indentation) was matched exactly.`);
210
- const selected = replaceAll ? blocks : blocks.slice(0, 1);
211
- let next = content;
212
- for (let i = selected.length - 1; i >= 0; i -= 1) {
213
- const block = selected[i];
214
- next = next.slice(0, block.start) + params.newString + next.slice(block.end);
215
- }
216
- return {
217
- ok: true,
218
- content: next,
219
- layer: "trailing_whitespace",
220
- replacements: selected.length,
221
- warnings,
222
- };
223
- }
224
- return { ok: false, error: notFoundError(), warnings };
225
- }
226
- // END_BLOCK_APPLY
227
- // START_BLOCK_FORMAT
228
- export function formatReplaceSuccess(filePath, beforeContent, result) {
229
- const diff = summarizeEditDiff(beforeContent, result.content);
230
- const firstChangedLine = findFirstChangedLine(beforeContent, result.content);
231
- const stats = `+${diff.additions}/-${diff.deletions}${firstChangedLine !== undefined ? `, first change line ${firstChangedLine}` : ""}`;
232
- const parts = [`Updated ${filePath} (${stats})`];
233
- if (result.layer !== "exact") {
234
- parts.push(`Note: matched via ${result.layer} fallback layer.`);
235
- }
236
- if (result.replacements > 1) {
237
- parts.push(`Note: replaced ${result.replacements} occurrences.`);
238
- }
239
- for (const warning of result.warnings) {
240
- parts.push(`Warning: ${warning}`);
241
- }
242
- parts.push(...diff.rendered);
243
- return parts.join("\n");
244
- }
245
- // END_BLOCK_FORMAT
246
- //# sourceMappingURL=replace-engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replace-engine.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/replace-engine.ts"],"names":[],"mappings":"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"}