@claude-flow/plugin-healthcare-clinical 3.0.0-alpha.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.
- package/README.md +280 -0
- package/dist/bridges/gnn-bridge.d.ts +70 -0
- package/dist/bridges/gnn-bridge.d.ts.map +1 -0
- package/dist/bridges/gnn-bridge.js +534 -0
- package/dist/bridges/gnn-bridge.js.map +1 -0
- package/dist/bridges/hnsw-bridge.d.ts +98 -0
- package/dist/bridges/hnsw-bridge.d.ts.map +1 -0
- package/dist/bridges/hnsw-bridge.js +390 -0
- package/dist/bridges/hnsw-bridge.js.map +1 -0
- package/dist/bridges/index.d.ts +8 -0
- package/dist/bridges/index.d.ts.map +1 -0
- package/dist/bridges/index.js +8 -0
- package/dist/bridges/index.js.map +1 -0
- package/dist/index.d.ts +95 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-tools.d.ts +22 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +525 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/types.d.ts +638 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +166 -0
- package/dist/types.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GNN Bridge - Healthcare Clinical Plugin
|
|
3
|
+
*
|
|
4
|
+
* Provides Graph Neural Network capabilities for clinical pathway
|
|
5
|
+
* analysis and drug interaction detection. Integrates with
|
|
6
|
+
* ruvector-gnn-wasm for efficient graph-based reasoning.
|
|
7
|
+
*
|
|
8
|
+
* Use Cases:
|
|
9
|
+
* - Clinical pathway recommendations
|
|
10
|
+
* - Drug interaction network analysis
|
|
11
|
+
* - Comorbidity pattern detection
|
|
12
|
+
* - Treatment outcome prediction
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Default logger
|
|
16
|
+
*/
|
|
17
|
+
const defaultLogger = {
|
|
18
|
+
debug: (msg, meta) => console.debug(`[gnn-bridge] ${msg}`, meta),
|
|
19
|
+
info: (msg, meta) => console.info(`[gnn-bridge] ${msg}`, meta),
|
|
20
|
+
warn: (msg, meta) => console.warn(`[gnn-bridge] ${msg}`, meta),
|
|
21
|
+
error: (msg, meta) => console.error(`[gnn-bridge] ${msg}`, meta),
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Drug interaction graph with known interactions
|
|
25
|
+
*/
|
|
26
|
+
class DrugInteractionGraph {
|
|
27
|
+
interactions = new Map();
|
|
28
|
+
severityOrder = ['contraindicated', 'major', 'moderate', 'minor'];
|
|
29
|
+
constructor() {
|
|
30
|
+
this.loadKnownInteractions();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Load known drug interactions
|
|
34
|
+
* In production, this would load from a clinical database
|
|
35
|
+
*/
|
|
36
|
+
loadKnownInteractions() {
|
|
37
|
+
// Sample known drug-drug interactions
|
|
38
|
+
const knownInteractions = [
|
|
39
|
+
{
|
|
40
|
+
drug1: 'warfarin',
|
|
41
|
+
drug2: 'aspirin',
|
|
42
|
+
severity: 'major',
|
|
43
|
+
description: 'Increased risk of bleeding when warfarin is combined with aspirin',
|
|
44
|
+
mechanism: 'Both drugs affect blood clotting through different mechanisms',
|
|
45
|
+
clinicalEffect: 'Enhanced anticoagulation, increased bleeding risk',
|
|
46
|
+
management: 'Monitor INR closely, consider alternative antiplatelet agent',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
drug1: 'metformin',
|
|
50
|
+
drug2: 'contrast_dye',
|
|
51
|
+
severity: 'major',
|
|
52
|
+
description: 'Risk of lactic acidosis with iodinated contrast media',
|
|
53
|
+
mechanism: 'Contrast-induced nephropathy may impair metformin clearance',
|
|
54
|
+
clinicalEffect: 'Potential for severe metabolic acidosis',
|
|
55
|
+
management: 'Hold metformin 48 hours before and after contrast administration',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
drug1: 'simvastatin',
|
|
59
|
+
drug2: 'clarithromycin',
|
|
60
|
+
severity: 'contraindicated',
|
|
61
|
+
description: 'Significantly increased risk of myopathy and rhabdomyolysis',
|
|
62
|
+
mechanism: 'Clarithromycin inhibits CYP3A4, increasing simvastatin levels',
|
|
63
|
+
clinicalEffect: 'Muscle damage, potential kidney failure',
|
|
64
|
+
management: 'Avoid combination, use azithromycin if macrolide needed',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
drug1: 'lisinopril',
|
|
68
|
+
drug2: 'potassium',
|
|
69
|
+
severity: 'moderate',
|
|
70
|
+
description: 'Increased risk of hyperkalemia',
|
|
71
|
+
mechanism: 'ACE inhibitors reduce aldosterone, preserving potassium',
|
|
72
|
+
clinicalEffect: 'Elevated serum potassium levels',
|
|
73
|
+
management: 'Monitor potassium levels regularly',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
drug1: 'ssri',
|
|
77
|
+
drug2: 'maoi',
|
|
78
|
+
severity: 'contraindicated',
|
|
79
|
+
description: 'Risk of serotonin syndrome',
|
|
80
|
+
mechanism: 'Combined serotonergic activity',
|
|
81
|
+
clinicalEffect: 'Potentially fatal serotonin toxicity',
|
|
82
|
+
management: 'Allow 2-week washout period between drugs',
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
for (const interaction of knownInteractions) {
|
|
86
|
+
const key1 = this.getInteractionKey(interaction.drug1, interaction.drug2);
|
|
87
|
+
const key2 = this.getInteractionKey(interaction.drug2, interaction.drug1);
|
|
88
|
+
if (!this.interactions.has(key1)) {
|
|
89
|
+
this.interactions.set(key1, []);
|
|
90
|
+
}
|
|
91
|
+
this.interactions.get(key1).push(interaction);
|
|
92
|
+
if (!this.interactions.has(key2)) {
|
|
93
|
+
this.interactions.set(key2, []);
|
|
94
|
+
}
|
|
95
|
+
this.interactions.get(key2).push({
|
|
96
|
+
...interaction,
|
|
97
|
+
drug1: interaction.drug2,
|
|
98
|
+
drug2: interaction.drug1,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check for drug interactions
|
|
104
|
+
*/
|
|
105
|
+
checkInteractions(medications, severityFilter = 'all') {
|
|
106
|
+
const results = [];
|
|
107
|
+
const normalized = medications.map(m => m.toLowerCase().trim());
|
|
108
|
+
for (let i = 0; i < normalized.length; i++) {
|
|
109
|
+
for (let j = i + 1; j < normalized.length; j++) {
|
|
110
|
+
const drug1 = normalized[i];
|
|
111
|
+
const drug2 = normalized[j];
|
|
112
|
+
const key = this.getInteractionKey(drug1, drug2);
|
|
113
|
+
const interactions = this.interactions.get(key);
|
|
114
|
+
if (interactions) {
|
|
115
|
+
for (const interaction of interactions) {
|
|
116
|
+
if (severityFilter === 'all' || this.meetsSeverityFilter(interaction.severity, severityFilter)) {
|
|
117
|
+
results.push(interaction);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Sort by severity
|
|
124
|
+
results.sort((a, b) => {
|
|
125
|
+
return this.severityOrder.indexOf(a.severity) - this.severityOrder.indexOf(b.severity);
|
|
126
|
+
});
|
|
127
|
+
return results;
|
|
128
|
+
}
|
|
129
|
+
getInteractionKey(drug1, drug2) {
|
|
130
|
+
return [drug1.toLowerCase(), drug2.toLowerCase()].sort().join('::');
|
|
131
|
+
}
|
|
132
|
+
meetsSeverityFilter(severity, filter) {
|
|
133
|
+
if (filter === 'all')
|
|
134
|
+
return true;
|
|
135
|
+
const filterIndex = this.severityOrder.indexOf(filter);
|
|
136
|
+
const severityIndex = this.severityOrder.indexOf(severity);
|
|
137
|
+
return severityIndex <= filterIndex;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Clinical pathway graph for treatment recommendations
|
|
142
|
+
*/
|
|
143
|
+
class ClinicalPathwayGraph {
|
|
144
|
+
pathways = new Map();
|
|
145
|
+
constructor() {
|
|
146
|
+
this.loadStandardPathways();
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Load standard clinical pathways
|
|
150
|
+
* In production, load from clinical guideline database
|
|
151
|
+
*/
|
|
152
|
+
loadStandardPathways() {
|
|
153
|
+
const samplePathways = [
|
|
154
|
+
{
|
|
155
|
+
id: 'dm2-management',
|
|
156
|
+
name: 'Type 2 Diabetes Management',
|
|
157
|
+
diagnosis: 'E11',
|
|
158
|
+
version: '2024.1',
|
|
159
|
+
evidenceLevel: 'systematic-review',
|
|
160
|
+
steps: [
|
|
161
|
+
{
|
|
162
|
+
id: 'dm2-1',
|
|
163
|
+
name: 'Initial Assessment',
|
|
164
|
+
description: 'Complete metabolic panel, HbA1c, lipid panel',
|
|
165
|
+
type: 'assessment',
|
|
166
|
+
timing: 'Day 1',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 'dm2-2',
|
|
170
|
+
name: 'Lifestyle Modification',
|
|
171
|
+
description: 'Diet counseling, exercise prescription',
|
|
172
|
+
type: 'intervention',
|
|
173
|
+
timing: 'Weeks 1-12',
|
|
174
|
+
prerequisites: ['dm2-1'],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'dm2-3',
|
|
178
|
+
name: 'Metformin Initiation',
|
|
179
|
+
description: 'Start metformin if HbA1c > 6.5%',
|
|
180
|
+
type: 'decision',
|
|
181
|
+
timing: 'Week 1',
|
|
182
|
+
prerequisites: ['dm2-1'],
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
id: 'dm2-4',
|
|
186
|
+
name: 'Glycemic Monitoring',
|
|
187
|
+
description: 'Regular HbA1c monitoring every 3 months',
|
|
188
|
+
type: 'monitoring',
|
|
189
|
+
timing: 'Ongoing',
|
|
190
|
+
prerequisites: ['dm2-2', 'dm2-3'],
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
id: 'htn-management',
|
|
196
|
+
name: 'Hypertension Management',
|
|
197
|
+
diagnosis: 'I10',
|
|
198
|
+
version: '2024.1',
|
|
199
|
+
evidenceLevel: 'rct',
|
|
200
|
+
steps: [
|
|
201
|
+
{
|
|
202
|
+
id: 'htn-1',
|
|
203
|
+
name: 'Blood Pressure Confirmation',
|
|
204
|
+
description: 'Confirm elevated BP with multiple readings',
|
|
205
|
+
type: 'assessment',
|
|
206
|
+
timing: 'Days 1-7',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: 'htn-2',
|
|
210
|
+
name: 'Risk Stratification',
|
|
211
|
+
description: 'Assess cardiovascular risk factors',
|
|
212
|
+
type: 'assessment',
|
|
213
|
+
timing: 'Day 1',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: 'htn-3',
|
|
217
|
+
name: 'Lifestyle Modification',
|
|
218
|
+
description: 'DASH diet, sodium restriction, exercise',
|
|
219
|
+
type: 'intervention',
|
|
220
|
+
timing: 'Weeks 1-8',
|
|
221
|
+
prerequisites: ['htn-1', 'htn-2'],
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
id: 'htn-4',
|
|
225
|
+
name: 'ACE Inhibitor or ARB',
|
|
226
|
+
description: 'First-line pharmacotherapy',
|
|
227
|
+
type: 'decision',
|
|
228
|
+
timing: 'Week 1-2',
|
|
229
|
+
prerequisites: ['htn-2'],
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
},
|
|
233
|
+
];
|
|
234
|
+
for (const pathway of samplePathways) {
|
|
235
|
+
this.pathways.set(pathway.diagnosis, pathway);
|
|
236
|
+
this.pathways.set(pathway.id, pathway);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Find pathway by diagnosis code
|
|
241
|
+
*/
|
|
242
|
+
findPathway(diagnosis) {
|
|
243
|
+
// Try exact match first
|
|
244
|
+
let pathway = this.pathways.get(diagnosis);
|
|
245
|
+
if (pathway)
|
|
246
|
+
return pathway;
|
|
247
|
+
// Try ICD-10 category match (first 3 characters)
|
|
248
|
+
const category = diagnosis.substring(0, 3);
|
|
249
|
+
pathway = this.pathways.get(category);
|
|
250
|
+
if (pathway)
|
|
251
|
+
return pathway;
|
|
252
|
+
// Search by diagnosis prefix
|
|
253
|
+
for (const [key, value] of this.pathways) {
|
|
254
|
+
if (diagnosis.startsWith(key) || key.startsWith(diagnosis)) {
|
|
255
|
+
return value;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return undefined;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get all available pathways
|
|
262
|
+
*/
|
|
263
|
+
getAllPathways() {
|
|
264
|
+
const seen = new Set();
|
|
265
|
+
const results = [];
|
|
266
|
+
for (const pathway of this.pathways.values()) {
|
|
267
|
+
if (!seen.has(pathway.id)) {
|
|
268
|
+
seen.add(pathway.id);
|
|
269
|
+
results.push(pathway);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return results;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Healthcare GNN Bridge implementation
|
|
277
|
+
*/
|
|
278
|
+
export class HealthcareGNNBridge {
|
|
279
|
+
wasmModule = null;
|
|
280
|
+
graphPtr = 0;
|
|
281
|
+
config;
|
|
282
|
+
logger;
|
|
283
|
+
nodes = new Map();
|
|
284
|
+
edges = [];
|
|
285
|
+
nodeIdToIndex = new Map();
|
|
286
|
+
drugInteractionGraph;
|
|
287
|
+
clinicalPathwayGraph;
|
|
288
|
+
initialized = false;
|
|
289
|
+
constructor(config, logger) {
|
|
290
|
+
this.config = {
|
|
291
|
+
hiddenDimensions: config?.hiddenDimensions ?? 256,
|
|
292
|
+
numLayers: config?.numLayers ?? 3,
|
|
293
|
+
dropout: config?.dropout ?? 0.1,
|
|
294
|
+
aggregationType: config?.aggregationType ?? 'mean',
|
|
295
|
+
};
|
|
296
|
+
this.logger = logger ?? defaultLogger;
|
|
297
|
+
this.drugInteractionGraph = new DrugInteractionGraph();
|
|
298
|
+
this.clinicalPathwayGraph = new ClinicalPathwayGraph();
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Initialize the GNN bridge
|
|
302
|
+
*/
|
|
303
|
+
async initialize(config) {
|
|
304
|
+
if (config) {
|
|
305
|
+
this.config = { ...this.config, ...config };
|
|
306
|
+
}
|
|
307
|
+
try {
|
|
308
|
+
const wasmPath = await this.resolveWasmPath();
|
|
309
|
+
if (wasmPath) {
|
|
310
|
+
this.wasmModule = await this.loadWasmModule(wasmPath);
|
|
311
|
+
this.logger.info('GNN WASM module initialized', {
|
|
312
|
+
hiddenDimensions: this.config.hiddenDimensions,
|
|
313
|
+
numLayers: this.config.numLayers,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this.logger.warn('WASM module not available, using fallback implementation');
|
|
318
|
+
}
|
|
319
|
+
this.initialized = true;
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
this.logger.warn('Failed to initialize WASM, using fallback', {
|
|
323
|
+
error: error instanceof Error ? error.message : String(error),
|
|
324
|
+
});
|
|
325
|
+
this.initialized = true;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Load a graph into the GNN
|
|
330
|
+
*/
|
|
331
|
+
async loadGraph(nodes, edges) {
|
|
332
|
+
if (!this.initialized) {
|
|
333
|
+
throw new Error('GNN bridge not initialized');
|
|
334
|
+
}
|
|
335
|
+
// Clear existing graph
|
|
336
|
+
this.nodes.clear();
|
|
337
|
+
this.edges = [];
|
|
338
|
+
this.nodeIdToIndex.clear();
|
|
339
|
+
// Index nodes
|
|
340
|
+
let idx = 0;
|
|
341
|
+
for (const node of nodes) {
|
|
342
|
+
this.nodes.set(node.id, node);
|
|
343
|
+
this.nodeIdToIndex.set(node.id, idx++);
|
|
344
|
+
}
|
|
345
|
+
// Store edges
|
|
346
|
+
this.edges = edges;
|
|
347
|
+
if (this.wasmModule) {
|
|
348
|
+
// Create WASM graph
|
|
349
|
+
const featureDim = nodes[0]?.features.length ?? 128;
|
|
350
|
+
this.graphPtr = this.wasmModule.create_graph(nodes.length, edges.length, featureDim);
|
|
351
|
+
// Add nodes
|
|
352
|
+
for (const node of nodes) {
|
|
353
|
+
const nodeIdx = this.nodeIdToIndex.get(node.id);
|
|
354
|
+
this.wasmModule.add_node(this.graphPtr, nodeIdx, new Float32Array(node.features));
|
|
355
|
+
}
|
|
356
|
+
// Add edges
|
|
357
|
+
for (const edge of edges) {
|
|
358
|
+
const sourceIdx = this.nodeIdToIndex.get(edge.source);
|
|
359
|
+
const targetIdx = this.nodeIdToIndex.get(edge.target);
|
|
360
|
+
if (sourceIdx !== undefined && targetIdx !== undefined) {
|
|
361
|
+
this.wasmModule.add_edge(this.graphPtr, sourceIdx, targetIdx, 0, edge.weight ?? 1.0);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
this.logger.info('Graph loaded', { nodes: nodes.length, edges: edges.length });
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Predict optimal pathway between nodes
|
|
369
|
+
*/
|
|
370
|
+
async predictPathway(startNode, endNode, constraints) {
|
|
371
|
+
if (!this.initialized) {
|
|
372
|
+
throw new Error('GNN bridge not initialized');
|
|
373
|
+
}
|
|
374
|
+
const startTime = performance.now();
|
|
375
|
+
if (this.wasmModule && this.graphPtr) {
|
|
376
|
+
const startIdx = this.nodeIdToIndex.get(startNode);
|
|
377
|
+
const endIdx = this.nodeIdToIndex.get(endNode);
|
|
378
|
+
if (startIdx !== undefined && endIdx !== undefined) {
|
|
379
|
+
const maxHops = constraints?.maxHops ?? 10;
|
|
380
|
+
const pathIndices = this.wasmModule.predict_path(this.graphPtr, startIdx, endIdx, maxHops);
|
|
381
|
+
const path = Array.from(pathIndices)
|
|
382
|
+
.map(idx => this.getNodeIdByIndex(idx))
|
|
383
|
+
.filter((id) => id !== undefined);
|
|
384
|
+
return {
|
|
385
|
+
path,
|
|
386
|
+
confidence: 0.85,
|
|
387
|
+
alternativePaths: [],
|
|
388
|
+
riskScore: 0.2,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Fallback: BFS path finding
|
|
393
|
+
const path = this.bfsPath(startNode, endNode, constraints);
|
|
394
|
+
const duration = performance.now() - startTime;
|
|
395
|
+
this.logger.debug('Pathway predicted', { startNode, endNode, pathLength: path.length, durationMs: duration });
|
|
396
|
+
return {
|
|
397
|
+
path,
|
|
398
|
+
confidence: path.length > 0 ? 0.75 : 0,
|
|
399
|
+
alternativePaths: [],
|
|
400
|
+
riskScore: this.calculatePathRisk(path),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Analyze interactions between nodes
|
|
405
|
+
*/
|
|
406
|
+
async analyzeInteractions(nodeIds) {
|
|
407
|
+
if (!this.initialized) {
|
|
408
|
+
throw new Error('GNN bridge not initialized');
|
|
409
|
+
}
|
|
410
|
+
// Use drug interaction graph for medication analysis
|
|
411
|
+
const drugInteractions = this.drugInteractionGraph.checkInteractions(nodeIds);
|
|
412
|
+
const interactions = drugInteractions.map(di => ({
|
|
413
|
+
nodes: [di.drug1, di.drug2],
|
|
414
|
+
type: 'drug-drug',
|
|
415
|
+
strength: this.severityToStrength(di.severity),
|
|
416
|
+
direction: 'bidirectional',
|
|
417
|
+
}));
|
|
418
|
+
const riskFactors = drugInteractions
|
|
419
|
+
.filter(di => di.severity === 'major' || di.severity === 'contraindicated')
|
|
420
|
+
.map(di => `${di.drug1} + ${di.drug2}: ${di.description}`);
|
|
421
|
+
const recommendations = drugInteractions.map(di => di.management ?? 'Monitor closely');
|
|
422
|
+
return {
|
|
423
|
+
interactions,
|
|
424
|
+
riskFactors,
|
|
425
|
+
recommendations: [...new Set(recommendations)],
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Get clinical pathway for a diagnosis
|
|
430
|
+
*/
|
|
431
|
+
getClinicalPathway(diagnosis) {
|
|
432
|
+
return this.clinicalPathwayGraph.findPathway(diagnosis);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Check drug interactions
|
|
436
|
+
*/
|
|
437
|
+
checkDrugInteractions(medications, severityFilter = 'all') {
|
|
438
|
+
return this.drugInteractionGraph.checkInteractions(medications, severityFilter);
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Cleanup resources
|
|
442
|
+
*/
|
|
443
|
+
destroy() {
|
|
444
|
+
if (this.wasmModule && this.graphPtr) {
|
|
445
|
+
this.wasmModule.free_graph(this.graphPtr);
|
|
446
|
+
}
|
|
447
|
+
this.nodes.clear();
|
|
448
|
+
this.edges = [];
|
|
449
|
+
this.nodeIdToIndex.clear();
|
|
450
|
+
this.initialized = false;
|
|
451
|
+
}
|
|
452
|
+
// Private methods
|
|
453
|
+
async resolveWasmPath() {
|
|
454
|
+
try {
|
|
455
|
+
// Dynamic import with type assertion for optional WASM package
|
|
456
|
+
const module = await import(/* webpackIgnore: true */ 'ruvector-gnn-wasm');
|
|
457
|
+
return module.default ?? null;
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
return null;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
async loadWasmModule(wasmPath) {
|
|
464
|
+
const module = await import(wasmPath);
|
|
465
|
+
await module.default();
|
|
466
|
+
return module;
|
|
467
|
+
}
|
|
468
|
+
getNodeIdByIndex(index) {
|
|
469
|
+
for (const [id, idx] of this.nodeIdToIndex) {
|
|
470
|
+
if (idx === index)
|
|
471
|
+
return id;
|
|
472
|
+
}
|
|
473
|
+
return undefined;
|
|
474
|
+
}
|
|
475
|
+
bfsPath(start, end, constraints) {
|
|
476
|
+
const visited = new Set();
|
|
477
|
+
const queue = [{ node: start, path: [start] }];
|
|
478
|
+
const excludeNodes = new Set(constraints?.excludeNodes ?? []);
|
|
479
|
+
const maxHops = constraints?.maxHops ?? 10;
|
|
480
|
+
while (queue.length > 0) {
|
|
481
|
+
const current = queue.shift();
|
|
482
|
+
if (current.node === end) {
|
|
483
|
+
return current.path;
|
|
484
|
+
}
|
|
485
|
+
if (current.path.length > maxHops)
|
|
486
|
+
continue;
|
|
487
|
+
if (visited.has(current.node))
|
|
488
|
+
continue;
|
|
489
|
+
visited.add(current.node);
|
|
490
|
+
// Find adjacent nodes
|
|
491
|
+
for (const edge of this.edges) {
|
|
492
|
+
let neighbor = null;
|
|
493
|
+
if (edge.source === current.node)
|
|
494
|
+
neighbor = edge.target;
|
|
495
|
+
if (edge.target === current.node)
|
|
496
|
+
neighbor = edge.source;
|
|
497
|
+
if (neighbor && !visited.has(neighbor) && !excludeNodes.has(neighbor)) {
|
|
498
|
+
queue.push({ node: neighbor, path: [...current.path, neighbor] });
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return [];
|
|
503
|
+
}
|
|
504
|
+
calculatePathRisk(path) {
|
|
505
|
+
if (path.length === 0)
|
|
506
|
+
return 1.0;
|
|
507
|
+
let risk = 0;
|
|
508
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
509
|
+
const edge = this.edges.find(e => (e.source === path[i] && e.target === path[i + 1]) ||
|
|
510
|
+
(e.target === path[i] && e.source === path[i + 1]));
|
|
511
|
+
if (edge && edge.weight !== undefined) {
|
|
512
|
+
risk += 1 - edge.weight;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
return Math.min(risk / path.length, 1.0);
|
|
516
|
+
}
|
|
517
|
+
severityToStrength(severity) {
|
|
518
|
+
switch (severity) {
|
|
519
|
+
case 'contraindicated': return 1.0;
|
|
520
|
+
case 'major': return 0.8;
|
|
521
|
+
case 'moderate': return 0.5;
|
|
522
|
+
case 'minor': return 0.2;
|
|
523
|
+
default: return 0.5;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Create a new GNN bridge instance
|
|
529
|
+
*/
|
|
530
|
+
export function createGNNBridge(config, logger) {
|
|
531
|
+
return new HealthcareGNNBridge(config, logger);
|
|
532
|
+
}
|
|
533
|
+
export default HealthcareGNNBridge;
|
|
534
|
+
//# sourceMappingURL=gnn-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gnn-bridge.js","sourceRoot":"","sources":["../../src/bridges/gnn-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HNSW Bridge - Healthcare Clinical Plugin
|
|
3
|
+
*
|
|
4
|
+
* Provides HNSW (Hierarchical Navigable Small World) vector search
|
|
5
|
+
* for patient similarity matching. Integrates with micro-hnsw-wasm
|
|
6
|
+
* for 150x faster similarity search.
|
|
7
|
+
*
|
|
8
|
+
* HIPAA Compliance:
|
|
9
|
+
* - All patient data processed locally in WASM sandbox
|
|
10
|
+
* - No PHI transmitted externally
|
|
11
|
+
* - Embeddings use differential privacy
|
|
12
|
+
*/
|
|
13
|
+
import type { HNSWBridge, HNSWConfig, PatientFeatures, SimilarPatient, Logger } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Patient embedding generator
|
|
16
|
+
* Converts clinical features to dense vector representations
|
|
17
|
+
*/
|
|
18
|
+
export declare class PatientEmbeddingGenerator {
|
|
19
|
+
private readonly dimensions;
|
|
20
|
+
constructor(dimensions?: number);
|
|
21
|
+
/**
|
|
22
|
+
* Generate embedding for patient features
|
|
23
|
+
* Uses a simplified bag-of-features approach
|
|
24
|
+
* In production, use ClinicalBERT or similar
|
|
25
|
+
*/
|
|
26
|
+
generateEmbedding(features: PatientFeatures): Float32Array;
|
|
27
|
+
/**
|
|
28
|
+
* Calculate cosine similarity between two embeddings
|
|
29
|
+
*/
|
|
30
|
+
cosineSimilarity(a: Float32Array, b: Float32Array): number;
|
|
31
|
+
private hashCode;
|
|
32
|
+
private getIndicesFromHash;
|
|
33
|
+
private normalizeLabValue;
|
|
34
|
+
private normalizeVitalValue;
|
|
35
|
+
private l2Normalize;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Healthcare HNSW Bridge implementation
|
|
39
|
+
* Wraps micro-hnsw-wasm for patient similarity search
|
|
40
|
+
*/
|
|
41
|
+
export declare class HealthcareHNSWBridge implements HNSWBridge {
|
|
42
|
+
private wasmModule;
|
|
43
|
+
private indexPtr;
|
|
44
|
+
private config;
|
|
45
|
+
private logger;
|
|
46
|
+
private idToIndex;
|
|
47
|
+
private indexToId;
|
|
48
|
+
private metadata;
|
|
49
|
+
private nextIndex;
|
|
50
|
+
private embeddingGenerator;
|
|
51
|
+
initialized: boolean;
|
|
52
|
+
constructor(config?: Partial<HNSWConfig>, logger?: Logger);
|
|
53
|
+
/**
|
|
54
|
+
* Initialize the HNSW index
|
|
55
|
+
*/
|
|
56
|
+
initialize(config?: HNSWConfig): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Add a patient vector to the index
|
|
59
|
+
*/
|
|
60
|
+
addVector(id: string, vector: Float32Array, metadata?: Record<string, unknown>): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Search for similar patients
|
|
63
|
+
*/
|
|
64
|
+
search(query: Float32Array, topK: number, filter?: Record<string, unknown>): Promise<Array<{
|
|
65
|
+
id: string;
|
|
66
|
+
distance: number;
|
|
67
|
+
}>>;
|
|
68
|
+
/**
|
|
69
|
+
* Delete a patient vector from the index
|
|
70
|
+
*/
|
|
71
|
+
delete(id: string): Promise<boolean>;
|
|
72
|
+
/**
|
|
73
|
+
* Get the number of vectors in the index
|
|
74
|
+
*/
|
|
75
|
+
count(): Promise<number>;
|
|
76
|
+
/**
|
|
77
|
+
* Search for similar patients by clinical features
|
|
78
|
+
*/
|
|
79
|
+
searchByFeatures(features: PatientFeatures, topK?: number, cohortFilter?: string): Promise<SimilarPatient[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Add a patient by clinical features
|
|
82
|
+
*/
|
|
83
|
+
addPatient(patientId: string, features: PatientFeatures, metadata?: Record<string, unknown>): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Cleanup resources
|
|
86
|
+
*/
|
|
87
|
+
destroy(): void;
|
|
88
|
+
private resolveWasmPath;
|
|
89
|
+
private loadWasmModule;
|
|
90
|
+
private bruteForceSearch;
|
|
91
|
+
private matchesFilter;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a new HNSW bridge instance
|
|
95
|
+
*/
|
|
96
|
+
export declare function createHNSWBridge(config?: Partial<HNSWConfig>, logger?: Logger): HealthcareHNSWBridge;
|
|
97
|
+
export default HealthcareHNSWBridge;
|
|
98
|
+
//# sourceMappingURL=hnsw-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-bridge.d.ts","sourceRoot":"","sources":["../../src/bridges/hnsw-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,eAAe,EACf,cAAc,EACd,MAAM,EACP,MAAM,aAAa,CAAC;AAyBrB;;;GAGG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,GAAE,MAAY;IAIpC;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY;IAuD1D;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM;IAiB1D,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,WAAW;CAYpB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,UAAU;IACrD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,kBAAkB,CAA4B;IAE/C,WAAW,UAAS;gBAEf,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM;IAYzD;;OAEG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCpD;;OAEG;IACG,SAAS,CACb,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAuBhB;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IA0CnD;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9B;;OAEG;IACG,gBAAgB,CACpB,QAAQ,EAAE,eAAe,EACzB,IAAI,GAAE,MAAU,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC;IAiB5B;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAShB;;OAEG;IACH,OAAO,IAAI,IAAI;YAYD,eAAe;YAUf,cAAc;IAO5B,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,aAAa;CAStB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAEpG;AAED,eAAe,oBAAoB,CAAC"}
|