heor-agent-mcp 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +114 -14
  2. package/dist/analytics.d.ts +9 -0
  3. package/dist/analytics.d.ts.map +1 -1
  4. package/dist/analytics.js +20 -0
  5. package/dist/analytics.js.map +1 -1
  6. package/dist/grade/eq5dImpact.d.ts.map +1 -1
  7. package/dist/grade/eq5dImpact.js +17 -4
  8. package/dist/grade/eq5dImpact.js.map +1 -1
  9. package/dist/grade/inconsistency.d.ts.map +1 -1
  10. package/dist/grade/inconsistency.js +5 -1
  11. package/dist/grade/inconsistency.js.map +1 -1
  12. package/dist/network/bucher.d.ts.map +1 -1
  13. package/dist/network/bucher.js +12 -9
  14. package/dist/network/bucher.js.map +1 -1
  15. package/dist/network/consistency.d.ts +7 -0
  16. package/dist/network/consistency.d.ts.map +1 -1
  17. package/dist/network/consistency.js +1 -2
  18. package/dist/network/consistency.js.map +1 -1
  19. package/dist/schemas/dossierInputSchemas.d.ts +113 -0
  20. package/dist/schemas/dossierInputSchemas.d.ts.map +1 -0
  21. package/dist/schemas/dossierInputSchemas.js +74 -0
  22. package/dist/schemas/dossierInputSchemas.js.map +1 -0
  23. package/dist/server.js +41 -11
  24. package/dist/server.js.map +1 -1
  25. package/dist/tools/examples.d.ts +34 -0
  26. package/dist/tools/examples.d.ts.map +1 -0
  27. package/dist/tools/examples.js +300 -0
  28. package/dist/tools/examples.js.map +1 -0
  29. package/dist/tools/htaDossierPrep.d.ts.map +1 -1
  30. package/dist/tools/htaDossierPrep.js +25 -4
  31. package/dist/tools/htaDossierPrep.js.map +1 -1
  32. package/dist/tools/indirectComparison.js +1 -1
  33. package/dist/tools/indirectComparison.js.map +1 -1
  34. package/dist/tools/literatureSearch.d.ts.map +1 -1
  35. package/dist/tools/literatureSearch.js +74 -3
  36. package/dist/tools/literatureSearch.js.map +1 -1
  37. package/dist/tools/projectCreate.d.ts.map +1 -1
  38. package/dist/tools/projectCreate.js +43 -14
  39. package/dist/tools/projectCreate.js.map +1 -1
  40. package/dist/tools/riskOfBias.d.ts.map +1 -1
  41. package/dist/tools/riskOfBias.js +33 -24
  42. package/dist/tools/riskOfBias.js.map +1 -1
  43. package/dist/util/didYouMean.d.ts +13 -0
  44. package/dist/util/didYouMean.d.ts.map +1 -0
  45. package/dist/util/didYouMean.js +64 -0
  46. package/dist/util/didYouMean.js.map +1 -0
  47. package/package.json +1 -1
package/README.md CHANGED
@@ -3,15 +3,36 @@
3
3
  [![npm version](https://img.shields.io/npm/v/heor-agent-mcp.svg)](https://www.npmjs.com/package/heor-agent-mcp)
4
4
  [![license](https://img.shields.io/npm/l/heor-agent-mcp.svg)](./LICENSE)
5
5
  [![node](https://img.shields.io/node/v/heor-agent-mcp.svg)](https://nodejs.org)
6
+ [![Try in ChatGPT](https://img.shields.io/badge/Try_in-ChatGPT-10A37F?logo=openai&logoColor=white)](https://chatgpt.com/g/g-69f651f588f48191b1d69d54409857ec-heoragent)
7
+ [![Web UI](https://img.shields.io/badge/Web_UI-Vercel-000000?logo=vercel&logoColor=white)](https://web-michael-ns-projects.vercel.app)
6
8
 
7
9
  **AI-powered Health Economics and Outcomes Research (HEOR) agent as a Model Context Protocol server.**
8
10
 
11
+ > **Try it now →** [HEORAgent on ChatGPT](https://chatgpt.com/g/g-69f651f588f48191b1d69d54409857ec-heoragent) (ChatGPT Plus / Team)
12
+ > · [Web UI (Claude, BYOK)](https://web-michael-ns-projects.vercel.app)
13
+ > · `npx heor-agent-mcp` for Claude Desktop / Claude Code
14
+
9
15
  Automates literature review across 44 data sources, risk of bias assessment (RoB 2 / ROBINS-I / AMSTAR-2), EQ-5D value set impact estimation, state-of-the-art cost-effectiveness modelling, HTA dossier preparation for NICE / EMA / FDA / IQWiG / HAS / EU JCA, and a persistent project knowledge base — all callable as MCP tools from Claude.ai, Claude Code, and any MCP-compatible host.
10
16
 
11
17
  Built for pharmaceutical, biotech, CRO, and medical affairs teams who need rigorous, auditable HEOR workflows without building infrastructure from scratch.
12
18
 
13
19
  ---
14
20
 
21
+ ## What's new in v1.0.4
22
+
23
+ Senior HEOR methodology + ChatGPT support:
24
+
25
+ - **GRADE inconsistency now uses I²** instead of study count. Single-study comparisons return `not_assessable` (per Cochrane 10.10) instead of being silently auto-downgraded as "Serious". Pass `heterogeneity_per_outcome` to `hta_dossier` and the Cochrane bands (50–74% Moderate, 75–89% Serious, ≥90% Very Serious) are applied directly.
26
+ - **GRADE upgrading (Guyatt 2011)** — observational evidence with strong effects can now be upgraded from Low. Three criteria via `upgrading_per_outcome`: large effect (RR <0.5/>2.0 → +1; <0.2/>5.0 → +2), dose-response (+1), plausible confounding biasing toward null (+1). Capped at +2.
27
+ - **Bucher consistency check** — when direct head-to-head A-vs-C evidence exists alongside the indirect A-vs-C estimate, `evidence_indirect` automatically tests Bucher's consistency assumption and flags violations (NICE DSU TSD 18). |z|≥1.96 = "substantial — consistency assumption appears violated."
28
+ - **EQ-5D 5L impact is baseline-utility-aware.** Biz 2026 reports category-level medians, but the new 5L value set compresses utilities in the 0.6–0.9 range — a drug for mild plaque psoriasis (baseline ~0.85) sees a much bigger ICER increase than one for severe HS (baseline ~0.45), even though both are `non_cancer_qol_only`. Pass `baseline_utility` to `utility_value_set` for a calibrated estimate.
29
+ - **ChatGPT Custom GPT support** — new OpenAPI 3.1 adapter at `/api/openapi` lets you build a Custom GPT in 5 minutes. See [ChatGPT Custom GPT](#chatgpt-custom-gpt) below.
30
+ - **Surface-tagged analytics** — every `tool_call` PostHog event now carries a `surface` property (`claude_anthropic_web` / `chatgpt_adapter` / `claude_desktop` / `direct_mcp`) so you can break down usage by client.
31
+
32
+ See [CHANGELOG.md](./CHANGELOG.md) for the full diff.
33
+
34
+ ---
35
+
15
36
  ## Quick Start
16
37
 
17
38
  ### Claude Code
@@ -45,15 +66,23 @@ Add to your MCP configuration:
45
66
 
46
67
  ---
47
68
 
48
- ## Tools
69
+ ## Tools (17)
49
70
 
50
71
  | Tool | Purpose |
51
72
  |------|---------|
52
- | `literature_search` | Search 42 data sources with a full PRISMA-style audit trail |
73
+ | `literature_search` | Search 44 data sources with a full PRISMA-style audit trail |
53
74
  | `screen_abstracts` | PICO-based relevance scoring and study design classification |
54
75
  | `risk_of_bias` | Cochrane RoB 2 / ROBINS-I / AMSTAR-2 with GRADE RoB domain summary |
55
- | `cost_effectiveness_model` | Markov / PartSA / decision-tree CEA with PSA, OWSA, CEAC, EVPI |
56
- | `hta_dossier_prep` | Draft submissions for NICE, EMA, FDA, IQWiG, HAS, and EU JCA GRADE table uses structured RoB when `rob_results` passed |
76
+ | `evidence_network` | Build treatment comparison network and assess NMA feasibility |
77
+ | `evidence_indirect` | Bucher and frequentist NMA with **automatic consistency check** vs direct h2h evidence (NICE DSU TSD 18) |
78
+ | `population_adjusted_comparison` | MAIC and STC for population-adjusted indirect comparisons |
79
+ | `survival_fitting` | Fit 5 parametric distributions to KM data (NICE DSU TSD 14) |
80
+ | `itc_feasibility` | Assess the 3-assumption ITC framework and recommend Bucher / NMA / MAIC / STC / ML-NMR |
81
+ | `cost_effectiveness_model` | Markov / PartSA / decision-tree CEA with PSA, OWSA, CEAC, EVPI, EVPPI; QALY + evLYG support |
82
+ | `budget_impact_model` | ISPOR-compliant BIA with year-by-year output and treatment-displacement modelling |
83
+ | `hta_dossier` | Draft submissions for NICE, EMA, FDA, IQWiG, HAS, and EU JCA — GRADE table uses structured RoB when `rob_results` passed; **inconsistency uses I² when `heterogeneity_per_outcome` passed**; **GRADE upgrading (Guyatt 2011) supported via `upgrading_per_outcome`** |
84
+ | `utility_value_set` | EQ-5D-3L / 5L value-set reference + **baseline-utility-aware** Biz 2026 ICER impact estimator (UK 5L transition) |
85
+ | `validate_links` | HTTP validation of citation URLs before presentation |
57
86
  | `project_create` | Initialize a persistent project workspace |
58
87
  | `knowledge_search` | Full-text search across a project's raw/ and wiki/ trees |
59
88
  | `knowledge_read` | Read any file from a project's knowledge base |
@@ -61,7 +90,7 @@ Add to your MCP configuration:
61
90
 
62
91
  ### `literature_search`
63
92
 
64
- Searches across 42 sources in parallel. Every call returns a **source selection table** showing which of the 42 sources were used and why — essential for HTA audit trails.
93
+ Searches across 44 sources in parallel. Every call returns a **source selection table** showing which of the 44 sources were used and why — essential for HTA audit trails.
65
94
 
66
95
  **Example call:**
67
96
  ```json
@@ -197,7 +226,7 @@ This single prompt exercises: `project_create` → `literature_search` → `scre
197
226
 
198
227
  ## Data Sources
199
228
 
200
- **42 sources across 9 categories.** Every `literature_search` call includes a source selection table showing used/not-used status and reason for each.
229
+ **44 sources across 10 categories.** Every `literature_search` call includes a source selection table showing used/not-used status and reason for each.
201
230
 
202
231
  <details>
203
232
  <summary><b>Biomedical & Clinical Trials (5)</b></summary>
@@ -270,9 +299,11 @@ This single prompt exercises: `project_create` → `literature_search` → `scre
270
299
  </details>
271
300
 
272
301
  <details>
273
- <summary><b>Other (1)</b></summary>
302
+ <summary><b>HEOR Methodology & Utility Reference (3)</b></summary>
274
303
 
275
304
  - **ISPOR** — HEOR methodology and conference abstracts
305
+ - **OHE (Office of Health Economics)** — EQ-5D value set research and HEOR methodology
306
+ - **EuroQol Group** — EQ-5D instruments, value sets, and registry
276
307
  </details>
277
308
 
278
309
  ---
@@ -293,7 +324,7 @@ DOCX files are saved to `~/.heor-agent/projects/{project}/reports/` (when a proj
293
324
 
294
325
  Every tool call returns a full audit record:
295
326
 
296
- - **Source selection table** — all 42 sources with used/not-used and reason
327
+ - **Source selection table** — all 44 sources with used/not-used and reason
297
328
  - **Sources queried** — queries sent, response counts, status, latency
298
329
  - **Inclusions / exclusions** — counts with reasons
299
330
  - **Methodology** — PRISMA-style for literature, ISPOR/NICE for economics
@@ -333,10 +364,11 @@ A companion chat interface is available at:
333
364
 
334
365
  **https://web-michael-ns-projects.vercel.app**
335
366
 
336
- - Chat with Claude Opus 4.6 + all 7 HEOR tools
367
+ - Chat with Claude Sonnet 4.6 + all 17 HEOR tools
337
368
  - **BYOK (Bring Your Own Key)** — paste your Anthropic API key in the settings; it stays in your browser's localStorage and is never stored on our servers
338
- - Markdown rendering with styled tables, tool call cards with live progress timers
339
- - Example prompts for common HEOR workflows
369
+ - Markdown rendering with styled tables, tool call cards with live progress timers, and theme-aware mermaid network diagrams
370
+ - 12 example prompts covering literature search, CEA, BIA, NMA, ITC feasibility, RoB, EQ-5D 5L, EU JCA dossiers
371
+ - Per-request MCP sessions (no cross-user session bleed)
340
372
 
341
373
  The web UI calls the hosted MCP server on Railway for tool execution. No setup required — just add your API key and start querying.
342
374
 
@@ -353,6 +385,74 @@ Set `MCP_SERVER_URL` to point to your own MCP server instance (default: the publ
353
385
 
354
386
  ---
355
387
 
388
+ ## ChatGPT Custom GPT
389
+
390
+ > **🟢 Live:** [HEORAgent on ChatGPT →](https://chatgpt.com/g/g-69f651f588f48191b1d69d54409857ec-heoragent)
391
+ >
392
+ > Open in ChatGPT (Plus / Team / Enterprise account required), pick a conversation starter, and you're querying 44 HEOR data sources.
393
+
394
+ HEORAgent is also available as a ChatGPT Custom GPT — useful when you (or your team) prefer the ChatGPT interface or have a ChatGPT Plus/Team account but no Anthropic API access.
395
+
396
+ Behind the scenes, the web tier exposes an OpenAPI 3.1 adapter at `/api/openapi`, with one POST endpoint per tool at `/api/v1/{tool_name}`. ChatGPT speaks this contract natively.
397
+
398
+ ### What's different from the Anthropic surface
399
+
400
+ | | Web UI / MCP / Claude Desktop | ChatGPT Custom GPT |
401
+ |---|---|---|
402
+ | Streaming | yes (SSE) | no (45s single response) |
403
+ | `psa_iterations` | up to 10,000 | capped to 1,000 (CEA) / 500 (BIA) |
404
+ | `literature_search.runs` | 1–5 | capped to 1 |
405
+ | `literature_search.max_results` | up to 100 | capped to 30 |
406
+ | Auth model | BYOK Anthropic | optional `X-API-Key` header (server-side `CHATGPT_ADAPTER_TOKEN`) |
407
+ | Surface label in PostHog | `claude_anthropic_web` / `claude_desktop` | `chatgpt_adapter` |
408
+
409
+ The caps exist because ChatGPT Actions hard-fail at the 45-second response timeout. PSA, multi-run literature search, and full max_results would routinely exceed it. The web UI and MCP clients are unaffected.
410
+
411
+ ### Build a Custom GPT (ChatGPT Plus / Team required)
412
+
413
+ 1. Visit [chatgpt.com/gpts/editor](https://chatgpt.com/gpts/editor) and click **Create**.
414
+ 2. **Configure** tab — fill in name (e.g., "HEORAgent"), description, and conversation starters. Paste the system prompt from `web/lib/claude.ts` (or write your own — the tool descriptions are self-documenting).
415
+ 3. **Actions** → **Create new action** → **Import from URL** → paste:
416
+ ```
417
+ https://web-michael-ns-projects.vercel.app/api/openapi
418
+ ```
419
+ ChatGPT auto-imports all 17 endpoints with their schemas.
420
+ 4. **Authentication** — choose **None** for the open public endpoint, or **API Key** with the `CHATGPT_ADAPTER_TOKEN` value if you've configured one (recommended for prod).
421
+ 5. **Privacy policy URL** — required by GPT Store. Use the web UI's privacy URL or your own.
422
+ 6. **Test** in the playground (right pane), then **Publish** → "Anyone with the link" or "GPT Store".
423
+
424
+ ### Securing the adapter for production
425
+
426
+ By default the `/api/v1/*` endpoint is open. Two layers of protection are recommended for any public-facing GPT:
427
+
428
+ ```bash
429
+ # 1. Token-gate the endpoint
430
+ cd web
431
+ vercel env add CHATGPT_ADAPTER_TOKEN production # generate a long random token
432
+ # Configure the same token in your Custom GPT under Authentication → API Key
433
+
434
+ # 2. Built-in rate limit
435
+ # 60 req/min per IP is enforced automatically (lib/rateLimit.ts).
436
+ # For multi-region/high-traffic prod, swap in @upstash/ratelimit + Vercel KV.
437
+ ```
438
+
439
+ ### Sample call (manual, no GPT needed)
440
+
441
+ ```bash
442
+ curl -X POST https://web-michael-ns-projects.vercel.app/api/v1/utility_value_set \
443
+ -H "Content-Type: application/json" \
444
+ -d '{
445
+ "action": "estimate_impact",
446
+ "indication_type": "non_cancer_qol_only",
447
+ "baseline_utility": 0.85,
448
+ "base_icer": 30000
449
+ }'
450
+ ```
451
+
452
+ Returns the Biz 2026 baseline-utility-adjusted ICER projection (the new EQ-5D 5L impact estimator).
453
+
454
+ ---
455
+
356
456
  ## HTTP Transport
357
457
 
358
458
  The server supports both **stdio** (default, for local MCP clients) and **Streamable HTTP** (for hosted deployment).
@@ -379,7 +479,7 @@ HTTP endpoints:
379
479
  git clone https://github.com/neptun2000/heor-agent-mcp
380
480
  cd heor-agent-mcp
381
481
  npm install
382
- npm test # 244 tests across 66 suites
482
+ npm test # 401 tests across 84 suites
383
483
  npm run build # Compile TypeScript to dist/
384
484
  npm run dev # Run with tsx (no build step)
385
485
  ```
@@ -398,10 +498,10 @@ npm run dev # Run with tsx (no build step)
398
498
  ┌────────────────▼──────────────────────────┐
399
499
  │ heor-agent-mcp server │
400
500
  │ ┌──────────────────────────────────────┐ │
401
- │ │ 7 MCP tools (Zod-validated) │ │
501
+ │ │ 17 MCP tools (Zod-validated) │ │
402
502
  │ ├──────────────────────────────────────┤ │
403
503
  │ │ DirectProvider (default) │ │
404
- │ │ ├─ 42 source fetchers │ │
504
+ │ │ ├─ 44 source fetchers │ │
405
505
  │ │ ├─ Audit builder + PRISMA trail │ │
406
506
  │ │ ├─ Markov / PartSA economic models │ │
407
507
  │ │ ├─ Markdown + DOCX formatters │ │
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Map MCP `clientInfo.name` (set by the calling client during initialize)
3
+ * to a canonical surface label so PostHog can distinguish events from
4
+ * Claude Desktop, the Vercel web UI, the ChatGPT Custom GPT adapter, etc.
5
+ *
6
+ * Returns "direct_mcp" for unknown / npx / third-party clients.
7
+ */
8
+ export type ClientSurface = "claude_anthropic_web" | "chatgpt_adapter" | "claude_desktop" | "smithery" | "glama" | "pulsemcp" | "direct_mcp";
9
+ export declare function inferSurface(clientName: string | undefined): ClientSurface;
1
10
  export declare function trackEvent(event: string, properties?: Record<string, unknown>, sessionId?: string): void;
2
11
  export declare function trackToolCall(toolName: string, durationMs: number, status: "ok" | "error", sessionId?: string, properties?: Record<string, unknown>): void;
3
12
  export declare function trackSession(event: "session_start" | "session_end", sessionId: string, properties?: Record<string, unknown>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAgBA,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACxC,SAAS,CAAC,EAAE,MAAM,QAanB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,IAAI,GAAG,OAAO,EACtB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,QAQzC;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,GAAG,aAAa,EACtC,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,QAGzC;AAED,wBAAsB,iBAAiB,kBAKtC"}
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,sBAAsB,GACtB,iBAAiB,GACjB,gBAAgB,GAChB,UAAU,GACV,OAAO,GACP,UAAU,GACV,YAAY,CAAC;AAEjB,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAe1E;AAgBD,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACxC,SAAS,CAAC,EAAE,MAAM,QAanB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,IAAI,GAAG,OAAO,EACtB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,QAYzC;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,GAAG,aAAa,EACtC,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,QAGzC;AAED,wBAAsB,iBAAiB,kBAKtC"}
package/dist/analytics.js CHANGED
@@ -1,4 +1,24 @@
1
1
  import { PostHog } from "posthog-node";
2
+ export function inferSurface(clientName) {
3
+ if (!clientName)
4
+ return "direct_mcp";
5
+ const n = clientName.toLowerCase();
6
+ if (n.startsWith("heor-web-ui"))
7
+ return "claude_anthropic_web";
8
+ if (n.startsWith("chatgpt-adapter"))
9
+ return "chatgpt_adapter";
10
+ if (n === "claude" ||
11
+ n.startsWith("claude-ai") ||
12
+ n.startsWith("claude-desktop"))
13
+ return "claude_desktop";
14
+ if (n.startsWith("smithery"))
15
+ return "smithery";
16
+ if (n.startsWith("glama"))
17
+ return "glama";
18
+ if (n.startsWith("pulsemcp"))
19
+ return "pulsemcp";
20
+ return "direct_mcp";
21
+ }
2
22
  let client = null;
3
23
  function getClient() {
4
24
  if (client)
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC,SAAS,SAAS;IAChB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACxB,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,CAAC;QACV,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,aAAsC,EAAE,EACxC,SAAkB;IAElB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE;QAAE,OAAO;IAEhB,EAAE,CAAC,OAAO,CAAC;QACT,UAAU,EAAE,SAAS,IAAI,WAAW;QACpC,KAAK;QACL,UAAU,EAAE;YACV,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;YAC5D,GAAG,UAAU;SACd;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,UAAkB,EAClB,MAAsB,EACtB,SAAkB,EAClB,aAAsC,EAAE;IAExC,UAAU,CAAC,WAAW,EAAE;QACtB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,UAAU;QACvB,MAAM;QACN,GAAG,UAAU;KACd,EAAE,SAAS,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAsC,EACtC,SAAiB,EACjB,aAAsC,EAAE;IAExC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAkBvC,MAAM,UAAU,YAAY,CAAC,UAA8B;IACzD,IAAI,CAAC,UAAU;QAAE,OAAO,YAAY,CAAC;IACrC,MAAM,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAC/D,IAAI,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAC9D,IACE,CAAC,KAAK,QAAQ;QACd,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;QACzB,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAE9B,OAAO,gBAAgB,CAAC;IAC1B,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAChD,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAChD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,IAAI,MAAM,GAAmB,IAAI,CAAC;AAElC,SAAS,SAAS;IAChB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACxB,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,CAAC;QACV,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,aAAsC,EAAE,EACxC,SAAkB;IAElB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE;QAAE,OAAO;IAEhB,EAAE,CAAC,OAAO,CAAC;QACT,UAAU,EAAE,SAAS,IAAI,WAAW;QACpC,KAAK;QACL,UAAU,EAAE;YACV,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;YAC5D,GAAG,UAAU;SACd;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,UAAkB,EAClB,MAAsB,EACtB,SAAkB,EAClB,aAAsC,EAAE;IAExC,UAAU,CACR,WAAW,EACX;QACE,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,UAAU;QACvB,MAAM;QACN,GAAG,UAAU;KACd,EACD,SAAS,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAsC,EACtC,SAAiB,EACjB,aAAsC,EAAE;IAExC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"eq5dImpact.d.ts","sourceRoot":"","sources":["../../src/grade/eq5dImpact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,cAAc,CAAC;IAChC,eAAe,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AA4BD,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,cAAc,EAC1B,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,sBAAsB,CAuExB"}
1
+ {"version":3,"file":"eq5dImpact.d.ts","sourceRoot":"","sources":["../../src/grade/eq5dImpact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,cAAc,CAAC;IAChC,eAAe,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AA4BD,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,cAAc,EAC1B,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,sBAAsB,CAsFxB"}
@@ -59,7 +59,20 @@ export function estimateBaselineAdjustedImpact(indication, baseline_utility) {
59
59
  }
60
60
  }
61
61
  const published = getImpactEstimate(indication);
62
- const median = published?.median_icer_change_pct ?? 0;
62
+ // Guard: indication categories without a published median (future entries
63
+ // added before data is populated) must not silently return a degenerate
64
+ // {0, 0, 0} range. Return is_baseline_adjusted=false with an explicit
65
+ // "no estimate available" rationale so callers can branch.
66
+ if (!published) {
67
+ return {
68
+ indication_type: indication,
69
+ icer_change_pct: { point: 0, lower: 0, upper: 0 },
70
+ is_baseline_adjusted: false,
71
+ baseline_utility,
72
+ rationale: `No published impact estimate for ${indication} — this category has no Biz 2026 entry yet. Re-run your model under both value sets for a direct estimate.`,
73
+ };
74
+ }
75
+ const median = published.median_icer_change_pct;
63
76
  // Range for unmodulated estimate (±25% of median to reflect inter-study spread)
64
77
  const baseRange = {
65
78
  point: median,
@@ -71,7 +84,7 @@ export function estimateBaselineAdjustedImpact(indication, baseline_utility) {
71
84
  indication_type: indication,
72
85
  icer_change_pct: baseRange,
73
86
  is_baseline_adjusted: false,
74
- rationale: `Published median for ${indication} (Biz et al. 2026, n=${published?.examples?.length ?? 0} indication examples).`,
87
+ rationale: `Published median for ${indication} (Biz et al. 2026, n=${published.examples?.length ?? 0} indication examples).`,
75
88
  };
76
89
  }
77
90
  if (indication === "non_cancer_life_extending") {
@@ -108,8 +121,8 @@ export function estimateBaselineAdjustedImpact(indication, baseline_utility) {
108
121
  indication_type: indication,
109
122
  icer_change_pct: {
110
123
  point: adjustedPoint,
111
- lower: adjustedPoint - Math.abs(adjustedPoint) * 0.30,
112
- upper: adjustedPoint + Math.abs(adjustedPoint) * 0.30,
124
+ lower: adjustedPoint - Math.abs(adjustedPoint) * 0.3,
125
+ upper: adjustedPoint + Math.abs(adjustedPoint) * 0.3,
113
126
  },
114
127
  is_baseline_adjusted: true,
115
128
  baseline_utility,
@@ -1 +1 @@
1
- {"version":3,"file":"eq5dImpact.js","sourceRoot":"","sources":["../../src/grade/eq5dImpact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eq5dImpact.js","sourceRoot":"","sources":["../../src/grade/eq5dImpact.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"inconsistency.d.ts","sourceRoot":"","sources":["../../src/grade/inconsistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,MAAM,kBAAkB,GAC1B,gBAAgB,GAChB,KAAK,GACL,UAAU,GACV,SAAS,GACT,cAAc,CAAC;AAEnB,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,eAAe,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,uBAAuB,CAkDzB"}
1
+ {"version":3,"file":"inconsistency.d.ts","sourceRoot":"","sources":["../../src/grade/inconsistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,MAAM,kBAAkB,GAC1B,gBAAgB,GAChB,KAAK,GACL,UAAU,GACV,SAAS,GACT,cAAc,CAAC;AAEnB,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,eAAe,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,uBAAuB,CAsDzB"}
@@ -35,8 +35,12 @@ export function assessInconsistency(n_studies, i_squared_pct) {
35
35
  };
36
36
  }
37
37
  if (i_squared_pct == null) {
38
+ // Was: level="Moderate", downgrade_steps=0 — internally inconsistent
39
+ // (every other Moderate path uses 1 step). Returning not_assessable
40
+ // with 0 downgrade forces an explicit manual decision instead of
41
+ // silently inflating GRADE certainty.
38
42
  return {
39
- level: "Moderate",
43
+ level: "not_assessable",
40
44
  downgrade_steps: 0,
41
45
  rationale: "Multiple studies but I² not computed — manual heterogeneity review recommended",
42
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"inconsistency.js","sourceRoot":"","sources":["../../src/grade/inconsistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAeH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,aAA4B;IAE5B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,oCAAoC;SAChD,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,eAAe,EAAE,CAAC;YAClB,SAAS,EACP,4EAA4E;SAC/E,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,eAAe,EAAE,CAAC;YAClB,SAAS,EACP,gFAAgF;SACnF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC;SAChF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;SAClF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;SACjF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B;KACvE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"inconsistency.js","sourceRoot":"","sources":["../../src/grade/inconsistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAeH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,aAA4B;IAE5B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,oCAAoC;SAChD,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,eAAe,EAAE,CAAC;YAClB,SAAS,EACP,4EAA4E;SAC/E,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,qEAAqE;QACrE,oEAAoE;QACpE,iEAAiE;QACjE,sCAAsC;QACtC,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,eAAe,EAAE,CAAC;YAClB,SAAS,EACP,gFAAgF;SACnF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC;SAChF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;SAClF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;SACjF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B;KACvE,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bucher.d.ts","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3C;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAiDD,4CAA4C;AAC5C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,cAAc,CAqBhB;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,EAAE,EAAE,cAAc,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAM3D;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC5B,gBAAgB,CA+ElB"}
1
+ {"version":3,"file":"bucher.d.ts","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3C;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AA8CD,4CAA4C;AAC5C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5C,cAAc,CAqBhB;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,EAAE,EAAE,cAAc,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAM3D;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC5B,gBAAgB,CAqElB"}
@@ -27,11 +27,12 @@ function isLogScale(measure) {
27
27
  return measure === "OR" || measure === "RR" || measure === "HR";
28
28
  }
29
29
  /** Convert to working scale (log for ratio measures) */
30
- function toWorkingScale(estimate, se, measure) {
31
- if (isLogScale(measure)) {
32
- return { value: Math.log(estimate), se };
33
- }
34
- return { value: estimate, se };
30
+ // Returns the working-scale point estimate. The SE parameter was
31
+ // previously included but acted as dead weight (passed through unchanged)
32
+ // that was a correctness trap because for OR/HR/RR the original-scale
33
+ // SE is NOT the log-scale SE. Use seOnWorkingScale() for that.
34
+ function toWorkingScale(estimate, measure) {
35
+ return isLogScale(measure) ? Math.log(estimate) : estimate;
35
36
  }
36
37
  /** Convert SE from CI on the original scale to working scale */
37
38
  function seOnWorkingScale(estimate, ci_lower, ci_upper, measure) {
@@ -89,13 +90,15 @@ export function bucherIndirect(ab, cb) {
89
90
  * Returns the indirect estimate of A vs C.
90
91
  */
91
92
  export function computeIndirectComparison(intervention, comparator, bridge, directAB, directCB, outcome, measure, directAC) {
92
- // Convert to working scale and pool
93
+ // Convert to working scale and pool. The SE on the working scale (log
94
+ // for ratio measures) comes from seOnWorkingScale, NOT from
95
+ // toWorkingScale (which only transforms the point estimate).
93
96
  const abStudies = directAB.map((d) => ({
94
- value: toWorkingScale(d.estimate, seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure), measure).value,
97
+ value: toWorkingScale(d.estimate, measure),
95
98
  se: seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure),
96
99
  }));
97
100
  const cbStudies = directCB.map((d) => ({
98
- value: toWorkingScale(d.estimate, seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure), measure).value,
101
+ value: toWorkingScale(d.estimate, measure),
99
102
  se: seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure),
100
103
  }));
101
104
  const pooledAB = poolFixedEffect(abStudies);
@@ -110,7 +113,7 @@ export function computeIndirectComparison(intervention, comparator, bridge, dire
110
113
  let consistency_check;
111
114
  if (directAC && directAC.length > 0) {
112
115
  const acStudies = directAC.map((d) => ({
113
- value: toWorkingScale(d.estimate, seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure), measure).value,
116
+ value: toWorkingScale(d.estimate, measure),
114
117
  se: seOnWorkingScale(d.estimate, d.ci_lower, d.ci_upper, measure),
115
118
  }));
116
119
  const pooledAC = poolFixedEffect(acStudies);
@@ -1 +1 @@
1
- {"version":3,"file":"bucher.js","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bucher.js","sourceRoot":"","sources":["../../src/network/bucher.ts"],"names":[],"mappings":"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"}
@@ -35,8 +35,15 @@ export type ConsistencySeverity = "untestable" | "none" | "moderate" | "substant
35
35
  export interface ConsistencyAssessment {
36
36
  has_conflict: boolean;
37
37
  severity: ConsistencySeverity;
38
+ /** direct − indirect (positive when direct exceeds indirect). Same scale as input. */
38
39
  difference: number;
40
+ /** Pooled SE: sqrt(SE_direct² + SE_indirect²). */
39
41
  se_difference: number;
42
+ /**
43
+ * Signed z = (direct − indirect) / SE_diff. Sign indicates which side
44
+ * the disagreement falls on. Severity bands use |z|, but consumers
45
+ * presenting the value should preserve the sign for direction.
46
+ */
40
47
  z_difference: number;
41
48
  rationale: string;
42
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"consistency.d.ts","sourceRoot":"","sources":["../../src/network/consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,8EAA8E;IAC9E,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,mBAAmB,GAC3B,YAAY,GACZ,MAAM,GACN,UAAU,GACV,aAAa,CAAC;AAElB,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,gBAAgB,GACtB,qBAAqB,CAuEvB"}
1
+ {"version":3,"file":"consistency.d.ts","sourceRoot":"","sources":["../../src/network/consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,8EAA8E;IAC9E,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,mBAAmB,GAC3B,YAAY,GACZ,MAAM,GACN,UAAU,GACV,aAAa,CAAC;AAElB,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,gBAAgB,GACtB,qBAAqB,CAuEvB"}
@@ -31,8 +31,7 @@ export function assessConsistencyConflict(input) {
31
31
  };
32
32
  }
33
33
  const difference = input.direct.value - input.indirect.value;
34
- const se_difference = Math.sqrt(input.direct.se * input.direct.se +
35
- input.indirect.se * input.indirect.se);
34
+ const se_difference = Math.sqrt(input.direct.se * input.direct.se + input.indirect.se * input.indirect.se);
36
35
  const z = se_difference > 0 ? difference / se_difference : 0;
37
36
  const absZ = Math.abs(z);
38
37
  // Opposite-direction check: both estimates significant in opposite directions
@@ -1 +1 @@
1
- {"version":3,"file":"consistency.js","sourceRoot":"","sources":["../../src/network/consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAwBH,MAAM,UAAU,yBAAyB,CACvC,KAAuB;IAEvB,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,SAAS,EACP,yIAAyI;SAC5I,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE;QAC/B,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CACxC,CAAC;IACF,MAAM,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEzB,8EAA8E;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC;IAC/E,MAAM,YAAY,GAChB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjE,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC;IAC7B,MAAM,mBAAmB,GAAG,SAAS,IAAI,WAAW,IAAI,YAAY,CAAC;IAErE,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,aAAa;YACvB,UAAU;YACV,aAAa;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,wGAAwG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gLAAgL;SAChT,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,aAAa;YACvB,UAAU;YACV,aAAa;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4KAA4K;SAC5N,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QAChB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,UAAU;YACpB,UAAU;YACV,aAAa;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4IAA4I;SAC5L,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,MAAM;QAChB,UAAU;QACV,aAAa;QACb,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,+BAA+B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,+EAA+E;KACtI,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"consistency.js","sourceRoot":"","sources":["../../src/network/consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA+BH,MAAM,UAAU,yBAAyB,CACvC,KAAuB;IAEvB,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,SAAS,EACP,yIAAyI;SAC5I,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAC1E,CAAC;IACF,MAAM,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEzB,8EAA8E;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC;IACzE,MAAM,WAAW,GACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC;IAC7D,MAAM,YAAY,GAChB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjE,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC;IAC7B,MAAM,mBAAmB,GAAG,SAAS,IAAI,WAAW,IAAI,YAAY,CAAC;IAErE,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,aAAa;YACvB,UAAU;YACV,aAAa;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,wGAAwG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gLAAgL;SAChT,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,aAAa;YACvB,UAAU;YACV,aAAa;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4KAA4K;SAC5N,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QAChB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,UAAU;YACpB,UAAU;YACV,aAAa;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4IAA4I;SAC5L,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,MAAM;QAChB,UAAU;QACV,aAAa;QACb,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,+BAA+B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,+EAA+E;KACtI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Zod schemas for inputs that htaDossierPrep accepts from upstream tools.
3
+ *
4
+ * Previously these were `z.any()` — which silently accepted garbage and let
5
+ * malformed shapes crash deep inside `generateGradeTable`. With proper
6
+ * schemas, the tool boundary rejects bad input with a field-level error
7
+ * message that's actionable for the caller (Claude, ChatGPT, or a human).
8
+ *
9
+ * `passthrough()` is used so unknown fields are preserved (forward-compat
10
+ * for adding new fields without breaking older callers).
11
+ */
12
+ import { z } from "zod";
13
+ /**
14
+ * Single literature search result. Accepts the canonical shape produced by
15
+ * literature_search; in practice many fields may be absent (e.g., user pastes
16
+ * a cherry-picked subset), so only title + abstract are required.
17
+ */
18
+ export declare const LiteratureResultSchema: z.ZodObject<{
19
+ id: z.ZodOptional<z.ZodString>;
20
+ source: z.ZodOptional<z.ZodString>;
21
+ title: z.ZodString;
22
+ authors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
23
+ date: z.ZodOptional<z.ZodString>;
24
+ study_type: z.ZodOptional<z.ZodString>;
25
+ abstract: z.ZodString;
26
+ url: z.ZodOptional<z.ZodString>;
27
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
28
+ id: z.ZodOptional<z.ZodString>;
29
+ source: z.ZodOptional<z.ZodString>;
30
+ title: z.ZodString;
31
+ authors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
32
+ date: z.ZodOptional<z.ZodString>;
33
+ study_type: z.ZodOptional<z.ZodString>;
34
+ abstract: z.ZodString;
35
+ url: z.ZodOptional<z.ZodString>;
36
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
37
+ id: z.ZodOptional<z.ZodString>;
38
+ source: z.ZodOptional<z.ZodString>;
39
+ title: z.ZodString;
40
+ authors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
41
+ date: z.ZodOptional<z.ZodString>;
42
+ study_type: z.ZodOptional<z.ZodString>;
43
+ abstract: z.ZodString;
44
+ url: z.ZodOptional<z.ZodString>;
45
+ }, z.ZodTypeAny, "passthrough">>;
46
+ export type LiteratureResultInput = z.infer<typeof LiteratureResultSchema>;
47
+ export declare const RobResultsSchema: z.ZodObject<{
48
+ summary: z.ZodObject<{
49
+ rob_judgment: z.ZodString;
50
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
51
+ rationale: z.ZodDefault<z.ZodString>;
52
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
53
+ rob_judgment: z.ZodString;
54
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
55
+ rationale: z.ZodDefault<z.ZodString>;
56
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
57
+ rob_judgment: z.ZodString;
58
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
59
+ rationale: z.ZodDefault<z.ZodString>;
60
+ }, z.ZodTypeAny, "passthrough">>;
61
+ overall_certainty_start: z.ZodEnum<["High", "Low"]>;
62
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
63
+ summary: z.ZodObject<{
64
+ rob_judgment: z.ZodString;
65
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
66
+ rationale: z.ZodDefault<z.ZodString>;
67
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
68
+ rob_judgment: z.ZodString;
69
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
70
+ rationale: z.ZodDefault<z.ZodString>;
71
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
72
+ rob_judgment: z.ZodString;
73
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
74
+ rationale: z.ZodDefault<z.ZodString>;
75
+ }, z.ZodTypeAny, "passthrough">>;
76
+ overall_certainty_start: z.ZodEnum<["High", "Low"]>;
77
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
78
+ summary: z.ZodObject<{
79
+ rob_judgment: z.ZodString;
80
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
81
+ rationale: z.ZodDefault<z.ZodString>;
82
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
83
+ rob_judgment: z.ZodString;
84
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
85
+ rationale: z.ZodDefault<z.ZodString>;
86
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
87
+ rob_judgment: z.ZodString;
88
+ downgrade: z.ZodEffects<z.ZodDefault<z.ZodBoolean>, boolean, unknown>;
89
+ rationale: z.ZodDefault<z.ZodString>;
90
+ }, z.ZodTypeAny, "passthrough">>;
91
+ overall_certainty_start: z.ZodEnum<["High", "Low"]>;
92
+ }, z.ZodTypeAny, "passthrough">>;
93
+ export type RobResultsInput = z.infer<typeof RobResultsSchema>;
94
+ /**
95
+ * Output of cost_effectiveness_model, optionally passed for
96
+ * downstream sensitivity narrative. Kept loose (passthrough) because the CEA
97
+ * output is large and we don't need to validate every nested PSA bin.
98
+ */
99
+ export declare const CEModelResultSchema: z.ZodObject<{
100
+ icer: z.ZodOptional<z.ZodNumber>;
101
+ incremental_costs: z.ZodOptional<z.ZodNumber>;
102
+ incremental_qalys: z.ZodOptional<z.ZodNumber>;
103
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
104
+ icer: z.ZodOptional<z.ZodNumber>;
105
+ incremental_costs: z.ZodOptional<z.ZodNumber>;
106
+ incremental_qalys: z.ZodOptional<z.ZodNumber>;
107
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
108
+ icer: z.ZodOptional<z.ZodNumber>;
109
+ incremental_costs: z.ZodOptional<z.ZodNumber>;
110
+ incremental_qalys: z.ZodOptional<z.ZodNumber>;
111
+ }, z.ZodTypeAny, "passthrough">>;
112
+ export type CEModelResultInput = z.infer<typeof CEModelResultSchema>;
113
+ //# sourceMappingURL=dossierInputSchemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dossierInputSchemas.d.ts","sourceRoot":"","sources":["../../src/schemas/dossierInputSchemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAWnB,CAAC;AAEjB,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAqB3E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAWb,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;gCAMhB,CAAC;AAEjB,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}