@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,609 @@
1
+ import fs from 'node:fs/promises';
2
+ import { errorMessage } from "../error_utils.js";
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+ import crypto from 'node:crypto';
6
+ import { DocxZip, parseXml } from '@usejunior/docx-core';
7
+ import { SessionManager } from '../session/manager.js';
8
+ import { openDocument } from '../tools/open_document.js';
9
+ import { readFile } from '../tools/read_file.js';
10
+ import { replaceText } from '../tools/replace_text.js';
11
+ import { download } from '../tools/download.js';
12
+ export const CONFORMANCE_REPORT_SCHEMA_VERSION = 'safe-docx-conformance-report/v1';
13
+ export const FIXTURE_MANIFEST_SCHEMA_VERSION = 'safe-docx-fixture-manifest/v1';
14
+ function isToolSuccess(response) {
15
+ return response.success === true;
16
+ }
17
+ function canonicalizeToon(toon) {
18
+ const lines = toon
19
+ .split(/\r?\n/)
20
+ .map((line) => line.trimEnd())
21
+ .filter((line) => line.length > 0);
22
+ const normalized = [];
23
+ let paraCounter = 0;
24
+ for (const line of lines) {
25
+ if (!line.startsWith('_bk_')) {
26
+ normalized.push(line);
27
+ continue;
28
+ }
29
+ const cols = line.split('|').map((c) => c.trim());
30
+ if (cols.length <= 1) {
31
+ normalized.push(`PARA_${paraCounter}`);
32
+ paraCounter += 1;
33
+ continue;
34
+ }
35
+ normalized.push([`PARA_${paraCounter}`, ...cols.slice(1)].join(' | '));
36
+ paraCounter += 1;
37
+ }
38
+ return normalized.join('\n');
39
+ }
40
+ function containsPlaceholderLeak(text) {
41
+ return /\{[A-Za-z0-9_]+\}/.test(text);
42
+ }
43
+ async function sha256OfFile(filePath) {
44
+ const buf = await fs.readFile(filePath);
45
+ return crypto.createHash('sha256').update(buf).digest('hex');
46
+ }
47
+ async function withTempDir(prefix, run) {
48
+ const dir = await fs.mkdtemp(path.join(os.tmpdir(), prefix));
49
+ try {
50
+ return await run(dir);
51
+ }
52
+ finally {
53
+ await fs.rm(dir, { recursive: true, force: true });
54
+ }
55
+ }
56
+ async function resolveFixturePath(fixture, repoRoot, openAgreementsRoot) {
57
+ if (fixture.source_type === 'local_repo') {
58
+ return { ok: true, absolutePath: path.resolve(repoRoot, fixture.source_path) };
59
+ }
60
+ if (!openAgreementsRoot) {
61
+ return {
62
+ ok: false,
63
+ code: 'NOT_COVERED',
64
+ reason: 'open_agreements_root_not_configured',
65
+ };
66
+ }
67
+ return {
68
+ ok: true,
69
+ absolutePath: path.resolve(openAgreementsRoot, fixture.source_path),
70
+ };
71
+ }
72
+ async function runPreflightChecks(absPath) {
73
+ const checks = [];
74
+ let zip;
75
+ try {
76
+ const buf = await fs.readFile(absPath);
77
+ zip = await DocxZip.load(buf);
78
+ checks.push({
79
+ check_id: 'zip_open',
80
+ status: 'PASS',
81
+ message: `ZIP opened (${buf.length} bytes).`,
82
+ });
83
+ }
84
+ catch (err) {
85
+ checks.push({
86
+ check_id: 'zip_open',
87
+ status: 'FAIL',
88
+ failure_code: 'ZIP_OPEN_FAILED',
89
+ message: `Failed to open ZIP: ${errorMessage(err)}`,
90
+ });
91
+ checks.push({
92
+ check_id: 'opc_part_document_xml',
93
+ status: 'NOT_COVERED',
94
+ failure_code: 'NOT_COVERED',
95
+ message: 'Skipped because ZIP open failed.',
96
+ });
97
+ checks.push({
98
+ check_id: 'xml_parse',
99
+ status: 'NOT_COVERED',
100
+ failure_code: 'NOT_COVERED',
101
+ message: 'Skipped because ZIP open failed.',
102
+ });
103
+ return checks;
104
+ }
105
+ const documentXml = await zip.readTextOrNull('word/document.xml');
106
+ if (!documentXml) {
107
+ checks.push({
108
+ check_id: 'opc_part_document_xml',
109
+ status: 'FAIL',
110
+ failure_code: 'OPC_PART_MISSING',
111
+ message: "Missing required OPC part 'word/document.xml'.",
112
+ });
113
+ checks.push({
114
+ check_id: 'xml_parse',
115
+ status: 'NOT_COVERED',
116
+ failure_code: 'NOT_COVERED',
117
+ message: 'Skipped because word/document.xml is missing.',
118
+ });
119
+ return checks;
120
+ }
121
+ checks.push({
122
+ check_id: 'opc_part_document_xml',
123
+ status: 'PASS',
124
+ message: "Found OPC part 'word/document.xml'.",
125
+ });
126
+ try {
127
+ parseXml(documentXml);
128
+ checks.push({
129
+ check_id: 'xml_parse',
130
+ status: 'PASS',
131
+ message: 'XML parse succeeded for word/document.xml.',
132
+ });
133
+ }
134
+ catch (err) {
135
+ checks.push({
136
+ check_id: 'xml_parse',
137
+ status: 'FAIL',
138
+ failure_code: 'XML_PARSE_FAILED',
139
+ message: `XML parse failed: ${errorMessage(err)}`,
140
+ });
141
+ }
142
+ return checks;
143
+ }
144
+ async function readToonCanonicalFromPath(filePath) {
145
+ const mgr = new SessionManager();
146
+ const opened = await openDocument(mgr, { file_path: filePath });
147
+ if (!isToolSuccess(opened)) {
148
+ return {
149
+ ok: false,
150
+ code: 'TOOL_OPERATION_FAILED',
151
+ message: `open_document failed: ${opened.error.code} ${opened.error.message}`,
152
+ };
153
+ }
154
+ const sessionId = String(opened.session_id);
155
+ const read = await readFile(mgr, { session_id: sessionId, format: 'toon' });
156
+ if (!isToolSuccess(read)) {
157
+ return {
158
+ ok: false,
159
+ code: 'TOOL_OPERATION_FAILED',
160
+ message: `read_file failed: ${read.error.code} ${read.error.message}`,
161
+ };
162
+ }
163
+ return { ok: true, canonical: canonicalizeToon(String(read.content ?? '')) };
164
+ }
165
+ async function runToonRoundtripCheck(absPath) {
166
+ const before = await readToonCanonicalFromPath(absPath);
167
+ if (!before.ok) {
168
+ return {
169
+ check_id: 'toon_roundtrip_equivalence',
170
+ status: 'FAIL',
171
+ failure_code: before.code,
172
+ message: before.message,
173
+ };
174
+ }
175
+ const mgr = new SessionManager();
176
+ const opened = await openDocument(mgr, { file_path: absPath });
177
+ if (!isToolSuccess(opened)) {
178
+ return {
179
+ check_id: 'toon_roundtrip_equivalence',
180
+ status: 'FAIL',
181
+ failure_code: 'TOOL_OPERATION_FAILED',
182
+ message: `open_document failed: ${opened.error.code} ${opened.error.message}`,
183
+ };
184
+ }
185
+ const after = await withTempDir('safe-docx-conformance-roundtrip-', async (outDir) => {
186
+ const cleanPath = path.join(outDir, 'clean.docx');
187
+ const saved = await download(mgr, {
188
+ session_id: String(opened.session_id),
189
+ save_to_local_path: cleanPath,
190
+ download_format: 'clean',
191
+ clean_bookmarks: true,
192
+ });
193
+ if (!isToolSuccess(saved)) {
194
+ return {
195
+ ok: false,
196
+ code: 'TOOL_OPERATION_FAILED',
197
+ message: `download(clean) failed: ${saved.error.code} ${saved.error.message}`,
198
+ };
199
+ }
200
+ return readToonCanonicalFromPath(cleanPath);
201
+ });
202
+ if (!after.ok) {
203
+ return {
204
+ check_id: 'toon_roundtrip_equivalence',
205
+ status: 'FAIL',
206
+ failure_code: after.code,
207
+ message: after.message,
208
+ };
209
+ }
210
+ if (before.canonical !== after.canonical) {
211
+ return {
212
+ check_id: 'toon_roundtrip_equivalence',
213
+ status: 'FAIL',
214
+ failure_code: 'UNEXPECTED_TEXT_MUTATION',
215
+ message: 'Canonical TOON changed after clean roundtrip.',
216
+ };
217
+ }
218
+ return {
219
+ check_id: 'toon_roundtrip_equivalence',
220
+ status: 'PASS',
221
+ message: 'Canonical TOON equivalence preserved across clean roundtrip.',
222
+ };
223
+ }
224
+ async function runDeterministicReplaceTextOnce(absPath, edit) {
225
+ const mgr = new SessionManager();
226
+ const opened = await openDocument(mgr, { file_path: absPath });
227
+ if (!isToolSuccess(opened)) {
228
+ return {
229
+ ok: false,
230
+ code: 'TOOL_OPERATION_FAILED',
231
+ message: `open_document failed: ${opened.error.code} ${opened.error.message}`,
232
+ };
233
+ }
234
+ const sessionId = String(opened.session_id);
235
+ const readJson = await readFile(mgr, { session_id: sessionId, format: 'json' });
236
+ if (!isToolSuccess(readJson)) {
237
+ return {
238
+ ok: false,
239
+ code: 'TOOL_OPERATION_FAILED',
240
+ message: `read_file(json) failed: ${readJson.error.code} ${readJson.error.message}`,
241
+ };
242
+ }
243
+ const nodes = JSON.parse(String(readJson.content ?? ''));
244
+ const target = nodes.find((n) => n.clean_text.includes(edit.old_string));
245
+ if (!target) {
246
+ return {
247
+ ok: false,
248
+ code: 'TOOL_OPERATION_FAILED',
249
+ message: `No paragraph contains old_string '${edit.old_string}'.`,
250
+ };
251
+ }
252
+ const edited = await replaceText(mgr, {
253
+ session_id: sessionId,
254
+ target_paragraph_id: target.id,
255
+ old_string: edit.old_string,
256
+ new_string: edit.new_string,
257
+ instruction: 'safe-docx conformance deterministic edit',
258
+ });
259
+ if (!isToolSuccess(edited)) {
260
+ return {
261
+ ok: false,
262
+ code: 'TOOL_OPERATION_FAILED',
263
+ message: `replace_text failed: ${edited.error.code} ${edited.error.message}`,
264
+ };
265
+ }
266
+ return withTempDir('safe-docx-conformance-edit-', async (outDir) => {
267
+ const cleanPath = path.join(outDir, 'edited.docx');
268
+ const saved = await download(mgr, {
269
+ session_id: sessionId,
270
+ save_to_local_path: cleanPath,
271
+ download_format: 'clean',
272
+ clean_bookmarks: true,
273
+ });
274
+ if (!isToolSuccess(saved)) {
275
+ return {
276
+ ok: false,
277
+ code: 'TOOL_OPERATION_FAILED',
278
+ message: `download(clean) failed: ${saved.error.code} ${saved.error.message}`,
279
+ };
280
+ }
281
+ return readToonCanonicalFromPath(cleanPath);
282
+ });
283
+ }
284
+ async function runDeterministicReplaceTextCheck(absPath, edit, runs) {
285
+ if (!edit) {
286
+ return {
287
+ check_id: 'deterministic_replace_text_toon',
288
+ status: 'NOT_COVERED',
289
+ failure_code: 'NOT_COVERED',
290
+ message: 'No edit_spec provided for deterministic replace_text check.',
291
+ };
292
+ }
293
+ const outputs = [];
294
+ for (let i = 0; i < runs; i++) {
295
+ const result = await runDeterministicReplaceTextOnce(absPath, edit);
296
+ if (!result.ok) {
297
+ return {
298
+ check_id: 'deterministic_replace_text_toon',
299
+ status: 'FAIL',
300
+ failure_code: result.code,
301
+ message: result.message,
302
+ };
303
+ }
304
+ outputs.push(result.canonical);
305
+ }
306
+ const first = outputs[0];
307
+ const mismatch = outputs.find((o) => o !== first);
308
+ if (mismatch) {
309
+ return {
310
+ check_id: 'deterministic_replace_text_toon',
311
+ status: 'FAIL',
312
+ failure_code: 'NON_DETERMINISTIC_RESULT',
313
+ message: `Canonical TOON differs across ${runs} runs.`,
314
+ };
315
+ }
316
+ return {
317
+ check_id: 'deterministic_replace_text_toon',
318
+ status: 'PASS',
319
+ message: `Canonical TOON matched across ${runs} deterministic replace_text runs.`,
320
+ };
321
+ }
322
+ async function runTrackedChangesCheck(absPath, edit) {
323
+ if (!edit) {
324
+ return {
325
+ check_id: 'tracked_changes_output',
326
+ status: 'NOT_COVERED',
327
+ failure_code: 'NOT_COVERED',
328
+ message: 'No edit_spec provided for tracked changes check.',
329
+ };
330
+ }
331
+ const mgr = new SessionManager();
332
+ const opened = await openDocument(mgr, { file_path: absPath });
333
+ if (!isToolSuccess(opened)) {
334
+ return {
335
+ check_id: 'tracked_changes_output',
336
+ status: 'FAIL',
337
+ failure_code: 'TOOL_OPERATION_FAILED',
338
+ message: `open_document failed: ${opened.error.code} ${opened.error.message}`,
339
+ };
340
+ }
341
+ const sessionId = String(opened.session_id);
342
+ const readJson = await readFile(mgr, { session_id: sessionId, format: 'json' });
343
+ if (!isToolSuccess(readJson)) {
344
+ return {
345
+ check_id: 'tracked_changes_output',
346
+ status: 'FAIL',
347
+ failure_code: 'TOOL_OPERATION_FAILED',
348
+ message: `read_file(json) failed: ${readJson.error.code} ${readJson.error.message}`,
349
+ };
350
+ }
351
+ const nodes = JSON.parse(String(readJson.content ?? ''));
352
+ const target = nodes.find((n) => n.clean_text.includes(edit.old_string));
353
+ if (!target) {
354
+ return {
355
+ check_id: 'tracked_changes_output',
356
+ status: 'FAIL',
357
+ failure_code: 'TOOL_OPERATION_FAILED',
358
+ message: `No paragraph contains old_string '${edit.old_string}'.`,
359
+ };
360
+ }
361
+ const edited = await replaceText(mgr, {
362
+ session_id: sessionId,
363
+ target_paragraph_id: target.id,
364
+ old_string: edit.old_string,
365
+ new_string: edit.new_string,
366
+ instruction: 'safe-docx conformance tracked output check',
367
+ });
368
+ if (!isToolSuccess(edited)) {
369
+ return {
370
+ check_id: 'tracked_changes_output',
371
+ status: 'FAIL',
372
+ failure_code: 'TOOL_OPERATION_FAILED',
373
+ message: `replace_text failed: ${edited.error.code} ${edited.error.message}`,
374
+ };
375
+ }
376
+ return withTempDir('safe-docx-conformance-tracked-', async (outDir) => {
377
+ const trackedPath = path.join(outDir, 'tracked.docx');
378
+ const tracked = await download(mgr, {
379
+ session_id: sessionId,
380
+ save_to_local_path: trackedPath,
381
+ download_format: 'tracked',
382
+ clean_bookmarks: true,
383
+ tracked_changes_engine: 'atomizer',
384
+ });
385
+ if (!isToolSuccess(tracked)) {
386
+ return {
387
+ check_id: 'tracked_changes_output',
388
+ status: 'FAIL',
389
+ failure_code: 'TRACKED_CHANGES_OUTPUT_FAILED',
390
+ message: `download(tracked) failed: ${tracked.error.code} ${tracked.error.message}`,
391
+ };
392
+ }
393
+ try {
394
+ const trackedZip = await DocxZip.load((await fs.readFile(trackedPath)));
395
+ const xml = await trackedZip.readTextOrNull('word/document.xml');
396
+ if (!xml) {
397
+ return {
398
+ check_id: 'tracked_changes_output',
399
+ status: 'FAIL',
400
+ failure_code: 'OPC_PART_MISSING',
401
+ message: "Tracked output missing 'word/document.xml'.",
402
+ };
403
+ }
404
+ const hasMarkers = xml.includes('<w:ins') || xml.includes('<w:del');
405
+ if (!hasMarkers) {
406
+ return {
407
+ check_id: 'tracked_changes_output',
408
+ status: 'FAIL',
409
+ failure_code: 'TRACKED_CHANGES_OUTPUT_FAILED',
410
+ message: 'Tracked output missing w:ins/w:del revision markers.',
411
+ };
412
+ }
413
+ return {
414
+ check_id: 'tracked_changes_output',
415
+ status: 'PASS',
416
+ message: 'Tracked output contains revision markers.',
417
+ };
418
+ }
419
+ catch (err) {
420
+ return {
421
+ check_id: 'tracked_changes_output',
422
+ status: 'FAIL',
423
+ failure_code: 'TRACKED_CHANGES_OUTPUT_FAILED',
424
+ message: `Failed to inspect tracked output: ${errorMessage(err)}`,
425
+ };
426
+ }
427
+ });
428
+ }
429
+ async function runPlaceholderLeakCheck(absPath) {
430
+ const res = await readToonCanonicalFromPath(absPath);
431
+ if (!res.ok) {
432
+ return {
433
+ check_id: 'placeholder_leak',
434
+ status: 'FAIL',
435
+ failure_code: res.code,
436
+ message: res.message,
437
+ };
438
+ }
439
+ if (containsPlaceholderLeak(res.canonical)) {
440
+ return {
441
+ check_id: 'placeholder_leak',
442
+ status: 'FAIL',
443
+ failure_code: 'PLACEHOLDER_LEAK',
444
+ message: 'Canonical TOON contains placeholder-like tokens.',
445
+ };
446
+ }
447
+ return {
448
+ check_id: 'placeholder_leak',
449
+ status: 'PASS',
450
+ message: 'No placeholder-like tokens detected.',
451
+ };
452
+ }
453
+ function deriveFixtureStatus(checks) {
454
+ if (checks.some((c) => c.status === 'FAIL'))
455
+ return 'FAIL';
456
+ if (checks.every((c) => c.status === 'NOT_COVERED'))
457
+ return 'NOT_COVERED';
458
+ return 'PASS';
459
+ }
460
+ function summarizeReport(fixtures, options) {
461
+ const checks = fixtures.flatMap((f) => f.checks);
462
+ return {
463
+ schema_version: CONFORMANCE_REPORT_SCHEMA_VERSION,
464
+ generated_at: new Date().toISOString(),
465
+ mode: options.mode ?? 'full',
466
+ repo_root: options.repoRoot,
467
+ options: {
468
+ deterministic_runs: options.deterministicRuns ?? 2,
469
+ open_agreements_root: options.openAgreementsRoot,
470
+ },
471
+ fixtures_total: fixtures.length,
472
+ fixtures_passed: fixtures.filter((f) => f.status === 'PASS').length,
473
+ fixtures_failed: fixtures.filter((f) => f.status === 'FAIL').length,
474
+ checks_passed: checks.filter((c) => c.status === 'PASS').length,
475
+ checks_failed: checks.filter((c) => c.status === 'FAIL').length,
476
+ not_covered_count: checks.filter((c) => c.status === 'NOT_COVERED').length,
477
+ fixtures,
478
+ };
479
+ }
480
+ export function getExitCode(report) {
481
+ return report.checks_failed > 0 ? 1 : 0;
482
+ }
483
+ export async function loadFixtureManifest(manifestPath) {
484
+ const raw = JSON.parse(await fs.readFile(manifestPath, 'utf8'));
485
+ if (!raw || typeof raw !== 'object' || !Array.isArray(raw.fixtures)) {
486
+ throw new Error(`Invalid fixture manifest: ${manifestPath}`);
487
+ }
488
+ if (raw.schema_version !== FIXTURE_MANIFEST_SCHEMA_VERSION) {
489
+ throw new Error(`Unsupported fixture manifest schema_version '${raw.schema_version}'. Expected '${FIXTURE_MANIFEST_SCHEMA_VERSION}'.`);
490
+ }
491
+ return raw;
492
+ }
493
+ function buildNotCoveredFixtureResult(fixture, reason) {
494
+ const checks = fixture.expected_checks.map((checkId) => ({
495
+ check_id: checkId,
496
+ status: 'NOT_COVERED',
497
+ failure_code: 'NOT_COVERED',
498
+ message: reason,
499
+ }));
500
+ return {
501
+ fixture_id: fixture.fixture_id,
502
+ source_path: fixture.source_path,
503
+ source_type: fixture.source_type,
504
+ category: fixture.category,
505
+ status: 'NOT_COVERED',
506
+ checks,
507
+ };
508
+ }
509
+ export async function runConformanceHarness(options) {
510
+ const manifest = await loadFixtureManifest(options.manifestPath);
511
+ const fixturesToRun = options.mode === 'smoke'
512
+ ? manifest.fixtures.slice(0, Math.min(2, manifest.fixtures.length))
513
+ : manifest.fixtures;
514
+ const fixtureResults = [];
515
+ const deterministicRuns = options.deterministicRuns ?? 2;
516
+ for (const fixture of fixturesToRun) {
517
+ const resolved = await resolveFixturePath(fixture, options.repoRoot, options.openAgreementsRoot);
518
+ if (!resolved.ok) {
519
+ fixtureResults.push(buildNotCoveredFixtureResult(fixture, `Fixture not covered: ${resolved.reason}`));
520
+ continue;
521
+ }
522
+ const absPath = resolved.absolutePath;
523
+ try {
524
+ await fs.access(absPath);
525
+ }
526
+ catch {
527
+ if (fixture.source_type === 'open_agreements_optional') {
528
+ fixtureResults.push(buildNotCoveredFixtureResult(fixture, `Optional external fixture missing at resolved path: ${absPath}`));
529
+ }
530
+ else {
531
+ fixtureResults.push({
532
+ fixture_id: fixture.fixture_id,
533
+ source_path: fixture.source_path,
534
+ source_type: fixture.source_type,
535
+ category: fixture.category,
536
+ status: 'FAIL',
537
+ checks: fixture.expected_checks.map((checkId) => ({
538
+ check_id: checkId,
539
+ status: 'FAIL',
540
+ failure_code: 'TOOL_OPERATION_FAILED',
541
+ message: `Required fixture file missing: ${absPath}`,
542
+ })),
543
+ });
544
+ }
545
+ continue;
546
+ }
547
+ const checks = [];
548
+ const runOperations = new Set(fixture.operations_to_run);
549
+ if (runOperations.has('preflight')) {
550
+ checks.push(...(await runPreflightChecks(absPath)));
551
+ }
552
+ if (runOperations.has('toon_roundtrip')) {
553
+ checks.push(await runToonRoundtripCheck(absPath));
554
+ }
555
+ if (runOperations.has('deterministic_replace_text')) {
556
+ checks.push(await runDeterministicReplaceTextCheck(absPath, fixture.edit_spec, deterministicRuns));
557
+ }
558
+ if (runOperations.has('tracked_changes_output')) {
559
+ checks.push(await runTrackedChangesCheck(absPath, fixture.edit_spec));
560
+ }
561
+ if (runOperations.has('placeholder_leak_scan')) {
562
+ checks.push(await runPlaceholderLeakCheck(absPath));
563
+ }
564
+ const producedCheckIds = new Set(checks.map((c) => c.check_id));
565
+ for (const expectedCheck of fixture.expected_checks) {
566
+ if (!producedCheckIds.has(expectedCheck)) {
567
+ checks.push({
568
+ check_id: expectedCheck,
569
+ status: 'NOT_COVERED',
570
+ failure_code: 'NOT_COVERED',
571
+ message: `Expected check '${expectedCheck}' not produced by configured operations.`,
572
+ });
573
+ }
574
+ }
575
+ fixtureResults.push({
576
+ fixture_id: fixture.fixture_id,
577
+ source_path: fixture.source_path,
578
+ source_type: fixture.source_type,
579
+ category: fixture.category,
580
+ status: deriveFixtureStatus(checks),
581
+ checks,
582
+ });
583
+ }
584
+ return summarizeReport(fixtureResults, options);
585
+ }
586
+ export async function computeManifestFixtureHashes(repoRoot, manifest, openAgreementsRoot) {
587
+ const out = [];
588
+ for (const fixture of manifest.fixtures) {
589
+ const resolved = await resolveFixturePath(fixture, repoRoot, openAgreementsRoot);
590
+ if (!resolved.ok) {
591
+ out.push({ fixture_id: fixture.fixture_id, not_covered_reason: resolved.reason });
592
+ continue;
593
+ }
594
+ try {
595
+ out.push({
596
+ fixture_id: fixture.fixture_id,
597
+ sha256: await sha256OfFile(resolved.absolutePath),
598
+ });
599
+ }
600
+ catch {
601
+ out.push({
602
+ fixture_id: fixture.fixture_id,
603
+ not_covered_reason: 'file_missing_or_unreadable',
604
+ });
605
+ }
606
+ }
607
+ return out;
608
+ }
609
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/conformance/harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function errorMessage(error: unknown): string;
2
+ export declare function errorCode(error: unknown): string | undefined;
3
+ //# sourceMappingURL=error_utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error_utils.d.ts","sourceRoot":"","sources":["../src/error_utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWnD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAO5D"}
@@ -0,0 +1,19 @@
1
+ export function errorMessage(error) {
2
+ if (error instanceof Error)
3
+ return error.message;
4
+ if (typeof error === 'object' && error !== null && 'message' in error) {
5
+ const message = error.message;
6
+ if (typeof message === 'string') {
7
+ return message;
8
+ }
9
+ }
10
+ return String(error);
11
+ }
12
+ export function errorCode(error) {
13
+ if (typeof error !== 'object' || error === null || !('code' in error)) {
14
+ return undefined;
15
+ }
16
+ const code = error.code;
17
+ return typeof code === 'string' ? code : undefined;
18
+ }
19
+ //# sourceMappingURL=error_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error_utils.js","sourceRoot":"","sources":["../src/error_utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAEjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACtE,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAC;QACzD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}