@the-cascade-protocol/cli 0.2.5 → 0.3.0

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 (74) hide show
  1. package/dist/commands/convert.d.ts +8 -5
  2. package/dist/commands/convert.d.ts.map +1 -1
  3. package/dist/commands/convert.js +51 -7
  4. package/dist/commands/convert.js.map +1 -1
  5. package/dist/commands/pod/helpers.d.ts +2 -0
  6. package/dist/commands/pod/helpers.d.ts.map +1 -1
  7. package/dist/commands/pod/helpers.js +62 -1
  8. package/dist/commands/pod/helpers.js.map +1 -1
  9. package/dist/commands/pod/import.d.ts +20 -0
  10. package/dist/commands/pod/import.d.ts.map +1 -0
  11. package/dist/commands/pod/import.js +382 -0
  12. package/dist/commands/pod/import.js.map +1 -0
  13. package/dist/commands/pod/index.d.ts.map +1 -1
  14. package/dist/commands/pod/index.js +2 -0
  15. package/dist/commands/pod/index.js.map +1 -1
  16. package/dist/commands/reconcile.d.ts.map +1 -1
  17. package/dist/commands/reconcile.js +22 -396
  18. package/dist/commands/reconcile.js.map +1 -1
  19. package/dist/lib/fhir-converter/cascade-to-fhir-admin.d.ts +13 -0
  20. package/dist/lib/fhir-converter/cascade-to-fhir-admin.d.ts.map +1 -0
  21. package/dist/lib/fhir-converter/cascade-to-fhir-admin.js +70 -0
  22. package/dist/lib/fhir-converter/cascade-to-fhir-admin.js.map +1 -0
  23. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.d.ts +36 -0
  24. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.d.ts.map +1 -0
  25. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.js +407 -0
  26. package/dist/lib/fhir-converter/cascade-to-fhir-clinical.js.map +1 -0
  27. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.d.ts +15 -0
  28. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.d.ts.map +1 -0
  29. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.js +115 -0
  30. package/dist/lib/fhir-converter/cascade-to-fhir-demographics.js.map +1 -0
  31. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts +9 -3
  32. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts.map +1 -1
  33. package/dist/lib/fhir-converter/cascade-to-fhir.js +69 -290
  34. package/dist/lib/fhir-converter/cascade-to-fhir.js.map +1 -1
  35. package/dist/lib/fhir-converter/converters-clinical-admin.d.ts +16 -0
  36. package/dist/lib/fhir-converter/converters-clinical-admin.d.ts.map +1 -0
  37. package/dist/lib/fhir-converter/converters-clinical-admin.js +166 -0
  38. package/dist/lib/fhir-converter/converters-clinical-admin.js.map +1 -0
  39. package/dist/lib/fhir-converter/converters-clinical.d.ts +28 -0
  40. package/dist/lib/fhir-converter/converters-clinical.d.ts.map +1 -1
  41. package/dist/lib/fhir-converter/converters-clinical.js +436 -11
  42. package/dist/lib/fhir-converter/converters-clinical.js.map +1 -1
  43. package/dist/lib/fhir-converter/converters-demographics.d.ts.map +1 -1
  44. package/dist/lib/fhir-converter/converters-demographics.js +4 -5
  45. package/dist/lib/fhir-converter/converters-demographics.js.map +1 -1
  46. package/dist/lib/fhir-converter/converters-passthrough.d.ts +29 -0
  47. package/dist/lib/fhir-converter/converters-passthrough.d.ts.map +1 -0
  48. package/dist/lib/fhir-converter/converters-passthrough.js +86 -0
  49. package/dist/lib/fhir-converter/converters-passthrough.js.map +1 -0
  50. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts +8 -4
  51. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts.map +1 -1
  52. package/dist/lib/fhir-converter/fhir-to-cascade.js +41 -10
  53. package/dist/lib/fhir-converter/fhir-to-cascade.js.map +1 -1
  54. package/dist/lib/fhir-converter/import-manifest.d.ts +40 -0
  55. package/dist/lib/fhir-converter/import-manifest.d.ts.map +1 -0
  56. package/dist/lib/fhir-converter/import-manifest.js +66 -0
  57. package/dist/lib/fhir-converter/import-manifest.js.map +1 -0
  58. package/dist/lib/fhir-converter/index.d.ts +33 -13
  59. package/dist/lib/fhir-converter/index.d.ts.map +1 -1
  60. package/dist/lib/fhir-converter/index.js +38 -17
  61. package/dist/lib/fhir-converter/index.js.map +1 -1
  62. package/dist/lib/fhir-converter/types.d.ts +12 -1
  63. package/dist/lib/fhir-converter/types.d.ts.map +1 -1
  64. package/dist/lib/fhir-converter/types.js +67 -2
  65. package/dist/lib/fhir-converter/types.js.map +1 -1
  66. package/dist/lib/output.d.ts +5 -0
  67. package/dist/lib/output.d.ts.map +1 -1
  68. package/dist/lib/output.js +6 -1
  69. package/dist/lib/output.js.map +1 -1
  70. package/dist/lib/reconciler.d.ts +45 -0
  71. package/dist/lib/reconciler.d.ts.map +1 -0
  72. package/dist/lib/reconciler.js +397 -0
  73. package/dist/lib/reconciler.js.map +1 -0
  74. package/package.json +1 -1
@@ -29,283 +29,8 @@
29
29
  */
30
30
  import { readFileSync, writeFileSync } from 'node:fs';
31
31
  import { basename } from 'node:path';
32
- import { Parser, Writer, DataFactory } from 'n3';
33
32
  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
- }
33
+ import { runReconciliation } from '../lib/reconciler.js';
309
34
  // ---------------------------------------------------------------------------
310
35
  // Command registration
311
36
  // ---------------------------------------------------------------------------
@@ -325,7 +50,7 @@ export function registerReconcileCommand(program) {
325
50
  process.exitCode = 1;
326
51
  return;
327
52
  }
328
- const trustScores = { 'primary-care': 0.90, 'specialist': 0.85, 'hospital': 0.95 };
53
+ const trustScores = {};
329
54
  if (options.trust) {
330
55
  for (const pair of options.trust.split(',')) {
331
56
  const [sys, score] = pair.split('=');
@@ -333,157 +58,58 @@ export function registerReconcileCommand(program) {
333
58
  trustScores[sys] = parseFloat(score);
334
59
  }
335
60
  }
336
- const defaultTrust = 0.80;
337
- const labTol = parseFloat(options.labTolerance);
61
+ const labTolerance = parseFloat(options.labTolerance);
338
62
  printVerbose(`Reconciling ${files.length} files`, globalOpts);
339
63
  printVerbose(`Trust scores: ${JSON.stringify(trustScores)}`, globalOpts);
340
- // Parse all files
341
- const allRecords = [];
342
- const sourceInfo = [];
64
+ // Read all files
65
+ const inputs = [];
343
66
  for (const filePath of files) {
344
67
  let turtle;
345
68
  try {
346
69
  turtle = readFileSync(filePath, 'utf-8');
347
70
  }
348
- catch (err) {
71
+ catch {
349
72
  printError(`Cannot read file: ${filePath}`, globalOpts);
350
73
  process.exitCode = 1;
351
74
  return;
352
75
  }
353
76
  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);
77
+ inputs.push({ content: turtle, systemName, file: filePath });
78
+ printVerbose(` Loading ${filePath} (system: ${systemName})`, globalOpts);
366
79
  }
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
- };
80
+ const result = await runReconciliation(inputs.map(i => ({ content: i.content, systemName: i.systemName })), { trustScores, labTolerance });
462
81
  // Output
463
82
  if (options.output) {
464
- writeFileSync(options.output, mergedTurtle);
83
+ writeFileSync(options.output, result.turtle);
465
84
  console.error(`Merged Turtle written to: ${options.output}`);
466
85
  }
467
86
  else {
468
- console.log(mergedTurtle);
87
+ console.log(result.turtle);
469
88
  }
89
+ const reportData = {
90
+ generatedAt: new Date().toISOString(),
91
+ sources: result.report.sources,
92
+ summary: result.report.summary,
93
+ transformations: result.report.transformations,
94
+ unresolvedConflicts: result.report.unresolvedConflicts,
95
+ };
470
96
  if (options.report) {
471
- writeFileSync(options.report, JSON.stringify(report, null, 2));
97
+ writeFileSync(options.report, JSON.stringify(reportData, null, 2));
472
98
  console.error(`Report written to: ${options.report}`);
473
99
  }
474
100
  // Summary to stderr
475
- const { summary } = report;
101
+ const { summary } = result.report;
476
102
  console.error(`\nReconciliation summary:`);
477
103
  console.error(` Input records: ${summary.totalInputRecords}`);
478
104
  console.error(` Exact duplicates: -${summary.exactDuplicatesRemoved}`);
479
105
  console.error(` Near-duplicates: ~${summary.nearDuplicatesMerged} merged`);
480
106
  console.error(` Conflicts resolved: ${summary.conflictsResolved}`);
481
107
  if (summary.conflictsUnresolved > 0) {
482
- console.error(` ⚠️ Unresolved: ${summary.conflictsUnresolved}`);
108
+ console.error(` Unresolved: ${summary.conflictsUnresolved}`);
483
109
  }
484
110
  console.error(` Final records: ${summary.finalRecordCount}`);
485
111
  if (globalOpts.json) {
486
- printResult(report, globalOpts);
112
+ printResult(reportData, globalOpts);
487
113
  }
488
114
  });
489
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/commands/reconcile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/commands/reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Cascade -> FHIR reverse converters for administrative/financial types.
3
+ *
4
+ * Handles:
5
+ * coverage:ClaimRecord -> Claim
6
+ * coverage:BenefitStatement -> ExplanationOfBenefit
7
+ */
8
+ type PV = Map<string, string[]>;
9
+ type FhirResource = Record<string, any>;
10
+ export declare function restoreClaimRecord(pv: PV, _warnings: string[]): FhirResource;
11
+ export declare function restoreBenefitStatement(pv: PV, _warnings: string[]): FhirResource;
12
+ export {};
13
+ //# sourceMappingURL=cascade-to-fhir-admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-to-fhir-admin.d.ts","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir-admin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAChC,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAMxC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CAyB5E;AAMD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,CA8BjF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Cascade -> FHIR reverse converters for administrative/financial types.
3
+ *
4
+ * Handles:
5
+ * coverage:ClaimRecord -> Claim
6
+ * coverage:BenefitStatement -> ExplanationOfBenefit
7
+ */
8
+ import { NS } from './types.js';
9
+ // ---------------------------------------------------------------------------
10
+ // Claim
11
+ // ---------------------------------------------------------------------------
12
+ export function restoreClaimRecord(pv, _warnings) {
13
+ const getFirst = (pred) => pv.get(pred)?.[0];
14
+ const fhirResource = {
15
+ resourceType: 'Claim',
16
+ status: getFirst(NS.coverage + 'claimStatus') ?? 'active',
17
+ use: 'claim',
18
+ };
19
+ const claimDate = getFirst(NS.coverage + 'claimDate');
20
+ if (claimDate)
21
+ fhirResource.created = claimDate;
22
+ const claimType = getFirst(NS.coverage + 'claimType');
23
+ if (claimType)
24
+ fhirResource.type = { coding: [{ code: claimType }] };
25
+ const provider = getFirst(NS.coverage + 'billingProvider');
26
+ if (provider)
27
+ fhirResource.provider = { display: provider };
28
+ const total = getFirst(NS.coverage + 'claimTotal');
29
+ if (total)
30
+ fhirResource.total = { value: parseFloat(total) };
31
+ const srcId = getFirst(NS.coverage + 'sourceRecordId');
32
+ if (srcId)
33
+ fhirResource.id = srcId;
34
+ return fhirResource;
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Explanation of Benefit
38
+ // ---------------------------------------------------------------------------
39
+ export function restoreBenefitStatement(pv, _warnings) {
40
+ const getFirst = (pred) => pv.get(pred)?.[0];
41
+ const fhirResource = {
42
+ resourceType: 'ExplanationOfBenefit',
43
+ status: getFirst(NS.coverage + 'adjudicationStatus') ?? 'active',
44
+ use: 'claim',
45
+ outcome: getFirst(NS.coverage + 'outcomeCode') ?? 'complete',
46
+ };
47
+ const adjDate = getFirst(NS.coverage + 'adjudicationDate');
48
+ if (adjDate)
49
+ fhirResource.created = adjDate;
50
+ const denialReason = getFirst(NS.coverage + 'denialReason');
51
+ if (denialReason)
52
+ fhirResource.adjudication = [{ reason: { text: denialReason } }];
53
+ const totalBilled = getFirst(NS.coverage + 'totalBilled');
54
+ const totalPaid = getFirst(NS.coverage + 'totalPaid');
55
+ const totalArr = [];
56
+ if (totalBilled)
57
+ totalArr.push({ category: { coding: [{ code: 'submitted' }] }, amount: { value: parseFloat(totalBilled) } });
58
+ if (totalPaid)
59
+ totalArr.push({ category: { coding: [{ code: 'benefit' }] }, amount: { value: parseFloat(totalPaid) } });
60
+ if (totalArr.length > 0)
61
+ fhirResource.total = totalArr;
62
+ const claimRef = getFirst(NS.coverage + 'relatedClaim');
63
+ if (claimRef)
64
+ fhirResource.claim = { reference: claimRef };
65
+ const srcId = getFirst(NS.coverage + 'sourceRecordId');
66
+ if (srcId)
67
+ fhirResource.id = srcId;
68
+ return fhirResource;
69
+ }
70
+ //# sourceMappingURL=cascade-to-fhir-admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-to-fhir-admin.js","sourceRoot":"","sources":["../../../src/lib/fhir-converter/cascade-to-fhir-admin.ts"],"names":[],"mappings":"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"}