@usejunior/docx-mcp 0.0.1 → 0.1.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 (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -28
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/cli/commands/compare.d.ts +20 -0
  5. package/dist/cli/commands/compare.d.ts.map +1 -0
  6. package/dist/cli/commands/compare.js +54 -0
  7. package/dist/cli/commands/compare.js.map +1 -0
  8. package/dist/cli/commands/serve.d.ts +2 -0
  9. package/dist/cli/commands/serve.d.ts.map +1 -0
  10. package/dist/cli/commands/serve.js +5 -0
  11. package/dist/cli/commands/serve.js.map +1 -0
  12. package/dist/cli/index.d.ts +13 -0
  13. package/dist/cli/index.d.ts.map +1 -0
  14. package/dist/cli/index.js +145 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/cli.d.ts +3 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +8 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/conformance/harness.d.ts +73 -0
  21. package/dist/conformance/harness.d.ts.map +1 -0
  22. package/dist/conformance/harness.js +609 -0
  23. package/dist/conformance/harness.js.map +1 -0
  24. package/dist/error_utils.d.ts +3 -0
  25. package/dist/error_utils.d.ts.map +1 -0
  26. package/dist/error_utils.js +19 -0
  27. package/dist/error_utils.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +3 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/server.d.ts +80 -0
  33. package/dist/server.d.ts.map +1 -0
  34. package/dist/server.js +112 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/session/manager.d.ts +84 -0
  37. package/dist/session/manager.d.ts.map +1 -0
  38. package/dist/session/manager.js +155 -0
  39. package/dist/session/manager.js.map +1 -0
  40. package/dist/tool_catalog.d.ts +439 -0
  41. package/dist/tool_catalog.d.ts.map +1 -0
  42. package/dist/tool_catalog.js +314 -0
  43. package/dist/tool_catalog.js.map +1 -0
  44. package/dist/tools/accept_changes.d.ts +7 -0
  45. package/dist/tools/accept_changes.d.ts.map +1 -0
  46. package/dist/tools/accept_changes.js +21 -0
  47. package/dist/tools/accept_changes.js.map +1 -0
  48. package/dist/tools/add_comment.d.ts +13 -0
  49. package/dist/tools/add_comment.d.ts.map +1 -0
  50. package/dist/tools/add_comment.js +77 -0
  51. package/dist/tools/add_comment.js.map +1 -0
  52. package/dist/tools/add_footnote.d.ts +10 -0
  53. package/dist/tools/add_footnote.d.ts.map +1 -0
  54. package/dist/tools/add_footnote.js +45 -0
  55. package/dist/tools/add_footnote.js.map +1 -0
  56. package/dist/tools/apply_plan.d.ts +9 -0
  57. package/dist/tools/apply_plan.d.ts.map +1 -0
  58. package/dist/tools/apply_plan.js +346 -0
  59. package/dist/tools/apply_plan.js.map +1 -0
  60. package/dist/tools/clear_session.d.ts +9 -0
  61. package/dist/tools/clear_session.d.ts.map +1 -0
  62. package/dist/tools/clear_session.js +66 -0
  63. package/dist/tools/clear_session.js.map +1 -0
  64. package/dist/tools/compare_documents.d.ts +12 -0
  65. package/dist/tools/compare_documents.d.ts.map +1 -0
  66. package/dist/tools/compare_documents.js +121 -0
  67. package/dist/tools/compare_documents.js.map +1 -0
  68. package/dist/tools/comparison_defaults.d.ts +9 -0
  69. package/dist/tools/comparison_defaults.d.ts.map +1 -0
  70. package/dist/tools/comparison_defaults.js +8 -0
  71. package/dist/tools/comparison_defaults.js.map +1 -0
  72. package/dist/tools/delete_comment.d.ts +8 -0
  73. package/dist/tools/delete_comment.d.ts.map +1 -0
  74. package/dist/tools/delete_comment.js +28 -0
  75. package/dist/tools/delete_comment.js.map +1 -0
  76. package/dist/tools/delete_footnote.d.ts +8 -0
  77. package/dist/tools/delete_footnote.d.ts.map +1 -0
  78. package/dist/tools/delete_footnote.js +34 -0
  79. package/dist/tools/delete_footnote.js.map +1 -0
  80. package/dist/tools/docx_archive_guard.d.ts +9 -0
  81. package/dist/tools/docx_archive_guard.d.ts.map +1 -0
  82. package/dist/tools/docx_archive_guard.js +64 -0
  83. package/dist/tools/docx_archive_guard.js.map +1 -0
  84. package/dist/tools/download.d.ts +20 -0
  85. package/dist/tools/download.d.ts.map +1 -0
  86. package/dist/tools/download.js +252 -0
  87. package/dist/tools/download.js.map +1 -0
  88. package/dist/tools/duplicate_document.d.ts +8 -0
  89. package/dist/tools/duplicate_document.d.ts.map +1 -0
  90. package/dist/tools/duplicate_document.js +90 -0
  91. package/dist/tools/duplicate_document.js.map +1 -0
  92. package/dist/tools/extract_revisions.d.ts +9 -0
  93. package/dist/tools/extract_revisions.d.ts.map +1 -0
  94. package/dist/tools/extract_revisions.js +52 -0
  95. package/dist/tools/extract_revisions.js.map +1 -0
  96. package/dist/tools/format_layout.d.ts +35 -0
  97. package/dist/tools/format_layout.d.ts.map +1 -0
  98. package/dist/tools/format_layout.js +332 -0
  99. package/dist/tools/format_layout.js.map +1 -0
  100. package/dist/tools/get_comments.d.ts +7 -0
  101. package/dist/tools/get_comments.d.ts.map +1 -0
  102. package/dist/tools/get_comments.js +32 -0
  103. package/dist/tools/get_comments.js.map +1 -0
  104. package/dist/tools/get_footnotes.d.ts +7 -0
  105. package/dist/tools/get_footnotes.d.ts.map +1 -0
  106. package/dist/tools/get_footnotes.js +25 -0
  107. package/dist/tools/get_footnotes.js.map +1 -0
  108. package/dist/tools/get_session_status.d.ts +7 -0
  109. package/dist/tools/get_session_status.d.ts.map +1 -0
  110. package/dist/tools/get_session_status.js +41 -0
  111. package/dist/tools/get_session_status.js.map +1 -0
  112. package/dist/tools/grep.d.ts +13 -0
  113. package/dist/tools/grep.d.ts.map +1 -0
  114. package/dist/tools/grep.js +129 -0
  115. package/dist/tools/grep.js.map +1 -0
  116. package/dist/tools/has_tracked_changes.d.ts +7 -0
  117. package/dist/tools/has_tracked_changes.d.ts.map +1 -0
  118. package/dist/tools/has_tracked_changes.js +74 -0
  119. package/dist/tools/has_tracked_changes.js.map +1 -0
  120. package/dist/tools/init_plan.d.ts +9 -0
  121. package/dist/tools/init_plan.d.ts.map +1 -0
  122. package/dist/tools/init_plan.js +44 -0
  123. package/dist/tools/init_plan.js.map +1 -0
  124. package/dist/tools/insert_paragraph.d.ts +12 -0
  125. package/dist/tools/insert_paragraph.d.ts.map +1 -0
  126. package/dist/tools/insert_paragraph.js +514 -0
  127. package/dist/tools/insert_paragraph.js.map +1 -0
  128. package/dist/tools/merge_plans.d.ts +7 -0
  129. package/dist/tools/merge_plans.d.ts.map +1 -0
  130. package/dist/tools/merge_plans.js +408 -0
  131. package/dist/tools/merge_plans.js.map +1 -0
  132. package/dist/tools/open_document.d.ts +7 -0
  133. package/dist/tools/open_document.d.ts.map +1 -0
  134. package/dist/tools/open_document.js +102 -0
  135. package/dist/tools/open_document.js.map +1 -0
  136. package/dist/tools/path_policy.d.ts +13 -0
  137. package/dist/tools/path_policy.d.ts.map +1 -0
  138. package/dist/tools/path_policy.js +109 -0
  139. package/dist/tools/path_policy.js.map +1 -0
  140. package/dist/tools/preview.d.ts +5 -0
  141. package/dist/tools/preview.d.ts.map +1 -0
  142. package/dist/tools/preview.js +11 -0
  143. package/dist/tools/preview.js.map +1 -0
  144. package/dist/tools/read_file.d.ts +12 -0
  145. package/dist/tools/read_file.d.ts.map +1 -0
  146. package/dist/tools/read_file.js +113 -0
  147. package/dist/tools/read_file.js.map +1 -0
  148. package/dist/tools/replace_text.d.ts +13 -0
  149. package/dist/tools/replace_text.d.ts.map +1 -0
  150. package/dist/tools/replace_text.js +628 -0
  151. package/dist/tools/replace_text.js.map +1 -0
  152. package/dist/tools/session_resolution.d.ts +29 -0
  153. package/dist/tools/session_resolution.d.ts.map +1 -0
  154. package/dist/tools/session_resolution.js +158 -0
  155. package/dist/tools/session_resolution.js.map +1 -0
  156. package/dist/tools/types.d.ts +15 -0
  157. package/dist/tools/types.d.ts.map +1 -0
  158. package/dist/tools/types.js +7 -0
  159. package/dist/tools/types.js.map +1 -0
  160. package/dist/tools/update_footnote.d.ts +9 -0
  161. package/dist/tools/update_footnote.d.ts.map +1 -0
  162. package/dist/tools/update_footnote.js +39 -0
  163. package/dist/tools/update_footnote.js.map +1 -0
  164. package/package.json +74 -6
@@ -0,0 +1,346 @@
1
+ import fs from 'node:fs/promises';
2
+ import { findUniqueSubstringMatch } from '@usejunior/docx-core';
3
+ import { errorMessage } from '../error_utils.js';
4
+ import { err, ok } from './types.js';
5
+ import { enforceReadPathPolicy } from './path_policy.js';
6
+ import { replaceText, stripSearchTags } from './replace_text.js';
7
+ import { insertParagraph } from './insert_paragraph.js';
8
+ import { resolveSessionForTool } from './session_resolution.js';
9
+ // ---------------------------------------------------------------------------
10
+ // Known fields per operation — only these are extracted during normalization.
11
+ // ---------------------------------------------------------------------------
12
+ const REPLACE_TEXT_FIELDS = new Set([
13
+ 'target_paragraph_id',
14
+ 'old_string',
15
+ 'new_string',
16
+ 'instruction',
17
+ 'normalize_first',
18
+ ]);
19
+ const INSERT_PARAGRAPH_FIELDS = new Set([
20
+ 'positional_anchor_node_id',
21
+ 'new_string',
22
+ 'instruction',
23
+ 'position',
24
+ 'style_source_id',
25
+ ]);
26
+ const SUPPORTED_OPERATIONS = new Set(['replace_text', 'insert_paragraph']);
27
+ const LEGACY_ALIASES = new Set(['smart_edit', 'smart_insert']);
28
+ const MAX_PLAN_FILE_BYTES = 1 * 1024 * 1024; // 1 MB
29
+ // ---------------------------------------------------------------------------
30
+ // Normalization: accept both raw and merge_plans-envelope formats
31
+ // ---------------------------------------------------------------------------
32
+ function normalizeSteps(rawSteps) {
33
+ const steps = [];
34
+ const errors = [];
35
+ for (let i = 0; i < rawSteps.length; i++) {
36
+ const raw = rawSteps[i];
37
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
38
+ errors.push(`Step ${i}: not a valid object.`);
39
+ continue;
40
+ }
41
+ const rawObj = raw;
42
+ // Reject __proto__ pollution
43
+ if (Object.prototype.hasOwnProperty.call(rawObj, '__proto__')) {
44
+ errors.push(`Step ${i}: __proto__ key is not allowed.`);
45
+ continue;
46
+ }
47
+ // Detect envelope format (merge_plans output has `arguments` sub-object)
48
+ const hasEnvelope = typeof rawObj.arguments === 'object' && rawObj.arguments !== null && !Array.isArray(rawObj.arguments);
49
+ const argsSource = hasEnvelope ? rawObj.arguments : rawObj;
50
+ // Reject __proto__ in arguments envelope too
51
+ if (hasEnvelope && Object.prototype.hasOwnProperty.call(argsSource, '__proto__')) {
52
+ errors.push(`Step ${i}: __proto__ key is not allowed in arguments.`);
53
+ continue;
54
+ }
55
+ // Extract operation — could be top-level or in arguments
56
+ const operationRaw = String(rawObj.operation ?? rawObj.op ?? '').trim().toLowerCase();
57
+ if (!operationRaw) {
58
+ errors.push(`Step ${i}: missing operation field.`);
59
+ continue;
60
+ }
61
+ if (LEGACY_ALIASES.has(operationRaw)) {
62
+ errors.push(`Step ${i}: legacy operation '${operationRaw}' is not supported. Use 'replace_text' or 'insert_paragraph'.`);
63
+ continue;
64
+ }
65
+ if (!SUPPORTED_OPERATIONS.has(operationRaw)) {
66
+ errors.push(`Step ${i}: unsupported operation '${operationRaw}'.`);
67
+ continue;
68
+ }
69
+ const operation = operationRaw;
70
+ // Extract step_id
71
+ const stepId = typeof rawObj.step_id === 'string' ? rawObj.step_id.trim() : '';
72
+ if (!stepId) {
73
+ errors.push(`Step ${i}: missing or empty step_id.`);
74
+ continue;
75
+ }
76
+ // Extract only known fields into a fresh object (prevents __proto__ pollution)
77
+ const knownFields = operation === 'replace_text' ? REPLACE_TEXT_FIELDS : INSERT_PARAGRAPH_FIELDS;
78
+ const fields = {};
79
+ for (const key of knownFields) {
80
+ if (key in argsSource) {
81
+ fields[key] = argsSource[key];
82
+ }
83
+ }
84
+ steps.push({ step_id: stepId, operation, fields });
85
+ }
86
+ return { steps, errors };
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Validation phase: check ALL steps before applying
90
+ // ---------------------------------------------------------------------------
91
+ function validateSteps(steps, doc) {
92
+ const results = [];
93
+ for (let i = 0; i < steps.length; i++) {
94
+ const step = steps[i];
95
+ const validation = {
96
+ step_id: step.step_id,
97
+ step_index: i,
98
+ valid: true,
99
+ errors: [],
100
+ warnings: [],
101
+ };
102
+ if (step.operation === 'replace_text') {
103
+ const targetId = step.fields.target_paragraph_id;
104
+ if (typeof targetId !== 'string' || !targetId.trim()) {
105
+ validation.errors.push('Missing target_paragraph_id.');
106
+ }
107
+ else {
108
+ const text = doc.getParagraphTextById(targetId);
109
+ if (text === null) {
110
+ validation.errors.push(`target_paragraph_id '${targetId}' not found in document.`);
111
+ }
112
+ else {
113
+ // Check old_string exists and matches in the paragraph.
114
+ // Apply the same tag-stripping that replaceText does before matching.
115
+ const oldStr = step.fields.old_string;
116
+ if (typeof oldStr !== 'string') {
117
+ validation.errors.push('Missing old_string.');
118
+ }
119
+ else {
120
+ const stripped = stripSearchTags(oldStr);
121
+ const matchResult = findUniqueSubstringMatch(text, stripped);
122
+ if (matchResult.status === 'not_found') {
123
+ validation.errors.push(`old_string not found in paragraph '${targetId}'. `
124
+ + `Paragraph text (first 120 chars): "${text.slice(0, 120)}"`);
125
+ }
126
+ else if (matchResult.status === 'multiple') {
127
+ validation.errors.push(`old_string matched ${matchResult.matchCount} times in paragraph '${targetId}' `
128
+ + `(${matchResult.mode} matching). Must be unique.`);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ if (typeof step.fields.new_string !== 'string') {
134
+ validation.errors.push('Missing new_string.');
135
+ }
136
+ if (typeof step.fields.instruction !== 'string') {
137
+ validation.errors.push('Missing instruction.');
138
+ }
139
+ }
140
+ else if (step.operation === 'insert_paragraph') {
141
+ const anchorId = step.fields.positional_anchor_node_id;
142
+ if (typeof anchorId !== 'string' || !anchorId.trim()) {
143
+ validation.errors.push('Missing positional_anchor_node_id.');
144
+ }
145
+ else {
146
+ const text = doc.getParagraphTextById(anchorId);
147
+ if (text === null) {
148
+ validation.errors.push(`positional_anchor_node_id '${anchorId}' not found in document.`);
149
+ }
150
+ }
151
+ if (typeof step.fields.new_string !== 'string') {
152
+ validation.errors.push('Missing new_string.');
153
+ }
154
+ if (typeof step.fields.instruction !== 'string') {
155
+ validation.errors.push('Missing instruction.');
156
+ }
157
+ // Validate style_source_id — warning only, not error
158
+ const styleSourceId = step.fields.style_source_id;
159
+ if (typeof styleSourceId === 'string' && styleSourceId.trim()) {
160
+ const text = doc.getParagraphTextById(styleSourceId);
161
+ if (text === null) {
162
+ validation.warnings.push(`style_source_id '${styleSourceId}' not found; will fall back to anchor formatting.`);
163
+ }
164
+ }
165
+ const pos = step.fields.position;
166
+ if (pos !== undefined && pos !== 'BEFORE' && pos !== 'AFTER') {
167
+ validation.errors.push(`Invalid position '${String(pos)}'. Must be 'BEFORE' or 'AFTER'.`);
168
+ }
169
+ }
170
+ if (validation.errors.length > 0)
171
+ validation.valid = false;
172
+ results.push(validation);
173
+ }
174
+ return results;
175
+ }
176
+ // ---------------------------------------------------------------------------
177
+ // Load steps from file path
178
+ // ---------------------------------------------------------------------------
179
+ async function loadStepsFromFile(filePath) {
180
+ if (!filePath.endsWith('.json')) {
181
+ return { error: err('INVALID_PLAN_FILE', `plan_file_path must have a .json extension: ${filePath}`) };
182
+ }
183
+ const pathCheck = await enforceReadPathPolicy(filePath);
184
+ if (!pathCheck.ok) {
185
+ return { error: pathCheck.response };
186
+ }
187
+ let stat;
188
+ try {
189
+ stat = await fs.stat(pathCheck.resolvedPath);
190
+ }
191
+ catch {
192
+ return { error: err('PLAN_FILE_NOT_FOUND', `Plan file not found: ${filePath}`) };
193
+ }
194
+ if (stat.size > MAX_PLAN_FILE_BYTES) {
195
+ return { error: err('PLAN_FILE_TOO_LARGE', `Plan file exceeds 1MB limit (${stat.size} bytes): ${filePath}`) };
196
+ }
197
+ let content;
198
+ try {
199
+ content = await fs.readFile(pathCheck.resolvedPath, 'utf-8');
200
+ }
201
+ catch (e) {
202
+ return { error: err('PLAN_FILE_READ_ERROR', `Failed to read plan file: ${errorMessage(e)}`) };
203
+ }
204
+ let parsed;
205
+ try {
206
+ parsed = JSON.parse(content);
207
+ }
208
+ catch (e) {
209
+ return { error: err('PLAN_FILE_PARSE_ERROR', `Failed to parse plan file as JSON: ${errorMessage(e)}`) };
210
+ }
211
+ if (!Array.isArray(parsed)) {
212
+ return { error: err('PLAN_FILE_FORMAT_ERROR', 'Plan file must contain a JSON array of steps.') };
213
+ }
214
+ return { steps: parsed };
215
+ }
216
+ // ---------------------------------------------------------------------------
217
+ // Apply phase: execute steps sequentially, stop on first error
218
+ // ---------------------------------------------------------------------------
219
+ async function executeSteps(manager, sessionId, steps) {
220
+ const completedStepIds = [];
221
+ const stepResults = [];
222
+ for (let i = 0; i < steps.length; i++) {
223
+ const step = steps[i];
224
+ let result;
225
+ if (step.operation === 'replace_text') {
226
+ result = await replaceText(manager, {
227
+ session_id: sessionId,
228
+ target_paragraph_id: step.fields.target_paragraph_id,
229
+ old_string: step.fields.old_string,
230
+ new_string: step.fields.new_string,
231
+ instruction: step.fields.instruction,
232
+ normalize_first: step.fields.normalize_first,
233
+ });
234
+ }
235
+ else {
236
+ result = await insertParagraph(manager, {
237
+ session_id: sessionId,
238
+ positional_anchor_node_id: step.fields.positional_anchor_node_id,
239
+ new_string: step.fields.new_string,
240
+ instruction: step.fields.instruction,
241
+ position: step.fields.position,
242
+ style_source_id: step.fields.style_source_id,
243
+ });
244
+ }
245
+ if (!result.success) {
246
+ stepResults.push({ step_id: step.step_id, success: false, result: result });
247
+ return {
248
+ completed_step_ids: completedStepIds,
249
+ failed_step_id: step.step_id,
250
+ failed_step_index: i,
251
+ failed_step_error: result.error?.message ?? 'Unknown error',
252
+ step_results: stepResults,
253
+ };
254
+ }
255
+ completedStepIds.push(step.step_id);
256
+ stepResults.push({ step_id: step.step_id, success: true, result: result });
257
+ }
258
+ return { completed_step_ids: completedStepIds, step_results: stepResults };
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // Main tool entry point
262
+ // ---------------------------------------------------------------------------
263
+ export async function applyPlan(manager, params) {
264
+ try {
265
+ // Validate mutual exclusivity of steps and plan_file_path
266
+ if (params.steps && params.plan_file_path) {
267
+ return err('INVALID_PARAMS', 'Cannot provide both steps and plan_file_path. Use one or the other.');
268
+ }
269
+ if (!params.steps && !params.plan_file_path) {
270
+ return err('INVALID_PARAMS', 'Must provide either steps (JSON array) or plan_file_path.');
271
+ }
272
+ // Load steps
273
+ let rawSteps;
274
+ if (params.plan_file_path) {
275
+ const loaded = await loadStepsFromFile(params.plan_file_path);
276
+ if (loaded.error)
277
+ return loaded.error;
278
+ rawSteps = loaded.steps;
279
+ }
280
+ else {
281
+ rawSteps = params.steps;
282
+ }
283
+ // Normalize steps
284
+ const { steps, errors: normErrors } = normalizeSteps(rawSteps);
285
+ if (normErrors.length > 0) {
286
+ return err('NORMALIZATION_ERROR', `Step normalization failed with ${normErrors.length} error(s): ${normErrors.join('; ')}`);
287
+ }
288
+ if (steps.length === 0) {
289
+ return err('EMPTY_PLAN', 'Plan contains no valid steps.');
290
+ }
291
+ // Resolve session
292
+ const resolved = await resolveSessionForTool(manager, params, { toolName: 'apply_plan' });
293
+ if (!resolved.ok)
294
+ return resolved.response;
295
+ const { session } = resolved;
296
+ // Validation phase — check ALL steps before applying
297
+ const validations = validateSteps(steps, session.doc);
298
+ const overallValid = validations.every((v) => v.valid);
299
+ if (!overallValid) {
300
+ return {
301
+ success: false,
302
+ error: {
303
+ code: 'VALIDATION_FAILED',
304
+ message: `Plan validation failed: ${validations.filter((v) => !v.valid).length} of ${steps.length} step(s) have errors.`,
305
+ hint: 'Fix the reported errors and resubmit.',
306
+ },
307
+ overall_valid: false,
308
+ steps: validations,
309
+ };
310
+ }
311
+ // Collect warnings
312
+ const allWarnings = validations.flatMap((v) => v.warnings.map((w) => ({ step_id: v.step_id, warning: w })));
313
+ // Apply phase — execute steps sequentially
314
+ const result = await executeSteps(manager, session.sessionId, steps);
315
+ if (result.failed_step_id !== undefined) {
316
+ return {
317
+ success: false,
318
+ error: {
319
+ code: 'APPLY_PARTIAL_FAILURE',
320
+ message: `Plan execution stopped at step '${result.failed_step_id}' (index ${result.failed_step_index}).`,
321
+ hint: 'Completed steps have already been applied. Reapply to original DOCX if rollback is needed.',
322
+ },
323
+ session_id: session.sessionId,
324
+ completed_count: result.completed_step_ids.length,
325
+ completed_step_ids: result.completed_step_ids,
326
+ failed_step_id: result.failed_step_id,
327
+ failed_step_index: result.failed_step_index,
328
+ failed_step_error: result.failed_step_error,
329
+ step_results: result.step_results,
330
+ ...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),
331
+ };
332
+ }
333
+ return ok({
334
+ session_id: session.sessionId,
335
+ edit_count: session.editCount,
336
+ completed_count: result.completed_step_ids.length,
337
+ completed_step_ids: result.completed_step_ids,
338
+ step_results: result.step_results,
339
+ ...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),
340
+ });
341
+ }
342
+ catch (e) {
343
+ return err('APPLY_PLAN_ERROR', `Failed to apply plan: ${errorMessage(e)}`);
344
+ }
345
+ }
346
+ //# sourceMappingURL=apply_plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply_plan.js","sourceRoot":"","sources":["../../src/tools/apply_plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { SessionManager } from '../session/manager.js';
2
+ import { type ToolResponse } from './types.js';
3
+ export declare function clearSession(manager: SessionManager, params: {
4
+ session_id?: string;
5
+ file_path?: string;
6
+ clear_all?: boolean;
7
+ confirm?: boolean;
8
+ }): Promise<ToolResponse>;
9
+ //# sourceMappingURL=clear_session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear_session.d.ts","sourceRoot":"","sources":["../../src/tools/clear_session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IACN,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,OAAO,CAAC,YAAY,CAAC,CAyFvB"}
@@ -0,0 +1,66 @@
1
+ import { errorMessage } from "../error_utils.js";
2
+ import { err, ok } from './types.js';
3
+ export async function clearSession(manager, params) {
4
+ try {
5
+ const clearAll = params.clear_all === true;
6
+ const sessionId = typeof params.session_id === 'string' ? params.session_id.trim() : '';
7
+ const filePath = typeof params.file_path === 'string' ? params.file_path.trim() : '';
8
+ const hasSessionId = sessionId.length > 0;
9
+ const hasFilePath = filePath.length > 0;
10
+ if (clearAll) {
11
+ if (params.confirm !== true) {
12
+ return err('CONFIRMATION_REQUIRED', 'clear_all=true requires confirm=true.', 'Re-run with confirm=true to clear every active session.');
13
+ }
14
+ if (hasSessionId || hasFilePath) {
15
+ return err('INVALID_CLEAR_TARGET', 'clear_all=true cannot be combined with session_id or file_path.', 'Use clear_all=true, confirm=true by itself, or remove clear_all and target a session_id/file_path.');
16
+ }
17
+ const clearedIds = await manager.clearAllSessions();
18
+ return ok({
19
+ clear_mode: 'all',
20
+ cleared_session_ids: clearedIds,
21
+ cleared_count: clearedIds.length,
22
+ });
23
+ }
24
+ if (hasSessionId && hasFilePath) {
25
+ return err('INVALID_CLEAR_TARGET', 'Provide either session_id or file_path, not both.', 'Use session_id to clear one session, or file_path to clear all sessions for one file.');
26
+ }
27
+ if (!hasSessionId && !hasFilePath) {
28
+ return err('INVALID_CLEAR_TARGET', 'clear_session requires session_id, file_path, or clear_all=true.', 'Provide session_id to clear one session, file_path to clear all sessions for a file, or clear_all=true with confirm=true.');
29
+ }
30
+ if (hasSessionId) {
31
+ try {
32
+ await manager.clearSessionById(sessionId);
33
+ }
34
+ catch (e) {
35
+ const msg = errorMessage(e);
36
+ if (msg.startsWith('INVALID_SESSION_ID:')) {
37
+ return err('INVALID_SESSION_ID', msg.replace(/^INVALID_SESSION_ID:/, 'Invalid session id: '), 'Session IDs must match format: ses_[12 alphanumeric chars]');
38
+ }
39
+ if (msg.startsWith('SESSION_NOT_FOUND:')) {
40
+ return err('SESSION_NOT_FOUND', `Session not found: ${sessionId}`);
41
+ }
42
+ if (msg.startsWith('SESSION_EXPIRED:')) {
43
+ return err('SESSION_EXPIRED', `Session expired: ${sessionId}`);
44
+ }
45
+ return err('CLEAR_SESSION_ERROR', `Failed to clear session: ${msg}`);
46
+ }
47
+ return ok({
48
+ clear_mode: 'session_id',
49
+ cleared_session_ids: [sessionId],
50
+ cleared_count: 1,
51
+ });
52
+ }
53
+ const normalizedPath = manager.normalizePath(filePath);
54
+ const clearedIds = await manager.clearSessionsByPath(normalizedPath);
55
+ return ok({
56
+ clear_mode: 'file_path',
57
+ file_path: normalizedPath,
58
+ cleared_session_ids: clearedIds,
59
+ cleared_count: clearedIds.length,
60
+ });
61
+ }
62
+ catch (e) {
63
+ return err('CLEAR_SESSION_ERROR', `Failed to clear session(s): ${errorMessage(e)}`);
64
+ }
65
+ }
66
+ //# sourceMappingURL=clear_session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear_session.js","sourceRoot":"","sources":["../../src/tools/clear_session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { SessionManager } from '../session/manager.js';
2
+ import { type ToolResponse } from './types.js';
3
+ export declare function compareDocuments_tool(manager: SessionManager, params: {
4
+ original_file_path?: string;
5
+ revised_file_path?: string;
6
+ session_id?: string;
7
+ file_path?: string;
8
+ save_to_local_path: string;
9
+ author?: string;
10
+ engine?: string;
11
+ }): Promise<ToolResponse>;
12
+ //# sourceMappingURL=compare_documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare_documents.d.ts","sourceRoot":"","sources":["../../src/tools/compare_documents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAyBxD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IACN,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,YAAY,CAAC,CA8GvB"}
@@ -0,0 +1,121 @@
1
+ import path from 'node:path';
2
+ import { errorCode, errorMessage } from "../error_utils.js";
3
+ import fs from 'node:fs/promises';
4
+ import { err, ok } from './types.js';
5
+ import { compareDocuments } from '@usejunior/docx-core';
6
+ import { mergeSessionResolutionMetadata, resolveSessionForTool, validateAndLoadDocxFromPath, } from './session_resolution.js';
7
+ import { enforceWritePathPolicy } from './path_policy.js';
8
+ import { DEFAULT_RECONSTRUCTION_MODE } from './comparison_defaults.js';
9
+ function expandPath(inputPath) {
10
+ return inputPath.startsWith('~') ? path.join(process.env.HOME || '', inputPath.slice(1)) : inputPath;
11
+ }
12
+ async function runWithoutConsoleLog(fn) {
13
+ if (process.env.SAFE_DOCX_ALLOW_COMPARISON_STDOUT === '1')
14
+ return fn();
15
+ const originalLog = console.log;
16
+ console.log = () => { };
17
+ try {
18
+ return await fn();
19
+ }
20
+ finally {
21
+ console.log = originalLog;
22
+ }
23
+ }
24
+ export async function compareDocuments_tool(manager, params) {
25
+ try {
26
+ const hasOriginal = typeof params.original_file_path === 'string' && params.original_file_path.trim().length > 0;
27
+ const hasRevised = typeof params.revised_file_path === 'string' && params.revised_file_path.trim().length > 0;
28
+ const hasSession = (typeof params.session_id === 'string' && params.session_id.trim().length > 0) ||
29
+ (typeof params.file_path === 'string' && params.file_path.trim().length > 0);
30
+ // Determine mode
31
+ const twoFileMode = hasOriginal && hasRevised;
32
+ const sessionMode = !twoFileMode && hasSession;
33
+ if (!twoFileMode && !sessionMode) {
34
+ return err('MISSING_PARAMS', 'Provide original_file_path + revised_file_path for two-file comparison, or session_id/file_path for session comparison.', 'Two-file mode compares two DOCX files. Session mode compares the current session state against the original.');
35
+ }
36
+ // Validate engine
37
+ const engine = params.engine ?? 'auto';
38
+ if (engine !== 'auto' && engine !== 'atomizer' && engine !== 'diffmatch') {
39
+ if (engine === 'wmlcomparer') {
40
+ return err('INVALID_ENGINE', "Engine 'wmlcomparer' is not supported.", "Use 'auto', 'atomizer', or 'diffmatch'.");
41
+ }
42
+ return err('INVALID_ENGINE', `Invalid engine: ${String(engine)}`, "Use 'auto', 'atomizer', or 'diffmatch'.");
43
+ }
44
+ const compareEngine = engine;
45
+ const author = params.author ?? 'Comparison';
46
+ let originalBuffer;
47
+ let revisedBuffer;
48
+ let sessionMetadata = {};
49
+ let originalFilePath;
50
+ let revisedFilePath;
51
+ if (twoFileMode) {
52
+ // Mode 1: two file paths
53
+ const originalLoaded = await validateAndLoadDocxFromPath(manager, params.original_file_path);
54
+ if (!originalLoaded.ok)
55
+ return originalLoaded.response;
56
+ const revisedLoaded = await validateAndLoadDocxFromPath(manager, params.revised_file_path);
57
+ if (!revisedLoaded.ok)
58
+ return revisedLoaded.response;
59
+ originalBuffer = originalLoaded.content;
60
+ revisedBuffer = revisedLoaded.content;
61
+ originalFilePath = originalLoaded.normalizedPath;
62
+ revisedFilePath = revisedLoaded.normalizedPath;
63
+ }
64
+ else {
65
+ // Mode 2: session edits
66
+ const resolved = await resolveSessionForTool(manager, params, { toolName: 'compare_documents' });
67
+ if (!resolved.ok)
68
+ return resolved.response;
69
+ const { session, metadata } = resolved;
70
+ sessionMetadata = metadata;
71
+ // Use comparison baseline (post-normalization with bookmarks) when available
72
+ // to prevent normalization artifacts from appearing as false tracked changes.
73
+ originalBuffer = session.comparisonBaselineWithBookmarks ?? session.originalBuffer;
74
+ const revised = await session.doc.toBuffer({ cleanBookmarks: false });
75
+ revisedBuffer = revised.buffer;
76
+ originalFilePath = manager.normalizePath(session.originalPath);
77
+ }
78
+ // Run comparison
79
+ const result = await runWithoutConsoleLog(() => compareDocuments(originalBuffer, revisedBuffer, {
80
+ author,
81
+ engine: compareEngine,
82
+ reconstructionMode: DEFAULT_RECONSTRUCTION_MODE,
83
+ }));
84
+ // Validate and write output
85
+ const savePath = expandPath(params.save_to_local_path);
86
+ const writePolicy = await enforceWritePathPolicy(savePath);
87
+ if (!writePolicy.ok)
88
+ return writePolicy.response;
89
+ await fs.mkdir(path.dirname(savePath), { recursive: true });
90
+ await fs.writeFile(savePath, new Uint8Array(result.document));
91
+ const response = {
92
+ mode: twoFileMode ? 'two_file' : 'session',
93
+ original_file_path: originalFilePath,
94
+ revised_file_path: revisedFilePath,
95
+ saved_to: savePath,
96
+ size_bytes: result.document.length,
97
+ engine_requested: compareEngine,
98
+ engine_used: result.engine,
99
+ author,
100
+ stats: result.stats,
101
+ reconstruction_mode_requested: result.reconstructionModeRequested,
102
+ reconstruction_mode_used: result.reconstructionModeUsed,
103
+ fallback_reason: result.fallbackReason,
104
+ message: twoFileMode
105
+ ? `Redline comparing '${path.basename(originalFilePath)}' vs '${path.basename(revisedFilePath)}' saved to ${savePath}`
106
+ : `Redline of session edits saved to ${savePath}`,
107
+ };
108
+ if (sessionMode) {
109
+ return ok(mergeSessionResolutionMetadata(response, sessionMetadata));
110
+ }
111
+ return ok(response);
112
+ }
113
+ catch (e) {
114
+ const msg = errorMessage(e);
115
+ if (String(errorCode(e) ?? '').toUpperCase() === 'EACCES') {
116
+ return err('PERMISSION_DENIED', `Cannot write to: ${params.save_to_local_path}`, 'Try saving to ~/Downloads/ or ~/Documents/ instead.');
117
+ }
118
+ return err('COMPARE_ERROR', `Comparison failed: ${msg}`);
119
+ }
120
+ }
121
+ //# sourceMappingURL=compare_documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare_documents.js","sourceRoot":"","sources":["../../src/tools/compare_documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CompareOptions } from '@usejunior/docx-core';
2
+ /**
3
+ * Default comparison reconstruction mode for tracked output.
4
+ *
5
+ * In-place mode preserves revised document structure when safe to do so.
6
+ * The atomizer pipeline still falls back to rebuild if round-trip safety checks fail.
7
+ */
8
+ export declare const DEFAULT_RECONSTRUCTION_MODE: NonNullable<CompareOptions['reconstructionMode']>;
9
+ //# sourceMappingURL=comparison_defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison_defaults.d.ts","sourceRoot":"","sources":["../../src/tools/comparison_defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,EAAE,WAAW,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Default comparison reconstruction mode for tracked output.
3
+ *
4
+ * In-place mode preserves revised document structure when safe to do so.
5
+ * The atomizer pipeline still falls back to rebuild if round-trip safety checks fail.
6
+ */
7
+ export const DEFAULT_RECONSTRUCTION_MODE = 'inplace';
8
+ //# sourceMappingURL=comparison_defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison_defaults.js","sourceRoot":"","sources":["../../src/tools/comparison_defaults.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAsD,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { SessionManager } from '../session/manager.js';
2
+ import { type ToolResponse } from './types.js';
3
+ export declare function deleteComment(manager: SessionManager, params: {
4
+ session_id?: string;
5
+ file_path?: string;
6
+ comment_id?: number;
7
+ }): Promise<ToolResponse>;
8
+ //# sourceMappingURL=delete_comment.d.ts.map