Spaces:
Runtime error
Runtime error
| /** | |
| * workflowLLMService.js — ChessBoard Reasoning Engine LLM Backend | |
| * Phase 2: Real LLM inference via Groq → DeepSeek → OpenRouter fallback chain | |
| * Produces board traces, step-by-step reasoning, verdicts, and real confidence scores. | |
| */ | |
| import crypto from "node:crypto"; | |
| // ── Domain Ontologies (64 nodes each) ───────────────────────────────────── | |
| // Sourced from workflow-engine.html — single source of truth must be kept in sync | |
| export const DOMAIN_ONTOLOGIES = { | |
| legal: { | |
| id: "legal", symbol: "⊢", name: "Legal Reasoning", | |
| description: "64 legal doctrine nodes. Auditable AI legal argumentation. Every case is a game. Every ruling is a trace.", | |
| nodes: [ | |
| {id:'a8',icon:'⊢',name:'Civil Liab.',desc:'General civil liability doctrine'}, | |
| {id:'b8',icon:'∂',name:'Med. Neg.',desc:'Medical standard of care breach'}, | |
| {id:'c8',icon:'∇',name:'Traffic',desc:'Road accident tort liability'}, | |
| {id:'d8',icon:'Σ',name:'Product',desc:'Defective product liability'}, | |
| {id:'e8',icon:'∫',name:'Premises',desc:'Property owner duty of care'}, | |
| {id:'f8',icon:'Π',name:'Pharma',desc:'Drug manufacturer liability'}, | |
| {id:'g8',icon:'δ',name:'Pers. Inj.',desc:'Bodily harm compensation'}, | |
| {id:'h8',icon:'Ω',name:'Wrng. Death',desc:'Death from negligent act'}, | |
| {id:'a7',icon:'→',name:'Contract',desc:'Offer, acceptance, consideration'}, | |
| {id:'b7',icon:'⊥',name:'Breach',desc:'Failure to perform obligation'}, | |
| {id:'c7',icon:'≡',name:'Damages',desc:'Monetary compensation calculation'}, | |
| {id:'d7',icon:'⇒',name:'Spec. Perf.',desc:'Specific performance equitable remedy'}, | |
| {id:'e7',icon:'∅',name:'Void',desc:'Contract nullity and rescission'}, | |
| {id:'f7',icon:'⊃',name:'Force Maj.',desc:'Force majeure unforeseen circumstances'}, | |
| {id:'g7',icon:'∧',name:'Good Faith',desc:'Good faith and fair dealing'}, | |
| {id:'h7',icon:'⏲',name:'Limitation',desc:'Statute of limitations time-bar'}, | |
| {id:'a6',icon:'∃',name:'Doc. Evid.',desc:'Documentary evidence standard'}, | |
| {id:'b6',icon:'∀',name:'Eyewitness',desc:'Testimonial evidence admissibility'}, | |
| {id:'c6',icon:'φ',name:'Expert Wit.',desc:'Expert opinion and admissibility'}, | |
| {id:'d6',icon:'λ',name:'Forensic',desc:'Scientific physical evidence'}, | |
| {id:'e6',icon:'ℤ',name:'Digital',desc:'Electronic records and metadata'}, | |
| {id:'f6',icon:'ρ',name:'CCTV',desc:'Video surveillance admissibility'}, | |
| {id:'g6',icon:'μ',name:'Med. Record',desc:'Clinical documentation standard'}, | |
| {id:'h6',icon:'ξ',name:'Statistical',desc:'Data-based evidentiary proof'}, | |
| {id:'a5',icon:'⊸',name:'But-For',desc:'Sine qua non causation test'}, | |
| {id:'b5',icon:'↔',name:'Proximate',desc:'Direct legal causation chain'}, | |
| {id:'c5',icon:'⊕',name:'Intervening',desc:'Superseding intervening cause'}, | |
| {id:'d5',icon:'σ',name:'Std. of Care',desc:'Reasonable person benchmark'}, | |
| {id:'e5',icon:'τ',name:'Duty of Care',desc:'Legal obligation to avoid harm'}, | |
| {id:'f5',icon:'⊗',name:'Contrib. Neg',desc:'Plaintiff contributory fault'}, | |
| {id:'g5',icon:'÷',name:'Comp. Fault',desc:'Proportional liability split'}, | |
| {id:'h5',icon:'⊤',name:'Strict Liab.',desc:'No-fault strict liability'}, | |
| {id:'a4',icon:'$',name:'Compensatory',desc:'Make the plaintiff whole'}, | |
| {id:'b4',icon:'×',name:'Punitive',desc:'Punishment for egregious conduct'}, | |
| {id:'c4',icon:'ℝ',name:'Actual Loss',desc:'Documented economic loss'}, | |
| {id:'d4',icon:'ε',name:'Pain & Suf.',desc:'Non-economic general damages'}, | |
| {id:'e4',icon:'η',name:'Lost Earn.',desc:'Income reduction future claim'}, | |
| {id:'f4',icon:'ℕ',name:'Med. Exp.',desc:'Healthcare cost recovery'}, | |
| {id:'g4',icon:'β',name:'Future Dmg.',desc:'Projected ongoing future losses'}, | |
| {id:'h4',icon:'≈',name:'Mitigation',desc:'Duty to mitigate damages'}, | |
| {id:'a3',icon:'∪',name:'Assump. Risk',desc:'Voluntary assumption of known risk'}, | |
| {id:'b3',icon:'⌛',name:'Stat. Limit.',desc:'Time-bar statute of limitations'}, | |
| {id:'c3',icon:'ℂ',name:'Sov. Immun.',desc:'Government sovereign immunity'}, | |
| {id:'d3',icon:'∩',name:'Consent',desc:'Plaintiff consent to risk'}, | |
| {id:'e3',icon:'≠',name:'Res Judic.',desc:'Prior judgment issue preclusion'}, | |
| {id:'f3',icon:'⊂',name:'Coll. Estop.',desc:'Collateral estoppel doctrine'}, | |
| {id:'g3',icon:'⚡',name:'Emergency',desc:'Sudden emergency doctrine'}, | |
| {id:'h3',icon:'±',name:'Good Samar.',desc:'Good Samaritan protection'}, | |
| {id:'a2',icon:'ℚ',name:'Subject Jx.',desc:'Subject matter jurisdiction'}, | |
| {id:'b2',icon:'∈',name:'Personal Jx.',desc:'Personal jurisdiction over party'}, | |
| {id:'c2',icon:'π',name:'Pleading',desc:'Required pleading specificity'}, | |
| {id:'d2',icon:'ι',name:'Discovery',desc:'Evidence disclosure rules'}, | |
| {id:'e2',icon:'κ',name:'Burden Pf.',desc:'Preponderance burden of proof'}, | |
| {id:'f2',icon:'ν',name:'Class Act.',desc:'Collective class action litigation'}, | |
| {id:'g2',icon:'ζ',name:'Settlement',desc:'Out-of-court resolution'}, | |
| {id:'h2',icon:'θ',name:'Sum. Judg.',desc:'Pre-trial summary judgment'}, | |
| {id:'a1',icon:'✓',name:'Liable',desc:'Defendant found liable'}, | |
| {id:'b1',icon:'✗',name:'No Liability',desc:'Defendant not liable'}, | |
| {id:'c1',icon:'½',name:'Partial',desc:'Partial recovery awarded'}, | |
| {id:'d1',icon:'¹',name:'Full Recov.',desc:'Complete damages awarded'}, | |
| {id:'e1',icon:'↩',name:'Remanded',desc:'Case returned to lower court'}, | |
| {id:'f1',icon:'⊘',name:'Dismissed',desc:'Permanent dismissal with prejudice'}, | |
| {id:'g1',icon:'⇔',name:'Equit. Rel.',desc:'Injunction or specific performance'}, | |
| {id:'h1',icon:'↻',name:'New Trial',desc:'New trial ordered by court'}, | |
| ], | |
| cases: [ | |
| {id:'hernandez-hospital', name:'Hernández v. Hospital Central', label:'Medical Neg.'}, | |
| {id:'techcorp-supplierx', name:'TechCorp v. SupplierX', label:'Contract Breach'}, | |
| {id:'people-martinez', name:'People v. Martínez', label:'Traffic Tort'}, | |
| ] | |
| }, | |
| medical: { | |
| id: "medical", symbol: "∂", name: "Medical Diagnosis", | |
| description: "64 clinical nodes. Bayesian diagnostic traversal. Every patient is a protocol. Every trace is a treatment plan.", | |
| nodes: [ | |
| {id:'a8',icon:'θ',name:'Fever',desc:'Elevated temperature symptom'},{id:'b8',icon:'♥',name:'Chest Pain',desc:'Chest pain with radiation'}, | |
| {id:'c8',icon:'~',name:'Dyspnea',desc:'Difficulty breathing dyspnea'},{id:'d8',icon:'≈',name:'Nausea',desc:'Nausea and vomiting symptom'}, | |
| {id:'e8',icon:'⊥',name:'Headache',desc:'Severe cephalgia headache'},{id:'f8',icon:'ρ',name:'Skin Rash',desc:'Cutaneous eruption rash'}, | |
| {id:'g8',icon:'τ',name:'Joint Pain',desc:'Polyarthralgia joint pain'},{id:'h8',icon:'μ',name:'Fatigue',desc:'Chronic fatigue syndrome'}, | |
| {id:'a7',icon:'∿',name:'ECG',desc:'Electrocardiogram test'},{id:'b7',icon:'Σ',name:'CBC Panel',desc:'Complete blood count panel'}, | |
| {id:'c7',icon:'∂',name:'CRP / ESR',desc:'Inflammatory markers CRP ESR'},{id:'d7',icon:'∇',name:'Culture',desc:'Microbial culture and sensitivity'}, | |
| {id:'e7',icon:'⊗',name:'CT Scan',desc:'Computed tomography imaging'},{id:'f7',icon:'λ',name:'Chest X-Ray',desc:'Chest X-ray radiograph'}, | |
| {id:'g7',icon:'∀',name:'ANA Panel',desc:'Antinuclear antibody panel'},{id:'h7',icon:'Δ',name:'Troponin',desc:'Cardiac troponin assay'}, | |
| {id:'a6',icon:'→',name:'ACS',desc:'Acute coronary syndrome'},{id:'b6',icon:'⊕',name:'Pulm. Emb.',desc:'Pulmonary embolism'}, | |
| {id:'c6',icon:'∃',name:'Bacterial',desc:'Bacterial infection diagnosis'},{id:'d6',icon:'ψ',name:'SLE / Lupus',desc:'Systemic lupus erythematosus'}, | |
| {id:'e6',icon:'ω',name:'Migraine',desc:'Complex migraine disorder'},{id:'f6',icon:'φ',name:'Viral',desc:'Viral syndrome diagnosis'}, | |
| {id:'g6',icon:'σ',name:'RA',desc:'Rheumatoid arthritis'},{id:'h6',icon:'ξ',name:'Drug Rxn.',desc:'Adverse drug reaction'}, | |
| {id:'a5',icon:'✗',name:'Not Cardiac',desc:'Rule out cardiac cause'},{id:'b5',icon:'✗',name:'Not Pulm.',desc:'Rule out pulmonary embolism'}, | |
| {id:'c5',icon:'✗',name:'Not Bact.',desc:'Rule out bacterial infection'},{id:'d5',icon:'✓',name:'Autoimmune',desc:'Confirm autoimmune etiology'}, | |
| {id:'e5',icon:'✗',name:'Not Mening.',desc:'Rule out meningitis'},{id:'f5',icon:'✓',name:'Viral Conf.',desc:'Confirm viral syndrome'}, | |
| {id:'g5',icon:'✓',name:'Rheumatic',desc:'Confirm rheumatic disease'},{id:'h5',icon:'✗',name:'Not Drug Rxn',desc:'Rule out drug reaction'}, | |
| {id:'a4',icon:'∫',name:'ASA + GTN',desc:'Aspirin and nitrates treatment'},{id:'b4',icon:'⊃',name:'Anticoag.',desc:'Anticoagulation therapy'}, | |
| {id:'c4',icon:'β',name:'Antibiotic',desc:'Broad-spectrum antibiotic'},{id:'d4',icon:'γ',name:'HCQ',desc:'Hydroxychloroquine treatment'}, | |
| {id:'e4',icon:'π',name:'Triptan',desc:'Triptan therapy for migraine'},{id:'f4',icon:'≡',name:'Supportive',desc:'Supportive care management'}, | |
| {id:'g4',icon:'α',name:'MTX + Bio.',desc:'Methotrexate and biologics'},{id:'h4',icon:'∅',name:'D/C Drug',desc:'Discontinue offending drug'}, | |
| {id:'a3',icon:'◊',name:'CCU Admit',desc:'Coronary care unit admission'},{id:'b3',icon:'◊',name:'ICU Admit',desc:'Intensive care unit admission'}, | |
| {id:'c3',icon:'◊',name:'Ward',desc:'General ward admission'},{id:'d3',icon:'◊',name:'Rheum. Out.',desc:'Rheumatology outpatient clinic'}, | |
| {id:'e3',icon:'◊',name:'Neuro. Out.',desc:'Neurology outpatient clinic'},{id:'f3',icon:'□',name:'Home Care',desc:'Home management and care'}, | |
| {id:'g3',icon:'◊',name:'Ortho Ref.',desc:'Orthopaedic referral'},{id:'h3',icon:'↻',name:'Review 48h',desc:'48-hour follow-up review'}, | |
| {id:'a2',icon:'Π',name:'Echo FU',desc:'Echocardiogram follow-up'},{id:'b2',icon:'∿',name:'INR Monitor',desc:'INR monitoring'}, | |
| {id:'c2',icon:'∂',name:'CRP Monitor',desc:'CRP monitoring'},{id:'d2',icon:'η',name:'dsDNA',desc:'dsDNA antibody monitoring'}, | |
| {id:'e2',icon:'∇',name:'HA Diary',desc:'Headache diary'},{id:'f2',icon:'θ',name:'Temp Monitor',desc:'Temperature monitoring'}, | |
| {id:'g2',icon:'Σ',name:'DAS28',desc:'DAS28 disease activity score'},{id:'h2',icon:'⊢',name:'GP Review',desc:'General practitioner review'}, | |
| {id:'a1',icon:'✓',name:'Stable',desc:'Stable for discharge'},{id:'b1',icon:'↑',name:'Cath Lab',desc:'Transfer to catheterization lab'}, | |
| {id:'c1',icon:'→',name:'Responds',desc:'Responding to treatment'},{id:'d1',icon:'∞',name:'Long-term',desc:'Long-term management plan'}, | |
| {id:'e1',icon:'≈',name:'Sym. Ctrl.',desc:'Symptom control achieved'},{id:'f1',icon:'↗',name:'Recovery',desc:'Expected recovery trajectory'}, | |
| {id:'g1',icon:'∫',name:'Remission',desc:'Remission target achieved'},{id:'h1',icon:'↻',name:'Monitor',desc:'Monitor and adjust'}, | |
| ], | |
| cases: [ | |
| {id:'male-64-chest', name:'Male 64 — Chest pain, dyspnea, diaphoresis', label:'ACS Protocol'}, | |
| {id:'female-34-fever', name:'Female 34 — Fever, rash, arthralgia', label:'Autoimmune Protocol'}, | |
| {id:'child-8-headache', name:'Child 8 — Recurrent headache, photophobia', label:'Neuro Protocol'}, | |
| ] | |
| }, | |
| learning: { | |
| id: "learning", symbol: "∇", name: "Adaptive Learning", | |
| description: "64 curriculum nodes. Cognitive profile mapping via board traversal. Every student is a unique path.", | |
| nodes: [ | |
| {id:'a8',name:'Arithmetic'},{id:'b8',name:'Algebra'},{id:'c8',name:'Statistics'},{id:'d8',name:'Calculus'}, | |
| {id:'e8',name:'Num. Theory'},{id:'f8',name:'Geometry'},{id:'g8',name:'Functions'},{id:'h8',name:'Lin. Algebra'}, | |
| {id:'a7',name:'Newton'},{id:'b7',name:'EM Theory'},{id:'c7',name:'Organic Chem'},{id:'d7',name:'Biology'}, | |
| {id:'e7',name:'Astronomy'},{id:'f7',name:'Earth Sci.'},{id:'g7',name:'Fluid Dyn.'},{id:'h7',name:'Thermody.'}, | |
| {id:'a6',name:'Reading'},{id:'b6',name:'Essay Writing'},{id:'c6',name:'Lit. Analysis'},{id:'d6',name:'Oral Pres.'}, | |
| {id:'e6',name:'Grammar'},{id:'f6',name:'Research'},{id:'g6',name:'Creative Wrt'},{id:'h6',name:'Language 2'}, | |
| {id:'a5',name:'Anc. History'},{id:'b5',name:'World History'},{id:'c5',name:'Wars'},{id:'d5',name:'Govt & Pol.'}, | |
| {id:'e5',name:'Econ. Hist.'},{id:'f5',name:'Art History'},{id:'g5',name:'Sci. History'},{id:'h5',name:'Philosophy'}, | |
| {id:'a4',name:'Programming'},{id:'b4',name:'AI / ML'},{id:'c4',name:'Web Dev.'},{id:'d4',name:'Databases'}, | |
| {id:'e4',name:'Cybersec.'},{id:'f4',name:'Data Science'},{id:'g4',name:'Statistics'},{id:'h4',name:'Algorithms'}, | |
| {id:'a3',name:'Visual Art'},{id:'b3',name:'Music Theory'},{id:'c3',name:'Film Studies'},{id:'d3',name:'Photography'}, | |
| {id:'e3',name:'Game Design'},{id:'f3',name:'Architecture'},{id:'g3',name:'Prob. Solving'},{id:'h3',name:'Crit. Thinking'}, | |
| {id:'a2',name:'Sports Sci.'},{id:'b2',name:'Finance'},{id:'c2',name:'Environ.'},{id:'d2',name:'Health Lit.'}, | |
| {id:'e2',name:'Global Cit.'},{id:'f2',name:'Career Plan'},{id:'g2',name:'Social Skills'},{id:'h2',name:'Wellbeing'}, | |
| {id:'a1',name:'Mastery Math'},{id:'b1',name:'Mastery Science'},{id:'c1',name:'Mastery Language'},{id:'d1',name:'Mastery History'}, | |
| {id:'e1',name:'Mastery CS'},{id:'f1',name:'Mastery Creative'},{id:'g1',name:'Mastery Applied'},{id:'h1',name:'Mastery All'}, | |
| ], | |
| cases: [ | |
| {id:'alex-analytical', name:'Alex — Analytical, math-dominant, avoids writing', label:'Math Track'}, | |
| {id:'maria-theoretical', name:'Maria — Theoretical, deep reading, avoids practice', label:'Humanities Track'}, | |
| {id:'sam-creative', name:'Sam — Creative divergent, nonlinear thinker', label:'Creative Track'}, | |
| ] | |
| }, | |
| cybersec: { | |
| id: "cybersec", symbol: "∅", name: "CyberSec Kill-Chain", | |
| description: "64 MITRE ATT&CK nodes. Threat actor simulation. Every campaign is a trace. Every IOC is a board position.", | |
| nodes: [ | |
| {id:'a8',name:'OSINT',desc:'Open-source intelligence gathering'},{id:'b8',name:'Port Scan',desc:'Network reconnaissance'}, | |
| {id:'c8',name:'Phishing',desc:'Social engineering initial access'},{id:'d8',name:'Supply Chain',desc:'Third-party compromise'}, | |
| {id:'e8',name:'Drive-by',desc:'Watering hole download'},{id:'f8',name:'Watering Hole',desc:'Strategic web compromise'}, | |
| {id:'g8',name:'Cred. Harvest',desc:'Credential harvesting'},{id:'h8',name:'0-Day',desc:'Zero-day exploit'}, | |
| {id:'a7',name:'Execution',desc:'Code execution technique'},{id:'b7',name:'Script Host',desc:'Script interpreter execution'}, | |
| {id:'c7',name:'Svc. Exploit',desc:'Service exploitation'},{id:'d7',name:'WMI Exec.',desc:'WMI-based execution'}, | |
| {id:'e7',name:'PowerShell',desc:'PowerShell execution'},{id:'f7',name:'Sched. Task',desc:'Scheduled task persistence'}, | |
| {id:'g7',name:'Registry Mod',desc:'Registry modification persistence'},{id:'h7',name:'New Account',desc:'Account creation persistence'}, | |
| {id:'a6',name:'AV Bypass',desc:'Antivirus evasion'},{id:'b6',name:'Log Clear',desc:'Log clearing defense evasion'}, | |
| {id:'c6',name:'Token Imp.',desc:'Token impersonation privilege escalation'},{id:'d6',name:'Priv. Esc.',desc:'Privilege escalation'}, | |
| {id:'e6',name:'Hash Dump',desc:'Credential hash dumping'},{id:'f6',name:'Kerberoast',desc:'Kerberoasting attack'}, | |
| {id:'g6',name:'Pass-the-Hash',desc:'Pass-the-hash lateral movement'},{id:'h6',name:'Cred. Files',desc:'Credential file access'}, | |
| {id:'a5',name:'Lateral Mv.',desc:'Lateral movement'},{id:'b5',name:'RDP Exploit',desc:'RDP exploitation'}, | |
| {id:'c5',name:'SMB Shares',desc:'SMB share access'},{id:'d5',name:'WinRM',desc:'WinRM lateral movement'}, | |
| {id:'e5',name:'Net. Scan',desc:'Network discovery'},{id:'f5',name:'File Discov.',desc:'File system discovery'}, | |
| {id:'g5',name:'AD Enum.',desc:'Active Directory enumeration'},{id:'h5',name:'Svc. Discov.',desc:'Service discovery'}, | |
| {id:'a4',name:'Data Staging',desc:'Data staging for exfiltration'},{id:'b4',name:'Email Coll.',desc:'Email collection'}, | |
| {id:'c4',name:'Screen Cap.',desc:'Screen capture collection'},{id:'d4',name:'Keylogging',desc:'Keylogger collection'}, | |
| {id:'e4',name:'Ransomware',desc:'Ransomware deployment impact'},{id:'f4',name:'Crypto Pay.',desc:'Cryptocurrency payment'}, | |
| {id:'g4',name:'Exfiltration',desc:'Data exfiltration'},{id:'h4',name:'DNS Exfil',desc:'DNS exfiltration covert channel'}, | |
| {id:'a3',name:'C2 Beacon',desc:'Command and control beacon'},{id:'b3',name:'Proxy C2',desc:'Proxy-based C2'}, | |
| {id:'c3',name:'Covert C2',desc:'Covert C2 channel'},{id:'d3',name:'HTTPS C2',desc:'HTTPS C2 communication'}, | |
| {id:'e3',name:'Track Cover',desc:'Track covering cleanup'},{id:'f3',name:'Artifact Rm.',desc:'Artifact removal'}, | |
| {id:'g3',name:'Acct. Disable',desc:'Account disabling cleanup'},{id:'h3',name:'DNS Flux',desc:'DNS fast-flux'}, | |
| {id:'a2',name:'No Detection',desc:'Undetected outcome'},{id:'b2',name:'Detected',desc:'Detection outcome'}, | |
| {id:'c2',name:'Partial Detct',desc:'Partial detection'},{id:'d2',name:'IOC Generat.',desc:'IOC generated'}, | |
| {id:'e2',name:'IDS Alert',desc:'IDS alert triggered'},{id:'f2',name:'Blocked WAF',desc:'WAF blocked'}, | |
| {id:'g2',name:'SOC Notified',desc:'SOC notification'},{id:'h2',name:'Acct. Locked',desc:'Account locked'}, | |
| {id:'a1',name:'Objective',desc:'Objective achieved'},{id:'b1',name:'Financial Gn',desc:'Financial gain achieved'}, | |
| {id:'c1',name:'Espionage',desc:'Espionage objective achieved'},{id:'d1',name:'Ransom Paid',desc:'Ransom payment received'}, | |
| {id:'e1',name:'Neutralized',desc:'Threat neutralized'},{id:'f1',name:'IR Activated',desc:'Incident response activated'}, | |
| {id:'g1',name:'Legal Action',desc:'Legal action initiated'},{id:'h1',name:'Recovery',desc:'System recovery achieved'}, | |
| ], | |
| cases: [ | |
| {id:'apt29-supply', name:'APT29 — Supply Chain Compromise (SolarWinds pattern)', label:'T1195.002'}, | |
| {id:'apt41-financial', name:'APT41 — Dual-mission Financial Intrusion', label:'T1566.001'}, | |
| {id:'raas-ransomware', name:'RaaS — Ransomware-as-a-Service Deployment', label:'T1486'}, | |
| ] | |
| }, | |
| "drug-rd": { | |
| id: "drug-rd", symbol: "λ", name: "Drug R&D Discovery", | |
| description: "64 pharma nodes. AI agent drug repurposing swarm. Every candidate is a board path. Every hit is a trace.", | |
| nodes: [ | |
| {id:'a8',name:'Metformin',desc:'Approved diabetes drug - AMPK activator'},{id:'b8',name:'Rapamycin',desc:'mTOR inhibitor - autophagy inducer'}, | |
| {id:'c8',name:'Ibuprofen',desc:'NSAID - COX inhibitor'},{id:'d8',name:'Ritonavir',desc:'HIV protease inhibitor'}, | |
| {id:'e8',name:'Sildenafil',desc:'PDE5 inhibitor - cardiovascular'},{id:'f8',name:'Thalidomide',desc:'Immunomodulatory - TNF-alpha blocker'}, | |
| {id:'g8',name:'Aspirin',desc:'COX inhibitor - antiplatelet'},{id:'h8',name:'Ivermectin',desc:'Antiparasitic - efflux pump inhibitor'}, | |
| {id:'a7',name:'mTOR',desc:'mTOR pathway target'},{id:'b7',name:'Amyloid',desc:'Amyloid-beta aggregation target'}, | |
| {id:'c7',name:'Tau-p',desc:'Tau phosphorylation target'},{id:'d7',name:'NF-kB',desc:'NF-kB inflammatory pathway'}, | |
| {id:'e7',name:'Mitochond.',desc:'Mitochondrial dysfunction target'},{id:'f7',name:'TB CellWall',desc:'TB cell wall biosynthesis'}, | |
| {id:'g7',name:'ATP Synth.',desc:'ATP synthase target'},{id:'h7',name:'Card. Metab.',desc:'Cardiac metabolic reprogramming'}, | |
| {id:'a6',name:'Kinase Inh.',desc:'Kinase inhibition mechanism'},{id:'b6',name:'Autophagy',desc:'Autophagy induction mechanism'}, | |
| {id:'c6',name:'HDAC Inh.',desc:'HDAC inhibition mechanism'},{id:'d6',name:'TNF-a Block',desc:'TNF-alpha blockade mechanism'}, | |
| {id:'e6',name:'ROS Scavng.',desc:'ROS scavenging mechanism'},{id:'f6',name:'Efflux Block',desc:'Efflux pump blockade'}, | |
| {id:'g6',name:'PDE5 Inh.',desc:'PDE5 inhibition'},{id:'h6',name:'AMPK Act.',desc:'AMPK activation mechanism'}, | |
| {id:'a5',name:'In Silico',desc:'Computational validation'},{id:'b5',name:'In Vitro',desc:'Cell-based validation'}, | |
| {id:'c5',name:'In Vivo',desc:'Animal model validation'},{id:'d5',name:'Organoid',desc:'Organoid model validation'}, | |
| {id:'e5',name:'SNS Score',desc:'Synaptic Network Score'},{id:'f5',name:'Bind. Affin.',desc:'Binding affinity score'}, | |
| {id:'g5',name:'ADMET',desc:'ADMET properties score'},{id:'h5',name:'Safety Idx',desc:'Safety index score'}, | |
| {id:'a4',name:'High Prio.',desc:'High priority candidate'},{id:'b4',name:'Med Prio.',desc:'Medium priority candidate'}, | |
| {id:'c4',name:'Low Prio.',desc:'Low priority candidate'},{id:'d4',name:'Candidate',desc:'Drug candidate confirmed'}, | |
| {id:'e4',name:'Phase I',desc:'Phase I clinical trial'},{id:'f4',name:'Phase II',desc:'Phase II clinical trial'}, | |
| {id:'g4',name:'Phase III',desc:'Phase III clinical trial'},{id:'h4',name:'FDA Submit',desc:'FDA submission'}, | |
| {id:'a3',name:'Patent',desc:'Patent protection'},{id:'b3',name:'IPFS Pub.',desc:'Open science IPFS publication'}, | |
| {id:'c3',name:'Open Access',desc:'Open access publication'},{id:'d3',name:'License',desc:'Commercial license'}, | |
| {id:'e3',name:'Pharma Ptnr',desc:'Pharmaceutical partnership'},{id:'f3',name:'Acad. Ptnr',desc:'Academic partnership'}, | |
| {id:'g3',name:'NIH Grant',desc:'NIH grant funding'},{id:'h3',name:'EU Horizon',desc:'EU Horizon funding'}, | |
| {id:'a2',name:'Novel Mech.',desc:'Novel mechanism discovered'},{id:'b2',name:'Biomarker',desc:'Biomarker identified'}, | |
| {id:'c2',name:'Combo Rx',desc:'Combination therapy identified'},{id:'d2',name:'Valid. Hit',desc:'Validated hit compound'}, | |
| {id:'e1',name:'Alz. Cand.',desc:'Alzheimer candidate'},{id:'f1',name:'TB Cand.',desc:'TB candidate'}, | |
| {id:'g1',name:'Heart Cand.',desc:'Heart failure candidate'},{id:'h1',name:'Published',desc:'Discovery published'}, | |
| {id:'a1',name:'Dataset',desc:'Dataset generated'},{id:'b1',name:'Next Iter.',desc:'Next iteration queued'}, | |
| {id:'c1',name:'Dead End',desc:'Dead end — pivot required'},{id:'d1',name:'Unexpected',desc:'Unexpected finding'}, | |
| ], | |
| cases: [ | |
| {id:'alzheimer', name:"Alzheimer's Disease — Amyloid-tau pathway disruption", label:'Neurodegeneration'}, | |
| {id:'tb-resistant', name:'Drug-Resistant TB — Novel target identification', label:'Infectious Disease'}, | |
| {id:'heart-failure', name:'Heart Failure — Metabolic reprogramming', label:'Cardiovascular'}, | |
| ] | |
| }, | |
| rover: { | |
| id: "rover", symbol: "∇", name: "Mars Rover Navigation", | |
| description: "64 mission nodes. Autonomous planetary navigation. Every sol is a trace. Every discovery is a board position.", | |
| nodes: [ | |
| {id:'a8',name:'Jezero Base',desc:'Base camp landing site'},{id:'b8',name:'Delta Entry',desc:'River delta entry point'}, | |
| {id:'c8',name:'W. Scarp',desc:'Western escarpment'},{id:'d8',name:'Fan Margin',desc:'Fan margin exploration'}, | |
| {id:'e8',name:'Crater Rim',desc:'Crater rim traverse'},{id:'f8',name:'Boulder Fld',desc:'Boulder field navigation'}, | |
| {id:'g8',name:'Dune Fld',desc:'Dune field crossing'},{id:'h8',name:'Lava Tube',desc:'Lava tube investigation'}, | |
| {id:'a7',name:'Cam Survey',desc:'Camera survey pass'},{id:'b7',name:'Chem. Scan',desc:'ChemCam spectroscopy'}, | |
| {id:'c7',name:'Drill Site',desc:'Core sample drilling'},{id:'d7',name:'Atm. Read.',desc:'Atmosphere reading'}, | |
| {id:'e7',name:'Seismic',desc:'Seismic monitoring'},{id:'f7',name:'Radar Pulse',desc:'Ground-penetrating radar'}, | |
| {id:'g7',name:'Soil Sample',desc:'Soil sample collection'},{id:'h7',name:'Rock Core',desc:'Rock core sample'}, | |
| {id:'a6',name:'Basalt',desc:'Basalt rock identified'},{id:'b6',name:'Carbonate',desc:'Carbonate minerals found'}, | |
| {id:'c6',name:'Sulfate',desc:'Sulfate deposits found'},{id:'d6',name:'Silica',desc:'Silica deposits found'}, | |
| {id:'e6',name:'Olivine',desc:'Olivine crystals found'},{id:'f6',name:'Perchlorate',desc:'Perchlorate detected'}, | |
| {id:'g6',name:'Organics',desc:'Organic molecules detected'},{id:'h6',name:'Biosignature',desc:'Potential biosignature found'}, | |
| {id:'a5',name:'Flat Terr.',desc:'Flat terrain — safe traverse'},{id:'b5',name:'Slope 15deg',desc:'15-degree slope navigation'}, | |
| {id:'c5',name:'Rocky Fld',desc:'Rocky field obstacle avoidance'},{id:'d5',name:'Sand Trap',desc:'Sand trap navigation hazard'}, | |
| {id:'e5',name:'Dust Storm',desc:'Dust storm protocol activated'},{id:'f5',name:'Night Mode',desc:'Night mode operations'}, | |
| {id:'g5',name:'Low Power',desc:'Low power mode conservation'},{id:'h5',name:'Comm. Delay',desc:'Communication delay protocol'}, | |
| {id:'a4',name:'Cache Site',desc:'Sample cache deposit site'},{id:'b4',name:'Depot A',desc:'Sample depot Alpha'}, | |
| {id:'c4',name:'Depot B',desc:'Sample depot Beta'},{id:'d4',name:'Depot C',desc:'Sample depot Gamma'}, | |
| {id:'e4',name:'MSR Flag',desc:'Mars Sample Return flagged'},{id:'f4',name:'Priority 1',desc:'Priority 1 sample cached'}, | |
| {id:'g4',name:'Priority 2',desc:'Priority 2 sample cached'},{id:'h4',name:'Priority 3',desc:'Priority 3 sample cached'}, | |
| {id:'a3',name:'Ingenuity',desc:'Ingenuity helicopter scout'},{id:'b3',name:'Aerial Surv.',desc:'Aerial survey data'}, | |
| {id:'c3',name:'Earth Comm.',desc:'Earth communication uplink'},{id:'d3',name:'Science Tbl.',desc:'Science table data transmitted'}, | |
| {id:'e3',name:'Rover Health',desc:'Rover health diagnostics'},{id:'f3',name:'Sol Report',desc:'Sol summary report'}, | |
| {id:'g3',name:'Navigation',desc:'Navigation path computed'},{id:'h3',name:'Drive Plan',desc:'Drive plan uploaded'}, | |
| {id:'a2',name:'Mineralogy',desc:'Mineralogy confirmed'},{id:'b2',name:'Geochemistry',desc:'Geochemistry data'}, | |
| {id:'c2',name:'Paleoclimate',desc:'Paleoclimate indicator'},{id:'d2',name:'Habitability',desc:'Habitability assessment'}, | |
| {id:'e2',name:'Life Marker',desc:'Life marker candidate'},{id:'f2',name:'Abiotic',desc:'Abiotic origin confirmed'}, | |
| {id:'g2',name:'Ambiguous',desc:'Ambiguous result'},{id:'h2',name:'Retest',desc:'Retest required'}, | |
| {id:'a1',name:'Discovery',desc:'Major discovery confirmed'},{id:'b1',name:'Cache Compl.',desc:'Cache complete'}, | |
| {id:'c1',name:'Science Win',desc:'Science objective achieved'},{id:'d1',name:'MSR Ready',desc:'Ready for Mars Sample Return'}, | |
| {id:'e1',name:'Anomaly',desc:'Anomaly detected — investigate'},{id:'f1',name:'Safe Mode',desc:'Safe mode activated'}, | |
| {id:'g1',name:'Earth Rcvd.',desc:'Earth confirmed receipt'},{id:'h1',name:'Published',desc:'Discovery published'}, | |
| ], | |
| cases: [ | |
| {id:'jezero-crater', name:'Jezero Crater — Paleolake delta exploration', label:'Astrobiology'}, | |
| {id:'three-forks', name:'Three Forks — Ancient river delta mapping', label:'Geomorphology'}, | |
| {id:'margin-fan', name:'Margin Fan — Carbonate biosignature hunt', label:'Biosignatures'}, | |
| ] | |
| }, | |
| compliance: { | |
| id: "compliance", symbol: "∫", name: "Regulatory Compliance", | |
| description: "64 regulatory nodes. Multi-jurisdictional compliance traversal. Every audit is a trace. Every control is a node.", | |
| nodes: [ | |
| {id:'a8',name:'GDPR Art.5',desc:'Data processing principles'},{id:'b8',name:'GDPR Art.6',desc:'Lawful basis for processing'}, | |
| {id:'c8',name:'GDPR Art.17',desc:'Right to erasure'},{id:'d8',name:'GDPR Art.25',desc:'Data protection by design'}, | |
| {id:'e8',name:'CCPA §1798',desc:'California consumer rights'},{id:'f8',name:'HIPAA §164',desc:'PHI security safeguards'}, | |
| {id:'g8',name:'SOX §302',desc:'CEO/CFO certifications'},{id:'h8',name:'SOX §404',desc:'Internal control assessment'}, | |
| {id:'a7',name:'ISO 27001',desc:'Information security management'},{id:'b7',name:'ISO 27701',desc:'Privacy information management'}, | |
| {id:'c7',name:'NIST CSF',desc:'Cybersecurity framework'},{id:'d7',name:'PCI DSS v4',desc:'Payment card security'}, | |
| {id:'e7',name:'FedRAMP',desc:'Federal cloud authorization'},{id:'f7',name:'DORA',desc:'Digital operational resilience'}, | |
| {id:'g7',name:'NIS2',desc:'EU network security directive'},{id:'h7',name:'AI Act',desc:'EU AI regulation compliance'}, | |
| {id:'a6',name:'Gap Analysis',desc:'Control gap identification'},{id:'b6',name:'Risk Assess.',desc:'Risk assessment methodology'}, | |
| {id:'c6',name:'Control Map',desc:'Control mapping exercise'},{id:'d6',name:'Evidence',desc:'Compliance evidence collection'}, | |
| {id:'e6',name:'Policy Rev.',desc:'Policy review and update'},{id:'f6',name:'Training',desc:'Compliance training required'}, | |
| {id:'g6',name:'Vendor Mgmt',desc:'Third-party vendor management'},{id:'h6',name:'Incident',desc:'Incident reporting obligation'}, | |
| {id:'a5',name:'Technical',desc:'Technical control implementation'},{id:'b5',name:'Admin',desc:'Administrative control'}, | |
| {id:'c5',name:'Physical',desc:'Physical security control'},{id:'d5',name:'Preventive',desc:'Preventive control category'}, | |
| {id:'e5',name:'Detective',desc:'Detective control category'},{id:'f5',name:'Corrective',desc:'Corrective control category'}, | |
| {id:'g5',name:'Compensating',desc:'Compensating control'},{id:'h5',name:'Directive',desc:'Directive control category'}, | |
| {id:'a4',name:'DPO Review',desc:'Data Protection Officer review'},{id:'b4',name:'Legal Review',desc:'Legal counsel review'}, | |
| {id:'c4',name:'CISO Sign',desc:'CISO sign-off required'},{id:'d4',name:'Board Report',desc:'Board reporting required'}, | |
| {id:'e4',name:'Remediation',desc:'Remediation plan required'},{id:'f4',name:'Exception',desc:'Exception request process'}, | |
| {id:'g4',name:'Waiver',desc:'Control waiver process'},{id:'h4',name:'Escalation',desc:'Executive escalation required'}, | |
| {id:'a3',name:'Internal Aud.',desc:'Internal audit finding'},{id:'b3',name:'External Aud.',desc:'External audit finding'}, | |
| {id:'c3',name:'Pen Test',desc:'Penetration test finding'},{id:'d3',name:'Reg. Inspect.',desc:'Regulatory inspection finding'}, | |
| {id:'e3',name:'Self-Assess.',desc:'Self-assessment result'},{id:'f3',name:'Continuous',desc:'Continuous monitoring'}, | |
| {id:'g3',name:'Attestation',desc:'Management attestation'},{id:'h3',name:'Certification',desc:'Certification renewal'}, | |
| {id:'a2',name:'Compliant',desc:'Fully compliant status'},{id:'b2',name:'Partial',desc:'Partially compliant'}, | |
| {id:'c2',name:'Non-Compliant',desc:'Non-compliant — action required'},{id:'d2',name:'In Progress',desc:'Remediation in progress'}, | |
| {id:'e2',name:'Waived',desc:'Control waived with approval'},{id:'f2',name:'N/A',desc:'Control not applicable'}, | |
| {id:'g2',name:'Under Review',desc:'Under regulatory review'},{id:'h2',name:'Disputed',desc:'Finding disputed'}, | |
| {id:'a1',name:'Cleared',desc:'Audit cleared — no findings'},{id:'b1',name:'Minor Finding',desc:'Minor finding — no material risk'}, | |
| {id:'c1',name:'Major Finding',desc:'Major finding — material risk'},{id:'d1',name:'Critical',desc:'Critical finding — immediate action'}, | |
| {id:'e1',name:'Enforcement',desc:'Regulatory enforcement action'},{id:'f1',name:'Fine Imposed',desc:'Financial penalty imposed'}, | |
| {id:'g1',name:'Certified',desc:'Certification achieved'},{id:'h1',name:'Renewed',desc:'Certification renewed'}, | |
| ], | |
| cases: [ | |
| {id:'gdpr-data-breach', name:'GDPR Data Breach — 72h notification obligation', label:'Data Protection'}, | |
| {id:'sox-internal', name:'SOX §404 — Internal controls over financial reporting', label:'Financial Reporting'}, | |
| {id:'hipaa-cloud', name:'HIPAA Cloud Migration — PHI in SaaS platform', label:'Healthcare Security'}, | |
| ] | |
| }, | |
| therapy: { | |
| id: "therapy", symbol: "Ψ", name: "Cognitive Therapy Protocol", | |
| description: "64 therapeutic nodes. Evidence-based intervention planning. Every session is a trace. Every breakthrough is a node.", | |
| nodes: [ | |
| {id:'a8',name:'PHQ-9 Depr.',desc:'PHQ-9 depression screening'},{id:'b8',name:'GAD-7 Anx.',desc:'GAD-7 anxiety screening'}, | |
| {id:'c8',name:'PCL-5 PTSD',desc:'PCL-5 PTSD screening'},{id:'d8',name:'AUDIT Alc.',desc:'AUDIT alcohol screening'}, | |
| {id:'e8',name:'DAST Drug',desc:'DAST drug screening'},{id:'f8',name:'BSSI Suic.',desc:'Beck suicidal ideation scale'}, | |
| {id:'g8',name:'YMRS Mania',desc:'Young Mania Rating Scale'},{id:'h8',name:'PANSS Psych',desc:'PANSS psychosis screening'}, | |
| {id:'a7',name:'Life Events',desc:'Life events inventory'},{id:'b7',name:'Sleep Study',desc:'Sleep quality assessment'}, | |
| {id:'c7',name:'Social Hx.',desc:'Social history and support'},{id:'d7',name:'Trauma Hx.',desc:'Trauma history inventory'}, | |
| {id:'e7',name:'Substance',desc:'Substance use history'},{id:'f7',name:'Family Hx.',desc:'Family psychiatric history'}, | |
| {id:'g7',name:'Cognitive',desc:'Cognitive assessment'},{id:'h7',name:'Physical Hx.',desc:'Physical health history'}, | |
| {id:'a6',name:'MDD',desc:'Major depressive disorder'},{id:'b6',name:'GAD',desc:'Generalized anxiety disorder'}, | |
| {id:'c6',name:'PTSD',desc:'Post-traumatic stress disorder'},{id:'d6',name:'Bipolar I',desc:'Bipolar I disorder'}, | |
| {id:'e6',name:'Bipolar II',desc:'Bipolar II disorder'},{id:'f6',name:'OCD',desc:'Obsessive-compulsive disorder'}, | |
| {id:'g6',name:'AUD',desc:'Alcohol use disorder'},{id:'h6',name:'Schizoph.',desc:'Schizophrenia spectrum'}, | |
| {id:'a5',name:'Safety Plan',desc:'Safety planning required'},{id:'b5',name:'Crisis Int.',desc:'Crisis intervention required'}, | |
| {id:'c5',name:'Inpatient',desc:'Inpatient admission required'},{id:'d5',name:'IOP',desc:'Intensive outpatient program'}, | |
| {id:'e5',name:'Outpatient',desc:'Standard outpatient care'},{id:'f5',name:'Telehealth',desc:'Telehealth appropriate'}, | |
| {id:'g5',name:'Peer Supp.',desc:'Peer support recommended'},{id:'h5',name:'Self-Help',desc:'Self-help resources appropriate'}, | |
| {id:'a4',name:'CBT',desc:'Cognitive Behavioral Therapy'},{id:'b4',name:'DBT',desc:'Dialectical Behavior Therapy'}, | |
| {id:'c4',name:'EMDR',desc:'Eye Movement Desensitization'},{id:'d4',name:'ACT',desc:'Acceptance Commitment Therapy'}, | |
| {id:'e4',name:'MI',desc:'Motivational Interviewing'},{id:'f4',name:'IPT',desc:'Interpersonal Therapy'}, | |
| {id:'g4',name:'Somatic',desc:'Somatic therapy approach'},{id:'h4',name:'Mindfulness',desc:'Mindfulness-based therapy'}, | |
| {id:'a3',name:'SSRI',desc:'SSRI antidepressant'},{id:'b3',name:'SNRI',desc:'SNRI antidepressant'}, | |
| {id:'c3',name:'Mood Stab.',desc:'Mood stabilizer medication'},{id:'d3',name:'Antipsych.',desc:'Antipsychotic medication'}, | |
| {id:'e3',name:'Anxiolytic',desc:'Anxiolytic medication'},{id:'f3',name:'Sleep Med.',desc:'Sleep medication'}, | |
| {id:'g3',name:'No Meds',desc:'Therapy only — no medication'},{id:'h3',name:'Review Meds',desc:'Medication review required'}, | |
| {id:'a2',name:'6-Week FU',desc:'6-week follow-up scheduled'},{id:'b2',name:'Monthly FU',desc:'Monthly follow-up scheduled'}, | |
| {id:'c2',name:'PRN',desc:'As-needed follow-up'},{id:'d2',name:'Discharge',desc:'Discharge planning initiated'}, | |
| {id:'e2',name:'Outcome Msr',desc:'Outcome measures tracked'},{id:'f2',name:'Goals Set',desc:'Therapeutic goals established'}, | |
| {id:'g2',name:'Progress',desc:'Progress documented'},{id:'h2',name:'Relapse Prev',desc:'Relapse prevention plan'}, | |
| {id:'a1',name:'Stable',desc:'Patient stable — maintained'},{id:'b1',name:'Improved',desc:'Clinically significant improvement'}, | |
| {id:'c1',name:'Remission',desc:'Symptom remission achieved'},{id:'d1',name:'Recovery',desc:'Full functional recovery'}, | |
| {id:'e1',name:'Refer Out',desc:'Specialty referral required'},{id:'f1',name:'Hospitalize',desc:'Hospitalization required'}, | |
| {id:'g1',name:'Step Down',desc:'Step-down care appropriate'},{id:'h1',name:'Maintenance',desc:'Maintenance therapy phase'}, | |
| ], | |
| cases: [ | |
| {id:'veteran-ptsd', name:'Veteran — Combat PTSD with depression comorbidity', label:'PTSD Protocol'}, | |
| {id:'adolescent-anxiety', name:'Adolescent 16 — Social anxiety, school avoidance', label:'CBT Adolescent'}, | |
| {id:'bipolar-stabilize', name:'Adult 35 — Bipolar I — post-manic stabilization', label:'Mood Stabilization'}, | |
| ] | |
| }, | |
| crisis: { | |
| id: "crisis", symbol: "Δ", name: "Crisis Management", | |
| description: "64 crisis response nodes. High-stakes decision under uncertainty. Every minute counts. Every action is a trace.", | |
| nodes: [ | |
| {id:'a8',name:'Cyber Attack',desc:'Active cyber attack detected'},{id:'b8',name:'Data Breach',desc:'Data breach confirmed'}, | |
| {id:'c8',name:'Phys. Threat',desc:'Physical threat incident'},{id:'d8',name:'Natl. Disast.',desc:'Natural disaster event'}, | |
| {id:'e8',name:'Supply Chain',desc:'Supply chain disruption'},{id:'f8',name:'Pandemic',desc:'Pandemic/epidemic event'}, | |
| {id:'g8',name:'Reputational',desc:'Reputational crisis event'},{id:'h8',name:'Financial',desc:'Financial crisis event'}, | |
| {id:'a7',name:'Scope',desc:'Define incident scope'},{id:'b7',name:'Severity',desc:'Assess severity level'}, | |
| {id:'c7',name:'Impact',desc:'Business impact assessment'},{id:'d7',name:'Timeline',desc:'Establish incident timeline'}, | |
| {id:'e7',name:'Stakeholders',desc:'Identify stakeholders'},{id:'f7',name:'Legal Review',desc:'Legal review initiated'}, | |
| {id:'g7',name:'Insurer',desc:'Insurance notification'},{id:'h7',name:'Regulators',desc:'Regulatory notification required'}, | |
| {id:'a6',name:'CISO Notif.',desc:'CISO notification'},{id:'b6',name:'CEO Notif.',desc:'CEO notification'}, | |
| {id:'c6',name:'Board Notif.',desc:'Board notification'},{id:'d6',name:'PR Team',desc:'PR team activated'}, | |
| {id:'e6',name:'Legal Counsel',desc:'External legal counsel'},{id:'f6',name:'IR Team',desc:'Incident response team'}, | |
| {id:'g6',name:'Crisis Comm.',desc:'Crisis communications lead'},{id:'h6',name:'Exec. Team',desc:'Executive team convened'}, | |
| {id:'a5',name:'Isolate',desc:'Isolate affected systems'},{id:'b5',name:'Contain',desc:'Contain incident spread'}, | |
| {id:'c5',name:'Eradicate',desc:'Eradicate threat vector'},{id:'d5',name:'Preserve Evid',desc:'Preserve forensic evidence'}, | |
| {id:'e5',name:'Notify Users',desc:'User notification required'},{id:'f5',name:'Public Stmt',desc:'Public statement required'}, | |
| {id:'g5',name:'Regul. Rpt.',desc:'Regulatory report filed'},{id:'h5',name:'Media Hold',desc:'Media hold implemented'}, | |
| {id:'a4',name:'Backup Rest.',desc:'Backup restoration'},{id:'b4',name:'Sys. Recovery',desc:'System recovery'}, | |
| {id:'c4',name:'Data Recov.',desc:'Data recovery operation'},{id:'d4',name:'Alt. Ops',desc:'Alternative operations activated'}, | |
| {id:'e4',name:'Vendor Supp.',desc:'Vendor support engaged'},{id:'f4',name:'Gov. Supp.',desc:'Government support requested'}, | |
| {id:'g4',name:'Community',desc:'Community assistance'},{id:'h4',name:'Mutual Aid',desc:'Mutual aid agreement activated'}, | |
| {id:'a3',name:'Root Cause',desc:'Root cause analysis'},{id:'b3',name:'Post-Mortem',desc:'Post-mortem review'}, | |
| {id:'c3',name:'Lessons Lrnd',desc:'Lessons learned documented'},{id:'d3',name:'Control Upd.',desc:'Controls updated'}, | |
| {id:'e3',name:'Policy Rev.',desc:'Policy review initiated'},{id:'f3',name:'Training',desc:'Training program updated'}, | |
| {id:'g3',name:'Monitoring',desc:'Enhanced monitoring deployed'},{id:'h3',name:'Test Plan',desc:'Updated test plan'}, | |
| {id:'a2',name:'All Clear',desc:'All clear confirmed'},{id:'b2',name:'Partial Rest.',desc:'Partial restoration achieved'}, | |
| {id:'c2',name:'Full Rest.',desc:'Full restoration achieved'},{id:'d2',name:'Ongoing',desc:'Ongoing management required'}, | |
| {id:'e2',name:'Litigation',desc:'Litigation initiated'},{id:'f2',name:'Regulatory',desc:'Regulatory action pending'}, | |
| {id:'g2',name:'Settled',desc:'Settlement reached'},{id:'h2',name:'Closed',desc:'Incident formally closed'}, | |
| {id:'a1',name:'Contained',desc:'Incident fully contained'},{id:'b1',name:'Mitigated',desc:'Risk mitigated'}, | |
| {id:'c1',name:'Resolved',desc:'Incident resolved'},{id:'d1',name:'Recovered',desc:'Full recovery achieved'}, | |
| {id:'e1',name:'Post-Crisis',desc:'Post-crisis strengthening'},{id:'f1',name:'IR Updated',desc:'IR plan updated'}, | |
| {id:'g1',name:'Resilient',desc:'Organizational resilience improved'},{id:'h1',name:'Certified',desc:'Crisis certification renewed'}, | |
| ], | |
| cases: [ | |
| {id:'ransomware-hospital', name:'Hospital Ransomware — Clinical systems offline', label:'Healthcare Continuity'}, | |
| {id:'data-breach-pii', name:'PII Data Breach — 2M records exposed', label:'GDPR 72h Response'}, | |
| {id:'supply-disruption', name:'Critical Supply Disruption — 72h countdown', label:'Business Continuity'}, | |
| ] | |
| }, | |
| "ai-interp": { | |
| id: "ai-interp", symbol: "⊗", name: "AI Interpretability", | |
| description: "64 interpretability nodes. XAI audit trail. Every model decision is a board traversal. Every explanation is a trace.", | |
| nodes: [ | |
| {id:'a8',name:'Input Data',desc:'Raw input data analysis'},{id:'b8',name:'Preprocessing',desc:'Data preprocessing step'}, | |
| {id:'c8',name:'Features',desc:'Feature extraction'},{id:'d8',name:'Embeddings',desc:'Embedding representation'}, | |
| {id:'e8',name:'Attention',desc:'Attention mechanism'},{id:'f8',name:'Hidden Layer',desc:'Hidden layer activation'}, | |
| {id:'g8',name:'Gradient',desc:'Gradient flow analysis'},{id:'h8',name:'Output',desc:'Model output'}, | |
| {id:'a7',name:'SHAP',desc:'SHAP value attribution'},{id:'b7',name:'LIME',desc:'LIME local explanation'}, | |
| {id:'c7',name:'Grad-CAM',desc:'Gradient-weighted class activation'},{id:'d7',name:'IG',desc:'Integrated gradients'}, | |
| {id:'e7',name:'SAGE',desc:'SAGE feature importance'},{id:'f7',name:'Anchors',desc:'Anchor rule extraction'}, | |
| {id:'g7',name:'Counterfact.',desc:'Counterfactual explanation'},{id:'h7',name:'Concepts',desc:'TCAV concept attribution'}, | |
| {id:'a6',name:'Fair. Metric',desc:'Fairness metric assessment'},{id:'b6',name:'Bias Detect.',desc:'Bias detection analysis'}, | |
| {id:'c6',name:'Disparate Imp',desc:'Disparate impact analysis'},{id:'d6',name:'Calibration',desc:'Model calibration check'}, | |
| {id:'e6',name:'Uncertainty',desc:'Uncertainty quantification'},{id:'f6',name:'Confidence',desc:'Prediction confidence'}, | |
| {id:'g6',name:'OOD Detect.',desc:'Out-of-distribution detection'},{id:'h6',name:'Robustness',desc:'Adversarial robustness'}, | |
| {id:'a5',name:'Proxy Model',desc:'Surrogate proxy model'},{id:'b5',name:'Rule Extract',desc:'Rule extraction'}, | |
| {id:'c5',name:'Decision Tree',desc:'Decision tree approximation'},{id:'d5',name:'Linear Approx',desc:'Linear approximation'}, | |
| {id:'e5',name:'Partial Dep.',desc:'Partial dependence plot'},{id:'f5',name:'ICE Plot',desc:'Individual conditional expectation'}, | |
| {id:'g5',name:'ALE Plot',desc:'Accumulated local effects'},{id:'h5',name:'Interact. Det.',desc:'Feature interaction detection'}, | |
| {id:'a4',name:'Regulatory',desc:'Regulatory compliance check'},{id:'b4',name:'Audit Log',desc:'Audit log generation'}, | |
| {id:'c4',name:'Reproducible',desc:'Reproducibility verification'},{id:'d4',name:'Versioned',desc:'Model version tracked'}, | |
| {id:'e4',name:'Human Rev.',desc:'Human review required'},{id:'f4',name:'Override',desc:'Human override mechanism'}, | |
| {id:'g4',name:'Appeal',desc:'Appeal process available'},{id:'h4',name:'Approved',desc:'Decision approved and documented'}, | |
| {id:'a3',name:'Documentation',desc:'XAI documentation'},{id:'b3',name:'Report Gen.',desc:'Explanation report generated'}, | |
| {id:'c3',name:'Dashboard',desc:'XAI monitoring dashboard'},{id:'d3',name:'Alerts',desc:'Explanation drift alerts'}, | |
| {id:'e3',name:'Retraining',desc:'Model retraining triggered'},{id:'f3',name:'Data Refresh',desc:'Training data refresh'}, | |
| {id:'g3',name:'Architecture',desc:'Architecture review required'},{id:'h3',name:'Benchmark',desc:'Benchmark comparison'}, | |
| {id:'a2',name:'Transparent',desc:'Model deemed transparent'},{id:'b2',name:'Explainable',desc:'Explanation satisfactory'}, | |
| {id:'c2',name:'Auditable',desc:'Full audit trail available'},{id:'d2',name:'Contested',desc:'Explanation contested'}, | |
| {id:'e2',name:'Opaque',desc:'Model remains opaque'},{id:'f2',name:'Deprecated',desc:'Model deprecated'}, | |
| {id:'g2',name:'Replaced',desc:'Model replaced'},{id:'h2',name:'Approved',desc:'Final approval granted'}, | |
| {id:'a1',name:'XAI Pass',desc:'XAI audit passed'},{id:'b1',name:'Partial XAI',desc:'Partial XAI — monitor'}, | |
| {id:'c1',name:'XAI Fail',desc:'XAI audit failed — halt'},{id:'d1',name:'Deployed',desc:'Model deployed with monitoring'}, | |
| {id:'e1',name:'Withdrawn',desc:'Model withdrawn from production'},{id:'f1',name:'Appealed',desc:'Decision appealed'}, | |
| {id:'g1',name:'Remediated',desc:'Issues remediated'},{id:'h1',name:'Certified',desc:'AI system certified'}, | |
| ], | |
| cases: [ | |
| {id:'credit-scoring', name:'Credit Scoring Model — Adverse action explanation', label:'Financial AI'}, | |
| {id:'medical-imaging', name:'Radiology AI — Tumor detection audit', label:'Medical AI'}, | |
| {id:'hiring-algorithm', name:'Hiring Algorithm — Disparate impact audit', label:'HR AI Fairness'}, | |
| ] | |
| } | |
| }; | |
| // ── LLM Provider Configuration ───────────────────────────────────────────── | |
| // ── Onion LLM chain: 8 providers, NEVER fails ────────────────────────────── | |
| // Primary: Groq (fast, logprobs) → DeepSeek (smart) → OpenRouter (free) | |
| // Fallback: Gemini (Google, free tier) → Cerebras (ultra-fast) → Groq key 2-5 round-robin | |
| const PROVIDERS = [ | |
| { | |
| id: "groq", | |
| name: "Groq (llama-3.3-70b-versatile)", | |
| url: "https://api.groq.com/openai/v1/chat/completions", | |
| model: "llama-3.3-70b-versatile", | |
| keyEnv: "GROQ_API_KEY", | |
| supportsLogprobs: true, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| }, | |
| { | |
| id: "deepseek", | |
| name: "DeepSeek-V3", | |
| url: "https://api.deepseek.com/v1/chat/completions", | |
| model: "deepseek-chat", | |
| keyEnv: "DEEPSEEK_API_KEY", | |
| supportsLogprobs: false, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| }, | |
| { | |
| id: "gemini", | |
| name: "Gemini 2.0 Flash", | |
| url: "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent", | |
| model: "gemini-2.0-flash", | |
| keyEnv: "GEMINI_API_KEY", | |
| supportsLogprobs: false, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| isGemini: true, // uses different API shape | |
| }, | |
| { | |
| id: "cerebras", | |
| name: "Cerebras (llama-3.3-70b)", | |
| url: "https://api.cerebras.ai/v1/chat/completions", | |
| model: "llama-3.3-70b", | |
| keyEnv: "CEREBRAS_API_KEY", | |
| supportsLogprobs: false, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| }, | |
| { | |
| id: "openrouter", | |
| name: "OpenRouter (llama-3.3-70b-instruct:free)", | |
| url: "https://openrouter.ai/api/v1/chat/completions", | |
| model: "meta-llama/llama-3.3-70b-instruct:free", | |
| keyEnv: "OPENROUTER_API_KEY", | |
| supportsLogprobs: false, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| headers: { | |
| "HTTP-Referer": "https://www.p2pclaw.com", | |
| "X-Title": "P2PCLAW ChessBoard Reasoning Engine", | |
| } | |
| }, | |
| { | |
| id: "groq2", | |
| name: "Groq Key 2 (llama-3.3-70b)", | |
| url: "https://api.groq.com/openai/v1/chat/completions", | |
| model: "llama-3.3-70b-versatile", | |
| keyEnv: "GROQ_API_KEY_2", | |
| supportsLogprobs: true, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| }, | |
| { | |
| id: "deepseek2", | |
| name: "DeepSeek Key 2", | |
| url: "https://api.deepseek.com/v1/chat/completions", | |
| model: "deepseek-chat", | |
| keyEnv: "DEEPSEEK_API_KEY_2", | |
| supportsLogprobs: false, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| }, | |
| { | |
| id: "openrouter2", | |
| name: "OpenRouter Key 2", | |
| url: "https://openrouter.ai/api/v1/chat/completions", | |
| model: "meta-llama/llama-3.3-70b-instruct:free", | |
| keyEnv: "OPENROUTER_API_KEY_2", | |
| supportsLogprobs: false, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| headers: { | |
| "HTTP-Referer": "https://www.p2pclaw.com", | |
| "X-Title": "P2PCLAW ChessBoard Reasoning Engine", | |
| } | |
| }, | |
| { | |
| id: "groq3", | |
| name: "Groq Key 3", | |
| url: "https://api.groq.com/openai/v1/chat/completions", | |
| model: "llama-3.3-70b-versatile", | |
| keyEnv: "GROQ_API_KEY_3", | |
| supportsLogprobs: true, | |
| temperature: 0.3, | |
| maxTokens: 1200, | |
| }, | |
| ]; | |
| // ── Result cache: prevent duplicate LLM calls within 60s for same domain+case ── | |
| const reasonCache = new Map(); // key: `${domain}:${case_id}` → {result, expires} | |
| // ── Build compact ontology string for prompt ─────────────────────────────── | |
| function buildOntologyString(nodes) { | |
| return nodes.map(n => `${n.id}:${n.name}${n.desc ? ' - '+n.desc : ''}`).join('\n'); | |
| } | |
| // ── Build system prompt for reasoning ───────────────────────────────────── | |
| function buildPrompt(domain, ontology, caseDescription, context) { | |
| const nodeStr = buildOntologyString(ontology.nodes); | |
| return { | |
| system: `You are the P2PCLAW ChessBoard Reasoning Engine — a formal ontology traversal system. | |
| DOMAIN: ${ontology.name} | |
| DOMAIN DESCRIPTION: ${ontology.description} | |
| You reason by traversing a 64-node board. Each node has a chess ID (a1-h8), a name, and a description. | |
| Select 6-10 nodes that best trace the reasoning path for the given case. | |
| For each node, provide ONE specific sentence of domain reasoning. | |
| End with a concrete, specific verdict and an integer confidence score (0-100). | |
| BOARD ONTOLOGY (${ontology.nodes.length} nodes): | |
| ${nodeStr} | |
| CRITICAL RULES: | |
| - path[] must contain ONLY node IDs from the list above (e.g., "b8", "g6", "d1") | |
| - reasoning[] length MUST equal path[] length | |
| - verdict must be specific with concrete findings — NOT generic | |
| - confidence is an integer 0-100 based on evidence strength | |
| - Return ONLY valid JSON — no markdown fences, no explanation text`, | |
| user: `CASE: ${caseDescription}${context ? '\n\nADDITIONAL CONTEXT: ' + context : ''} | |
| Return JSON in EXACTLY this schema: | |
| { | |
| "path": ["b8", "g6", "c6", "d5", "a5", "f4", "a4", "d1"], | |
| "reasoning": [ | |
| "Step reasoning for node b8", | |
| "Step reasoning for node g6", | |
| "... (one per path node)" | |
| ], | |
| "verdict": "Specific concrete verdict with findings and values", | |
| "confidence": 85 | |
| }` | |
| }; | |
| } | |
| // ── Parse and validate LLM JSON output ──────────────────────────────────── | |
| function parseAndValidate(raw, domain) { | |
| const ontology = DOMAIN_ONTOLOGIES[domain]; | |
| const validIds = new Set(ontology.nodes.map(n => n.id)); | |
| let parsed; | |
| // Try multiple JSON extraction strategies | |
| try { | |
| parsed = JSON.parse(raw); | |
| } catch (_) { | |
| const fenceMatch = raw.match(/```(?:json)?\n?([\s\S]+?)\n?```/); | |
| if (fenceMatch) { | |
| try { parsed = JSON.parse(fenceMatch[1]); } catch (_) {} | |
| } | |
| if (!parsed) { | |
| const braceMatch = raw.match(/\{[\s\S]+\}/); | |
| if (braceMatch) { | |
| try { parsed = JSON.parse(braceMatch[0]); } catch (_) {} | |
| } | |
| } | |
| } | |
| if (!parsed || !Array.isArray(parsed.path) || !Array.isArray(parsed.reasoning)) { | |
| throw new Error(`LLM JSON parse failed. Raw: ${raw.slice(0, 200)}`); | |
| } | |
| // Validate all node IDs | |
| const invalidIds = parsed.path.filter(id => !validIds.has(id)); | |
| if (invalidIds.length > 0) { | |
| throw new Error(`LLM returned invalid node IDs: ${invalidIds.join(', ')}`); | |
| } | |
| if (parsed.path.length < 4) throw new Error("Path too short (< 4 nodes)"); | |
| if (parsed.reasoning.length !== parsed.path.length) { | |
| // Pad or trim reasoning to match path length | |
| while (parsed.reasoning.length < parsed.path.length) { | |
| parsed.reasoning.push(`Node ${parsed.path[parsed.reasoning.length]} analysis`); | |
| } | |
| parsed.reasoning = parsed.reasoning.slice(0, parsed.path.length); | |
| } | |
| parsed.confidence = Math.max(10, Math.min(99, parseInt(parsed.confidence) || 75)); | |
| if (!parsed.verdict || parsed.verdict.length < 10) { | |
| parsed.verdict = `${domain} analysis complete. Trace: ${parsed.path.join('-')}. Confidence: ${parsed.confidence}%.`; | |
| } | |
| return parsed; | |
| } | |
| // ── Compute confidence from logprobs (Groq feature) ─────────────────────── | |
| function computeConfidenceFromLogprobs(logprobs) { | |
| if (!logprobs || !logprobs.content || logprobs.content.length === 0) return null; | |
| const values = logprobs.content | |
| .filter(t => t.logprob !== null && t.logprob > -100) | |
| .map(t => t.logprob); | |
| if (values.length === 0) return null; | |
| const meanLogprob = values.reduce((a, b) => a + b, 0) / values.length; | |
| return Math.max(50, Math.min(99, Math.round(Math.exp(meanLogprob) * 100 + 50))); | |
| } | |
| // ── Real audit hash (SHA-256) ───────────────────────────────────────────── | |
| export function computeAuditHash(trace, caseId, timestamp, modelId) { | |
| const input = `trace:${trace}|case:${caseId}|ts:${timestamp}|model:${modelId}`; | |
| return 'sha256:' + crypto.createHash('sha256').update(input).digest('hex'); | |
| } | |
| // ── Generate unique trace ID ─────────────────────────────────────────────── | |
| function generateTraceId(auditHash, timestamp) { | |
| return `wf-${timestamp}-${auditHash.slice(7, 11)}`; | |
| } | |
| // ── Main LLM call with provider fallback chain ───────────────────────────── | |
| async function callLLM(provider, prompt) { | |
| const apiKey = process.env[provider.keyEnv]; | |
| if (!apiKey) throw new Error(`${provider.keyEnv} not set`); | |
| // ── Gemini uses a different API shape ──────────────────────────────────── | |
| if (provider.isGemini) { | |
| const geminiUrl = `${provider.url}?key=${apiKey}`; | |
| const geminiBody = { | |
| contents: [{ role: "user", parts: [{ text: `${prompt.system}\n\n${prompt.user}` }] }], | |
| generationConfig: { temperature: provider.temperature, maxOutputTokens: provider.maxTokens } | |
| }; | |
| const response = await fetch(geminiUrl, { | |
| method: "POST", | |
| headers: { "Content-Type": "application/json" }, | |
| body: JSON.stringify(geminiBody), | |
| signal: AbortSignal.timeout(25000) | |
| }); | |
| if (!response.ok) { | |
| const errText = await response.text().catch(() => ""); | |
| throw new Error(`${provider.id} HTTP ${response.status}: ${errText.slice(0, 200)}`); | |
| } | |
| const data = await response.json(); | |
| const content = data?.candidates?.[0]?.content?.parts?.[0]?.text; | |
| if (!content) throw new Error(`${provider.id} returned empty content`); | |
| return { content, logprobs: null, modelId: provider.model, providerId: provider.id }; | |
| } | |
| // ── Standard OpenAI-compatible API ────────────────────────────────────── | |
| const body = { | |
| model: provider.model, | |
| temperature: provider.temperature, | |
| max_tokens: provider.maxTokens, | |
| messages: [ | |
| { role: "system", content: prompt.system }, | |
| { role: "user", content: prompt.user } | |
| ] | |
| }; | |
| if (provider.supportsLogprobs) { | |
| body.logprobs = true; | |
| body.top_logprobs = 1; | |
| } | |
| const headers = { | |
| "Authorization": `Bearer ${apiKey}`, | |
| "Content-Type": "application/json", | |
| ...(provider.headers || {}) | |
| }; | |
| const response = await fetch(provider.url, { | |
| method: "POST", | |
| headers, | |
| body: JSON.stringify(body), | |
| signal: AbortSignal.timeout(25000) // 25s timeout | |
| }); | |
| if (!response.ok) { | |
| const errText = await response.text().catch(() => ""); | |
| throw new Error(`${provider.id} HTTP ${response.status}: ${errText.slice(0, 200)}`); | |
| } | |
| const data = await response.json(); | |
| const content = data?.choices?.[0]?.message?.content; | |
| if (!content) throw new Error(`${provider.id} returned empty content`); | |
| const logprobs = provider.supportsLogprobs ? data?.choices?.[0]?.logprobs : null; | |
| return { content, logprobs, modelId: provider.model, providerId: provider.id }; | |
| } | |
| // ── Master reasoning function ────────────────────────────────────────────── | |
| export async function runWorkflowReason({ domain, caseId, caseDescription, context, agentId, preferredProvider }) { | |
| const ontology = DOMAIN_ONTOLOGIES[domain]; | |
| if (!ontology) throw new Error(`Unknown domain: ${domain}`); | |
| // Check cache (60s TTL for same domain+case) | |
| const cacheKey = `${domain}:${caseId || 'custom'}:${caseDescription.slice(0, 50)}`; | |
| const cached = reasonCache.get(cacheKey); | |
| if (cached && cached.expires > Date.now()) { | |
| console.log(`[WORKFLOW-LLM] Cache hit for ${cacheKey}`); | |
| // Return a fresh trace ID but same LLM result | |
| const ts = Date.now(); | |
| const auditHash = computeAuditHash(cached.result.trace, caseId || 'custom', ts, cached.result.llm_model); | |
| const traceId = generateTraceId(auditHash, ts); | |
| return { ...cached.result, traceId, audit_hash: auditHash, timestamp: ts, cached: true }; | |
| } | |
| const prompt = buildPrompt(domain, ontology, caseDescription, context); | |
| // Determine provider order | |
| const providers = [...PROVIDERS]; | |
| if (preferredProvider) { | |
| const preferred = providers.find(p => p.id === preferredProvider); | |
| if (preferred) { | |
| const rest = providers.filter(p => p.id !== preferredProvider); | |
| providers.splice(0, providers.length, preferred, ...rest); | |
| } | |
| } | |
| const triedProviders = []; | |
| let lastError; | |
| for (const provider of providers) { | |
| try { | |
| console.log(`[WORKFLOW-LLM] Trying ${provider.id} for domain:${domain}`); | |
| const { content, logprobs, modelId, providerId } = await callLLM(provider, prompt); | |
| const parsed = parseAndValidate(content, domain); | |
| // Compute confidence: logprobs > LLM-reported > default | |
| let confidence = parsed.confidence; | |
| let confidenceMethod = "llm-reported"; | |
| if (logprobs) { | |
| const logprobConf = computeConfidenceFromLogprobs(logprobs); | |
| if (logprobConf !== null) { | |
| confidence = logprobConf; | |
| confidenceMethod = "logprobs"; | |
| } | |
| } | |
| const trace = parsed.path.join('-'); | |
| const timestamp = Date.now(); | |
| const auditHash = computeAuditHash(trace, caseId || 'custom', timestamp, modelId); | |
| const traceId = generateTraceId(auditHash, timestamp); | |
| // Build steps with node metadata | |
| const steps = parsed.path.map((nodeId, idx) => { | |
| const node = ontology.nodes.find(n => n.id === nodeId) || { icon: '·', name: nodeId, desc: '' }; | |
| return { | |
| step: idx + 1, | |
| node_id: nodeId, | |
| node_icon: node.icon || '·', | |
| node_name: node.name, | |
| node_desc: node.desc || '', | |
| reasoning: parsed.reasoning[idx] | |
| }; | |
| }); | |
| const result = { | |
| traceId, | |
| domain, | |
| case_id: caseId || null, | |
| case_description: caseDescription, | |
| trace, | |
| steps, | |
| verdict: parsed.verdict, | |
| confidence, | |
| confidence_method: confidenceMethod, | |
| audit_hash: auditHash, | |
| audit_hash_input: `trace:${trace}|case:${caseId || 'custom'}|ts:${timestamp}|model:${modelId}`, | |
| llm_model: modelId, | |
| llm_provider: providerId, | |
| agent_id: agentId || "anonymous", | |
| timestamp, | |
| published_paper_id: null, | |
| status: "active" | |
| }; | |
| // Cache result for 60s | |
| reasonCache.set(cacheKey, { result, expires: Date.now() + 60000 }); | |
| // Evict cache if too large | |
| if (reasonCache.size > 200) { | |
| const firstKey = reasonCache.keys().next().value; | |
| reasonCache.delete(firstKey); | |
| } | |
| console.log(`[WORKFLOW-LLM] ✓ ${provider.id} | domain:${domain} | trace:${trace} | conf:${confidence}% | hash:${auditHash.slice(0,16)}...`); | |
| return result; | |
| } catch (err) { | |
| console.warn(`[WORKFLOW-LLM] ${provider.id} failed: ${err.message}`); | |
| triedProviders.push(provider.id); | |
| lastError = err; | |
| } | |
| } | |
| throw new Error(`All LLM providers failed (tried: ${triedProviders.join(', ')}). Last error: ${lastError?.message}`); | |
| } | |