@the-cascade-protocol/cli 0.2.3 → 0.2.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8H7D"}
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmI7D"}
@@ -39,6 +39,7 @@ export function registerConvertCommand(program) {
39
39
  .requiredOption('--from <format>', 'Source format (fhir|cascade|c-cda)')
40
40
  .requiredOption('--to <format>', 'Target format (turtle|jsonld|fhir|cascade)')
41
41
  .option('--format <output>', 'Output serialization format (turtle|jsonld)', 'turtle')
42
+ .option('--source-system <name>', 'Tag all records with a source system name (adds cascade:sourceSystem for reconciliation)')
42
43
  .action(async (file, options) => {
43
44
  const globalOpts = program.opts();
44
45
  printVerbose(`Converting from ${options.from} to ${options.to}`, globalOpts);
@@ -49,6 +50,9 @@ export function registerConvertCommand(program) {
49
50
  printVerbose('Reading from stdin', globalOpts);
50
51
  }
51
52
  printVerbose(`Output format: ${options.format}`, globalOpts);
53
+ if (options.sourceSystem) {
54
+ printVerbose(`Source system: ${options.sourceSystem}`, globalOpts);
55
+ }
52
56
  // 1. Read input
53
57
  let input;
54
58
  try {
@@ -84,7 +88,7 @@ export function registerConvertCommand(program) {
84
88
  }
85
89
  // 4. Run conversion
86
90
  const outputSerialization = (options.format === 'jsonld' ? 'jsonld' : 'turtle');
87
- const result = await convert(input, options.from, options.to, outputSerialization);
91
+ const result = await convert(input, options.from, options.to, outputSerialization, options.sourceSystem);
88
92
  // 5. Output
89
93
  if (!result.success) {
90
94
  for (const err of result.errors) {
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * cascade reconcile <file1> <file2> [file3...] [options]
3
+ *
4
+ * Reconcile Cascade Protocol Turtle files from multiple sources into a
5
+ * single normalized record set.
6
+ *
7
+ * Detects and resolves:
8
+ * - Exact duplicates (same record from multiple systems)
9
+ * - Near-duplicates (same record, minor value drift)
10
+ * - Status conflicts (active vs resolved)
11
+ * - Value conflicts (same test, different result)
12
+ *
13
+ * Adds reconciliation provenance to the merged output:
14
+ * cascade:reconciliationStatus "canonical" | "merged" | "conflict-resolved" | "unresolved-conflict"
15
+ * cascade:mergedFrom <source-uri1>, <source-uri2>, ...
16
+ * cascade:mergedSources "system-a, system-b"
17
+ * cascade:conflictResolution "trust_priority" | "merge_values"
18
+ *
19
+ * Options:
20
+ * --output <file> Write merged Turtle to file (default: stdout)
21
+ * --report <file> Write JSON transformation report to file
22
+ * --trust <system=score,...> Set trust scores (e.g. hospital=0.95,specialist=0.85)
23
+ * --lab-tolerance <number> Numeric tolerance for lab value matching (default: 0.05)
24
+ * --json Output report as JSON to stdout
25
+ *
26
+ * Examples:
27
+ * cascade reconcile primary-care.ttl specialist.ttl hospital.ttl --output merged.ttl --report report.json
28
+ * cascade reconcile *.ttl --trust hospital=0.95
29
+ */
30
+ import { Command } from 'commander';
31
+ export declare function registerReconcileCommand(program: Command): void;
32
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/commands/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoWpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsL/D"}
@@ -0,0 +1,490 @@
1
+ /**
2
+ * cascade reconcile <file1> <file2> [file3...] [options]
3
+ *
4
+ * Reconcile Cascade Protocol Turtle files from multiple sources into a
5
+ * single normalized record set.
6
+ *
7
+ * Detects and resolves:
8
+ * - Exact duplicates (same record from multiple systems)
9
+ * - Near-duplicates (same record, minor value drift)
10
+ * - Status conflicts (active vs resolved)
11
+ * - Value conflicts (same test, different result)
12
+ *
13
+ * Adds reconciliation provenance to the merged output:
14
+ * cascade:reconciliationStatus "canonical" | "merged" | "conflict-resolved" | "unresolved-conflict"
15
+ * cascade:mergedFrom <source-uri1>, <source-uri2>, ...
16
+ * cascade:mergedSources "system-a, system-b"
17
+ * cascade:conflictResolution "trust_priority" | "merge_values"
18
+ *
19
+ * Options:
20
+ * --output <file> Write merged Turtle to file (default: stdout)
21
+ * --report <file> Write JSON transformation report to file
22
+ * --trust <system=score,...> Set trust scores (e.g. hospital=0.95,specialist=0.85)
23
+ * --lab-tolerance <number> Numeric tolerance for lab value matching (default: 0.05)
24
+ * --json Output report as JSON to stdout
25
+ *
26
+ * Examples:
27
+ * cascade reconcile primary-care.ttl specialist.ttl hospital.ttl --output merged.ttl --report report.json
28
+ * cascade reconcile *.ttl --trust hospital=0.95
29
+ */
30
+ import { readFileSync, writeFileSync } from 'node:fs';
31
+ import { basename } from 'node:path';
32
+ import { Parser, Writer, DataFactory } from 'n3';
33
+ import { printResult, printError, printVerbose } from '../lib/output.js';
34
+ import { NS, TURTLE_PREFIXES } from '../lib/fhir-converter/types.js';
35
+ const { namedNode, literal, quad: makeQuad } = DataFactory;
36
+ const KNOWN_TYPES = {
37
+ [NS.health + 'MedicationRecord']: 'health:MedicationRecord',
38
+ [NS.health + 'ConditionRecord']: 'health:ConditionRecord',
39
+ [NS.health + 'AllergyRecord']: 'health:AllergyRecord',
40
+ [NS.health + 'LabResultRecord']: 'health:LabResultRecord',
41
+ [NS.health + 'ImmunizationRecord']: 'health:ImmunizationRecord',
42
+ [NS.clinical + 'VitalSign']: 'clinical:VitalSign',
43
+ [NS.cascade + 'PatientProfile']: 'cascade:PatientProfile',
44
+ [NS.coverage + 'InsurancePlan']: 'coverage:InsurancePlan',
45
+ };
46
+ async function parseTurtle(turtle, defaultSystem) {
47
+ return new Promise((resolve, reject) => {
48
+ const parser = new Parser({ format: 'Turtle' });
49
+ const bySubject = new Map();
50
+ parser.parse(turtle, (error, quad) => {
51
+ if (error) {
52
+ reject(error);
53
+ return;
54
+ }
55
+ if (!quad) {
56
+ const records = [];
57
+ for (const [uri, triples] of bySubject) {
58
+ const typeTriple = triples.find(t => t.pred === NS.rdf + 'type');
59
+ if (!typeTriple || !KNOWN_TYPES[typeTriple.obj])
60
+ continue;
61
+ const properties = new Map();
62
+ for (const t of triples) {
63
+ const existing = properties.get(t.pred);
64
+ if (existing)
65
+ existing.push(t.obj);
66
+ else
67
+ properties.set(t.pred, [t.obj]);
68
+ }
69
+ const sourceSystem = properties.get(NS.cascade + 'sourceSystem')?.[0] ?? defaultSystem;
70
+ records.push({ uri, type: KNOWN_TYPES[typeTriple.obj], sourceSystem, properties });
71
+ }
72
+ resolve(records);
73
+ return;
74
+ }
75
+ const subj = quad.subject.value;
76
+ if (!bySubject.has(subj))
77
+ bySubject.set(subj, []);
78
+ bySubject.get(subj).push({ pred: quad.predicate.value, obj: quad.object.value });
79
+ });
80
+ });
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Matching helpers
84
+ // ---------------------------------------------------------------------------
85
+ function normalizeMedName(name) {
86
+ return name.toLowerCase()
87
+ .replace(/\d+(\.\d+)?\s*(mg|mcg|g|ml|%|iu|units?|meq)\b/gi, '')
88
+ .replace(/\b(oral|tablet|capsule|solution|injection|extended|release|er|xr|cr|sr|hr)\b/gi, '')
89
+ .replace(/\s+/g, ' ').trim();
90
+ }
91
+ function normalizeConditionName(name) {
92
+ return name.toLowerCase().replace(/\([^)]*\)/g, '').replace(/\s+/g, ' ').trim();
93
+ }
94
+ function getProp(r, pred) {
95
+ return r.properties.get(pred)?.[0];
96
+ }
97
+ function codeFromUri(uri) {
98
+ return uri.split('/').pop() ?? uri.split('#').pop() ?? uri;
99
+ }
100
+ function dateOnly(dt) { return dt.split('T')[0] ?? dt; }
101
+ function matchMedications(a, b) {
102
+ const rxA = (a.properties.get(NS.health + 'rxNormCode') ?? []).map(codeFromUri);
103
+ const rxB = (b.properties.get(NS.health + 'rxNormCode') ?? []).map(codeFromUri);
104
+ const shared = rxA.find(c => c && rxB.includes(c));
105
+ if (shared)
106
+ return { match: true, confidence: 1.0, matchedOn: `rxnorm:${shared}` };
107
+ const nA = normalizeMedName(getProp(a, NS.health + 'medicationName') ?? '');
108
+ const nB = normalizeMedName(getProp(b, NS.health + 'medicationName') ?? '');
109
+ if (nA && nB && nA === nB)
110
+ return { match: true, confidence: 0.85, matchedOn: `name:"${nA}"` };
111
+ if (nA && nB && (nA.includes(nB) || nB.includes(nA)))
112
+ return { match: true, confidence: 0.70, matchedOn: `partial-name` };
113
+ return { match: false, confidence: 0, matchedOn: '' };
114
+ }
115
+ function matchConditions(a, b) {
116
+ const sA = getProp(a, NS.health + 'snomedCode');
117
+ const sB = getProp(b, NS.health + 'snomedCode');
118
+ if (sA && sB && codeFromUri(sA) === codeFromUri(sB))
119
+ return { match: true, confidence: 1.0, matchedOn: `snomed:${codeFromUri(sA)}` };
120
+ const iA = getProp(a, NS.health + 'icd10Code');
121
+ const iB = getProp(b, NS.health + 'icd10Code');
122
+ if (iA && iB && codeFromUri(iA) === codeFromUri(iB))
123
+ return { match: true, confidence: 0.95, matchedOn: `icd10:${codeFromUri(iA)}` };
124
+ const nA = normalizeConditionName(getProp(a, NS.health + 'conditionName') ?? '');
125
+ const nB = normalizeConditionName(getProp(b, NS.health + 'conditionName') ?? '');
126
+ if (nA && nB && nA === nB)
127
+ return { match: true, confidence: 0.80, matchedOn: `name:"${nA}"` };
128
+ return { match: false, confidence: 0, matchedOn: '' };
129
+ }
130
+ function matchAllergies(a, b) {
131
+ const nA = (getProp(a, NS.health + 'allergen') ?? '').toLowerCase().trim();
132
+ const nB = (getProp(b, NS.health + 'allergen') ?? '').toLowerCase().trim();
133
+ if (nA && nB && nA === nB)
134
+ return { match: true, confidence: 0.90, matchedOn: `allergen:"${nA}"` };
135
+ return { match: false, confidence: 0, matchedOn: '' };
136
+ }
137
+ function matchLabs(a, b, tol) {
138
+ const lA = getProp(a, NS.health + 'testCode');
139
+ const lB = getProp(b, NS.health + 'testCode');
140
+ const dA = dateOnly(getProp(a, NS.health + 'performedDate') ?? '');
141
+ const dB = dateOnly(getProp(b, NS.health + 'performedDate') ?? '');
142
+ const vA = parseFloat(getProp(a, NS.health + 'resultValue') ?? 'NaN');
143
+ const vB = parseFloat(getProp(b, NS.health + 'resultValue') ?? 'NaN');
144
+ const sameDay = dA && dB && dA === dB;
145
+ const sameLoinc = lA && lB && codeFromUri(lA) === codeFromUri(lB);
146
+ if (sameLoinc && sameDay) {
147
+ if (!isNaN(vA) && !isNaN(vB)) {
148
+ const diff = Math.abs(vA - vB) / Math.max(Math.abs(vA), 0.001);
149
+ const conf = diff <= tol ? (diff === 0 ? 1.0 : 0.90) : 0.85;
150
+ return { match: true, confidence: conf, matchedOn: `loinc:${codeFromUri(lA)}+${dA}` };
151
+ }
152
+ return { match: true, confidence: 0.90, matchedOn: `loinc:${codeFromUri(lA)}+${dA}` };
153
+ }
154
+ const nA = (getProp(a, NS.health + 'testName') ?? '').toLowerCase().trim();
155
+ const nB = (getProp(b, NS.health + 'testName') ?? '').toLowerCase().trim();
156
+ if (nA && nB && nA === nB && sameDay)
157
+ return { match: true, confidence: 0.75, matchedOn: `name:"${nA}"+${dA}` };
158
+ return { match: false, confidence: 0, matchedOn: '' };
159
+ }
160
+ function matchImmunizations(a, b) {
161
+ const cA = getProp(a, NS.health + 'cvxCode');
162
+ const cB = getProp(b, NS.health + 'cvxCode');
163
+ const dA = dateOnly(getProp(a, NS.health + 'administrationDate') ?? getProp(a, NS.health + 'startDate') ?? '');
164
+ const dB = dateOnly(getProp(b, NS.health + 'administrationDate') ?? getProp(b, NS.health + 'startDate') ?? '');
165
+ if (cA && cB && codeFromUri(cA) === codeFromUri(cB) && dA && dA === dB)
166
+ return { match: true, confidence: 1.0, matchedOn: `cvx:${codeFromUri(cA)}+${dA}` };
167
+ return { match: false, confidence: 0, matchedOn: '' };
168
+ }
169
+ function doRecordsMatch(a, b, tol) {
170
+ if (a.type !== b.type)
171
+ return { match: false, confidence: 0, matchedOn: '' };
172
+ switch (a.type) {
173
+ case 'health:MedicationRecord': return matchMedications(a, b);
174
+ case 'health:ConditionRecord': return matchConditions(a, b);
175
+ case 'health:AllergyRecord': return matchAllergies(a, b);
176
+ case 'health:LabResultRecord': return matchLabs(a, b, tol);
177
+ case 'health:ImmunizationRecord': return matchImmunizations(a, b);
178
+ default: return { match: false, confidence: 0, matchedOn: '' };
179
+ }
180
+ }
181
+ function classifyGroup(records, tol) {
182
+ if (records.length < 2)
183
+ return { matchType: 'pass_through' };
184
+ const [a, b] = records;
185
+ if (a.type === 'health:ConditionRecord') {
186
+ const sA = getProp(a, NS.health + 'status');
187
+ const sB = getProp(b, NS.health + 'status');
188
+ if (sA && sB && sA !== sB)
189
+ return { matchType: 'status_conflict', conflictField: 'health:status', conflictValues: { [a.sourceSystem]: sA, [b.sourceSystem]: sB } };
190
+ }
191
+ if (a.type === 'health:AllergyRecord') {
192
+ const sA = getProp(a, NS.health + 'allergySeverity');
193
+ const sB = getProp(b, NS.health + 'allergySeverity');
194
+ if (sA && sB && sA !== sB)
195
+ return { matchType: 'value_conflict', conflictField: 'health:allergySeverity', conflictValues: { [a.sourceSystem]: sA, [b.sourceSystem]: sB } };
196
+ }
197
+ if (a.type === 'health:LabResultRecord') {
198
+ const vA = parseFloat(getProp(a, NS.health + 'resultValue') ?? 'NaN');
199
+ const vB = parseFloat(getProp(b, NS.health + 'resultValue') ?? 'NaN');
200
+ if (!isNaN(vA) && !isNaN(vB)) {
201
+ const diff = Math.abs(vA - vB) / Math.max(Math.abs(vA), 0.001);
202
+ if (diff > tol)
203
+ return { matchType: 'value_conflict', conflictField: 'health:resultValue', conflictValues: { [a.sourceSystem]: String(vA), [b.sourceSystem]: String(vB) } };
204
+ if (diff > 0)
205
+ return { matchType: 'near_duplicate' };
206
+ }
207
+ }
208
+ if (a.type === 'health:MedicationRecord') {
209
+ const nA = normalizeMedName(getProp(a, NS.health + 'medicationName') ?? '');
210
+ const nB = normalizeMedName(getProp(b, NS.health + 'medicationName') ?? '');
211
+ if (nA !== nB)
212
+ return { matchType: 'near_duplicate' };
213
+ }
214
+ return { matchType: 'exact_duplicate' };
215
+ }
216
+ function completeness(r) {
217
+ const skip = new Set([NS.rdf + 'type', NS.cascade + 'dataProvenance', NS.cascade + 'schemaVersion', NS.cascade + 'sourceSystem']);
218
+ let n = 0;
219
+ for (const [p] of r.properties)
220
+ if (!skip.has(p))
221
+ n++;
222
+ return n;
223
+ }
224
+ function resolveGroup(g, trustScores, defaultTrust) {
225
+ const trust = (sys) => trustScores[sys] ?? defaultTrust;
226
+ if (g.records.length === 1) {
227
+ return { canonical: g.records[0], mergedUris: [g.records[0].uri], mergedSystems: [g.records[0].sourceSystem], strategy: 'pass_through', resolved: true };
228
+ }
229
+ const ranked = [...g.records].sort((a, b) => {
230
+ const td = trust(b.sourceSystem) - trust(a.sourceSystem);
231
+ return td !== 0 ? td : completeness(b) - completeness(a);
232
+ });
233
+ const winner = ranked[0];
234
+ const losers = ranked.slice(1);
235
+ let strategy = 'trust_priority';
236
+ let resolved = true;
237
+ if (g.matchType === 'near_duplicate') {
238
+ strategy = 'merge_values';
239
+ }
240
+ else if (g.matchType === 'status_conflict') {
241
+ const diff = Math.abs(trust(ranked[0].sourceSystem) - trust(ranked[1].sourceSystem));
242
+ if (diff < 0.05) {
243
+ strategy = 'flag_unresolved';
244
+ resolved = false;
245
+ }
246
+ }
247
+ // Merge missing fields from lower-trust sources
248
+ let canonical = winner;
249
+ if (strategy === 'merge_values') {
250
+ const mergedProps = new Map(winner.properties);
251
+ const metaPreds = new Set([NS.rdf + 'type', NS.cascade + 'dataProvenance', NS.cascade + 'schemaVersion', NS.cascade + 'sourceSystem']);
252
+ for (const src of losers) {
253
+ for (const [pred, vals] of src.properties) {
254
+ if (!metaPreds.has(pred) && !mergedProps.has(pred))
255
+ mergedProps.set(pred, vals);
256
+ }
257
+ }
258
+ canonical = { ...winner, properties: mergedProps };
259
+ }
260
+ return {
261
+ canonical,
262
+ mergedUris: g.records.map(r => r.uri),
263
+ mergedSystems: g.records.map(r => r.sourceSystem),
264
+ strategy,
265
+ resolved,
266
+ };
267
+ }
268
+ // ---------------------------------------------------------------------------
269
+ // Serializer: resolved groups → Turtle
270
+ // ---------------------------------------------------------------------------
271
+ async function serializeGroups(groups, resolutions) {
272
+ return new Promise((resolve, reject) => {
273
+ const writer = new Writer({ prefixes: TURTLE_PREFIXES });
274
+ for (let i = 0; i < groups.length; i++) {
275
+ const g = groups[i];
276
+ const res = resolutions[i];
277
+ const subj = namedNode(res.canonical.uri);
278
+ for (const [pred, vals] of res.canonical.properties) {
279
+ for (const val of vals) {
280
+ const obj = val.startsWith('http') || val.startsWith('urn:') ? namedNode(val) : literal(val);
281
+ writer.addQuad(makeQuad(subj, namedNode(pred), obj));
282
+ }
283
+ }
284
+ // Reconciliation status
285
+ const status = !res.resolved ? 'unresolved-conflict'
286
+ : g.matchType === 'pass_through' ? 'canonical'
287
+ : (g.matchType === 'status_conflict' || g.matchType === 'value_conflict') ? 'conflict-resolved'
288
+ : 'merged';
289
+ writer.addQuad(makeQuad(subj, namedNode(NS.cascade + 'reconciliationStatus'), literal(status)));
290
+ writer.addQuad(makeQuad(subj, namedNode(NS.cascade + 'sourceSystem'), literal(res.canonical.sourceSystem)));
291
+ if (g.matchType !== 'pass_through' && res.mergedUris.length > 1) {
292
+ for (const srcUri of res.mergedUris) {
293
+ writer.addQuad(makeQuad(subj, namedNode(NS.cascade + 'mergedFrom'), namedNode(srcUri)));
294
+ writer.addQuad(makeQuad(subj, namedNode(NS.prov + 'wasDerivedFrom'), namedNode(srcUri)));
295
+ }
296
+ writer.addQuad(makeQuad(subj, namedNode(NS.cascade + 'mergedSources'), literal(res.mergedSystems.join(', '))));
297
+ writer.addQuad(makeQuad(subj, namedNode(NS.cascade + 'conflictResolution'), literal(res.strategy)));
298
+ if (g.conflictField)
299
+ writer.addQuad(makeQuad(subj, namedNode(NS.cascade + 'conflictField'), literal(g.conflictField)));
300
+ if (g.conflictValues) {
301
+ const valDesc = Object.entries(g.conflictValues).map(([s, v]) => `${s}: "${v}"`).join(' vs ');
302
+ writer.addQuad(makeQuad(subj, namedNode(NS.cascade + 'conflictValues'), literal(valDesc)));
303
+ }
304
+ }
305
+ }
306
+ writer.end((err, result) => err ? reject(err) : resolve(result));
307
+ });
308
+ }
309
+ // ---------------------------------------------------------------------------
310
+ // Command registration
311
+ // ---------------------------------------------------------------------------
312
+ export function registerReconcileCommand(program) {
313
+ program
314
+ .command('reconcile')
315
+ .description('Reconcile Cascade RDF from multiple sources into a normalized record set')
316
+ .argument('<files...>', 'Cascade Turtle files to reconcile (2 or more)')
317
+ .option('--output <file>', 'Write merged Turtle output to file (default: stdout)')
318
+ .option('--report <file>', 'Write JSON transformation report to file')
319
+ .option('--trust <scores>', 'Source trust scores: system1=0.9,system2=0.85')
320
+ .option('--lab-tolerance <number>', 'Lab value match tolerance as fraction (default: 0.05)', '0.05')
321
+ .action(async (files, options) => {
322
+ const globalOpts = program.opts();
323
+ if (files.length < 2) {
324
+ printError('reconcile requires at least 2 input files', globalOpts);
325
+ process.exitCode = 1;
326
+ return;
327
+ }
328
+ const trustScores = { 'primary-care': 0.90, 'specialist': 0.85, 'hospital': 0.95 };
329
+ if (options.trust) {
330
+ for (const pair of options.trust.split(',')) {
331
+ const [sys, score] = pair.split('=');
332
+ if (sys && score)
333
+ trustScores[sys] = parseFloat(score);
334
+ }
335
+ }
336
+ const defaultTrust = 0.80;
337
+ const labTol = parseFloat(options.labTolerance);
338
+ printVerbose(`Reconciling ${files.length} files`, globalOpts);
339
+ printVerbose(`Trust scores: ${JSON.stringify(trustScores)}`, globalOpts);
340
+ // Parse all files
341
+ const allRecords = [];
342
+ const sourceInfo = [];
343
+ for (const filePath of files) {
344
+ let turtle;
345
+ try {
346
+ turtle = readFileSync(filePath, 'utf-8');
347
+ }
348
+ catch (err) {
349
+ printError(`Cannot read file: ${filePath}`, globalOpts);
350
+ process.exitCode = 1;
351
+ return;
352
+ }
353
+ const systemName = basename(filePath, '.ttl').replace(/_/g, '-');
354
+ const records = await parseTurtle(turtle, systemName);
355
+ // Use the cascade:sourceSystem from the file if present, otherwise derive from filename
356
+ const systemNames = [...new Set(records.map(r => r.sourceSystem).filter(s => s !== systemName))];
357
+ const effectiveSystem = systemNames[0] ?? systemName;
358
+ // Re-tag with effective system if all records share one
359
+ for (const r of records) {
360
+ if (r.sourceSystem === systemName && systemNames.length > 0)
361
+ r.sourceSystem = effectiveSystem;
362
+ }
363
+ allRecords.push(...records);
364
+ sourceInfo.push({ system: effectiveSystem, file: filePath, count: records.length });
365
+ printVerbose(` ${filePath}: ${records.length} records (system: ${effectiveSystem})`, globalOpts);
366
+ }
367
+ // Match and group
368
+ const groups = [];
369
+ const assigned = new Set();
370
+ for (let i = 0; i < allRecords.length; i++) {
371
+ const a = allRecords[i];
372
+ if (assigned.has(a.uri))
373
+ continue;
374
+ if (a.type === 'cascade:PatientProfile' || a.type === 'coverage:InsurancePlan') {
375
+ groups.push({ matchType: 'pass_through', confidence: 1.0, records: [a], matchedOn: 'profile' });
376
+ assigned.add(a.uri);
377
+ continue;
378
+ }
379
+ const matched = [a];
380
+ let matchedOn = '';
381
+ let bestConf = 1.0;
382
+ for (let j = i + 1; j < allRecords.length; j++) {
383
+ const b = allRecords[j];
384
+ if (assigned.has(b.uri) || a.sourceSystem === b.sourceSystem)
385
+ continue;
386
+ const { match, confidence, matchedOn: mo } = doRecordsMatch(a, b, labTol);
387
+ if (match && confidence >= 0.65) {
388
+ matched.push(b);
389
+ assigned.add(b.uri);
390
+ if (!matchedOn) {
391
+ matchedOn = mo;
392
+ bestConf = confidence;
393
+ }
394
+ }
395
+ }
396
+ assigned.add(a.uri);
397
+ if (matched.length === 1) {
398
+ groups.push({ matchType: 'pass_through', confidence: 1.0, records: matched, matchedOn: '' });
399
+ }
400
+ else {
401
+ const { matchType, conflictField, conflictValues } = classifyGroup(matched, labTol);
402
+ groups.push({ matchType, confidence: bestConf, records: matched, matchedOn, conflictField, conflictValues });
403
+ }
404
+ }
405
+ // Resolve
406
+ const resolutions = groups.map(g => resolveGroup(g, trustScores, defaultTrust));
407
+ // Serialize
408
+ const mergedTurtle = await serializeGroups(groups, resolutions);
409
+ // Build report
410
+ let exactDups = 0, nearDups = 0, resolved = 0, unresolved = 0, passThrough = 0;
411
+ const transformations = [];
412
+ const unresolvedList = [];
413
+ for (let i = 0; i < groups.length; i++) {
414
+ const g = groups[i];
415
+ const res = resolutions[i];
416
+ const t = {
417
+ type: g.matchType,
418
+ recordType: g.records[0].type,
419
+ canonicalUri: res.canonical.uri,
420
+ sources: g.records.map(r => r.sourceSystem),
421
+ matchedOn: g.matchedOn,
422
+ strategy: res.strategy,
423
+ conflictField: g.conflictField,
424
+ conflictValues: g.conflictValues,
425
+ resolved: res.resolved,
426
+ };
427
+ switch (g.matchType) {
428
+ case 'exact_duplicate':
429
+ exactDups++;
430
+ break;
431
+ case 'near_duplicate':
432
+ nearDups++;
433
+ break;
434
+ case 'status_conflict':
435
+ case 'value_conflict':
436
+ res.resolved ? resolved++ : unresolved++;
437
+ break;
438
+ case 'pass_through':
439
+ passThrough++;
440
+ break;
441
+ }
442
+ if (g.matchType !== 'pass_through')
443
+ transformations.push(t);
444
+ if (!res.resolved)
445
+ unresolvedList.push(t);
446
+ }
447
+ const report = {
448
+ generatedAt: new Date().toISOString(),
449
+ sources: sourceInfo.map(s => ({ ...s, trustScore: trustScores[s.system] ?? defaultTrust })),
450
+ summary: {
451
+ totalInputRecords: allRecords.length,
452
+ exactDuplicatesRemoved: exactDups,
453
+ nearDuplicatesMerged: nearDups,
454
+ conflictsResolved: resolved,
455
+ conflictsUnresolved: unresolved,
456
+ passThrough,
457
+ finalRecordCount: groups.length,
458
+ },
459
+ transformations,
460
+ unresolvedConflicts: unresolvedList,
461
+ };
462
+ // Output
463
+ if (options.output) {
464
+ writeFileSync(options.output, mergedTurtle);
465
+ console.error(`Merged Turtle written to: ${options.output}`);
466
+ }
467
+ else {
468
+ console.log(mergedTurtle);
469
+ }
470
+ if (options.report) {
471
+ writeFileSync(options.report, JSON.stringify(report, null, 2));
472
+ console.error(`Report written to: ${options.report}`);
473
+ }
474
+ // Summary to stderr
475
+ const { summary } = report;
476
+ console.error(`\nReconciliation summary:`);
477
+ console.error(` Input records: ${summary.totalInputRecords}`);
478
+ console.error(` Exact duplicates: -${summary.exactDuplicatesRemoved}`);
479
+ console.error(` Near-duplicates: ~${summary.nearDuplicatesMerged} merged`);
480
+ console.error(` Conflicts resolved: ${summary.conflictsResolved}`);
481
+ if (summary.conflictsUnresolved > 0) {
482
+ console.error(` ⚠️ Unresolved: ${summary.conflictsUnresolved}`);
483
+ }
484
+ console.error(` Final records: ${summary.finalRecordCount}`);
485
+ if (globalOpts.json) {
486
+ printResult(report, globalOpts);
487
+ }
488
+ });
489
+ }
490
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/commands/reconcile.ts"],"names":[],"mappings":"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"}