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.
- package/README.md +114 -14
- package/dist/analytics.d.ts +9 -0
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +20 -0
- package/dist/analytics.js.map +1 -1
- package/dist/grade/eq5dImpact.d.ts.map +1 -1
- package/dist/grade/eq5dImpact.js +17 -4
- package/dist/grade/eq5dImpact.js.map +1 -1
- package/dist/grade/inconsistency.d.ts.map +1 -1
- package/dist/grade/inconsistency.js +5 -1
- package/dist/grade/inconsistency.js.map +1 -1
- package/dist/network/bucher.d.ts.map +1 -1
- package/dist/network/bucher.js +12 -9
- package/dist/network/bucher.js.map +1 -1
- package/dist/network/consistency.d.ts +7 -0
- package/dist/network/consistency.d.ts.map +1 -1
- package/dist/network/consistency.js +1 -2
- package/dist/network/consistency.js.map +1 -1
- package/dist/schemas/dossierInputSchemas.d.ts +113 -0
- package/dist/schemas/dossierInputSchemas.d.ts.map +1 -0
- package/dist/schemas/dossierInputSchemas.js +74 -0
- package/dist/schemas/dossierInputSchemas.js.map +1 -0
- package/dist/server.js +41 -11
- package/dist/server.js.map +1 -1
- package/dist/tools/examples.d.ts +34 -0
- package/dist/tools/examples.d.ts.map +1 -0
- package/dist/tools/examples.js +300 -0
- package/dist/tools/examples.js.map +1 -0
- package/dist/tools/htaDossierPrep.d.ts.map +1 -1
- package/dist/tools/htaDossierPrep.js +25 -4
- package/dist/tools/htaDossierPrep.js.map +1 -1
- package/dist/tools/indirectComparison.js +1 -1
- package/dist/tools/indirectComparison.js.map +1 -1
- package/dist/tools/literatureSearch.d.ts.map +1 -1
- package/dist/tools/literatureSearch.js +74 -3
- package/dist/tools/literatureSearch.js.map +1 -1
- package/dist/tools/projectCreate.d.ts.map +1 -1
- package/dist/tools/projectCreate.js +43 -14
- package/dist/tools/projectCreate.js.map +1 -1
- package/dist/tools/riskOfBias.d.ts.map +1 -1
- package/dist/tools/riskOfBias.js +33 -24
- package/dist/tools/riskOfBias.js.map +1 -1
- package/dist/util/didYouMean.d.ts +13 -0
- package/dist/util/didYouMean.d.ts.map +1 -0
- package/dist/util/didYouMean.js +64 -0
- package/dist/util/didYouMean.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,15 +3,36 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/heor-agent-mcp)
|
|
4
4
|
[](./LICENSE)
|
|
5
5
|
[](https://nodejs.org)
|
|
6
|
+
[](https://chatgpt.com/g/g-69f651f588f48191b1d69d54409857ec-heoragent)
|
|
7
|
+
[](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
|
|
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
|
-
| `
|
|
56
|
-
| `
|
|
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
|
|
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
|
-
**
|
|
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>
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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 #
|
|
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
|
-
│ │
|
|
501
|
+
│ │ 17 MCP tools (Zod-validated) │ │
|
|
402
502
|
│ ├──────────────────────────────────────┤ │
|
|
403
503
|
│ │ DirectProvider (default) │ │
|
|
404
|
-
│ │ ├─
|
|
504
|
+
│ │ ├─ 44 source fetchers │ │
|
|
405
505
|
│ │ ├─ Audit builder + PRISMA trail │ │
|
|
406
506
|
│ │ ├─ Markov / PartSA economic models │ │
|
|
407
507
|
│ │ ├─ Markdown + DOCX formatters │ │
|
package/dist/analytics.d.ts
CHANGED
|
@@ -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;
|
package/dist/analytics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"
|
|
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)
|
package/dist/analytics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,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,
|
|
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"}
|
package/dist/grade/eq5dImpact.js
CHANGED
|
@@ -59,7 +59,20 @@ export function estimateBaselineAdjustedImpact(indication, baseline_utility) {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
const published = getImpactEstimate(indication);
|
|
62
|
-
|
|
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
|
|
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.
|
|
112
|
-
upper: adjustedPoint + Math.abs(adjustedPoint) * 0.
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAc7D;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC;IACjB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,uCAAuC;IAC1D,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,qFAAqF;IACrF,4BAA4B;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC;IACjB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,qDAAqD;IACzE,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,UAA0B,EAC1B,gBAAoC;IAEpC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,gBAAgB,GAAG,CAAC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CACb,2CAA2C,gBAAgB,EAAE,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;
|
|
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,
|
|
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: "
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/network/bucher.js
CHANGED
|
@@ -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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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":"AAMA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa;IACnD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;AAChC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,eAAe;IAC7C,MAAM,CAAC,GACL,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QACxB,CAAC,CAAC;YACA,CAAC,UAAU;gBACT,CAAC;oBACC,CAAC,CAAC,WAAW;wBACX,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,kDAAkD;AAClD,SAAS,UAAU,CAAC,OAAsB;IACxC,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC;AAClE,CAAC;AAED,wDAAwD;AACxD,SAAS,cAAc,
|
|
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;
|
|
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"}
|