heor-agent-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/dist/audit/builder.d.ts +8 -0
  4. package/dist/audit/builder.d.ts.map +1 -0
  5. package/dist/audit/builder.js +37 -0
  6. package/dist/audit/builder.js.map +1 -0
  7. package/dist/audit/types.d.ts +30 -0
  8. package/dist/audit/types.d.ts.map +1 -0
  9. package/dist/audit/types.js +2 -0
  10. package/dist/audit/types.js.map +1 -0
  11. package/dist/formatters/docx.d.ts +5 -0
  12. package/dist/formatters/docx.d.ts.map +1 -0
  13. package/dist/formatters/docx.js +207 -0
  14. package/dist/formatters/docx.js.map +1 -0
  15. package/dist/formatters/json.d.ts +4 -0
  16. package/dist/formatters/json.d.ts.map +1 -0
  17. package/dist/formatters/json.js +4 -0
  18. package/dist/formatters/json.js.map +1 -0
  19. package/dist/formatters/markdown.d.ts +5 -0
  20. package/dist/formatters/markdown.d.ts.map +1 -0
  21. package/dist/formatters/markdown.js +50 -0
  22. package/dist/formatters/markdown.js.map +1 -0
  23. package/dist/knowledge/index.d.ts +8 -0
  24. package/dist/knowledge/index.d.ts.map +1 -0
  25. package/dist/knowledge/index.js +8 -0
  26. package/dist/knowledge/index.js.map +1 -0
  27. package/dist/knowledge/paths.d.ts +9 -0
  28. package/dist/knowledge/paths.d.ts.map +1 -0
  29. package/dist/knowledge/paths.js +35 -0
  30. package/dist/knowledge/paths.js.map +1 -0
  31. package/dist/knowledge/projectStore.d.ts +37 -0
  32. package/dist/knowledge/projectStore.d.ts.map +1 -0
  33. package/dist/knowledge/projectStore.js +112 -0
  34. package/dist/knowledge/projectStore.js.map +1 -0
  35. package/dist/knowledge/rawStore.d.ts +18 -0
  36. package/dist/knowledge/rawStore.d.ts.map +1 -0
  37. package/dist/knowledge/rawStore.js +103 -0
  38. package/dist/knowledge/rawStore.js.map +1 -0
  39. package/dist/knowledge/search.d.ts +19 -0
  40. package/dist/knowledge/search.d.ts.map +1 -0
  41. package/dist/knowledge/search.js +105 -0
  42. package/dist/knowledge/search.js.map +1 -0
  43. package/dist/knowledge/types.d.ts +6 -0
  44. package/dist/knowledge/types.d.ts.map +1 -0
  45. package/dist/knowledge/types.js +2 -0
  46. package/dist/knowledge/types.js.map +1 -0
  47. package/dist/knowledge/wikiStore.d.ts +18 -0
  48. package/dist/knowledge/wikiStore.d.ts.map +1 -0
  49. package/dist/knowledge/wikiStore.js +77 -0
  50. package/dist/knowledge/wikiStore.js.map +1 -0
  51. package/dist/knowledge/yaml.d.ts +17 -0
  52. package/dist/knowledge/yaml.d.ts.map +1 -0
  53. package/dist/knowledge/yaml.js +131 -0
  54. package/dist/knowledge/yaml.js.map +1 -0
  55. package/dist/models/distributions.d.ts +28 -0
  56. package/dist/models/distributions.d.ts.map +1 -0
  57. package/dist/models/distributions.js +99 -0
  58. package/dist/models/distributions.js.map +1 -0
  59. package/dist/models/index.d.ts +11 -0
  60. package/dist/models/index.d.ts.map +1 -0
  61. package/dist/models/index.js +7 -0
  62. package/dist/models/index.js.map +1 -0
  63. package/dist/models/markov.d.ts +42 -0
  64. package/dist/models/markov.d.ts.map +1 -0
  65. package/dist/models/markov.js +82 -0
  66. package/dist/models/markov.js.map +1 -0
  67. package/dist/models/modelUtils.d.ts +29 -0
  68. package/dist/models/modelUtils.d.ts.map +1 -0
  69. package/dist/models/modelUtils.js +139 -0
  70. package/dist/models/modelUtils.js.map +1 -0
  71. package/dist/models/owsa.d.ts +31 -0
  72. package/dist/models/owsa.d.ts.map +1 -0
  73. package/dist/models/owsa.js +103 -0
  74. package/dist/models/owsa.js.map +1 -0
  75. package/dist/models/partsa.d.ts +40 -0
  76. package/dist/models/partsa.d.ts.map +1 -0
  77. package/dist/models/partsa.js +65 -0
  78. package/dist/models/partsa.js.map +1 -0
  79. package/dist/models/psa.d.ts +33 -0
  80. package/dist/models/psa.d.ts.map +1 -0
  81. package/dist/models/psa.js +118 -0
  82. package/dist/models/psa.js.map +1 -0
  83. package/dist/providers/direct/aifa.d.ts +3 -0
  84. package/dist/providers/direct/aifa.d.ts.map +1 -0
  85. package/dist/providers/direct/aifa.js +30 -0
  86. package/dist/providers/direct/aifa.js.map +1 -0
  87. package/dist/providers/direct/allOfUs.d.ts +3 -0
  88. package/dist/providers/direct/allOfUs.d.ts.map +1 -0
  89. package/dist/providers/direct/allOfUs.js +37 -0
  90. package/dist/providers/direct/allOfUs.js.map +1 -0
  91. package/dist/providers/direct/anvisa.d.ts +3 -0
  92. package/dist/providers/direct/anvisa.d.ts.map +1 -0
  93. package/dist/providers/direct/anvisa.js +25 -0
  94. package/dist/providers/direct/anvisa.js.map +1 -0
  95. package/dist/providers/direct/biorxiv.d.ts +3 -0
  96. package/dist/providers/direct/biorxiv.d.ts.map +1 -0
  97. package/dist/providers/direct/biorxiv.js +33 -0
  98. package/dist/providers/direct/biorxiv.js.map +1 -0
  99. package/dist/providers/direct/bnf.d.ts +3 -0
  100. package/dist/providers/direct/bnf.d.ts.map +1 -0
  101. package/dist/providers/direct/bnf.js +30 -0
  102. package/dist/providers/direct/bnf.js.map +1 -0
  103. package/dist/providers/direct/cadthReviews.d.ts +3 -0
  104. package/dist/providers/direct/cadthReviews.d.ts.map +1 -0
  105. package/dist/providers/direct/cadthReviews.js +30 -0
  106. package/dist/providers/direct/cadthReviews.js.map +1 -0
  107. package/dist/providers/direct/chembl.d.ts +3 -0
  108. package/dist/providers/direct/chembl.d.ts.map +1 -0
  109. package/dist/providers/direct/chembl.js +24 -0
  110. package/dist/providers/direct/chembl.js.map +1 -0
  111. package/dist/providers/direct/citeline.d.ts +3 -0
  112. package/dist/providers/direct/citeline.d.ts.map +1 -0
  113. package/dist/providers/direct/citeline.js +50 -0
  114. package/dist/providers/direct/citeline.js.map +1 -0
  115. package/dist/providers/direct/clinicalTrials.d.ts +3 -0
  116. package/dist/providers/direct/clinicalTrials.d.ts.map +1 -0
  117. package/dist/providers/direct/clinicalTrials.js +29 -0
  118. package/dist/providers/direct/clinicalTrials.js.map +1 -0
  119. package/dist/providers/direct/cmsNadac.d.ts +3 -0
  120. package/dist/providers/direct/cmsNadac.d.ts.map +1 -0
  121. package/dist/providers/direct/cmsNadac.js +52 -0
  122. package/dist/providers/direct/cmsNadac.js.map +1 -0
  123. package/dist/providers/direct/cochrane.d.ts +3 -0
  124. package/dist/providers/direct/cochrane.d.ts.map +1 -0
  125. package/dist/providers/direct/cochrane.js +46 -0
  126. package/dist/providers/direct/cochrane.js.map +1 -0
  127. package/dist/providers/direct/conitec.d.ts +3 -0
  128. package/dist/providers/direct/conitec.d.ts.map +1 -0
  129. package/dist/providers/direct/conitec.js +25 -0
  130. package/dist/providers/direct/conitec.js.map +1 -0
  131. package/dist/providers/direct/cortellis.d.ts +3 -0
  132. package/dist/providers/direct/cortellis.d.ts.map +1 -0
  133. package/dist/providers/direct/cortellis.js +52 -0
  134. package/dist/providers/direct/cortellis.js.map +1 -0
  135. package/dist/providers/direct/datasus.d.ts +3 -0
  136. package/dist/providers/direct/datasus.d.ts.map +1 -0
  137. package/dist/providers/direct/datasus.js +30 -0
  138. package/dist/providers/direct/datasus.js.map +1 -0
  139. package/dist/providers/direct/embase.d.ts +3 -0
  140. package/dist/providers/direct/embase.d.ts.map +1 -0
  141. package/dist/providers/direct/embase.js +54 -0
  142. package/dist/providers/direct/embase.js.map +1 -0
  143. package/dist/providers/direct/fonasa.d.ts +3 -0
  144. package/dist/providers/direct/fonasa.d.ts.map +1 -0
  145. package/dist/providers/direct/fonasa.js +25 -0
  146. package/dist/providers/direct/fonasa.js.map +1 -0
  147. package/dist/providers/direct/gbaDecisions.d.ts +3 -0
  148. package/dist/providers/direct/gbaDecisions.d.ts.map +1 -0
  149. package/dist/providers/direct/gbaDecisions.js +30 -0
  150. package/dist/providers/direct/gbaDecisions.js.map +1 -0
  151. package/dist/providers/direct/googleScholar.d.ts +3 -0
  152. package/dist/providers/direct/googleScholar.d.ts.map +1 -0
  153. package/dist/providers/direct/googleScholar.js +39 -0
  154. package/dist/providers/direct/googleScholar.js.map +1 -0
  155. package/dist/providers/direct/hasTc.d.ts +3 -0
  156. package/dist/providers/direct/hasTc.d.ts.map +1 -0
  157. package/dist/providers/direct/hasTc.js +30 -0
  158. package/dist/providers/direct/hasTc.js.map +1 -0
  159. package/dist/providers/direct/hitap.d.ts +3 -0
  160. package/dist/providers/direct/hitap.d.ts.map +1 -0
  161. package/dist/providers/direct/hitap.js +30 -0
  162. package/dist/providers/direct/hitap.js.map +1 -0
  163. package/dist/providers/direct/icerReports.d.ts +3 -0
  164. package/dist/providers/direct/icerReports.d.ts.map +1 -0
  165. package/dist/providers/direct/icerReports.js +30 -0
  166. package/dist/providers/direct/icerReports.js.map +1 -0
  167. package/dist/providers/direct/iets.d.ts +3 -0
  168. package/dist/providers/direct/iets.d.ts.map +1 -0
  169. package/dist/providers/direct/iets.js +25 -0
  170. package/dist/providers/direct/iets.js.map +1 -0
  171. package/dist/providers/direct/ihmeGbd.d.ts +3 -0
  172. package/dist/providers/direct/ihmeGbd.d.ts.map +1 -0
  173. package/dist/providers/direct/ihmeGbd.js +74 -0
  174. package/dist/providers/direct/ihmeGbd.js.map +1 -0
  175. package/dist/providers/direct/index.d.ts +7 -0
  176. package/dist/providers/direct/index.d.ts.map +1 -0
  177. package/dist/providers/direct/index.js +186 -0
  178. package/dist/providers/direct/index.js.map +1 -0
  179. package/dist/providers/direct/inesss.d.ts +3 -0
  180. package/dist/providers/direct/inesss.d.ts.map +1 -0
  181. package/dist/providers/direct/inesss.js +30 -0
  182. package/dist/providers/direct/inesss.js.map +1 -0
  183. package/dist/providers/direct/iqwig.d.ts +3 -0
  184. package/dist/providers/direct/iqwig.d.ts.map +1 -0
  185. package/dist/providers/direct/iqwig.js +30 -0
  186. package/dist/providers/direct/iqwig.js.map +1 -0
  187. package/dist/providers/direct/ispor.d.ts +3 -0
  188. package/dist/providers/direct/ispor.d.ts.map +1 -0
  189. package/dist/providers/direct/ispor.js +35 -0
  190. package/dist/providers/direct/ispor.js.map +1 -0
  191. package/dist/providers/direct/nhsCosts.d.ts +3 -0
  192. package/dist/providers/direct/nhsCosts.d.ts.map +1 -0
  193. package/dist/providers/direct/nhsCosts.js +32 -0
  194. package/dist/providers/direct/nhsCosts.js.map +1 -0
  195. package/dist/providers/direct/niceTa.d.ts +3 -0
  196. package/dist/providers/direct/niceTa.d.ts.map +1 -0
  197. package/dist/providers/direct/niceTa.js +30 -0
  198. package/dist/providers/direct/niceTa.js.map +1 -0
  199. package/dist/providers/direct/oecd.d.ts +3 -0
  200. package/dist/providers/direct/oecd.d.ts.map +1 -0
  201. package/dist/providers/direct/oecd.js +102 -0
  202. package/dist/providers/direct/oecd.js.map +1 -0
  203. package/dist/providers/direct/orangeBook.d.ts +3 -0
  204. package/dist/providers/direct/orangeBook.d.ts.map +1 -0
  205. package/dist/providers/direct/orangeBook.js +48 -0
  206. package/dist/providers/direct/orangeBook.js.map +1 -0
  207. package/dist/providers/direct/paho.d.ts +3 -0
  208. package/dist/providers/direct/paho.d.ts.map +1 -0
  209. package/dist/providers/direct/paho.js +30 -0
  210. package/dist/providers/direct/paho.js.map +1 -0
  211. package/dist/providers/direct/pbacPsd.d.ts +3 -0
  212. package/dist/providers/direct/pbacPsd.d.ts.map +1 -0
  213. package/dist/providers/direct/pbacPsd.js +30 -0
  214. package/dist/providers/direct/pbacPsd.js.map +1 -0
  215. package/dist/providers/direct/pbsSchedule.d.ts +3 -0
  216. package/dist/providers/direct/pbsSchedule.d.ts.map +1 -0
  217. package/dist/providers/direct/pbsSchedule.js +37 -0
  218. package/dist/providers/direct/pbsSchedule.js.map +1 -0
  219. package/dist/providers/direct/pharmapendium.d.ts +3 -0
  220. package/dist/providers/direct/pharmapendium.d.ts.map +1 -0
  221. package/dist/providers/direct/pharmapendium.js +39 -0
  222. package/dist/providers/direct/pharmapendium.js.map +1 -0
  223. package/dist/providers/direct/proxyClient.d.ts +15 -0
  224. package/dist/providers/direct/proxyClient.d.ts.map +1 -0
  225. package/dist/providers/direct/proxyClient.js +76 -0
  226. package/dist/providers/direct/proxyClient.js.map +1 -0
  227. package/dist/providers/direct/pssru.d.ts +3 -0
  228. package/dist/providers/direct/pssru.d.ts.map +1 -0
  229. package/dist/providers/direct/pssru.js +33 -0
  230. package/dist/providers/direct/pssru.js.map +1 -0
  231. package/dist/providers/direct/pubmed.d.ts +3 -0
  232. package/dist/providers/direct/pubmed.d.ts.map +1 -0
  233. package/dist/providers/direct/pubmed.js +73 -0
  234. package/dist/providers/direct/pubmed.js.map +1 -0
  235. package/dist/providers/direct/purpleBook.d.ts +3 -0
  236. package/dist/providers/direct/purpleBook.d.ts.map +1 -0
  237. package/dist/providers/direct/purpleBook.js +52 -0
  238. package/dist/providers/direct/purpleBook.js.map +1 -0
  239. package/dist/providers/direct/tlv.d.ts +3 -0
  240. package/dist/providers/direct/tlv.d.ts.map +1 -0
  241. package/dist/providers/direct/tlv.js +30 -0
  242. package/dist/providers/direct/tlv.js.map +1 -0
  243. package/dist/providers/direct/whoGho.d.ts +3 -0
  244. package/dist/providers/direct/whoGho.d.ts.map +1 -0
  245. package/dist/providers/direct/whoGho.js +51 -0
  246. package/dist/providers/direct/whoGho.js.map +1 -0
  247. package/dist/providers/direct/worldBank.d.ts +3 -0
  248. package/dist/providers/direct/worldBank.d.ts.map +1 -0
  249. package/dist/providers/direct/worldBank.js +54 -0
  250. package/dist/providers/direct/worldBank.js.map +1 -0
  251. package/dist/providers/factory.d.ts +3 -0
  252. package/dist/providers/factory.d.ts.map +1 -0
  253. package/dist/providers/factory.js +8 -0
  254. package/dist/providers/factory.js.map +1 -0
  255. package/dist/providers/hosted/index.d.ts +9 -0
  256. package/dist/providers/hosted/index.d.ts.map +1 -0
  257. package/dist/providers/hosted/index.js +16 -0
  258. package/dist/providers/hosted/index.js.map +1 -0
  259. package/dist/providers/types.d.ts +176 -0
  260. package/dist/providers/types.d.ts.map +1 -0
  261. package/dist/providers/types.js +2 -0
  262. package/dist/providers/types.js.map +1 -0
  263. package/dist/server.d.ts +3 -0
  264. package/dist/server.d.ts.map +1 -0
  265. package/dist/server.js +80 -0
  266. package/dist/server.js.map +1 -0
  267. package/dist/tools/costEffectivenessModel.d.ts +98 -0
  268. package/dist/tools/costEffectivenessModel.d.ts.map +1 -0
  269. package/dist/tools/costEffectivenessModel.js +404 -0
  270. package/dist/tools/costEffectivenessModel.js.map +1 -0
  271. package/dist/tools/htaDossierPrep.d.ts +69 -0
  272. package/dist/tools/htaDossierPrep.d.ts.map +1 -0
  273. package/dist/tools/htaDossierPrep.js +399 -0
  274. package/dist/tools/htaDossierPrep.js.map +1 -0
  275. package/dist/tools/knowledgeRead.d.ts +21 -0
  276. package/dist/tools/knowledgeRead.d.ts.map +1 -0
  277. package/dist/tools/knowledgeRead.js +38 -0
  278. package/dist/tools/knowledgeRead.js.map +1 -0
  279. package/dist/tools/knowledgeSearch.d.ts +37 -0
  280. package/dist/tools/knowledgeSearch.d.ts.map +1 -0
  281. package/dist/tools/knowledgeSearch.js +51 -0
  282. package/dist/tools/knowledgeSearch.js.map +1 -0
  283. package/dist/tools/knowledgeWrite.d.ts +25 -0
  284. package/dist/tools/knowledgeWrite.d.ts.map +1 -0
  285. package/dist/tools/knowledgeWrite.js +40 -0
  286. package/dist/tools/knowledgeWrite.js.map +1 -0
  287. package/dist/tools/literatureSearch.d.ts +42 -0
  288. package/dist/tools/literatureSearch.d.ts.map +1 -0
  289. package/dist/tools/literatureSearch.js +142 -0
  290. package/dist/tools/literatureSearch.js.map +1 -0
  291. package/dist/tools/metabolicProfile.d.ts +19 -0
  292. package/dist/tools/metabolicProfile.d.ts.map +1 -0
  293. package/dist/tools/metabolicProfile.js +150 -0
  294. package/dist/tools/metabolicProfile.js.map +1 -0
  295. package/dist/tools/projectCreate.d.ts +37 -0
  296. package/dist/tools/projectCreate.d.ts.map +1 -0
  297. package/dist/tools/projectCreate.js +61 -0
  298. package/dist/tools/projectCreate.js.map +1 -0
  299. package/package.json +71 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * One-Way Sensitivity Analysis (OWSA) for tornado diagram generation.
3
+ */
4
+ import type { CEModelParams } from "../providers/types.js";
5
+ export type CEModelInputs = CEModelParams;
6
+ export interface OWSAParameter {
7
+ name: string;
8
+ base_value: number;
9
+ low_value: number;
10
+ high_value: number;
11
+ }
12
+ export interface OWSAResult {
13
+ parameter: string;
14
+ low_value: number;
15
+ high_value: number;
16
+ icer_low: number;
17
+ icer_high: number;
18
+ impact: number;
19
+ }
20
+ /**
21
+ * Run OWSA: vary each parameter one at a time and compute ICER.
22
+ * Returns results sorted by impact descending (tornado diagram order).
23
+ */
24
+ export declare function runOWSA(baseParams: CEModelInputs, parameters: OWSAParameter[], runModel: (params: CEModelInputs) => {
25
+ icer: number;
26
+ }): OWSAResult[];
27
+ /**
28
+ * Build default OWSA parameters from CEModelParams with ±20% variation.
29
+ */
30
+ export declare function buildDefaultOWSAParameters(params: CEModelInputs): OWSAParameter[];
31
+ //# sourceMappingURL=owsa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owsa.d.ts","sourceRoot":"","sources":["../../src/models/owsa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,aAAa,EACzB,UAAU,EAAE,aAAa,EAAE,EAC3B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD,UAAU,EAAE,CAsBd;AAuCD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,EAAE,CAsCjF"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * One-Way Sensitivity Analysis (OWSA) for tornado diagram generation.
3
+ */
4
+ /**
5
+ * Run OWSA: vary each parameter one at a time and compute ICER.
6
+ * Returns results sorted by impact descending (tornado diagram order).
7
+ */
8
+ export function runOWSA(baseParams, parameters, runModel) {
9
+ const results = [];
10
+ for (const param of parameters) {
11
+ const icer_low = runModel(applyParameter(baseParams, param.name, param.low_value)).icer;
12
+ const icer_high = runModel(applyParameter(baseParams, param.name, param.high_value)).icer;
13
+ const safe_icer_low = isFinite(icer_low) ? icer_low : 999999;
14
+ const safe_icer_high = isFinite(icer_high) ? icer_high : 999999;
15
+ results.push({
16
+ parameter: param.name,
17
+ low_value: param.low_value,
18
+ high_value: param.high_value,
19
+ icer_low,
20
+ icer_high,
21
+ impact: Math.abs(safe_icer_high - safe_icer_low),
22
+ });
23
+ }
24
+ // Sort by impact descending (tornado diagram order)
25
+ return results.sort((a, b) => b.impact - a.impact);
26
+ }
27
+ /**
28
+ * Apply a parameter value to CEModelParams by name.
29
+ * Supports dot-notation for nested params.
30
+ */
31
+ function applyParameter(params, name, value) {
32
+ switch (name) {
33
+ case "drug_cost_annual":
34
+ return { ...params, cost_inputs: { ...params.cost_inputs, drug_cost_annual: value } };
35
+ case "comparator_cost_annual":
36
+ return { ...params, cost_inputs: { ...params.cost_inputs, comparator_cost_annual: value } };
37
+ case "admin_cost":
38
+ return { ...params, cost_inputs: { ...params.cost_inputs, admin_cost: value } };
39
+ case "ae_cost":
40
+ return { ...params, cost_inputs: { ...params.cost_inputs, ae_cost: value } };
41
+ case "efficacy_delta":
42
+ return { ...params, clinical_inputs: { ...params.clinical_inputs, efficacy_delta: value } };
43
+ case "mortality_reduction":
44
+ return { ...params, clinical_inputs: { ...params.clinical_inputs, mortality_reduction: value } };
45
+ case "qaly_on_treatment":
46
+ return {
47
+ ...params,
48
+ utility_inputs: params.utility_inputs
49
+ ? { ...params.utility_inputs, qaly_on_treatment: value }
50
+ : { qaly_on_treatment: value, qaly_comparator: 0.7 },
51
+ };
52
+ case "qaly_comparator":
53
+ return {
54
+ ...params,
55
+ utility_inputs: params.utility_inputs
56
+ ? { ...params.utility_inputs, qaly_comparator: value }
57
+ : { qaly_on_treatment: 0.75, qaly_comparator: value },
58
+ };
59
+ default:
60
+ return params;
61
+ }
62
+ }
63
+ /**
64
+ * Build default OWSA parameters from CEModelParams with ±20% variation.
65
+ */
66
+ export function buildDefaultOWSAParameters(params) {
67
+ const parameters = [
68
+ {
69
+ name: "drug_cost_annual",
70
+ base_value: params.cost_inputs.drug_cost_annual,
71
+ low_value: params.cost_inputs.drug_cost_annual * 0.8,
72
+ high_value: params.cost_inputs.drug_cost_annual * 1.2,
73
+ },
74
+ {
75
+ name: "comparator_cost_annual",
76
+ base_value: params.cost_inputs.comparator_cost_annual,
77
+ low_value: params.cost_inputs.comparator_cost_annual * 0.8,
78
+ high_value: params.cost_inputs.comparator_cost_annual * 1.2,
79
+ },
80
+ {
81
+ name: "efficacy_delta",
82
+ base_value: params.clinical_inputs.efficacy_delta,
83
+ low_value: Math.max(0.001, params.clinical_inputs.efficacy_delta * 0.8),
84
+ high_value: Math.min(0.999, params.clinical_inputs.efficacy_delta * 1.2),
85
+ },
86
+ ];
87
+ if (params.utility_inputs) {
88
+ parameters.push({
89
+ name: "qaly_on_treatment",
90
+ base_value: params.utility_inputs.qaly_on_treatment,
91
+ low_value: Math.max(0.001, params.utility_inputs.qaly_on_treatment * 0.8),
92
+ high_value: Math.min(0.999, params.utility_inputs.qaly_on_treatment * 1.2),
93
+ });
94
+ parameters.push({
95
+ name: "qaly_comparator",
96
+ base_value: params.utility_inputs.qaly_comparator,
97
+ low_value: Math.max(0.001, params.utility_inputs.qaly_comparator * 0.8),
98
+ high_value: Math.min(0.999, params.utility_inputs.qaly_comparator * 1.2),
99
+ });
100
+ }
101
+ return parameters;
102
+ }
103
+ //# sourceMappingURL=owsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owsa.js","sourceRoot":"","sources":["../../src/models/owsa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH;;;GAGG;AACH,MAAM,UAAU,OAAO,CACrB,UAAyB,EACzB,UAA2B,EAC3B,QAAqD;IAErD,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACxF,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;QAE1F,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAEhE,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ;YACR,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,aAAa,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,oDAAoD;IACpD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAqB,EAAE,IAAY,EAAE,KAAa;IACxE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB;YACrB,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,CAAC;QACxF,KAAK,wBAAwB;YAC3B,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9F,KAAK,YAAY;YACf,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;QAClF,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/E,KAAK,gBAAgB;YACnB,OAAO,EAAE,GAAG,MAAM,EAAE,eAAe,EAAE,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9F,KAAK,qBAAqB;YACxB,OAAO,EAAE,GAAG,MAAM,EAAE,eAAe,EAAE,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,CAAC;QACnG,KAAK,mBAAmB;YACtB,OAAO;gBACL,GAAG,MAAM;gBACT,cAAc,EAAE,MAAM,CAAC,cAAc;oBACnC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,iBAAiB,EAAE,KAAK,EAAE;oBACxD,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE;aACvD,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,GAAG,MAAM;gBACT,cAAc,EAAE,MAAM,CAAC,cAAc;oBACnC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE;oBACtD,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE;aACxD,CAAC;QACJ;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAqB;IAC9D,MAAM,UAAU,GAAoB;QAClC;YACE,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,gBAAgB;YAC/C,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,gBAAgB,GAAG,GAAG;YACpD,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,gBAAgB,GAAG,GAAG;SACtD;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,sBAAsB;YACrD,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,sBAAsB,GAAG,GAAG;YAC1D,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,sBAAsB,GAAG,GAAG;SAC5D;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,UAAU,EAAE,MAAM,CAAC,eAAe,CAAC,cAAc;YACjD,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,cAAc,GAAG,GAAG,CAAC;YACvE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,cAAc,GAAG,GAAG,CAAC;SACzE;KACF,CAAC;IAEF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,mBAAmB;YACzB,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,iBAAiB;YACnD,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,iBAAiB,GAAG,GAAG,CAAC;YACzE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,iBAAiB,GAAG,GAAG,CAAC;SAC3E,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,eAAe;YACjD,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,eAAe,GAAG,GAAG,CAAC;YACvE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,eAAe,GAAG,GAAG,CAAC;SACzE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Partitioned Survival Analysis (PartSA) for oncology economic models.
3
+ * Area-under-curve approach using survival functions.
4
+ */
5
+ export interface SurvivalParams {
6
+ os_median_months: number;
7
+ pfs_median_months: number;
8
+ distribution: "exponential" | "weibull";
9
+ weibull_shape?: number;
10
+ }
11
+ export interface PartSAParams {
12
+ intervention_survival: SurvivalParams;
13
+ comparator_survival: SurvivalParams;
14
+ states: ["PFS", "PD", "Dead"];
15
+ utility_pfs: number;
16
+ utility_pd: number;
17
+ cost_pfs_annual: number;
18
+ cost_pd_annual: number;
19
+ n_cycles: number;
20
+ cycle_length_years: number;
21
+ discount_rate_costs: number;
22
+ discount_rate_outcomes: number;
23
+ }
24
+ export interface PartSAResult {
25
+ intervention: {
26
+ total_cost: number;
27
+ total_qaly: number;
28
+ total_lys: number;
29
+ };
30
+ comparator: {
31
+ total_cost: number;
32
+ total_qaly: number;
33
+ total_lys: number;
34
+ };
35
+ }
36
+ /**
37
+ * Run Partitioned Survival Analysis for both arms.
38
+ */
39
+ export declare function runPartSA(params: PartSAParams): PartSAResult;
40
+ //# sourceMappingURL=partsa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partsa.d.ts","sourceRoot":"","sources":["../../src/models/partsa.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,aAAa,GAAG,SAAS,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,qBAAqB,EAAE,cAAc,CAAC;IACtC,mBAAmB,EAAE,cAAc,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AA4ED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CA0B5D"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Partitioned Survival Analysis (PartSA) for oncology economic models.
3
+ * Area-under-curve approach using survival functions.
4
+ */
5
+ /**
6
+ * Compute survival function value at time t (in years).
7
+ * For exponential: S(t) = exp(-lambda * t)
8
+ * For Weibull: S(t) = exp(-(t/scale)^shape)
9
+ */
10
+ function survivalAt(t, params, medianType) {
11
+ const medianMonths = medianType === "os" ? params.os_median_months : params.pfs_median_months;
12
+ const medianYears = medianMonths / 12;
13
+ if (params.distribution === "exponential" || (params.weibull_shape ?? 1) === 1) {
14
+ // Exponential: lambda = log(2) / median
15
+ const lambda = Math.log(2) / medianYears;
16
+ return Math.exp(-lambda * t);
17
+ }
18
+ else {
19
+ // Weibull: S(t) = exp(-(t/scale)^shape)
20
+ const shape = params.weibull_shape ?? 1;
21
+ // Derive scale from median: median = scale * (log(2))^(1/shape)
22
+ const scale = medianYears / Math.pow(Math.log(2), 1 / shape);
23
+ return Math.exp(-Math.pow(t / scale, shape));
24
+ }
25
+ }
26
+ /**
27
+ * Run one arm of PartSA.
28
+ */
29
+ function runPartSAArm(survivalParams, utilityPFS, utilityPD, costPFSAnnual, costPDAnnual, nCycles, cycleLengthYears, discountRateCosts, discountRateOutcomes) {
30
+ let total_cost = 0;
31
+ let total_qaly = 0;
32
+ let total_lys = 0;
33
+ for (let cycle = 0; cycle <= nCycles; cycle++) {
34
+ const t = cycle * cycleLengthYears;
35
+ const s_pfs = survivalAt(t, survivalParams, "pfs");
36
+ const s_os = survivalAt(t, survivalParams, "os");
37
+ // Proportions in each state
38
+ const prop_pfs = s_pfs;
39
+ const prop_pd = Math.max(0, s_os - s_pfs);
40
+ // const prop_dead = 1 - s_os; // not needed for calculations
41
+ // Discount factors
42
+ const discount_cost = 1 / Math.pow(1 + discountRateCosts, t);
43
+ const discount_outcome = 1 / Math.pow(1 + discountRateOutcomes, t);
44
+ // Half-cycle correction
45
+ const isFirst = cycle === 0;
46
+ const isLast = cycle === nCycles;
47
+ const fraction = (isFirst || isLast) ? 0.5 : 1.0;
48
+ const cycle_cost = (prop_pfs * costPFSAnnual + prop_pd * costPDAnnual) * cycleLengthYears * fraction * discount_cost;
49
+ const cycle_qaly = (prop_pfs * utilityPFS + prop_pd * utilityPD) * cycleLengthYears * fraction * discount_outcome;
50
+ const cycle_lys = (prop_pfs + prop_pd) * cycleLengthYears * fraction * discount_outcome;
51
+ total_cost += cycle_cost;
52
+ total_qaly += cycle_qaly;
53
+ total_lys += cycle_lys;
54
+ }
55
+ return { total_cost, total_qaly, total_lys };
56
+ }
57
+ /**
58
+ * Run Partitioned Survival Analysis for both arms.
59
+ */
60
+ export function runPartSA(params) {
61
+ const intervention = runPartSAArm(params.intervention_survival, params.utility_pfs, params.utility_pd, params.cost_pfs_annual, params.cost_pd_annual, params.n_cycles, params.cycle_length_years, params.discount_rate_costs, params.discount_rate_outcomes);
62
+ const comparator = runPartSAArm(params.comparator_survival, params.utility_pfs, params.utility_pd, params.cost_pfs_annual, params.cost_pd_annual, params.n_cycles, params.cycle_length_years, params.discount_rate_costs, params.discount_rate_outcomes);
63
+ return { intervention, comparator };
64
+ }
65
+ //# sourceMappingURL=partsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partsa.js","sourceRoot":"","sources":["../../src/models/partsa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Probabilistic Sensitivity Analysis (PSA) using Monte Carlo simulation.
3
+ */
4
+ import type { CEModelParams } from "../providers/types.js";
5
+ export type CEModelInputs = CEModelParams;
6
+ export interface PSAParams {
7
+ base_params: CEModelInputs;
8
+ n_iterations: number;
9
+ seed?: number;
10
+ }
11
+ export interface PSAIteration {
12
+ delta_cost: number;
13
+ delta_qaly: number;
14
+ icer: number;
15
+ }
16
+ export interface PSAResult {
17
+ iterations: PSAIteration[];
18
+ mean_icer: number;
19
+ ci_icer_lower: number;
20
+ ci_icer_upper: number;
21
+ prob_cost_effective: Record<string, number>;
22
+ ceac: Array<{
23
+ wtp: number;
24
+ prob_ce: number;
25
+ }>;
26
+ evpi: number;
27
+ scatter_sample: PSAIteration[];
28
+ }
29
+ /**
30
+ * Run PSA: Monte Carlo simulation over uncertain parameters.
31
+ */
32
+ export declare function runPSA(params: PSAParams): PSAResult;
33
+ //# sourceMappingURL=psa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psa.d.ts","sourceRoot":"","sources":["../../src/models/psa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;AAE1C,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,aAAa,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;AAiCD;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAkGnD"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Probabilistic Sensitivity Analysis (PSA) using Monte Carlo simulation.
3
+ */
4
+ import { betaSample, gammaSample, createSeededRng } from "./distributions.js";
5
+ import { runMarkovAndComputeICER } from "./modelUtils.js";
6
+ const WTP_THRESHOLDS_PSA = {
7
+ nhs_low: 20000,
8
+ nhs_high: 30000,
9
+ us_payer_low: 100000,
10
+ us_payer_mid: 150000,
11
+ societal: 50000,
12
+ };
13
+ /**
14
+ * Perturb a parameter using Beta distribution (for utilities/probabilities).
15
+ * Uses ±10% relative variance by default.
16
+ */
17
+ function perturbBeta(value, cv, rng) {
18
+ const mean = Math.max(0.001, Math.min(0.999, value));
19
+ const variance = Math.pow(mean * cv, 2);
20
+ // Clamp variance so alpha/beta are positive
21
+ const maxVariance = mean * (1 - mean) * 0.99;
22
+ const safeVariance = Math.min(variance, maxVariance);
23
+ return betaSample(mean, safeVariance, rng);
24
+ }
25
+ /**
26
+ * Perturb a cost parameter using Gamma distribution.
27
+ * Uses 20% CV by default.
28
+ */
29
+ function perturbGamma(value, cv, rng) {
30
+ const mean = Math.max(1, value);
31
+ const variance = Math.pow(mean * cv, 2);
32
+ return gammaSample(mean, variance, rng);
33
+ }
34
+ /**
35
+ * Run PSA: Monte Carlo simulation over uncertain parameters.
36
+ */
37
+ export function runPSA(params) {
38
+ const rng = createSeededRng(params.seed ?? 42);
39
+ const iterations = [];
40
+ for (let i = 0; i < params.n_iterations; i++) {
41
+ // Sample perturbed parameters
42
+ const perturbedParams = {
43
+ ...params.base_params,
44
+ clinical_inputs: {
45
+ ...params.base_params.clinical_inputs,
46
+ efficacy_delta: perturbBeta(Math.max(0.001, Math.min(0.999, params.base_params.clinical_inputs.efficacy_delta)), 0.10, rng),
47
+ mortality_reduction: params.base_params.clinical_inputs.mortality_reduction !== undefined
48
+ ? perturbBeta(Math.max(0.001, Math.min(0.999, params.base_params.clinical_inputs.mortality_reduction)), 0.10, rng)
49
+ : undefined,
50
+ },
51
+ cost_inputs: {
52
+ drug_cost_annual: perturbGamma(params.base_params.cost_inputs.drug_cost_annual, 0.20, rng),
53
+ comparator_cost_annual: perturbGamma(params.base_params.cost_inputs.comparator_cost_annual, 0.20, rng),
54
+ admin_cost: params.base_params.cost_inputs.admin_cost !== undefined
55
+ ? perturbGamma(params.base_params.cost_inputs.admin_cost, 0.20, rng)
56
+ : undefined,
57
+ ae_cost: params.base_params.cost_inputs.ae_cost !== undefined
58
+ ? perturbGamma(params.base_params.cost_inputs.ae_cost, 0.20, rng)
59
+ : undefined,
60
+ },
61
+ utility_inputs: params.base_params.utility_inputs
62
+ ? {
63
+ qaly_on_treatment: perturbBeta(params.base_params.utility_inputs.qaly_on_treatment, 0.05, rng),
64
+ qaly_comparator: perturbBeta(params.base_params.utility_inputs.qaly_comparator, 0.05, rng),
65
+ }
66
+ : undefined,
67
+ };
68
+ const { delta_cost, delta_qaly, icer } = runMarkovAndComputeICER(perturbedParams);
69
+ iterations.push({ delta_cost, delta_qaly, icer });
70
+ }
71
+ // Compute statistics
72
+ const finiteICERs = iterations.map(it => it.icer).filter(ic => isFinite(ic));
73
+ const sortedICERs = [...finiteICERs].sort((a, b) => a - b);
74
+ const mean_icer = finiteICERs.length > 0
75
+ ? finiteICERs.reduce((a, b) => a + b, 0) / finiteICERs.length
76
+ : Infinity;
77
+ const ci_icer_lower = sortedICERs.length > 0
78
+ ? sortedICERs[Math.floor(sortedICERs.length * 0.025)] ?? sortedICERs[0]
79
+ : 0;
80
+ const ci_icer_upper = sortedICERs.length > 0
81
+ ? sortedICERs[Math.floor(sortedICERs.length * 0.975)] ?? sortedICERs[sortedICERs.length - 1]
82
+ : 0;
83
+ // Probability cost-effective at named thresholds
84
+ const prob_cost_effective = {};
85
+ for (const [name, wtp] of Object.entries(WTP_THRESHOLDS_PSA)) {
86
+ const n_ce = iterations.filter(it => wtp * it.delta_qaly - it.delta_cost > 0).length;
87
+ prob_cost_effective[name] = n_ce / iterations.length;
88
+ }
89
+ // CEAC: WTP from $0 to $300,000 in $5,000 steps
90
+ const ceac = [];
91
+ for (let wtp = 0; wtp <= 300000; wtp += 5000) {
92
+ const n_ce = iterations.filter(it => wtp * it.delta_qaly - it.delta_cost > 0).length;
93
+ ceac.push({ wtp, prob_ce: n_ce / iterations.length });
94
+ }
95
+ // EVPI: E[max_arm(NMB)] - max_arm(E[NMB])
96
+ // Using a reference WTP (midpoint of common thresholds: $50,000)
97
+ const lambda = 50000;
98
+ const nmb_intervention_mean = iterations.reduce((sum, it) => sum + (lambda * it.delta_qaly - it.delta_cost), 0) / iterations.length;
99
+ const nmb_comparator_mean = 0; // comparator is reference (delta = 0)
100
+ const e_max_nmb = iterations.reduce((sum, it) => {
101
+ const nmb_int = lambda * it.delta_qaly - it.delta_cost;
102
+ return sum + Math.max(nmb_int, nmb_comparator_mean);
103
+ }, 0) / iterations.length;
104
+ const max_e_nmb = Math.max(nmb_intervention_mean, nmb_comparator_mean);
105
+ const evpi = Math.max(0, e_max_nmb - max_e_nmb);
106
+ const scatter_sample = iterations.slice(0, 500);
107
+ return {
108
+ iterations,
109
+ mean_icer,
110
+ ci_icer_lower,
111
+ ci_icer_upper,
112
+ prob_cost_effective,
113
+ ceac,
114
+ evpi,
115
+ scatter_sample,
116
+ };
117
+ }
118
+ //# sourceMappingURL=psa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psa.js","sourceRoot":"","sources":["../../src/models/psa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAA2B,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AA2BnF,MAAM,kBAAkB,GAA2B;IACjD,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,MAAM;IACpB,YAAY,EAAE,MAAM;IACpB,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAa,EAAE,EAAU,EAAE,GAAiB;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACxC,4CAA4C;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAa,EAAE,EAAU,EAAE,GAAiB;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,MAAiB;IACtC,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAmB,EAAE,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,8BAA8B;QAC9B,MAAM,eAAe,GAAkB;YACrC,GAAG,MAAM,CAAC,WAAW;YACrB,eAAe,EAAE;gBACf,GAAG,MAAM,CAAC,WAAW,CAAC,eAAe;gBACrC,cAAc,EAAE,WAAW,CACzB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,EACnF,IAAI,EACJ,GAAG,CACJ;gBACD,mBAAmB,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,mBAAmB,KAAK,SAAS;oBACvF,CAAC,CAAC,WAAW,CACT,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,EACxF,IAAI,EACJ,GAAG,CACJ;oBACH,CAAC,CAAC,SAAS;aACd;YACD,WAAW,EAAE;gBACX,gBAAgB,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,EAAE,GAAG,CAAC;gBAC1F,sBAAsB,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,sBAAsB,EAAE,IAAI,EAAE,GAAG,CAAC;gBACtG,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,KAAK,SAAS;oBACjE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC;oBACpE,CAAC,CAAC,SAAS;gBACb,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS;oBAC3D,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC;oBACjE,CAAC,CAAC,SAAS;aACd;YACD,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc;gBAC/C,CAAC,CAAC;oBACE,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,iBAAiB,EAAE,IAAI,EAAE,GAAG,CAAC;oBAC9F,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,CAAC;iBAC3F;gBACH,CAAC,CAAC,SAAS;SACd,CAAC;QAEF,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAC;QAClF,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,qBAAqB;IACrB,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM;QAC7D,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QAC1C,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAE;QACxE,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QAC1C,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAE;QAC7F,CAAC,CAAC,CAAC,CAAC;IAEN,iDAAiD;IACjD,MAAM,mBAAmB,GAA2B,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACrF,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;IACvD,CAAC;IAED,gDAAgD;IAChD,MAAM,IAAI,GAA4C,EAAE,CAAC;IACzD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACrF,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,0CAA0C;IAC1C,iEAAiE;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC;IACrB,MAAM,qBAAqB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IACpI,MAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,sCAAsC;IACrE,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QACvD,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACtD,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IAEhD,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEhD,OAAO;QACL,UAAU;QACV,SAAS;QACT,aAAa;QACb,aAAa;QACb,mBAAmB;QACnB,IAAI;QACJ,IAAI;QACJ,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LiteratureResult } from "../types.js";
2
+ export declare function fetchAifa(query: string, maxResults: number): Promise<LiteratureResult[]>;
3
+ //# sourceMappingURL=aifa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aifa.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/aifa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6B9F"}
@@ -0,0 +1,30 @@
1
+ export async function fetchAifa(query, maxResults) {
2
+ const entries = [
3
+ {
4
+ title: `AIFA HTA Reports: ${query}`,
5
+ abstract: `AIFA (Agenzia Italiana del Farmaco — Italian Medicines Agency) evaluates medicines for reimbursement and pricing in Italy through its Technical Scientific Commission (CTS) and Pricing and Reimbursement Committee (CPR). AIFA assessments consider clinical value, budget impact, and therapeutic alternatives. Search "${query}" to find AIFA reimbursement decisions and HTA reports relevant to the drug or indication.`,
6
+ url: `https://www.aifa.gov.it/en/web/guest/ricerca?inheritRedirect=true&redirect=%2Fen%2Fweb%2Fguest%2Fhome&q=${encodeURIComponent(query)}`,
7
+ },
8
+ {
9
+ title: `AIFA Reimbursement and Pricing Framework`,
10
+ abstract: `AIFA manages drug classification for reimbursement (Class A — fully reimbursed, Class C — non-reimbursed) and negotiates prices with manufacturers. The reimbursement dossier must include clinical evidence, pharmacoeconomic evaluation, and budget impact analysis. Key reference for Italian market access strategy and dossier preparation requirements.`,
11
+ url: "https://www.aifa.gov.it/en/prezzi-e-rimborso",
12
+ },
13
+ {
14
+ title: `Italian National Pharmaceutical Formulary (PT Nazionale)`,
15
+ abstract: `The Prontuario Farmaceutico Nazionale (PFN) lists all medicines reimbursed by Italy's National Health Service (SSN), classified by reimbursement status and prescribing restrictions. Essential for understanding the competitive landscape and existing treatment algorithms for any indication in the Italian market.`,
16
+ url: "https://www.aifa.gov.it/prontuario-farmaceutico-nazionale",
17
+ },
18
+ ];
19
+ return entries.slice(0, maxResults).map((e, i) => ({
20
+ id: `aifa_${i}`,
21
+ source: "aifa",
22
+ title: e.title,
23
+ authors: ["Agenzia Italiana del Farmaco (AIFA) — Italian Medicines Agency"],
24
+ date: new Date().getFullYear().toString(),
25
+ study_type: "hta_report",
26
+ abstract: e.abstract,
27
+ url: e.url,
28
+ }));
29
+ }
30
+ //# sourceMappingURL=aifa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aifa.js","sourceRoot":"","sources":["../../../src/providers/direct/aifa.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,UAAkB;IAC/D,MAAM,OAAO,GAAG;QACd;YACE,KAAK,EAAE,qBAAqB,KAAK,EAAE;YACnC,QAAQ,EAAE,6TAA6T,KAAK,4FAA4F;YACxa,GAAG,EAAE,2GAA2G,kBAAkB,CAAC,KAAK,CAAC,EAAE;SAC5I;QACD;YACE,KAAK,EAAE,0CAA0C;YACjD,QAAQ,EAAE,+VAA+V;YACzW,GAAG,EAAE,8CAA8C;SACpD;QACD;YACE,KAAK,EAAE,0DAA0D;YACjE,QAAQ,EAAE,yTAAyT;YACnU,GAAG,EAAE,2DAA2D;SACjE;KACF,CAAC;IAEF,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,MAAM,EAAE,MAAe;QACvB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO,EAAE,CAAC,gEAAgE,CAAC;QAC3E,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QACzC,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,GAAG,EAAE,CAAC,CAAC,GAAG;KACX,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LiteratureResult } from "../types.js";
2
+ export declare function fetchAllOfUs(query: string, maxResults: number): Promise<LiteratureResult[]>;
3
+ //# sourceMappingURL=allOfUs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allOfUs.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/allOfUs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAmBpD,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkC7B"}
@@ -0,0 +1,37 @@
1
+ const BASE = "https://databrowser.researchallofus.org/api/v1/databrowser";
2
+ export async function fetchAllOfUs(query, maxResults) {
3
+ try {
4
+ const url = `${BASE}/search?query=${encodeURIComponent(query)}&limit=${maxResults}`;
5
+ const res = await fetch(url, {
6
+ headers: { Accept: "application/json" },
7
+ });
8
+ if (!res.ok)
9
+ return [];
10
+ const data = (await res.json());
11
+ const items = data.items ?? [];
12
+ return items.slice(0, maxResults).map((item) => ({
13
+ id: `aou_${item.conceptId}`,
14
+ source: "all_of_us",
15
+ title: `${item.conceptName} (${item.domainId})`,
16
+ authors: ["NIH All of Us Research Program"],
17
+ date: new Date().getFullYear().toString(),
18
+ study_type: "registry",
19
+ abstract: [
20
+ `Concept: ${item.conceptName}`,
21
+ `Domain: ${item.domainId}`,
22
+ `Vocabulary: ${item.vocabularyId} (${item.conceptCode})`,
23
+ `Participant count: ${item.countValue.toLocaleString()}`,
24
+ item.prevalence > 0
25
+ ? `Prevalence: ${(item.prevalence * 100).toFixed(2)}%`
26
+ : null,
27
+ ]
28
+ .filter(Boolean)
29
+ .join(" | "),
30
+ url: `https://databrowser.researchallofus.org/survey/${item.conceptId}`,
31
+ }));
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ //# sourceMappingURL=allOfUs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allOfUs.js","sourceRoot":"","sources":["../../../src/providers/direct/allOfUs.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,4DAA4D,CAAC;AAiB1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAa,EACb,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,IAAI,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC;QACpF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAEvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAE/B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/C,EAAE,EAAE,OAAO,IAAI,CAAC,SAAS,EAAE;YAC3B,MAAM,EAAE,WAAoB;YAC5B,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,QAAQ,GAAG;YAC/C,OAAO,EAAE,CAAC,gCAAgC,CAAC;YAC3C,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;YACzC,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE;gBACR,YAAY,IAAI,CAAC,WAAW,EAAE;gBAC9B,WAAW,IAAI,CAAC,QAAQ,EAAE;gBAC1B,eAAe,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,WAAW,GAAG;gBACxD,sBAAsB,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE;gBACxD,IAAI,CAAC,UAAU,GAAG,CAAC;oBACjB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;oBACtD,CAAC,CAAC,IAAI;aACT;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,KAAK,CAAC;YACd,GAAG,EAAE,kDAAkD,IAAI,CAAC,SAAS,EAAE;SACxE,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LiteratureResult } from "../types.js";
2
+ export declare function fetchAnvisa(query: string, maxResults: number): Promise<LiteratureResult[]>;
3
+ //# sourceMappingURL=anvisa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anvisa.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/anvisa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwBhG"}
@@ -0,0 +1,25 @@
1
+ export async function fetchAnvisa(query, maxResults) {
2
+ const entries = [
3
+ {
4
+ title: `ANVISA Drug Pricing (CMED): ${query}`,
5
+ abstract: `ANVISA (Agência Nacional de Vigilância Sanitária) through CMED (Câmara de Regulação do Mercado de Medicamentos) sets maximum drug prices in Brazil. The CMED price list is the reference for public sector drug procurement. Essential for Brazilian HEOR drug cost inputs.`,
6
+ url: `https://www.gov.br/anvisa/pt-br/assuntos/medicamentos/cmed/precos`,
7
+ },
8
+ {
9
+ title: `ANVISA Drug Registry — ${query}`,
10
+ abstract: `ANVISA registry of registered medicinal products in Brazil. Search for registration status, active ingredients, therapeutic class, and marketing authorization holder. Prerequisite check before including drugs in Brazilian CE models.`,
11
+ url: `https://consultas.anvisa.gov.br/#/medicamentos/?search_text=${encodeURIComponent(query)}`,
12
+ },
13
+ ];
14
+ return entries.slice(0, maxResults).map((e, i) => ({
15
+ id: `anvisa_${i}`,
16
+ source: "anvisa",
17
+ title: e.title,
18
+ authors: ["ANVISA — Agência Nacional de Vigilância Sanitária (Brazil)"],
19
+ date: new Date().getFullYear().toString(),
20
+ study_type: "regulatory",
21
+ abstract: e.abstract,
22
+ url: e.url,
23
+ }));
24
+ }
25
+ //# sourceMappingURL=anvisa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anvisa.js","sourceRoot":"","sources":["../../../src/providers/direct/anvisa.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,UAAkB;IACjE,MAAM,OAAO,GAAG;QACd;YACE,KAAK,EAAE,+BAA+B,KAAK,EAAE;YAC7C,QAAQ,EAAE,6QAA6Q;YACvR,GAAG,EAAE,mEAAmE;SACzE;QACD;YACE,KAAK,EAAE,0BAA0B,KAAK,EAAE;YACxC,QAAQ,EAAE,0OAA0O;YACpP,GAAG,EAAE,+DAA+D,kBAAkB,CAAC,KAAK,CAAC,EAAE;SAChG;KACF,CAAC;IAEF,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,MAAM,EAAE,QAAiB;QACzB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO,EAAE,CAAC,4DAA4D,CAAC;QACvE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QACzC,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,GAAG,EAAE,CAAC,CAAC,GAAG;KACX,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LiteratureResult } from "../types.js";
2
+ export declare function fetchBiorxiv(query: string, maxResults: number): Promise<LiteratureResult[]>;
3
+ //# sourceMappingURL=biorxiv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biorxiv.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/biorxiv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAapD,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiCjG"}
@@ -0,0 +1,33 @@
1
+ const BASE = "https://api.biorxiv.org/details/medrxiv";
2
+ export async function fetchBiorxiv(query, maxResults) {
3
+ try {
4
+ const dateFrom = new Date();
5
+ dateFrom.setFullYear(dateFrom.getFullYear() - 2);
6
+ const from = dateFrom.toISOString().split("T")[0];
7
+ const to = new Date().toISOString().split("T")[0];
8
+ const url = `${BASE}/${from}/${to}/0/json`;
9
+ const res = await fetch(url);
10
+ if (!res.ok)
11
+ return [];
12
+ const data = await res.json();
13
+ const queryLower = query.toLowerCase();
14
+ return (data.collection ?? [])
15
+ .filter((p) => p.title.toLowerCase().includes(queryLower) ||
16
+ p.abstract.toLowerCase().includes(queryLower))
17
+ .slice(0, maxResults)
18
+ .map((p) => ({
19
+ id: `biorxiv_${p.doi.replace(/\//g, "_")}`,
20
+ source: "biorxiv",
21
+ title: p.title,
22
+ authors: p.authors.split(";").map((a) => a.trim()),
23
+ date: p.date,
24
+ study_type: "preprint",
25
+ abstract: p.abstract,
26
+ url: `https://www.medrxiv.org/content/${p.doi}`,
27
+ }));
28
+ }
29
+ catch {
30
+ return [];
31
+ }
32
+ }
33
+ //# sourceMappingURL=biorxiv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biorxiv.js","sourceRoot":"","sources":["../../../src/providers/direct/biorxiv.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,yCAAyC,CAAC;AAWvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,UAAkB;IAClE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAElD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,SAAS,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAEvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAoC,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACZ,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC1C,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC9C;aACA,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;YAC1C,MAAM,EAAE,SAAkB;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,GAAG,EAAE,mCAAmC,CAAC,CAAC,GAAG,EAAE;SAChD,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LiteratureResult } from "../types.js";
2
+ export declare function fetchBnf(query: string, maxResults: number): Promise<LiteratureResult[]>;
3
+ //# sourceMappingURL=bnf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bnf.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/bnf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6B7F"}