@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.
Files changed (91) hide show
  1. package/LICENSE +202 -21
  2. package/NOTICE +2 -0
  3. package/README.md +3 -3
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/cli/commands/edit.js +5 -5
  6. package/dist/cli/commands/edit.js.map +1 -1
  7. package/dist/cli/help.d.ts.map +1 -1
  8. package/dist/cli/help.js +1 -0
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/index.js +1 -1
  11. package/dist/odf_loader.d.ts.map +1 -1
  12. package/dist/odf_loader.js +6 -5
  13. package/dist/odf_loader.js.map +1 -1
  14. package/dist/server.d.ts +5 -8
  15. package/dist/server.d.ts.map +1 -1
  16. package/dist/server.js +6 -9
  17. package/dist/server.js.map +1 -1
  18. package/dist/session/manager.d.ts +4 -0
  19. package/dist/session/manager.d.ts.map +1 -1
  20. package/dist/session/manager.js +16 -57
  21. package/dist/session/manager.js.map +1 -1
  22. package/dist/tool_catalog.d.ts +22 -36
  23. package/dist/tool_catalog.d.ts.map +1 -1
  24. package/dist/tool_catalog.js +24 -25
  25. package/dist/tool_catalog.js.map +1 -1
  26. package/dist/tools/add_comment.d.ts.map +1 -1
  27. package/dist/tools/add_comment.js +19 -5
  28. package/dist/tools/add_comment.js.map +1 -1
  29. package/dist/tools/add_footnote.d.ts.map +1 -1
  30. package/dist/tools/add_footnote.js +13 -3
  31. package/dist/tools/add_footnote.js.map +1 -1
  32. package/dist/tools/ai_revision_guard.d.ts +38 -0
  33. package/dist/tools/ai_revision_guard.d.ts.map +1 -0
  34. package/dist/tools/ai_revision_guard.js +115 -0
  35. package/dist/tools/ai_revision_guard.js.map +1 -0
  36. package/dist/tools/{apply_plan.d.ts → batch_edit.d.ts} +2 -2
  37. package/dist/tools/batch_edit.d.ts.map +1 -0
  38. package/dist/tools/{apply_plan.js → batch_edit.js} +216 -72
  39. package/dist/tools/batch_edit.js.map +1 -0
  40. package/dist/tools/clear_formatting.d.ts.map +1 -1
  41. package/dist/tools/clear_formatting.js +52 -42
  42. package/dist/tools/clear_formatting.js.map +1 -1
  43. package/dist/tools/convert_to_odt.d.ts +20 -0
  44. package/dist/tools/convert_to_odt.d.ts.map +1 -0
  45. package/dist/tools/convert_to_odt.js +74 -0
  46. package/dist/tools/convert_to_odt.js.map +1 -0
  47. package/dist/tools/delete_comment.d.ts.map +1 -1
  48. package/dist/tools/delete_comment.js +10 -1
  49. package/dist/tools/delete_comment.js.map +1 -1
  50. package/dist/tools/delete_footnote.d.ts.map +1 -1
  51. package/dist/tools/delete_footnote.js +10 -1
  52. package/dist/tools/delete_footnote.js.map +1 -1
  53. package/dist/tools/format_layout.d.ts.map +1 -1
  54. package/dist/tools/format_layout.js +16 -0
  55. package/dist/tools/format_layout.js.map +1 -1
  56. package/dist/tools/get_comments.d.ts.map +1 -1
  57. package/dist/tools/get_comments.js +9 -0
  58. package/dist/tools/get_comments.js.map +1 -1
  59. package/dist/tools/grep.d.ts.map +1 -1
  60. package/dist/tools/grep.js +13 -0
  61. package/dist/tools/grep.js.map +1 -1
  62. package/dist/tools/insert_paragraph.d.ts +5 -0
  63. package/dist/tools/insert_paragraph.d.ts.map +1 -1
  64. package/dist/tools/insert_paragraph.js +36 -26
  65. package/dist/tools/insert_paragraph.js.map +1 -1
  66. package/dist/tools/read_file.d.ts +1 -0
  67. package/dist/tools/read_file.d.ts.map +1 -1
  68. package/dist/tools/read_file.js +65 -72
  69. package/dist/tools/read_file.js.map +1 -1
  70. package/dist/tools/replace_text.d.ts +5 -0
  71. package/dist/tools/replace_text.d.ts.map +1 -1
  72. package/dist/tools/replace_text.js +65 -60
  73. package/dist/tools/replace_text.js.map +1 -1
  74. package/dist/tools/save.d.ts +19 -0
  75. package/dist/tools/save.d.ts.map +1 -1
  76. package/dist/tools/save.js +109 -8
  77. package/dist/tools/save.js.map +1 -1
  78. package/dist/tools/update_footnote.d.ts.map +1 -1
  79. package/dist/tools/update_footnote.js +18 -7
  80. package/dist/tools/update_footnote.js.map +1 -1
  81. package/package.json +8 -7
  82. package/dist/tools/apply_plan.d.ts.map +0 -1
  83. package/dist/tools/apply_plan.js.map +0 -1
  84. package/dist/tools/init_plan.d.ts +0 -8
  85. package/dist/tools/init_plan.d.ts.map +0 -1
  86. package/dist/tools/init_plan.js +0 -45
  87. package/dist/tools/init_plan.js.map +0 -1
  88. package/dist/tools/merge_plans.d.ts +0 -7
  89. package/dist/tools/merge_plans.d.ts.map +0 -1
  90. package/dist/tools/merge_plans.js +0 -408
  91. 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; // 1 MB
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 argsSource) {
82
- fields[key] = argsSource[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 if (step.operation === 'insert_paragraph') {
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
- // Apply phase: execute steps sequentially, stop on first error
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
- // Main tool entry point
263
- // ---------------------------------------------------------------------------
264
- export async function applyPlan(manager, params) {
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
- // Validate mutual exclusivity of steps and plan_file_path
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 (!params.steps && !params.plan_file_path) {
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
- // Normalize steps
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('EMPTY_PLAN', 'Plan contains no valid steps.');
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: `Plan validation failed: ${validations.filter((v) => !v.valid).length} of ${steps.length} step(s) have errors.`,
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
- // Apply phase — execute steps sequentially
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: 'APPLY_PARTIAL_FAILURE',
322
- message: `Plan execution stopped at step '${result.failed_step_id}' (index ${result.failed_step_index}).`,
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('APPLY_PLAN_ERROR', `Failed to apply plan: ${errorMessage(e)}`);
489
+ return err('BATCH_EDIT_ERROR', `Failed to apply batch edit: ${errorMessage(e)}`);
346
490
  }
347
491
  }
348
- //# sourceMappingURL=apply_plan.js.map
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;AAExD,OAAO,EAKL,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,CA6EvB"}
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
- let modifiedCount = 0;
49
- for (const pid of pids) {
50
- const pEl = session.doc.getParagraphElementById(pid);
51
- if (!pEl)
52
- continue;
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 oldRPrClone = revisionCtx ? rPr.cloneNode(true) : null;
60
- const removeRunProps = revisionCtx ? removeDirectChildrenByName : removeDescendantsByName;
61
- let rModified = false;
62
- if (params.clear_highlight && removeRunProps(rPr, [W.highlight])) {
63
- rModified = true;
64
- }
65
- if (params.clear_bold && removeRunProps(rPr, [W.b])) {
66
- rModified = true;
67
- }
68
- if (params.clear_italic && removeRunProps(rPr, [W.i])) {
69
- rModified = true;
70
- }
71
- if (params.clear_underline && removeRunProps(rPr, [W.u])) {
72
- rModified = true;
73
- }
74
- if (params.clear_color && removeRunProps(rPr, [W.color])) {
75
- rModified = true;
76
- }
77
- if (params.clear_font && removeRunProps(rPr, [W.rFonts, W.sz, W.szCs])) {
78
- rModified = true;
79
- }
80
- if (revisionCtx && rModified) {
81
- for (const stale of getDirectChildrenByName(rPr, 'rPrChange')) {
82
- rPr.removeChild(stale);
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 (pModified)
91
- modifiedCount++;
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":"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"}
1
+ {"version":3,"file":"clear_formatting.js","sourceRoot":"","sources":["../../src/tools/clear_formatting.ts"],"names":[],"mappings":"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"}