@usejunior/docx-core 0.3.0 → 0.3.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 (77) hide show
  1. package/README.md +0 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/atomizer.d.ts.map +1 -1
  4. package/dist/atomizer.js +16 -3
  5. package/dist/atomizer.js.map +1 -1
  6. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
  7. package/dist/baselines/atomizer/documentReconstructor.js +11 -5
  8. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  9. package/dist/baselines/atomizer/inPlaceModifier.d.ts +81 -1
  10. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
  11. package/dist/baselines/atomizer/inPlaceModifier.js +618 -34
  12. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
  13. package/dist/baselines/atomizer/pipeline.d.ts +1 -1
  14. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  15. package/dist/baselines/atomizer/pipeline.js +70 -1
  16. package/dist/baselines/atomizer/pipeline.js.map +1 -1
  17. package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -1
  18. package/dist/baselines/atomizer/premergeRuns.js +3 -0
  19. package/dist/baselines/atomizer/premergeRuns.js.map +1 -1
  20. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  21. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +63 -33
  22. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  23. package/dist/cli/compare-two.js +4 -4
  24. package/dist/cli/compare-two.js.map +1 -1
  25. package/dist/index.d.ts +6 -6
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +7 -7
  28. package/dist/index.js.map +1 -1
  29. package/package.json +2 -2
  30. package/dist/baselines/diffmatch/documentBuilder.d.ts +0 -44
  31. package/dist/baselines/diffmatch/documentBuilder.d.ts.map +0 -1
  32. package/dist/baselines/diffmatch/documentBuilder.js +0 -227
  33. package/dist/baselines/diffmatch/documentBuilder.js.map +0 -1
  34. package/dist/baselines/diffmatch/paragraphAlignment.d.ts +0 -75
  35. package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +0 -1
  36. package/dist/baselines/diffmatch/paragraphAlignment.js +0 -206
  37. package/dist/baselines/diffmatch/paragraphAlignment.js.map +0 -1
  38. package/dist/baselines/diffmatch/pipeline.d.ts +0 -33
  39. package/dist/baselines/diffmatch/pipeline.d.ts.map +0 -1
  40. package/dist/baselines/diffmatch/pipeline.js +0 -84
  41. package/dist/baselines/diffmatch/pipeline.js.map +0 -1
  42. package/dist/baselines/diffmatch/runDiff.d.ts +0 -53
  43. package/dist/baselines/diffmatch/runDiff.d.ts.map +0 -1
  44. package/dist/baselines/diffmatch/runDiff.js +0 -253
  45. package/dist/baselines/diffmatch/runDiff.js.map +0 -1
  46. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +0 -64
  47. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +0 -1
  48. package/dist/baselines/diffmatch/trackChangesRenderer.js +0 -178
  49. package/dist/baselines/diffmatch/trackChangesRenderer.js.map +0 -1
  50. package/dist/baselines/diffmatch/xmlParser.d.ts +0 -45
  51. package/dist/baselines/diffmatch/xmlParser.d.ts.map +0 -1
  52. package/dist/baselines/diffmatch/xmlParser.js +0 -216
  53. package/dist/baselines/diffmatch/xmlParser.js.map +0 -1
  54. package/dist/benchmark/gates.d.ts +0 -17
  55. package/dist/benchmark/gates.d.ts.map +0 -1
  56. package/dist/benchmark/gates.js +0 -260
  57. package/dist/benchmark/gates.js.map +0 -1
  58. package/dist/benchmark/metrics.d.ts +0 -15
  59. package/dist/benchmark/metrics.d.ts.map +0 -1
  60. package/dist/benchmark/metrics.js +0 -24
  61. package/dist/benchmark/metrics.js.map +0 -1
  62. package/dist/benchmark/reporter.d.ts +0 -10
  63. package/dist/benchmark/reporter.d.ts.map +0 -1
  64. package/dist/benchmark/reporter.js +0 -94
  65. package/dist/benchmark/reporter.js.map +0 -1
  66. package/dist/benchmark/runner.d.ts +0 -15
  67. package/dist/benchmark/runner.d.ts.map +0 -1
  68. package/dist/benchmark/runner.js +0 -241
  69. package/dist/benchmark/runner.js.map +0 -1
  70. package/dist/benchmark/scores.d.ts +0 -24
  71. package/dist/benchmark/scores.d.ts.map +0 -1
  72. package/dist/benchmark/scores.js +0 -103
  73. package/dist/benchmark/scores.js.map +0 -1
  74. package/dist/benchmark/types.d.ts +0 -81
  75. package/dist/benchmark/types.d.ts.map +0 -1
  76. package/dist/benchmark/types.js +0 -7
  77. package/dist/benchmark/types.js.map +0 -1
@@ -1,94 +0,0 @@
1
- /**
2
- * Quality benchmark reporter.
3
- *
4
- * Formats gate-then-score results as Markdown, JSON, or console output.
5
- */
6
- // ── Helpers ─────────────────────────────────────────────────────────
7
- function gateIcon(passed) {
8
- return passed ? 'PASS' : 'FAIL';
9
- }
10
- // ── Markdown ────────────────────────────────────────────────────────
11
- export function generateMarkdownReport(results) {
12
- const lines = [];
13
- lines.push('# Quality Benchmark Results');
14
- lines.push('');
15
- lines.push(`Generated: ${new Date().toISOString()}`);
16
- lines.push('');
17
- lines.push('| Fixture | Engine | G1a | G1b | G1c | G2* | G3 | Q1 | Q3(ms) | Q4 |');
18
- lines.push('|---------|--------|-----|-----|-----|-----|----|----|--------|----|');
19
- for (const result of results) {
20
- for (const [engineName, er] of Object.entries(result.engines)) {
21
- const g1 = er.gates.textRoundTrip;
22
- const g1a = gateIcon(g1.normalizedTextParity.passed);
23
- const g1b = gateIcon(g1.paragraphCountParity.passed);
24
- const g1c = gateIcon(g1.xmlParseValidity.passed);
25
- const g2 = gateIcon(er.gates.formattingProjection.passed);
26
- const g3 = gateIcon(er.gates.structuralIntegrity.passed);
27
- const q1 = er.scores?.diffMinimality
28
- ? String(er.scores.diffMinimality.engineRuns)
29
- : '-';
30
- const q3 = er.scores?.performance
31
- ? er.scores.performance.wallTimeMs.toFixed(0)
32
- : '-';
33
- const q4parts = [];
34
- if (er.scores?.extras.moveDetection)
35
- q4parts.push('moves');
36
- if (er.scores?.extras.tableCellDiff)
37
- q4parts.push('tables');
38
- const q4 = q4parts.length > 0 ? q4parts.join('+') : '-';
39
- lines.push(`| ${result.fixture} | ${engineName} | ${g1a} | ${g1b} | ${g1c} | ${g2} | ${g3} | ${q1} | ${q3} | ${q4} |`);
40
- }
41
- }
42
- lines.push('');
43
- lines.push('*G2 is a soft gate (diagnostic only in v1)*');
44
- lines.push('');
45
- // Summary
46
- lines.push('## Summary');
47
- lines.push('');
48
- const engineStats = new Map();
49
- for (const result of results) {
50
- for (const [engineName, er] of Object.entries(result.engines)) {
51
- const stats = engineStats.get(engineName) ?? { total: 0, hardPass: 0, softPass: 0 };
52
- stats.total++;
53
- if (er.hardGatesPassed)
54
- stats.hardPass++;
55
- if (er.softGatesPassed)
56
- stats.softPass++;
57
- engineStats.set(engineName, stats);
58
- }
59
- }
60
- for (const [engine, stats] of engineStats) {
61
- lines.push(`- **${engine}**: ${stats.hardPass}/${stats.total} hard gates passed, ${stats.softPass}/${stats.total} soft gates passed`);
62
- }
63
- return lines.join('\n');
64
- }
65
- // ── JSON ────────────────────────────────────────────────────────────
66
- export function generateJsonReport(results) {
67
- return JSON.stringify({
68
- timestamp: new Date().toISOString(),
69
- results,
70
- }, null, 2);
71
- }
72
- // ── Console ─────────────────────────────────────────────────────────
73
- export function printSummary(results) {
74
- console.log('\n=== Quality Benchmark Summary ===\n');
75
- for (const result of results) {
76
- console.log(`Fixture: ${result.fixture} [${result.tags.join(', ')}]`);
77
- for (const [engineName, er] of Object.entries(result.engines)) {
78
- const hard = er.hardGatesPassed ? 'PASS' : 'FAIL';
79
- const soft = er.softGatesPassed ? 'PASS' : 'FAIL';
80
- const time = er.scores?.performance
81
- ? `${er.scores.performance.wallTimeMs.toFixed(0)}ms`
82
- : 'N/A';
83
- const q1 = er.scores?.diffMinimality
84
- ? `${er.scores.diffMinimality.engineRuns} runs`
85
- : 'N/A';
86
- console.log(` ${engineName}: hard=${hard} soft=${soft} time=${time} q1=${q1}`);
87
- if (er.error) {
88
- console.log(` Error: ${er.error}`);
89
- }
90
- }
91
- console.log('');
92
- }
93
- }
94
- //# sourceMappingURL=reporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/benchmark/reporter.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Quality benchmark runner — gate-then-score architecture.
3
- *
4
- * For each fixture × engine: produce redline → run gates → if hard gates pass, run scores.
5
- */
6
- import type { FixtureBenchmarkResult, FixtureManifest, FixtureManifestEntry, QualityBenchmarkConfig } from './types.js';
7
- export declare function loadManifest(manifestPath: string): Promise<{
8
- manifest: FixtureManifest;
9
- resolvedFixtures: Array<FixtureManifestEntry & {
10
- resolvedOriginal: string;
11
- resolvedRevised: string;
12
- }>;
13
- }>;
14
- export declare function runQualityBenchmark(config: QualityBenchmarkConfig): Promise<FixtureBenchmarkResult[]>;
15
- //# sourceMappingURL=runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EAGV,sBAAsB,EACtB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAMpB,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,QAAQ,EAAE,eAAe,CAAC;IAC1B,gBAAgB,EAAE,KAAK,CAAC,oBAAoB,GAAG;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvG,CAAC,CA+BD;AAwJD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAgCnC"}
@@ -1,241 +0,0 @@
1
- /**
2
- * Quality benchmark runner — gate-then-score architecture.
3
- *
4
- * For each fixture × engine: produce redline → run gates → if hard gates pass, run scores.
5
- */
6
- import { readFile, access } from 'fs/promises';
7
- import { resolve, dirname } from 'path';
8
- import { execFile } from 'child_process';
9
- import { promisify } from 'util';
10
- import { compareDocuments } from '../index.js';
11
- import { extractTextWithParagraphs } from '../baselines/atomizer/trackChangesAcceptorAst.js';
12
- import { DocxArchive } from '../shared/docx/DocxArchive.js';
13
- import { createTimer } from './metrics.js';
14
- import { runGates } from './gates.js';
15
- import { scoreDiffMinimality, scoreCompatibility, scoreExtras } from './scores.js';
16
- import { generateMarkdownReport, generateJsonReport } from './reporter.js';
17
- const execFileAsync = promisify(execFile);
18
- // ── Manifest loading ────────────────────────────────────────────────
19
- export async function loadManifest(manifestPath) {
20
- const raw = await readFile(manifestPath, 'utf-8');
21
- const manifest = JSON.parse(raw);
22
- const baseDir = resolve(dirname(manifestPath), manifest.base_dir);
23
- const resolvedFixtures = [];
24
- const missing = [];
25
- for (const entry of manifest.fixtures) {
26
- const resolvedOriginal = resolve(baseDir, entry.original);
27
- const resolvedRevised = resolve(baseDir, entry.revised);
28
- try {
29
- await access(resolvedOriginal);
30
- }
31
- catch {
32
- missing.push(`${entry.name}: original not found at ${resolvedOriginal}`);
33
- }
34
- try {
35
- await access(resolvedRevised);
36
- }
37
- catch {
38
- missing.push(`${entry.name}: revised not found at ${resolvedRevised}`);
39
- }
40
- resolvedFixtures.push({ ...entry, resolvedOriginal, resolvedRevised });
41
- }
42
- if (missing.length > 0) {
43
- throw new Error(`Manifest path validation failed:\n${missing.join('\n')}`);
44
- }
45
- return { manifest, resolvedFixtures };
46
- }
47
- // ── Engine dispatch ─────────────────────────────────────────────────
48
- async function produceRedline(engine, originalBuffer, revisedBuffer, author, asposeCliPath) {
49
- if (engine === 'atomizer') {
50
- const result = await compareDocuments(originalBuffer, revisedBuffer, { engine: 'atomizer', author });
51
- return result.document;
52
- }
53
- if (engine === 'diffmatch') {
54
- const result = await compareDocuments(originalBuffer, revisedBuffer, { engine: 'diffmatch', author });
55
- return result.document;
56
- }
57
- if (engine === 'aspose') {
58
- if (!asposeCliPath) {
59
- throw new Error('Aspose CLI path not provided');
60
- }
61
- // Use Python subprocess
62
- const { tmpdir } = await import('os');
63
- const { mkdtemp, writeFile, unlink } = await import('fs/promises');
64
- const { join } = await import('path');
65
- const tempDir = await mkdtemp(join(tmpdir(), 'benchmark-aspose-'));
66
- const origPath = join(tempDir, 'original.docx');
67
- const revPath = join(tempDir, 'revised.docx');
68
- const outPath = join(tempDir, 'result.docx');
69
- try {
70
- await writeFile(origPath, originalBuffer);
71
- await writeFile(revPath, revisedBuffer);
72
- await execFileAsync('python3', [
73
- asposeCliPath,
74
- '--original', origPath,
75
- '--revised', revPath,
76
- '--output', outPath,
77
- '--author', author,
78
- ], { timeout: 120_000 });
79
- return await readFile(outPath);
80
- }
81
- finally {
82
- try {
83
- await unlink(origPath);
84
- }
85
- catch { /* ignore */ }
86
- try {
87
- await unlink(revPath);
88
- }
89
- catch { /* ignore */ }
90
- try {
91
- await unlink(outPath);
92
- }
93
- catch { /* ignore */ }
94
- try {
95
- await unlink(outPath.replace('.docx', '.manifest.json'));
96
- }
97
- catch { /* ignore */ }
98
- try {
99
- const { rmdir } = await import('fs/promises');
100
- await rmdir(tempDir);
101
- }
102
- catch { /* ignore */ }
103
- }
104
- }
105
- throw new Error(`Unknown engine: ${engine}`);
106
- }
107
- // ── Single fixture × engine ─────────────────────────────────────────
108
- async function runEngineOnFixture(engine, originalBuffer, revisedBuffer, author, config) {
109
- const timer = createTimer();
110
- try {
111
- const resultBuffer = await produceRedline(engine, originalBuffer, revisedBuffer, author, config.asposeCliPath);
112
- const wallTimeMs = timer();
113
- // Extract text from source documents for gate comparison
114
- const originalArchive = await DocxArchive.load(originalBuffer);
115
- const revisedArchive = await DocxArchive.load(revisedBuffer);
116
- const originalDocXml = await originalArchive.getDocumentXml();
117
- const revisedDocXml = await revisedArchive.getDocumentXml();
118
- const originalText = extractTextWithParagraphs(originalDocXml);
119
- const revisedText = extractTextWithParagraphs(revisedDocXml);
120
- // Get result document.xml for gates
121
- const resultArchive = await DocxArchive.load(resultBuffer);
122
- const resultDocXml = await resultArchive.getDocumentXml();
123
- // Run gates
124
- const { gates, hardGatesPassed, softGatesPassed } = await runGates(resultBuffer, resultDocXml, originalText, revisedText, originalBuffer, revisedBuffer);
125
- // Run scores only if hard gates pass
126
- let scores = null;
127
- if (hardGatesPassed) {
128
- const diffMin = scoreDiffMinimality(resultDocXml);
129
- const compat = await scoreCompatibility(resultBuffer, config.libreOfficePath, config.timeout);
130
- const extras = scoreExtras(resultDocXml);
131
- scores = {
132
- diffMinimality: diffMin,
133
- compatibility: compat,
134
- performance: { wallTimeMs },
135
- extras,
136
- };
137
- }
138
- return {
139
- engine,
140
- gates,
141
- hardGatesPassed,
142
- softGatesPassed,
143
- scores,
144
- };
145
- }
146
- catch (e) {
147
- const msg = e instanceof Error ? e.message : String(e);
148
- return {
149
- engine,
150
- gates: {
151
- textRoundTrip: {
152
- normalizedTextParity: { passed: false, detail: 'Skipped (engine error)' },
153
- paragraphCountParity: { passed: false, detail: 'Skipped (engine error)' },
154
- xmlParseValidity: { passed: false, detail: 'Skipped (engine error)' },
155
- },
156
- formattingProjection: { passed: false, detail: 'Skipped (engine error)' },
157
- structuralIntegrity: { passed: false, detail: 'Skipped (engine error)' },
158
- },
159
- hardGatesPassed: false,
160
- softGatesPassed: false,
161
- scores: null,
162
- error: msg,
163
- };
164
- }
165
- }
166
- // ── Main entry point ────────────────────────────────────────────────
167
- export async function runQualityBenchmark(config) {
168
- const { resolvedFixtures } = await loadManifest(config.manifestPath);
169
- const author = config.author ?? 'Benchmark';
170
- const results = [];
171
- for (const fixture of resolvedFixtures) {
172
- console.log(`Running: ${fixture.name}`);
173
- const originalBuffer = await readFile(fixture.resolvedOriginal);
174
- const revisedBuffer = await readFile(fixture.resolvedRevised);
175
- const engines = {};
176
- for (const engine of config.engines) {
177
- console.log(` Engine: ${engine}`);
178
- engines[engine] = await runEngineOnFixture(engine, originalBuffer, revisedBuffer, author, config);
179
- }
180
- results.push({
181
- fixture: fixture.name,
182
- tags: fixture.tags,
183
- engines,
184
- timestamp: new Date().toISOString(),
185
- });
186
- }
187
- return results;
188
- }
189
- // ── CLI entry point ─────────────────────────────────────────────────
190
- async function main() {
191
- const args = process.argv.slice(2);
192
- if (args.length === 0) {
193
- console.log('Usage: pnpm benchmark <manifest.json> [options]');
194
- console.log('');
195
- console.log('Options:');
196
- console.log(' --engines=atomizer,diffmatch Engines to run (comma-separated)');
197
- console.log(' --aspose-cli=<path> Path to aspose_compare.py');
198
- console.log(' --libreoffice=<path> Path to LibreOffice binary');
199
- console.log(' --author=<name> Author name for revisions');
200
- console.log(' --format=json|markdown Output format (default: json)');
201
- process.exit(1);
202
- }
203
- const manifestPath = args[0];
204
- const options = {};
205
- for (let i = 1; i < args.length; i++) {
206
- const arg = args[i];
207
- if (arg.startsWith('--') && arg.includes('=')) {
208
- const [key, value] = arg.slice(2).split('=', 2);
209
- options[key] = value;
210
- }
211
- }
212
- const engines = (options.engines ?? 'atomizer,diffmatch')
213
- .split(',')
214
- .map((e) => e.trim());
215
- const config = {
216
- manifestPath: resolve(manifestPath),
217
- engines,
218
- author: options.author,
219
- asposeCliPath: options['aspose-cli'],
220
- libreOfficePath: options.libreoffice,
221
- };
222
- try {
223
- const results = await runQualityBenchmark(config);
224
- const format = options.format ?? 'json';
225
- if (format === 'markdown') {
226
- console.log(generateMarkdownReport(results));
227
- }
228
- else {
229
- console.log(generateJsonReport(results));
230
- }
231
- }
232
- catch (error) {
233
- console.error('Benchmark failed:', error);
234
- process.exit(1);
235
- }
236
- }
237
- // Run if executed directly
238
- if (import.meta.url === `file://${process.argv[1]}`) {
239
- main().catch(console.error);
240
- }
241
- //# sourceMappingURL=runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Quality benchmark scores.
3
- *
4
- * Q1: Diff minimality — count of ins/del runs
5
- * Q2: Compatibility — LibreOffice round-trip test
6
- * Q4: Extras — move detection, table cell diffs
7
- */
8
- export interface DiffMinimalityResult {
9
- engineRuns: number;
10
- oracleRuns: number | null;
11
- ratio: number | null;
12
- }
13
- export declare function scoreDiffMinimality(resultDocumentXml: string, oracleDocumentXml?: string | null): DiffMinimalityResult;
14
- export interface CompatibilityResult {
15
- opensClean: boolean;
16
- skipReason?: string;
17
- }
18
- export declare function scoreCompatibility(resultBuffer: Buffer, libreOfficePath?: string, timeout?: number): Promise<CompatibilityResult>;
19
- export interface ExtrasResult {
20
- moveDetection: boolean;
21
- tableCellDiff: boolean;
22
- }
23
- export declare function scoreExtras(resultDocumentXml: string): ExtrasResult;
24
- //# sourceMappingURL=scores.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scores.d.ts","sourceRoot":"","sources":["../../src/benchmark/scores.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,GAChC,oBAAoB,CAoBtB;AAID,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,EACxB,OAAO,GAAE,MAAe,GACvB,OAAO,CAAC,mBAAmB,CAAC,CA+C9B;AAID,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,iBAAiB,EAAE,MAAM,GAAG,YAAY,CAsBnE"}
@@ -1,103 +0,0 @@
1
- /**
2
- * Quality benchmark scores.
3
- *
4
- * Q1: Diff minimality — count of ins/del runs
5
- * Q2: Compatibility — LibreOffice round-trip test
6
- * Q4: Extras — move detection, table cell diffs
7
- */
8
- import { execFile } from 'child_process';
9
- import { writeFile, unlink, access, mkdtemp } from 'fs/promises';
10
- import { join } from 'path';
11
- import { tmpdir } from 'os';
12
- import { promisify } from 'util';
13
- import { parseXml } from '../primitives/xml.js';
14
- import { findAllByTagName } from '../primitives/dom-helpers.js';
15
- const execFileAsync = promisify(execFile);
16
- export function scoreDiffMinimality(resultDocumentXml, oracleDocumentXml) {
17
- const doc = parseXml(resultDocumentXml);
18
- const root = doc.documentElement;
19
- const insCount = findAllByTagName(root, 'w:ins').length;
20
- const delCount = findAllByTagName(root, 'w:del').length;
21
- const engineRuns = insCount + delCount;
22
- let oracleRuns = null;
23
- let ratio = null;
24
- if (oracleDocumentXml) {
25
- const oracleDoc = parseXml(oracleDocumentXml);
26
- const oracleRoot = oracleDoc.documentElement;
27
- const oracleIns = findAllByTagName(oracleRoot, 'w:ins').length;
28
- const oracleDel = findAllByTagName(oracleRoot, 'w:del').length;
29
- oracleRuns = oracleIns + oracleDel;
30
- ratio = oracleRuns > 0 ? engineRuns / oracleRuns : null;
31
- }
32
- return { engineRuns, oracleRuns, ratio };
33
- }
34
- export async function scoreCompatibility(resultBuffer, libreOfficePath, timeout = 30_000) {
35
- if (!libreOfficePath) {
36
- return { opensClean: false, skipReason: 'binary_missing' };
37
- }
38
- // Verify binary exists
39
- try {
40
- await access(libreOfficePath);
41
- }
42
- catch {
43
- return { opensClean: false, skipReason: 'binary_missing' };
44
- }
45
- let tempDir;
46
- let inputPath;
47
- try {
48
- tempDir = await mkdtemp(join(tmpdir(), 'benchmark-q2-'));
49
- inputPath = join(tempDir, 'input.docx');
50
- await writeFile(inputPath, resultBuffer);
51
- await execFileAsync(libreOfficePath, ['--headless', '--convert-to', 'docx', '--outdir', tempDir, inputPath], { timeout });
52
- return { opensClean: true };
53
- }
54
- catch (e) {
55
- const msg = e instanceof Error ? e.message : String(e);
56
- if (msg.includes('TIMEOUT') || msg.includes('timed out')) {
57
- return { opensClean: false, skipReason: 'timeout' };
58
- }
59
- return { opensClean: false, skipReason: 'conversion_error' };
60
- }
61
- finally {
62
- // Cleanup temp files
63
- if (inputPath) {
64
- try {
65
- await unlink(inputPath);
66
- }
67
- catch { /* ignore */ }
68
- }
69
- if (tempDir) {
70
- const outputPath = join(tempDir, 'input.docx');
71
- try {
72
- await unlink(outputPath);
73
- }
74
- catch { /* ignore */ }
75
- try {
76
- const { rmdir } = await import('fs/promises');
77
- await rmdir(tempDir);
78
- }
79
- catch { /* ignore */ }
80
- }
81
- }
82
- }
83
- export function scoreExtras(resultDocumentXml) {
84
- const doc = parseXml(resultDocumentXml);
85
- const root = doc.documentElement;
86
- // Move detection: w:moveFrom or w:moveTo present
87
- const moveFrom = findAllByTagName(root, 'w:moveFrom');
88
- const moveTo = findAllByTagName(root, 'w:moveTo');
89
- const moveDetection = moveFrom.length > 0 || moveTo.length > 0;
90
- // Table cell diff: track changes inside w:tc elements
91
- const tableCells = findAllByTagName(root, 'w:tc');
92
- let tableCellDiff = false;
93
- for (const tc of tableCells) {
94
- const ins = findAllByTagName(tc, 'w:ins');
95
- const del = findAllByTagName(tc, 'w:del');
96
- if (ins.length > 0 || del.length > 0) {
97
- tableCellDiff = true;
98
- break;
99
- }
100
- }
101
- return { moveDetection, tableCellDiff };
102
- }
103
- //# sourceMappingURL=scores.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scores.js","sourceRoot":"","sources":["../../src/benchmark/scores.ts"],"names":[],"mappings":"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"}
@@ -1,81 +0,0 @@
1
- /**
2
- * Quality benchmark type definitions.
3
- *
4
- * Gate-then-score architecture: hard gates must pass before scores are computed.
5
- */
6
- export type BenchmarkEngine = 'atomizer' | 'diffmatch' | 'aspose';
7
- export interface G1TextRoundTripResult {
8
- normalizedTextParity: {
9
- passed: boolean;
10
- detail: string;
11
- };
12
- paragraphCountParity: {
13
- passed: boolean;
14
- detail: string;
15
- };
16
- xmlParseValidity: {
17
- passed: boolean;
18
- detail: string;
19
- };
20
- }
21
- export interface GateResult {
22
- passed: boolean;
23
- detail: string;
24
- }
25
- export interface GateResults {
26
- textRoundTrip: G1TextRoundTripResult;
27
- formattingProjection: GateResult;
28
- structuralIntegrity: GateResult;
29
- }
30
- export interface ScoreResults {
31
- diffMinimality: {
32
- engineRuns: number;
33
- oracleRuns: number | null;
34
- ratio: number | null;
35
- } | null;
36
- compatibility: {
37
- opensClean: boolean;
38
- skipReason?: string;
39
- } | null;
40
- performance: {
41
- wallTimeMs: number;
42
- };
43
- extras: {
44
- moveDetection: boolean;
45
- tableCellDiff: boolean;
46
- };
47
- }
48
- export interface EngineResult {
49
- engine: BenchmarkEngine;
50
- gates: GateResults;
51
- hardGatesPassed: boolean;
52
- softGatesPassed: boolean;
53
- scores: ScoreResults | null;
54
- error?: string;
55
- }
56
- export interface FixtureBenchmarkResult {
57
- fixture: string;
58
- tags: string[];
59
- engines: Record<string, EngineResult>;
60
- timestamp: string;
61
- }
62
- export interface FixtureManifestEntry {
63
- name: string;
64
- original: string;
65
- revised: string;
66
- tags: string[];
67
- oracleRedline?: string;
68
- }
69
- export interface FixtureManifest {
70
- base_dir: string;
71
- fixtures: FixtureManifestEntry[];
72
- }
73
- export interface QualityBenchmarkConfig {
74
- manifestPath: string;
75
- engines: BenchmarkEngine[];
76
- author?: string;
77
- asposeCliPath?: string;
78
- libreOfficePath?: string;
79
- timeout?: number;
80
- }
81
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/benchmark/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAIlE,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,oBAAoB,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,gBAAgB,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,qBAAqB,CAAC;IACrC,oBAAoB,EAAE,UAAU,CAAC;IACjC,mBAAmB,EAAE,UAAU,CAAC;CACjC;AAID,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,GAAG,IAAI,CAAC;IACT,aAAa,EAAE;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI,CAAC;IACT,WAAW,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE;QACN,aAAa,EAAE,OAAO,CAAC;QACvB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAID,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,WAAW,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAID,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Quality benchmark type definitions.
3
- *
4
- * Gate-then-score architecture: hard gates must pass before scores are computed.
5
- */
6
- export {};
7
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/benchmark/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}