@usejunior/docx-mcp 0.0.1 → 0.1.2

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,408 @@
1
+ import { err, ok } from './types.js';
2
+ import { errorMessage } from "../error_utils.js";
3
+ function asRecord(value) {
4
+ if (!value || typeof value !== 'object' || Array.isArray(value))
5
+ return null;
6
+ return value;
7
+ }
8
+ function asTrimmedString(value) {
9
+ if (typeof value !== 'string')
10
+ return undefined;
11
+ const trimmed = value.trim();
12
+ return trimmed.length > 0 ? trimmed : undefined;
13
+ }
14
+ function asInteger(value) {
15
+ if (typeof value !== 'number' || !Number.isFinite(value))
16
+ return null;
17
+ if (!Number.isInteger(value) || value < 0)
18
+ return null;
19
+ return value;
20
+ }
21
+ function asBoolean(value, fallback) {
22
+ return typeof value === 'boolean' ? value : fallback;
23
+ }
24
+ function normalizeOperation(value) {
25
+ const raw = asTrimmedString(value)?.toLowerCase();
26
+ if (!raw)
27
+ return null;
28
+ if (raw === 'replace_text')
29
+ return 'replace_text';
30
+ if (raw === 'insert_paragraph')
31
+ return 'insert_paragraph';
32
+ return null;
33
+ }
34
+ function extractRange(step) {
35
+ const rangeRaw = step.range ?? step.span ?? step.match_range;
36
+ if (rangeRaw == null)
37
+ return null;
38
+ const rangeObj = asRecord(rangeRaw);
39
+ if (!rangeObj)
40
+ return 'invalid';
41
+ const start = asInteger(rangeObj.start);
42
+ const end = asInteger(rangeObj.end);
43
+ if (start == null || end == null)
44
+ return 'invalid';
45
+ if (end <= start)
46
+ return 'invalid';
47
+ return { start, end };
48
+ }
49
+ function stepRef(step) {
50
+ return {
51
+ plan_id: step.source_plan_id,
52
+ plan_index: step.source_plan_index,
53
+ step_index: step.source_step_index,
54
+ step_id: step.step_id,
55
+ };
56
+ }
57
+ function buildAutoStepId(planIndex, stepIndex) {
58
+ return `auto_${planIndex + 1}_${stepIndex + 1}`;
59
+ }
60
+ function cloneArguments(step) {
61
+ const out = {};
62
+ for (const [key, value] of Object.entries(step)) {
63
+ if (key === 'operation' || key === 'op' || key === 'step_id' || key === 'note' || key === 'range' || key === 'span' || key === 'match_range') {
64
+ continue;
65
+ }
66
+ out[key] = value;
67
+ }
68
+ return out;
69
+ }
70
+ function normalizePlans(plansRaw) {
71
+ if (!Array.isArray(plansRaw)) {
72
+ return {
73
+ plans: [],
74
+ plan_count: 0,
75
+ conflicts: [
76
+ {
77
+ code: 'INVALID_INPUT',
78
+ severity: 'hard',
79
+ message: "'plans' must be an array.",
80
+ step_refs: [],
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ const plans = [];
86
+ const conflicts = [];
87
+ for (let pIdx = 0; pIdx < plansRaw.length; pIdx += 1) {
88
+ const planObj = asRecord(plansRaw[pIdx]);
89
+ const planId = asTrimmedString(planObj?.plan_id) ?? `plan_${pIdx + 1}`;
90
+ if (!planObj) {
91
+ conflicts.push({
92
+ code: 'INVALID_PLAN',
93
+ severity: 'hard',
94
+ message: `Plan at index ${pIdx} is not an object.`,
95
+ step_refs: [],
96
+ });
97
+ continue;
98
+ }
99
+ const baseRevisionRaw = planObj.base_revision;
100
+ const baseRevision = baseRevisionRaw == null ? null : asInteger(baseRevisionRaw);
101
+ if (baseRevisionRaw != null && baseRevision == null) {
102
+ conflicts.push({
103
+ code: 'INVALID_BASE_REVISION',
104
+ severity: 'hard',
105
+ message: `Plan '${planId}' has invalid base_revision. Expected a non-negative integer.`,
106
+ step_refs: [],
107
+ });
108
+ }
109
+ const stepsRaw = planObj.steps;
110
+ if (!Array.isArray(stepsRaw)) {
111
+ conflicts.push({
112
+ code: 'INVALID_PLAN_STEPS',
113
+ severity: 'hard',
114
+ message: `Plan '${planId}' must include a 'steps' array.`,
115
+ step_refs: [],
116
+ });
117
+ continue;
118
+ }
119
+ const normalizedSteps = [];
120
+ for (let sIdx = 0; sIdx < stepsRaw.length; sIdx += 1) {
121
+ const stepObj = asRecord(stepsRaw[sIdx]);
122
+ const generatedStepId = buildAutoStepId(pIdx, sIdx);
123
+ const providedStepId = asTrimmedString(stepObj?.step_id);
124
+ const finalStepId = providedStepId ?? generatedStepId;
125
+ if (!stepObj) {
126
+ conflicts.push({
127
+ code: 'INVALID_STEP',
128
+ severity: 'hard',
129
+ message: `Step ${sIdx} in plan '${planId}' is not an object.`,
130
+ step_refs: [{ plan_id: planId, plan_index: pIdx, step_index: sIdx, step_id: finalStepId }],
131
+ });
132
+ continue;
133
+ }
134
+ const operation = normalizeOperation(stepObj.operation ?? stepObj.op);
135
+ if (!operation) {
136
+ conflicts.push({
137
+ code: 'INVALID_STEP_OPERATION',
138
+ severity: 'hard',
139
+ message: `Step '${finalStepId}' in plan '${planId}' has unsupported operation.`,
140
+ step_refs: [{ plan_id: planId, plan_index: pIdx, step_index: sIdx, step_id: finalStepId }],
141
+ });
142
+ continue;
143
+ }
144
+ const baseStep = {
145
+ step_id: finalStepId,
146
+ source_plan_id: planId,
147
+ source_plan_index: pIdx,
148
+ source_step_index: sIdx,
149
+ note: asTrimmedString(stepObj.note),
150
+ arguments: cloneArguments(stepObj),
151
+ };
152
+ if (operation === 'replace_text') {
153
+ const targetParagraphId = asTrimmedString(stepObj.target_paragraph_id);
154
+ if (!targetParagraphId) {
155
+ conflicts.push({
156
+ code: 'INVALID_STEP_TARGET',
157
+ severity: 'hard',
158
+ message: `replace_text step '${finalStepId}' in plan '${planId}' requires target_paragraph_id.`,
159
+ step_refs: [{ plan_id: planId, plan_index: pIdx, step_index: sIdx, step_id: finalStepId }],
160
+ });
161
+ continue;
162
+ }
163
+ const range = extractRange(stepObj);
164
+ if (range === 'invalid') {
165
+ conflicts.push({
166
+ code: 'INVALID_STEP_RANGE',
167
+ severity: 'hard',
168
+ message: `replace_text step '${finalStepId}' in plan '${planId}' has invalid range/span metadata.`,
169
+ paragraph_id: targetParagraphId,
170
+ step_refs: [{ plan_id: planId, plan_index: pIdx, step_index: sIdx, step_id: finalStepId }],
171
+ });
172
+ continue;
173
+ }
174
+ normalizedSteps.push({
175
+ ...baseStep,
176
+ operation,
177
+ target_paragraph_id: targetParagraphId,
178
+ range: range ?? undefined,
179
+ });
180
+ continue;
181
+ }
182
+ const anchorParagraphId = asTrimmedString(stepObj.positional_anchor_node_id)
183
+ ?? asTrimmedString(stepObj.anchor_paragraph_id);
184
+ if (!anchorParagraphId) {
185
+ conflicts.push({
186
+ code: 'INVALID_STEP_TARGET',
187
+ severity: 'hard',
188
+ message: `insert_paragraph step '${finalStepId}' in plan '${planId}' requires positional_anchor_node_id.`,
189
+ step_refs: [{ plan_id: planId, plan_index: pIdx, step_index: sIdx, step_id: finalStepId }],
190
+ });
191
+ continue;
192
+ }
193
+ const position = (asTrimmedString(stepObj.position) ?? 'AFTER').toUpperCase();
194
+ if (position !== 'BEFORE' && position !== 'AFTER') {
195
+ conflicts.push({
196
+ code: 'INVALID_STEP_POSITION',
197
+ severity: 'hard',
198
+ message: `insert_paragraph step '${finalStepId}' in plan '${planId}' has invalid position '${String(stepObj.position)}'.`,
199
+ paragraph_id: anchorParagraphId,
200
+ step_refs: [{ plan_id: planId, plan_index: pIdx, step_index: sIdx, step_id: finalStepId }],
201
+ });
202
+ continue;
203
+ }
204
+ normalizedSteps.push({
205
+ ...baseStep,
206
+ operation,
207
+ positional_anchor_node_id: anchorParagraphId,
208
+ position: position,
209
+ });
210
+ }
211
+ plans.push({
212
+ plan_id: planId,
213
+ base_revision: baseRevision,
214
+ source_plan_index: pIdx,
215
+ steps: normalizedSteps,
216
+ });
217
+ }
218
+ return {
219
+ plans,
220
+ conflicts,
221
+ plan_count: plansRaw.length,
222
+ };
223
+ }
224
+ function detectDuplicateStepIdConflicts(steps) {
225
+ const byStepId = new Map();
226
+ for (const step of steps) {
227
+ const arr = byStepId.get(step.step_id) ?? [];
228
+ arr.push(step);
229
+ byStepId.set(step.step_id, arr);
230
+ }
231
+ const conflicts = [];
232
+ for (const [stepId, dupeSteps] of byStepId.entries()) {
233
+ if (dupeSteps.length < 2)
234
+ continue;
235
+ conflicts.push({
236
+ code: 'DUPLICATE_STEP_ID',
237
+ severity: 'hard',
238
+ message: `Duplicate step_id '${stepId}' detected across submitted plans.`,
239
+ step_refs: dupeSteps.map((s) => stepRef(s)),
240
+ details: { duplicate_step_id: stepId },
241
+ });
242
+ }
243
+ return conflicts;
244
+ }
245
+ function rangesOverlap(a, b) {
246
+ return a.start < b.end && b.start < a.end;
247
+ }
248
+ function detectReplaceConflicts(steps) {
249
+ const replaceSteps = steps.filter((s) => s.operation === 'replace_text' && !!s.target_paragraph_id);
250
+ const byParagraph = new Map();
251
+ for (const step of replaceSteps) {
252
+ const paragraphId = step.target_paragraph_id;
253
+ const arr = byParagraph.get(paragraphId) ?? [];
254
+ arr.push(step);
255
+ byParagraph.set(paragraphId, arr);
256
+ }
257
+ const conflicts = [];
258
+ for (const [paragraphId, paragraphSteps] of byParagraph.entries()) {
259
+ if (paragraphSteps.length < 2)
260
+ continue;
261
+ const unknownRangeSteps = paragraphSteps.filter((s) => !s.range);
262
+ if (unknownRangeSteps.length > 0) {
263
+ conflicts.push({
264
+ code: 'UNKNOWN_REPLACE_RANGE',
265
+ severity: 'hard',
266
+ message: `replace_text steps targeting paragraph '${paragraphId}' require explicit non-overlapping ranges for deterministic merge.`,
267
+ paragraph_id: paragraphId,
268
+ step_refs: paragraphSteps.map((s) => stepRef(s)),
269
+ });
270
+ continue;
271
+ }
272
+ for (let i = 0; i < paragraphSteps.length; i += 1) {
273
+ for (let j = i + 1; j < paragraphSteps.length; j += 1) {
274
+ const a = paragraphSteps[i];
275
+ const b = paragraphSteps[j];
276
+ if (!a.range || !b.range)
277
+ continue;
278
+ if (!rangesOverlap(a.range, b.range))
279
+ continue;
280
+ conflicts.push({
281
+ code: 'OVERLAPPING_REPLACE_RANGE',
282
+ severity: 'hard',
283
+ message: `replace_text spans overlap in paragraph '${paragraphId}'.`,
284
+ paragraph_id: paragraphId,
285
+ step_refs: [stepRef(a), stepRef(b)],
286
+ details: {
287
+ first_range: a.range,
288
+ second_range: b.range,
289
+ },
290
+ });
291
+ }
292
+ }
293
+ }
294
+ return conflicts;
295
+ }
296
+ function detectInsertSlotCollisions(steps) {
297
+ const insertSteps = steps.filter((s) => s.operation === 'insert_paragraph' && !!s.positional_anchor_node_id && !!s.position);
298
+ const bySlot = new Map();
299
+ for (const step of insertSteps) {
300
+ const slotKey = `${step.positional_anchor_node_id}::${step.position}`;
301
+ const arr = bySlot.get(slotKey) ?? [];
302
+ arr.push(step);
303
+ bySlot.set(slotKey, arr);
304
+ }
305
+ const conflicts = [];
306
+ for (const [slotKey, slotSteps] of bySlot.entries()) {
307
+ if (slotSteps.length < 2)
308
+ continue;
309
+ const anchorId = slotSteps[0].positional_anchor_node_id;
310
+ const position = slotSteps[0].position;
311
+ conflicts.push({
312
+ code: 'INSERT_SLOT_COLLISION',
313
+ severity: 'hard',
314
+ message: `Multiple insert_paragraph steps target the same slot '${slotKey}'.`,
315
+ paragraph_id: anchorId,
316
+ step_refs: slotSteps.map((s) => stepRef(s)),
317
+ details: {
318
+ anchor_paragraph_id: anchorId,
319
+ position,
320
+ },
321
+ });
322
+ }
323
+ return conflicts;
324
+ }
325
+ function detectBaseRevisionConflicts(plans, requireSharedBaseRevision) {
326
+ const revisions = new Set();
327
+ for (const plan of plans) {
328
+ if (plan.base_revision == null)
329
+ continue;
330
+ revisions.add(plan.base_revision);
331
+ }
332
+ if (revisions.size === 0) {
333
+ return { conflicts: [], mergedBaseRevision: null };
334
+ }
335
+ const mergedBaseRevision = revisions.size === 1 ? [...revisions][0] : null;
336
+ if (!requireSharedBaseRevision || revisions.size <= 1) {
337
+ return { conflicts: [], mergedBaseRevision };
338
+ }
339
+ return {
340
+ mergedBaseRevision,
341
+ conflicts: [
342
+ {
343
+ code: 'BASE_REVISION_CONFLICT',
344
+ severity: 'hard',
345
+ message: `Submitted plans have mismatched base_revision values: ${[...revisions].sort((a, b) => a - b).join(', ')}.`,
346
+ step_refs: [],
347
+ details: {
348
+ base_revisions: [...revisions].sort((a, b) => a - b),
349
+ },
350
+ },
351
+ ],
352
+ };
353
+ }
354
+ export async function mergePlans(params) {
355
+ try {
356
+ const failOnConflict = asBoolean(params.fail_on_conflict, true);
357
+ const requireSharedBaseRevision = asBoolean(params.require_shared_base_revision, true);
358
+ const normalized = normalizePlans(params.plans);
359
+ const normalizedPlans = normalized.plans;
360
+ const flattenedSteps = normalizedPlans.flatMap((plan) => plan.steps);
361
+ const revisionCheck = detectBaseRevisionConflicts(normalizedPlans, requireSharedBaseRevision);
362
+ const conflicts = [
363
+ ...normalized.conflicts,
364
+ ...revisionCheck.conflicts,
365
+ ...detectDuplicateStepIdConflicts(flattenedSteps),
366
+ ...detectReplaceConflicts(flattenedSteps),
367
+ ...detectInsertSlotCollisions(flattenedSteps),
368
+ ];
369
+ const hasConflicts = conflicts.length > 0;
370
+ const mergedPlan = {
371
+ format: 'safe_docx_merged_plan_v1',
372
+ generated_at: new Date().toISOString(),
373
+ base_revision: revisionCheck.mergedBaseRevision,
374
+ plan_count: normalized.plan_count,
375
+ step_count: flattenedSteps.length,
376
+ steps: flattenedSteps,
377
+ };
378
+ if (hasConflicts && failOnConflict) {
379
+ return {
380
+ success: false,
381
+ error: {
382
+ code: 'PLAN_CONFLICT',
383
+ message: `Detected ${conflicts.length} hard conflict(s) while merging plans.`,
384
+ hint: 'Resolve reported conflicts, or set fail_on_conflict=false to inspect diagnostics without hard failure.',
385
+ },
386
+ has_conflicts: true,
387
+ conflict_count: conflicts.length,
388
+ conflicts,
389
+ merged_plan: mergedPlan,
390
+ };
391
+ }
392
+ return ok({
393
+ has_conflicts: hasConflicts,
394
+ conflict_count: conflicts.length,
395
+ conflicts,
396
+ merged_plan: mergedPlan,
397
+ conflict_policy: {
398
+ fail_on_conflict: failOnConflict,
399
+ require_shared_base_revision: requireSharedBaseRevision,
400
+ },
401
+ });
402
+ }
403
+ catch (e) {
404
+ const msg = errorMessage(e);
405
+ return err('MERGE_PLAN_ERROR', `Failed to merge plans: ${msg}`);
406
+ }
407
+ }
408
+ //# sourceMappingURL=merge_plans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge_plans.js","sourceRoot":"","sources":["../../src/tools/merge_plans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { SessionManager } from '../session/manager.js';
2
+ import { type ToolResponse } from './types.js';
3
+ export declare function openDocument(manager: SessionManager, params: {
4
+ file_path: string;
5
+ skip_normalization?: boolean;
6
+ }): Promise<ToolResponse>;
7
+ //# sourceMappingURL=open_document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open_document.d.ts","sourceRoot":"","sources":["../../src/tools/open_document.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAqCxD,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1D,OAAO,CAAC,YAAY,CAAC,CA6EvB"}
@@ -0,0 +1,102 @@
1
+ import fs from 'node:fs/promises';
2
+ import { errorMessage } from "../error_utils.js";
3
+ import path from 'node:path';
4
+ import { err, ok } from './types.js';
5
+ import { enforceReadPathPolicy } from './path_policy.js';
6
+ import { validateDocxArchiveSafety } from './docx_archive_guard.js';
7
+ import { SAFE_DOCX_MCP_TOOLS } from '../tool_catalog.js';
8
+ function getAvailableToolsSchema() {
9
+ const toolDefaultsByName = {
10
+ grep: { dedupe_by_paragraph: true },
11
+ download: {
12
+ download_format: 'both',
13
+ clean_bookmarks: true,
14
+ returned_variants: ['clean', 'tracked'],
15
+ },
16
+ };
17
+ return SAFE_DOCX_MCP_TOOLS.map((tool) => {
18
+ const parameters = getTopLevelPropertyNames(tool.inputSchema);
19
+ const defaults = toolDefaultsByName[tool.name];
20
+ return defaults
21
+ ? { name: tool.name, description: tool.description, parameters, defaults }
22
+ : { name: tool.name, description: tool.description, parameters };
23
+ });
24
+ }
25
+ function getTopLevelPropertyNames(inputSchema) {
26
+ const rawProperties = inputSchema['properties'];
27
+ if (!rawProperties || typeof rawProperties !== 'object' || Array.isArray(rawProperties)) {
28
+ return [];
29
+ }
30
+ return Object.keys(rawProperties);
31
+ }
32
+ export async function openDocument(manager, params) {
33
+ const filePath = params.file_path;
34
+ try {
35
+ const expanded = manager.normalizePath(filePath);
36
+ const stat = await fs.stat(expanded).catch(() => null);
37
+ if (!stat || !stat.isFile()) {
38
+ return err('FILE_NOT_FOUND', `File not found: ${filePath}`, 'Copy the file to ~/Downloads/ or ~/Documents/ first, then pass that path.');
39
+ }
40
+ if (path.extname(expanded).toLowerCase() !== '.docx') {
41
+ return err('INVALID_FILE_TYPE', `Invalid file type: ${path.extname(expanded)}`, 'Only .docx files are supported.');
42
+ }
43
+ const policy = await enforceReadPathPolicy(filePath);
44
+ if (!policy.ok)
45
+ return policy.response;
46
+ const safePath = policy.normalizedPath;
47
+ const content = await fs.readFile(safePath);
48
+ if (content.length > 50 * 1024 * 1024) {
49
+ return err('VALIDATION_ERROR', 'File too large', 'Check file type (.docx only) and size (max 50MB).');
50
+ }
51
+ const archiveGuard = await validateDocxArchiveSafety(content);
52
+ if (!archiveGuard.ok)
53
+ return archiveGuard.response;
54
+ const filename = path.basename(safePath);
55
+ const session = await manager.createSession(content, filename, safePath);
56
+ // Normalize: merge runs + simplify redlines BEFORE bookmark allocation.
57
+ if (!params.skip_normalization) {
58
+ session.normalizationStats = session.doc.normalize();
59
+ }
60
+ // Insert paragraph bookmarks for stable paragraph ids.
61
+ const info = session.doc.insertParagraphBookmarks(`mcp_${session.sessionId}`);
62
+ // Compute comparison baselines AFTER normalization + bookmark insertion.
63
+ // These baselines are used for tracked-changes comparison instead of originalBuffer,
64
+ // preventing normalization artifacts from appearing as false tracked changes.
65
+ const [cleanBaseline, bookmarkedBaseline] = await Promise.all([
66
+ session.doc.toBuffer({ cleanBookmarks: true }),
67
+ session.doc.toBuffer({ cleanBookmarks: false }),
68
+ ]);
69
+ session.comparisonBaseline = cleanBaseline.buffer;
70
+ session.comparisonBaselineWithBookmarks = bookmarkedBaseline.buffer;
71
+ manager.touch(session);
72
+ return ok({
73
+ session_id: session.sessionId,
74
+ expires_at: session.expiresAt.toISOString(),
75
+ document: {
76
+ filename,
77
+ paragraphs: info.paragraphCount,
78
+ size_bytes: content.length,
79
+ },
80
+ normalization: session.normalizationStats
81
+ ? {
82
+ runs_merged: session.normalizationStats.runsMerged,
83
+ proof_errors_removed: session.normalizationStats.proofErrRemoved,
84
+ redlines_simplified: session.normalizationStats.wrappersConsolidated,
85
+ double_elevations_fixed: session.normalizationStats.doubleElevationsFixed,
86
+ normalization_skipped: false,
87
+ }
88
+ : { runs_merged: 0, redlines_simplified: 0, double_elevations_fixed: 0, normalization_skipped: true },
89
+ download_defaults: {
90
+ default_variants: ['clean', 'redline'],
91
+ default_download_format: 'both',
92
+ supports_variant_override: true,
93
+ redownload_by_session_id: true,
94
+ },
95
+ tools: getAvailableToolsSchema(),
96
+ });
97
+ }
98
+ catch (e) {
99
+ return err('FILE_READ_ERROR', `Failed to read file: ${errorMessage(e)}`, 'Ensure the file exists and is readable.');
100
+ }
101
+ }
102
+ //# sourceMappingURL=open_document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open_document.js","sourceRoot":"","sources":["../../src/tools/open_document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ToolResponse } from './types.js';
2
+ export type PathPolicyOutcome = {
3
+ ok: true;
4
+ normalizedPath: string;
5
+ resolvedPath: string;
6
+ allowedRoots: string[];
7
+ } | {
8
+ ok: false;
9
+ response: ToolResponse;
10
+ };
11
+ export declare function enforceReadPathPolicy(inputPath: string): Promise<PathPolicyOutcome>;
12
+ export declare function enforceWritePathPolicy(inputPath: string): Promise<PathPolicyOutcome>;
13
+ //# sourceMappingURL=path_policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path_policy.d.ts","sourceRoot":"","sources":["../../src/tools/path_policy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GACzB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AA8EN,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoBzF;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoB1F"}