@usejunior/docx-mcp 0.10.0 → 0.11.1
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/LICENSE +202 -21
- package/NOTICE +2 -0
- package/README.md +3 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/edit.js +5 -5
- package/dist/cli/commands/edit.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/odf_loader.d.ts.map +1 -1
- package/dist/odf_loader.js +6 -5
- package/dist/odf_loader.js.map +1 -1
- package/dist/server.d.ts +5 -8
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -9
- package/dist/server.js.map +1 -1
- package/dist/session/manager.d.ts +4 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +16 -57
- package/dist/session/manager.js.map +1 -1
- package/dist/tool_catalog.d.ts +22 -36
- package/dist/tool_catalog.d.ts.map +1 -1
- package/dist/tool_catalog.js +24 -25
- package/dist/tool_catalog.js.map +1 -1
- package/dist/tools/add_comment.d.ts.map +1 -1
- package/dist/tools/add_comment.js +19 -5
- package/dist/tools/add_comment.js.map +1 -1
- package/dist/tools/add_footnote.d.ts.map +1 -1
- package/dist/tools/add_footnote.js +13 -3
- package/dist/tools/add_footnote.js.map +1 -1
- package/dist/tools/ai_revision_guard.d.ts +38 -0
- package/dist/tools/ai_revision_guard.d.ts.map +1 -0
- package/dist/tools/ai_revision_guard.js +115 -0
- package/dist/tools/ai_revision_guard.js.map +1 -0
- package/dist/tools/{apply_plan.d.ts → batch_edit.d.ts} +2 -2
- package/dist/tools/batch_edit.d.ts.map +1 -0
- package/dist/tools/{apply_plan.js → batch_edit.js} +216 -72
- package/dist/tools/batch_edit.js.map +1 -0
- package/dist/tools/clear_formatting.d.ts.map +1 -1
- package/dist/tools/clear_formatting.js +52 -42
- package/dist/tools/clear_formatting.js.map +1 -1
- package/dist/tools/convert_to_odt.d.ts +20 -0
- package/dist/tools/convert_to_odt.d.ts.map +1 -0
- package/dist/tools/convert_to_odt.js +74 -0
- package/dist/tools/convert_to_odt.js.map +1 -0
- package/dist/tools/delete_comment.d.ts.map +1 -1
- package/dist/tools/delete_comment.js +10 -1
- package/dist/tools/delete_comment.js.map +1 -1
- package/dist/tools/delete_footnote.d.ts.map +1 -1
- package/dist/tools/delete_footnote.js +10 -1
- package/dist/tools/delete_footnote.js.map +1 -1
- package/dist/tools/format_layout.d.ts.map +1 -1
- package/dist/tools/format_layout.js +16 -0
- package/dist/tools/format_layout.js.map +1 -1
- package/dist/tools/get_comments.d.ts.map +1 -1
- package/dist/tools/get_comments.js +9 -0
- package/dist/tools/get_comments.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +13 -0
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/insert_paragraph.d.ts +5 -0
- package/dist/tools/insert_paragraph.d.ts.map +1 -1
- package/dist/tools/insert_paragraph.js +36 -26
- package/dist/tools/insert_paragraph.js.map +1 -1
- package/dist/tools/read_file.d.ts +1 -0
- package/dist/tools/read_file.d.ts.map +1 -1
- package/dist/tools/read_file.js +65 -72
- package/dist/tools/read_file.js.map +1 -1
- package/dist/tools/replace_text.d.ts +5 -0
- package/dist/tools/replace_text.d.ts.map +1 -1
- package/dist/tools/replace_text.js +65 -60
- package/dist/tools/replace_text.js.map +1 -1
- package/dist/tools/save.d.ts +19 -0
- package/dist/tools/save.d.ts.map +1 -1
- package/dist/tools/save.js +109 -8
- package/dist/tools/save.js.map +1 -1
- package/dist/tools/update_footnote.d.ts.map +1 -1
- package/dist/tools/update_footnote.js +18 -7
- package/dist/tools/update_footnote.js.map +1 -1
- package/package.json +8 -7
- package/dist/tools/apply_plan.d.ts.map +0 -1
- package/dist/tools/apply_plan.js.map +0 -1
- package/dist/tools/init_plan.d.ts +0 -8
- package/dist/tools/init_plan.d.ts.map +0 -1
- package/dist/tools/init_plan.js +0 -45
- package/dist/tools/init_plan.js.map +0 -1
- package/dist/tools/merge_plans.d.ts +0 -7
- package/dist/tools/merge_plans.d.ts.map +0 -1
- package/dist/tools/merge_plans.js +0 -408
- package/dist/tools/merge_plans.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
|
-
import { findUniqueSubstringMatch } from '@usejunior/docx-core';
|
|
2
|
+
import { findUniqueSubstringMatch, replaceParagraphTextRange, } from '@usejunior/docx-core';
|
|
3
3
|
import { getRevisionContextForSession } from '../session/manager.js';
|
|
4
4
|
import { errorMessage } from '../error_utils.js';
|
|
5
5
|
import { err, ok } from './types.js';
|
|
@@ -7,9 +7,7 @@ import { enforceReadPathPolicy } from './path_policy.js';
|
|
|
7
7
|
import { replaceText, stripSearchTags } from './replace_text.js';
|
|
8
8
|
import { insertParagraph } from './insert_paragraph.js';
|
|
9
9
|
import { resolveSessionForTool } from './session_resolution.js';
|
|
10
|
-
|
|
11
|
-
// Known fields per operation — only these are extracted during normalization.
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
10
|
+
import { preflightAiRevisionMutation } from './ai_revision_guard.js';
|
|
13
11
|
const REPLACE_TEXT_FIELDS = new Set([
|
|
14
12
|
'target_paragraph_id',
|
|
15
13
|
'old_string',
|
|
@@ -26,10 +24,7 @@ const INSERT_PARAGRAPH_FIELDS = new Set([
|
|
|
26
24
|
]);
|
|
27
25
|
const SUPPORTED_OPERATIONS = new Set(['replace_text', 'insert_paragraph']);
|
|
28
26
|
const LEGACY_ALIASES = new Set(['smart_edit', 'smart_insert']);
|
|
29
|
-
const MAX_PLAN_FILE_BYTES = 1 * 1024 * 1024;
|
|
30
|
-
// ---------------------------------------------------------------------------
|
|
31
|
-
// Normalization: accept both raw and merge_plans-envelope formats
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
27
|
+
const MAX_PLAN_FILE_BYTES = 1 * 1024 * 1024;
|
|
33
28
|
function normalizeSteps(rawSteps) {
|
|
34
29
|
const steps = [];
|
|
35
30
|
const errors = [];
|
|
@@ -40,20 +35,10 @@ function normalizeSteps(rawSteps) {
|
|
|
40
35
|
continue;
|
|
41
36
|
}
|
|
42
37
|
const rawObj = raw;
|
|
43
|
-
// Reject __proto__ pollution
|
|
44
38
|
if (Object.prototype.hasOwnProperty.call(rawObj, '__proto__')) {
|
|
45
39
|
errors.push(`Step ${i}: __proto__ key is not allowed.`);
|
|
46
40
|
continue;
|
|
47
41
|
}
|
|
48
|
-
// Detect envelope format (merge_plans output has `arguments` sub-object)
|
|
49
|
-
const hasEnvelope = typeof rawObj.arguments === 'object' && rawObj.arguments !== null && !Array.isArray(rawObj.arguments);
|
|
50
|
-
const argsSource = hasEnvelope ? rawObj.arguments : rawObj;
|
|
51
|
-
// Reject __proto__ in arguments envelope too
|
|
52
|
-
if (hasEnvelope && Object.prototype.hasOwnProperty.call(argsSource, '__proto__')) {
|
|
53
|
-
errors.push(`Step ${i}: __proto__ key is not allowed in arguments.`);
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
// Extract operation — could be top-level or in arguments
|
|
57
42
|
const operationRaw = String(rawObj.operation ?? rawObj.op ?? '').trim().toLowerCase();
|
|
58
43
|
if (!operationRaw) {
|
|
59
44
|
errors.push(`Step ${i}: missing operation field.`);
|
|
@@ -64,31 +49,25 @@ function normalizeSteps(rawSteps) {
|
|
|
64
49
|
continue;
|
|
65
50
|
}
|
|
66
51
|
if (!SUPPORTED_OPERATIONS.has(operationRaw)) {
|
|
67
|
-
errors.push(`Step ${i}: unsupported operation '${operationRaw}'.`);
|
|
52
|
+
errors.push(`Step ${i}: unsupported operation '${operationRaw}'. Use 'replace_text' or 'insert_paragraph'.`);
|
|
68
53
|
continue;
|
|
69
54
|
}
|
|
70
55
|
const operation = operationRaw;
|
|
71
|
-
// Extract step_id
|
|
72
56
|
const stepId = typeof rawObj.step_id === 'string' ? rawObj.step_id.trim() : '';
|
|
73
57
|
if (!stepId) {
|
|
74
58
|
errors.push(`Step ${i}: missing or empty step_id.`);
|
|
75
59
|
continue;
|
|
76
60
|
}
|
|
77
|
-
// Extract only known fields into a fresh object (prevents __proto__ pollution)
|
|
78
61
|
const knownFields = operation === 'replace_text' ? REPLACE_TEXT_FIELDS : INSERT_PARAGRAPH_FIELDS;
|
|
79
62
|
const fields = {};
|
|
80
63
|
for (const key of knownFields) {
|
|
81
|
-
if (key in
|
|
82
|
-
fields[key] =
|
|
83
|
-
}
|
|
64
|
+
if (key in rawObj)
|
|
65
|
+
fields[key] = rawObj[key];
|
|
84
66
|
}
|
|
85
67
|
steps.push({ step_id: stepId, operation, fields });
|
|
86
68
|
}
|
|
87
69
|
return { steps, errors };
|
|
88
70
|
}
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
// Validation phase: check ALL steps before applying
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
71
|
function validateSteps(steps, doc) {
|
|
93
72
|
const results = [];
|
|
94
73
|
for (let i = 0; i < steps.length; i++) {
|
|
@@ -111,8 +90,6 @@ function validateSteps(steps, doc) {
|
|
|
111
90
|
validation.errors.push(`target_paragraph_id '${targetId}' not found in document.`);
|
|
112
91
|
}
|
|
113
92
|
else {
|
|
114
|
-
// Check old_string exists and matches in the paragraph.
|
|
115
|
-
// Apply the same tag-stripping that replaceText does before matching.
|
|
116
93
|
const oldStr = step.fields.old_string;
|
|
117
94
|
if (typeof oldStr !== 'string') {
|
|
118
95
|
validation.errors.push('Missing old_string.');
|
|
@@ -128,34 +105,31 @@ function validateSteps(steps, doc) {
|
|
|
128
105
|
validation.errors.push(`old_string matched ${matchResult.matchCount} times in paragraph '${targetId}' `
|
|
129
106
|
+ `(${matchResult.mode} matching). Must be unique.`);
|
|
130
107
|
}
|
|
108
|
+
else {
|
|
109
|
+
step.resolved_range = { start: matchResult.start, end: matchResult.end };
|
|
110
|
+
}
|
|
131
111
|
}
|
|
132
112
|
}
|
|
133
113
|
}
|
|
134
|
-
if (typeof step.fields.new_string !== 'string')
|
|
114
|
+
if (typeof step.fields.new_string !== 'string')
|
|
135
115
|
validation.errors.push('Missing new_string.');
|
|
136
|
-
|
|
137
|
-
if (typeof step.fields.instruction !== 'string') {
|
|
116
|
+
if (typeof step.fields.instruction !== 'string')
|
|
138
117
|
validation.errors.push('Missing instruction.');
|
|
139
|
-
}
|
|
140
118
|
}
|
|
141
|
-
else
|
|
119
|
+
else {
|
|
142
120
|
const anchorId = step.fields.positional_anchor_node_id;
|
|
143
121
|
if (typeof anchorId !== 'string' || !anchorId.trim()) {
|
|
144
122
|
validation.errors.push('Missing positional_anchor_node_id.');
|
|
145
123
|
}
|
|
146
124
|
else {
|
|
147
125
|
const text = doc.getParagraphTextById(anchorId);
|
|
148
|
-
if (text === null)
|
|
126
|
+
if (text === null)
|
|
149
127
|
validation.errors.push(`positional_anchor_node_id '${anchorId}' not found in document.`);
|
|
150
|
-
}
|
|
151
128
|
}
|
|
152
|
-
if (typeof step.fields.new_string !== 'string')
|
|
129
|
+
if (typeof step.fields.new_string !== 'string')
|
|
153
130
|
validation.errors.push('Missing new_string.');
|
|
154
|
-
|
|
155
|
-
if (typeof step.fields.instruction !== 'string') {
|
|
131
|
+
if (typeof step.fields.instruction !== 'string')
|
|
156
132
|
validation.errors.push('Missing instruction.');
|
|
157
|
-
}
|
|
158
|
-
// Validate style_source_id — warning only, not error
|
|
159
133
|
const styleSourceId = step.fields.style_source_id;
|
|
160
134
|
if (typeof styleSourceId === 'string' && styleSourceId.trim()) {
|
|
161
135
|
const text = doc.getParagraphTextById(styleSourceId);
|
|
@@ -174,17 +148,13 @@ function validateSteps(steps, doc) {
|
|
|
174
148
|
}
|
|
175
149
|
return results;
|
|
176
150
|
}
|
|
177
|
-
// ---------------------------------------------------------------------------
|
|
178
|
-
// Load steps from file path
|
|
179
|
-
// ---------------------------------------------------------------------------
|
|
180
151
|
async function loadStepsFromFile(filePath) {
|
|
181
152
|
if (!filePath.endsWith('.json')) {
|
|
182
153
|
return { error: err('INVALID_PLAN_FILE', `plan_file_path must have a .json extension: ${filePath}`) };
|
|
183
154
|
}
|
|
184
155
|
const pathCheck = await enforceReadPathPolicy(filePath);
|
|
185
|
-
if (!pathCheck.ok)
|
|
156
|
+
if (!pathCheck.ok)
|
|
186
157
|
return { error: pathCheck.response };
|
|
187
|
-
}
|
|
188
158
|
let stat;
|
|
189
159
|
try {
|
|
190
160
|
stat = await fs.stat(pathCheck.resolvedPath);
|
|
@@ -214,9 +184,128 @@ async function loadStepsFromFile(filePath) {
|
|
|
214
184
|
}
|
|
215
185
|
return { steps: parsed };
|
|
216
186
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
187
|
+
function stepRef(step) {
|
|
188
|
+
return {
|
|
189
|
+
plan_id: step.source_plan_id,
|
|
190
|
+
plan_index: step.source_plan_index,
|
|
191
|
+
step_index: step.source_step_index,
|
|
192
|
+
step_id: step.step_id,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function detectDuplicateStepIdConflicts(steps) {
|
|
196
|
+
const byStepId = new Map();
|
|
197
|
+
for (const step of steps) {
|
|
198
|
+
const arr = byStepId.get(step.step_id) ?? [];
|
|
199
|
+
arr.push(step);
|
|
200
|
+
byStepId.set(step.step_id, arr);
|
|
201
|
+
}
|
|
202
|
+
const conflicts = [];
|
|
203
|
+
for (const [stepId, dupeSteps] of byStepId.entries()) {
|
|
204
|
+
if (dupeSteps.length < 2)
|
|
205
|
+
continue;
|
|
206
|
+
conflicts.push({
|
|
207
|
+
code: 'DUPLICATE_STEP_ID',
|
|
208
|
+
severity: 'hard',
|
|
209
|
+
message: `Duplicate step_id '${stepId}' detected in batch_edit steps.`,
|
|
210
|
+
step_refs: dupeSteps.map((s) => stepRef(s)),
|
|
211
|
+
details: { duplicate_step_id: stepId },
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return conflicts;
|
|
215
|
+
}
|
|
216
|
+
function rangesOverlap(a, b) {
|
|
217
|
+
return a.start < b.end && b.start < a.end;
|
|
218
|
+
}
|
|
219
|
+
function detectReplaceConflicts(steps) {
|
|
220
|
+
const replaceSteps = steps.filter((s) => s.operation === 'replace_text' && !!s.target_paragraph_id);
|
|
221
|
+
const byParagraph = new Map();
|
|
222
|
+
for (const step of replaceSteps) {
|
|
223
|
+
const paragraphId = step.target_paragraph_id;
|
|
224
|
+
const arr = byParagraph.get(paragraphId) ?? [];
|
|
225
|
+
arr.push(step);
|
|
226
|
+
byParagraph.set(paragraphId, arr);
|
|
227
|
+
}
|
|
228
|
+
const conflicts = [];
|
|
229
|
+
for (const [paragraphId, paragraphSteps] of byParagraph.entries()) {
|
|
230
|
+
if (paragraphSteps.length < 2)
|
|
231
|
+
continue;
|
|
232
|
+
for (let i = 0; i < paragraphSteps.length; i += 1) {
|
|
233
|
+
for (let j = i + 1; j < paragraphSteps.length; j += 1) {
|
|
234
|
+
const a = paragraphSteps[i];
|
|
235
|
+
const b = paragraphSteps[j];
|
|
236
|
+
if (!a.range || !b.range)
|
|
237
|
+
continue;
|
|
238
|
+
if (!rangesOverlap(a.range, b.range))
|
|
239
|
+
continue;
|
|
240
|
+
conflicts.push({
|
|
241
|
+
code: 'OVERLAPPING_REPLACE_RANGE',
|
|
242
|
+
severity: 'hard',
|
|
243
|
+
message: `replace_text spans overlap in paragraph '${paragraphId}'.`,
|
|
244
|
+
paragraph_id: paragraphId,
|
|
245
|
+
step_refs: [stepRef(a), stepRef(b)],
|
|
246
|
+
details: {
|
|
247
|
+
first_range: a.range,
|
|
248
|
+
second_range: b.range,
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return conflicts;
|
|
255
|
+
}
|
|
256
|
+
function detectInsertSlotCollisions(steps) {
|
|
257
|
+
const insertSteps = steps.filter((s) => s.operation === 'insert_paragraph' && !!s.positional_anchor_node_id && !!s.position);
|
|
258
|
+
const bySlot = new Map();
|
|
259
|
+
for (const step of insertSteps) {
|
|
260
|
+
const slotKey = `${step.positional_anchor_node_id}::${step.position}`;
|
|
261
|
+
const arr = bySlot.get(slotKey) ?? [];
|
|
262
|
+
arr.push(step);
|
|
263
|
+
bySlot.set(slotKey, arr);
|
|
264
|
+
}
|
|
265
|
+
const conflicts = [];
|
|
266
|
+
for (const [slotKey, slotSteps] of bySlot.entries()) {
|
|
267
|
+
if (slotSteps.length < 2)
|
|
268
|
+
continue;
|
|
269
|
+
const anchorId = slotSteps[0].positional_anchor_node_id;
|
|
270
|
+
const position = slotSteps[0].position;
|
|
271
|
+
conflicts.push({
|
|
272
|
+
code: 'INSERT_SLOT_COLLISION',
|
|
273
|
+
severity: 'hard',
|
|
274
|
+
message: `Multiple insert_paragraph steps target the same slot '${slotKey}'.`,
|
|
275
|
+
paragraph_id: anchorId,
|
|
276
|
+
step_refs: slotSteps.map((s) => stepRef(s)),
|
|
277
|
+
details: {
|
|
278
|
+
anchor_paragraph_id: anchorId,
|
|
279
|
+
position,
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
return conflicts;
|
|
284
|
+
}
|
|
285
|
+
function buildConflictView(steps) {
|
|
286
|
+
return steps.map((step, index) => {
|
|
287
|
+
if (step.operation === 'replace_text') {
|
|
288
|
+
return {
|
|
289
|
+
step_id: step.step_id,
|
|
290
|
+
operation: step.operation,
|
|
291
|
+
source_plan_id: 'batch',
|
|
292
|
+
source_plan_index: 0,
|
|
293
|
+
source_step_index: index,
|
|
294
|
+
target_paragraph_id: step.fields.target_paragraph_id,
|
|
295
|
+
range: step.resolved_range,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
step_id: step.step_id,
|
|
300
|
+
operation: step.operation,
|
|
301
|
+
source_plan_id: 'batch',
|
|
302
|
+
source_plan_index: 0,
|
|
303
|
+
source_step_index: index,
|
|
304
|
+
positional_anchor_node_id: step.fields.positional_anchor_node_id,
|
|
305
|
+
position: step.fields.position ?? 'AFTER',
|
|
306
|
+
};
|
|
307
|
+
});
|
|
308
|
+
}
|
|
220
309
|
async function executeSteps(manager, filePath, steps, ctx) {
|
|
221
310
|
const completedStepIds = [];
|
|
222
311
|
const stepResults = [];
|
|
@@ -231,6 +320,7 @@ async function executeSteps(manager, filePath, steps, ctx) {
|
|
|
231
320
|
new_string: step.fields.new_string,
|
|
232
321
|
instruction: step.fields.instruction,
|
|
233
322
|
normalize_first: step.fields.normalize_first,
|
|
323
|
+
skip_ai_revision_preflight: true,
|
|
234
324
|
}, ctx);
|
|
235
325
|
}
|
|
236
326
|
else {
|
|
@@ -241,6 +331,7 @@ async function executeSteps(manager, filePath, steps, ctx) {
|
|
|
241
331
|
instruction: step.fields.instruction,
|
|
242
332
|
position: step.fields.position,
|
|
243
333
|
style_source_id: step.fields.style_source_id,
|
|
334
|
+
skip_ai_revision_preflight: true,
|
|
244
335
|
}, ctx);
|
|
245
336
|
}
|
|
246
337
|
if (!result.success) {
|
|
@@ -258,19 +349,53 @@ async function executeSteps(manager, filePath, steps, ctx) {
|
|
|
258
349
|
}
|
|
259
350
|
return { completed_step_ids: completedStepIds, step_results: stepResults };
|
|
260
351
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
352
|
+
function invalidateDocumentCaches(doc) {
|
|
353
|
+
const mutableDoc = doc;
|
|
354
|
+
mutableDoc.dirty = true;
|
|
355
|
+
mutableDoc.documentViewCache = null;
|
|
356
|
+
}
|
|
357
|
+
function executeStepOnDoc(doc, step, ctx) {
|
|
358
|
+
if (step.operation === 'replace_text') {
|
|
359
|
+
const targetParagraphId = step.fields.target_paragraph_id;
|
|
360
|
+
const oldString = stripSearchTags(step.fields.old_string);
|
|
361
|
+
const newString = step.fields.new_string;
|
|
362
|
+
if (step.fields.normalize_first)
|
|
363
|
+
doc.mergeRunsOnly();
|
|
364
|
+
const pEl = doc.getParagraphElementById(targetParagraphId);
|
|
365
|
+
if (!pEl)
|
|
366
|
+
throw new Error(`Paragraph ID ${targetParagraphId} not found in document`);
|
|
367
|
+
const text = doc.getParagraphTextById(targetParagraphId) ?? '';
|
|
368
|
+
const match = findUniqueSubstringMatch(text, oldString);
|
|
369
|
+
if (match.status !== 'unique')
|
|
370
|
+
throw new Error(`replace_text preview failed for paragraph ${targetParagraphId}`);
|
|
371
|
+
if (ctx) {
|
|
372
|
+
replaceParagraphTextRange(pEl, match.start, match.end, newString, ctx);
|
|
373
|
+
invalidateDocumentCaches(doc);
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
doc.replaceText({ targetParagraphId, findText: match.matchedText, replaceText: newString });
|
|
377
|
+
}
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
doc.insertParagraph({
|
|
381
|
+
positionalAnchorNodeId: step.fields.positional_anchor_node_id,
|
|
382
|
+
relativePosition: step.fields.position ?? 'AFTER',
|
|
383
|
+
newText: step.fields.new_string,
|
|
384
|
+
styleSourceId: step.fields.style_source_id,
|
|
385
|
+
}, ctx);
|
|
386
|
+
}
|
|
387
|
+
function executeStepsOnDoc(doc, steps, ctx) {
|
|
388
|
+
for (const step of steps)
|
|
389
|
+
executeStepOnDoc(doc, step, ctx);
|
|
390
|
+
}
|
|
391
|
+
export async function batchEdit(manager, params) {
|
|
265
392
|
try {
|
|
266
|
-
|
|
267
|
-
if (params.steps && params.plan_file_path) {
|
|
393
|
+
if (params.steps !== undefined && params.plan_file_path) {
|
|
268
394
|
return err('INVALID_PARAMS', 'Cannot provide both steps and plan_file_path. Use one or the other.');
|
|
269
395
|
}
|
|
270
|
-
if (
|
|
396
|
+
if (params.steps === undefined && !params.plan_file_path) {
|
|
271
397
|
return err('INVALID_PARAMS', 'Must provide either steps (JSON array) or plan_file_path.');
|
|
272
398
|
}
|
|
273
|
-
// Load steps
|
|
274
399
|
let rawSteps;
|
|
275
400
|
if (params.plan_file_path) {
|
|
276
401
|
const loaded = await loadStepsFromFile(params.plan_file_path);
|
|
@@ -278,23 +403,22 @@ export async function applyPlan(manager, params) {
|
|
|
278
403
|
return loaded.error;
|
|
279
404
|
rawSteps = loaded.steps;
|
|
280
405
|
}
|
|
281
|
-
else {
|
|
406
|
+
else if (Array.isArray(params.steps)) {
|
|
282
407
|
rawSteps = params.steps;
|
|
283
408
|
}
|
|
284
|
-
|
|
409
|
+
else {
|
|
410
|
+
return err('INVALID_PARAMS', 'steps must be a JSON array.');
|
|
411
|
+
}
|
|
285
412
|
const { steps, errors: normErrors } = normalizeSteps(rawSteps);
|
|
286
413
|
if (normErrors.length > 0) {
|
|
287
414
|
return err('NORMALIZATION_ERROR', `Step normalization failed with ${normErrors.length} error(s): ${normErrors.join('; ')}`);
|
|
288
415
|
}
|
|
289
|
-
if (steps.length === 0)
|
|
290
|
-
return err('
|
|
291
|
-
}
|
|
292
|
-
// Resolve session
|
|
293
|
-
const resolved = await resolveSessionForTool(manager, params, { toolName: 'apply_plan' });
|
|
416
|
+
if (steps.length === 0)
|
|
417
|
+
return err('EMPTY_BATCH', 'Batch contains no valid steps.');
|
|
418
|
+
const resolved = await resolveSessionForTool(manager, params, { toolName: 'batch_edit' });
|
|
294
419
|
if (!resolved.ok)
|
|
295
420
|
return resolved.response;
|
|
296
421
|
const { session } = resolved;
|
|
297
|
-
// Validation phase — check ALL steps before applying
|
|
298
422
|
const validations = validateSteps(steps, session.doc);
|
|
299
423
|
const overallValid = validations.every((v) => v.valid);
|
|
300
424
|
if (!overallValid) {
|
|
@@ -302,24 +426,44 @@ export async function applyPlan(manager, params) {
|
|
|
302
426
|
success: false,
|
|
303
427
|
error: {
|
|
304
428
|
code: 'VALIDATION_FAILED',
|
|
305
|
-
message: `
|
|
429
|
+
message: `Batch validation failed: ${validations.filter((v) => !v.valid).length} of ${steps.length} step(s) have errors.`,
|
|
306
430
|
hint: 'Fix the reported errors and resubmit.',
|
|
307
431
|
},
|
|
308
432
|
overall_valid: false,
|
|
309
433
|
steps: validations,
|
|
310
434
|
};
|
|
311
435
|
}
|
|
312
|
-
// Collect warnings
|
|
313
436
|
const allWarnings = validations.flatMap((v) => v.warnings.map((w) => ({ step_id: v.step_id, warning: w })));
|
|
314
|
-
|
|
437
|
+
const conflictSteps = buildConflictView(steps);
|
|
438
|
+
const conflicts = [
|
|
439
|
+
...detectDuplicateStepIdConflicts(conflictSteps),
|
|
440
|
+
...detectReplaceConflicts(conflictSteps),
|
|
441
|
+
...detectInsertSlotCollisions(conflictSteps),
|
|
442
|
+
];
|
|
443
|
+
if (conflicts.length > 0) {
|
|
444
|
+
return {
|
|
445
|
+
success: false,
|
|
446
|
+
error: {
|
|
447
|
+
code: 'BATCH_CONFLICT',
|
|
448
|
+
message: `Detected ${conflicts.length} hard conflict(s) in batch_edit steps.`,
|
|
449
|
+
hint: 'Resolve reported conflicts and resubmit the batch.',
|
|
450
|
+
},
|
|
451
|
+
has_conflicts: true,
|
|
452
|
+
conflict_count: conflicts.length,
|
|
453
|
+
conflicts,
|
|
454
|
+
};
|
|
455
|
+
}
|
|
315
456
|
const ctx = await getRevisionContextForSession(session);
|
|
457
|
+
const revisionPreflight = await preflightAiRevisionMutation(session, ctx, (previewDoc, previewCtx) => executeStepsOnDoc(previewDoc, steps, previewCtx));
|
|
458
|
+
if (revisionPreflight)
|
|
459
|
+
return revisionPreflight;
|
|
316
460
|
const result = await executeSteps(manager, manager.normalizePath(session.originalPath), steps, ctx);
|
|
317
461
|
if (result.failed_step_id !== undefined) {
|
|
318
462
|
return {
|
|
319
463
|
success: false,
|
|
320
464
|
error: {
|
|
321
|
-
code: '
|
|
322
|
-
message: `
|
|
465
|
+
code: 'BATCH_PARTIAL_FAILURE',
|
|
466
|
+
message: `Batch execution stopped at step '${result.failed_step_id}' (index ${result.failed_step_index}).`,
|
|
323
467
|
hint: 'Completed steps have already been applied. Reapply to original DOCX if rollback is needed.',
|
|
324
468
|
},
|
|
325
469
|
file_path: manager.normalizePath(session.originalPath),
|
|
@@ -342,7 +486,7 @@ export async function applyPlan(manager, params) {
|
|
|
342
486
|
});
|
|
343
487
|
}
|
|
344
488
|
catch (e) {
|
|
345
|
-
return err('
|
|
489
|
+
return err('BATCH_EDIT_ERROR', `Failed to apply batch edit: ${errorMessage(e)}`);
|
|
346
490
|
}
|
|
347
491
|
}
|
|
348
|
-
//# sourceMappingURL=
|
|
492
|
+
//# sourceMappingURL=batch_edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch_edit.js","sourceRoot":"","sources":["../../src/tools/batch_edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear_formatting.d.ts","sourceRoot":"","sources":["../../src/tools/clear_formatting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgC,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"clear_formatting.d.ts","sourceRoot":"","sources":["../../src/tools/clear_formatting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgC,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AA8C9B,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IACN,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,GAAG,CAAC,EAAE,eAAe,GACpB,OAAO,CAAC,YAAY,CAAC,CA6FvB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getRevisionContextForSession } from '../session/manager.js';
|
|
2
2
|
import { ok, err } from './types.js';
|
|
3
3
|
import { resolveSessionForTool, mergeSessionResolutionMetadata } from './session_resolution.js';
|
|
4
|
+
import { preflightAiRevisionMutation } from './ai_revision_guard.js';
|
|
4
5
|
import { OOXML, W, buildRPrChangeElement, getDirectChildrenByName, } from '@usejunior/docx-core';
|
|
5
6
|
function removeDescendantsByName(parent, localNames) {
|
|
6
7
|
let removed = false;
|
|
@@ -45,53 +46,62 @@ export async function clearFormatting(manager, params, ctx) {
|
|
|
45
46
|
const revisionCtx = ctx ?? await getRevisionContextForSession(session);
|
|
46
47
|
const { nodes } = session.doc.buildDocumentView({ includeSemanticTags: false });
|
|
47
48
|
const pids = params.paragraph_ids ?? nodes.map((n) => n.id);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const rElems = Array.from(pEl.getElementsByTagNameNS(OOXML.W_NS, W.r));
|
|
54
|
-
let pModified = false;
|
|
55
|
-
for (const r of rElems) {
|
|
56
|
-
const rPr = r.getElementsByTagNameNS(OOXML.W_NS, W.rPr).item(0);
|
|
57
|
-
if (!rPr)
|
|
49
|
+
const mutate = (doc, activeCtx) => {
|
|
50
|
+
let modifiedCount = 0;
|
|
51
|
+
for (const pid of pids) {
|
|
52
|
+
const pEl = doc.getParagraphElementById(pid);
|
|
53
|
+
if (!pEl)
|
|
58
54
|
continue;
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
55
|
+
const rElems = Array.from(pEl.getElementsByTagNameNS(OOXML.W_NS, W.r));
|
|
56
|
+
let pModified = false;
|
|
57
|
+
for (const r of rElems) {
|
|
58
|
+
const rPr = r.getElementsByTagNameNS(OOXML.W_NS, W.rPr).item(0);
|
|
59
|
+
if (!rPr)
|
|
60
|
+
continue;
|
|
61
|
+
const oldRPrClone = activeCtx ? rPr.cloneNode(true) : null;
|
|
62
|
+
const removeRunProps = activeCtx ? removeDirectChildrenByName : removeDescendantsByName;
|
|
63
|
+
let rModified = false;
|
|
64
|
+
if (params.clear_highlight && removeRunProps(rPr, [W.highlight])) {
|
|
65
|
+
rModified = true;
|
|
66
|
+
}
|
|
67
|
+
if (params.clear_bold && removeRunProps(rPr, [W.b])) {
|
|
68
|
+
rModified = true;
|
|
69
|
+
}
|
|
70
|
+
if (params.clear_italic && removeRunProps(rPr, [W.i])) {
|
|
71
|
+
rModified = true;
|
|
72
|
+
}
|
|
73
|
+
if (params.clear_underline && removeRunProps(rPr, [W.u])) {
|
|
74
|
+
rModified = true;
|
|
75
|
+
}
|
|
76
|
+
if (params.clear_color && removeRunProps(rPr, [W.color])) {
|
|
77
|
+
rModified = true;
|
|
78
|
+
}
|
|
79
|
+
if (params.clear_font && removeRunProps(rPr, [W.rFonts, W.sz, W.szCs])) {
|
|
80
|
+
rModified = true;
|
|
81
|
+
}
|
|
82
|
+
if (activeCtx && rModified) {
|
|
83
|
+
for (const stale of getDirectChildrenByName(rPr, 'rPrChange')) {
|
|
84
|
+
rPr.removeChild(stale);
|
|
85
|
+
}
|
|
86
|
+
rPr.appendChild(buildRPrChangeElement(oldRPrClone, activeCtx));
|
|
87
|
+
}
|
|
88
|
+
if (rModified) {
|
|
89
|
+
pModified = true;
|
|
83
90
|
}
|
|
84
|
-
rPr.appendChild(buildRPrChangeElement(oldRPrClone, revisionCtx));
|
|
85
|
-
}
|
|
86
|
-
if (rModified) {
|
|
87
|
-
pModified = true;
|
|
88
91
|
}
|
|
92
|
+
if (pModified)
|
|
93
|
+
modifiedCount++;
|
|
89
94
|
}
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
if (modifiedCount > 0) {
|
|
96
|
+
invalidateDocumentCaches(doc);
|
|
97
|
+
}
|
|
98
|
+
return modifiedCount;
|
|
99
|
+
};
|
|
100
|
+
const revisionPreflight = await preflightAiRevisionMutation(session, revisionCtx, (doc, activeCtx) => { mutate(doc, activeCtx); });
|
|
101
|
+
if (revisionPreflight)
|
|
102
|
+
return revisionPreflight;
|
|
103
|
+
const modifiedCount = mutate(session.doc, revisionCtx);
|
|
93
104
|
if (modifiedCount > 0) {
|
|
94
|
-
invalidateDocumentCaches(session.doc);
|
|
95
105
|
manager.markEdited(session);
|
|
96
106
|
}
|
|
97
107
|
return ok(mergeSessionResolutionMetadata({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear_formatting.js","sourceRoot":"","sources":["../../src/tools/clear_formatting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,EAAE,EAAE,GAAG,EAAqB,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,
|
|
1
|
+
{"version":3,"file":"clear_formatting.js","sourceRoot":"","sources":["../../src/tools/clear_formatting.ts"],"names":[],"mappings":"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"}
|