heor-agent-mcp 1.14.0 → 1.14.2
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/dist/models/modelUtils.d.ts +18 -0
- package/dist/models/modelUtils.d.ts.map +1 -1
- package/dist/models/modelUtils.js +34 -0
- package/dist/models/modelUtils.js.map +1 -1
- package/dist/providers/direct/biorxiv.d.ts +1 -0
- package/dist/providers/direct/biorxiv.d.ts.map +1 -1
- package/dist/providers/direct/biorxiv.js +43 -27
- package/dist/providers/direct/biorxiv.js.map +1 -1
- package/dist/providers/direct/cmsNadac.d.ts.map +1 -1
- package/dist/providers/direct/cmsNadac.js +25 -16
- package/dist/providers/direct/cmsNadac.js.map +1 -1
- package/dist/providers/direct/embase.d.ts +17 -0
- package/dist/providers/direct/embase.d.ts.map +1 -1
- package/dist/providers/direct/embase.js +70 -37
- package/dist/providers/direct/embase.js.map +1 -1
- package/dist/providers/direct/googleScholar.d.ts.map +1 -1
- package/dist/providers/direct/googleScholar.js +40 -34
- package/dist/providers/direct/googleScholar.js.map +1 -1
- package/dist/providers/direct/pubmed.d.ts.map +1 -1
- package/dist/providers/direct/pubmed.js +42 -43
- package/dist/providers/direct/pubmed.js.map +1 -1
- package/dist/providers/direct/purpleBook.d.ts.map +1 -1
- package/dist/providers/direct/purpleBook.js +36 -37
- package/dist/providers/direct/purpleBook.js.map +1 -1
- package/dist/providers/direct/scienceDirect.d.ts.map +1 -1
- package/dist/providers/direct/scienceDirect.js +38 -36
- package/dist/providers/direct/scienceDirect.js.map +1 -1
- package/dist/providers/direct/whoGho.d.ts.map +1 -1
- package/dist/providers/direct/whoGho.js +29 -27
- package/dist/providers/direct/whoGho.js.map +1 -1
- package/dist/server.js +10 -36
- package/dist/server.js.map +1 -1
- package/dist/tools/costEffectivenessModel.d.ts +5 -5
- package/dist/tools/costEffectivenessModel.d.ts.map +1 -1
- package/dist/tools/costEffectivenessModel.js +64 -10
- package/dist/tools/costEffectivenessModel.js.map +1 -1
- package/dist/tools/htaDossierPrep.d.ts +5 -5
- package/dist/tools/htaDossierPrep.js +5 -5
- package/dist/tools/htaDossierPrep.js.map +1 -1
- package/dist/tools/htaWorkflow.d.ts +5 -5
- package/dist/tools/htaWorkflow.d.ts.map +1 -1
- package/dist/tools/htaWorkflow.js +8 -6
- package/dist/tools/htaWorkflow.js.map +1 -1
- package/dist/tools/maicWorkflow.d.ts +2 -2
- package/dist/tools/maicWorkflow.d.ts.map +1 -1
- package/dist/tools/maicWorkflow.js +23 -29
- package/dist/tools/maicWorkflow.js.map +1 -1
- package/dist/tools/survivalFitting.d.ts +5 -5
- package/dist/tools/survivalFitting.d.ts.map +1 -1
- package/dist/tools/survivalFitting.js +13 -9
- package/dist/tools/survivalFitting.js.map +1 -1
- package/dist/tools/validateLinks.d.ts.map +1 -1
- package/dist/tools/validateLinks.js +8 -6
- package/dist/tools/validateLinks.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,6 +4,24 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { CEModelParams } from "../providers/types.js";
|
|
6
6
|
import type { MarkovParams } from "./markov.js";
|
|
7
|
+
/**
|
|
8
|
+
* Structural assumptions baked into `buildMarkovParamsFromCE`.
|
|
9
|
+
*
|
|
10
|
+
* These are simplified illustrative defaults used when no indication-specific
|
|
11
|
+
* epidemiological data are supplied. They materially drive every Markov-based
|
|
12
|
+
* ICER produced by this tool. They MUST be replaced with indication-specific
|
|
13
|
+
* values before the model is used for any regulatory submission, HTA dossier,
|
|
14
|
+
* or payer negotiation.
|
|
15
|
+
*
|
|
16
|
+
* Callers (e.g. costEffectivenessModel.ts) should surface all three strings
|
|
17
|
+
* via `addAssumption` so they appear in the audit trail and visible output.
|
|
18
|
+
*
|
|
19
|
+
* Rationale for exporting rather than calling addAssumption here:
|
|
20
|
+
* modelUtils is a pure computation module with no audit dependency — it has
|
|
21
|
+
* no access to an AuditRecord instance. The caller owns the audit lifecycle
|
|
22
|
+
* and is the correct place to wire these strings in.
|
|
23
|
+
*/
|
|
24
|
+
export declare const MARKOV_STRUCTURAL_ASSUMPTIONS: readonly string[];
|
|
7
25
|
export declare function getTimeHorizonYears(horizon: CEModelParams["time_horizon"]): number;
|
|
8
26
|
/**
|
|
9
27
|
* Build MarkovParams from CEModelParams using a 3-state model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelUtils.d.ts","sourceRoot":"","sources":["../../src/models/modelUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAC;AAK/E,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,GACrC,MAAM,CAKR;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CAgG3E;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAgEA"}
|
|
1
|
+
{"version":3,"file":"modelUtils.d.ts","sourceRoot":"","sources":["../../src/models/modelUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAC;AAK/E;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAkBjD,CAAC;AAEX,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,GACrC,MAAM,CAKR;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CAgG3E;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAgEA"}
|
|
@@ -4,6 +4,40 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { runMarkovModel } from "./markov.js";
|
|
6
6
|
const DISCOUNT_RATE = 0.035;
|
|
7
|
+
/**
|
|
8
|
+
* Structural assumptions baked into `buildMarkovParamsFromCE`.
|
|
9
|
+
*
|
|
10
|
+
* These are simplified illustrative defaults used when no indication-specific
|
|
11
|
+
* epidemiological data are supplied. They materially drive every Markov-based
|
|
12
|
+
* ICER produced by this tool. They MUST be replaced with indication-specific
|
|
13
|
+
* values before the model is used for any regulatory submission, HTA dossier,
|
|
14
|
+
* or payer negotiation.
|
|
15
|
+
*
|
|
16
|
+
* Callers (e.g. costEffectivenessModel.ts) should surface all three strings
|
|
17
|
+
* via `addAssumption` so they appear in the audit trail and visible output.
|
|
18
|
+
*
|
|
19
|
+
* Rationale for exporting rather than calling addAssumption here:
|
|
20
|
+
* modelUtils is a pure computation module with no audit dependency — it has
|
|
21
|
+
* no access to an AuditRecord instance. The caller owns the audit lifecycle
|
|
22
|
+
* and is the correct place to wire these strings in.
|
|
23
|
+
*/
|
|
24
|
+
export const MARKOV_STRUCTURAL_ASSUMPTIONS = [
|
|
25
|
+
"STRUCTURAL ASSUMPTION (illustrative, not epidemiologically derived): " +
|
|
26
|
+
"Background annual mortality fixed at 2% (0.02). " +
|
|
27
|
+
"This is a generic placeholder. Replace with indication-specific life-table " +
|
|
28
|
+
"mortality for submission use.",
|
|
29
|
+
"STRUCTURAL ASSUMPTION (illustrative, not epidemiologically derived): " +
|
|
30
|
+
"Annual probability of staying on intervention derived as " +
|
|
31
|
+
"0.5 + efficacy_delta × 0.5 — a heuristic mapping from the unitless " +
|
|
32
|
+
"efficacy_delta input to a Markov transition probability with no " +
|
|
33
|
+
"epidemiological basis. Replace with a clinical-trial-derived " +
|
|
34
|
+
"treatment-discontinuation rate for submission use.",
|
|
35
|
+
"STRUCTURAL ASSUMPTION (illustrative, not epidemiologically derived): " +
|
|
36
|
+
"Comparator retention set to 70% of intervention retention " +
|
|
37
|
+
"(baselineProbStayOn = probStayOnIntervention × 0.7) — an arbitrary scalar " +
|
|
38
|
+
"with no indication-specific basis. Replace with trial-observed or " +
|
|
39
|
+
"registry-derived comparator discontinuation data for submission use.",
|
|
40
|
+
];
|
|
7
41
|
export function getTimeHorizonYears(horizon) {
|
|
8
42
|
if (horizon === "lifetime")
|
|
9
43
|
return 40;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelUtils.js","sourceRoot":"","sources":["../../src/models/modelUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"modelUtils.js","sourceRoot":"","sources":["../../src/models/modelUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AAepD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAa9D;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmC7B"}
|
|
@@ -1,33 +1,49 @@
|
|
|
1
1
|
const BASE = "https://api.biorxiv.org/details/medrxiv";
|
|
2
|
+
const BIORXIV_QUERY_NOISE = /\b(?:AND|OR|NOT)\b/gi;
|
|
3
|
+
export function extractBiorxivKeywords(query) {
|
|
4
|
+
return [
|
|
5
|
+
...new Set(query
|
|
6
|
+
.replace(/[(){}[\]:"']/g, " ")
|
|
7
|
+
.replace(BIORXIV_QUERY_NOISE, " ")
|
|
8
|
+
.replace(/[?*]/g, "")
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.split(/\s+/)
|
|
11
|
+
.map((term) => term.trim())
|
|
12
|
+
.filter((term) => term.length >= 3)),
|
|
13
|
+
];
|
|
14
|
+
}
|
|
2
15
|
export async function fetchBiorxiv(query, maxResults) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
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
|
-
}));
|
|
16
|
+
const dateFrom = new Date();
|
|
17
|
+
dateFrom.setFullYear(dateFrom.getFullYear() - 2);
|
|
18
|
+
const from = dateFrom.toISOString().split("T")[0];
|
|
19
|
+
const to = new Date().toISOString().split("T")[0];
|
|
20
|
+
// bioRxiv/medRxiv has no true search endpoint. We fetch the first page only
|
|
21
|
+
// (offset 0, roughly 100 records) and keyword-filter locally.
|
|
22
|
+
const url = `${BASE}/${from}/${to}/0/json`;
|
|
23
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(15_000) });
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
const body = await res.text().catch(() => "");
|
|
26
|
+
throw new Error(`bioRxiv API ${res.status}: ${body.slice(0, 200)}`);
|
|
28
27
|
}
|
|
29
|
-
|
|
28
|
+
const data = (await res.json());
|
|
29
|
+
const keywords = extractBiorxivKeywords(query);
|
|
30
|
+
if (keywords.length === 0)
|
|
30
31
|
return [];
|
|
31
|
-
|
|
32
|
+
return (data.collection ?? [])
|
|
33
|
+
.filter((p) => {
|
|
34
|
+
const haystack = `${p.title} ${p.abstract}`.toLowerCase();
|
|
35
|
+
return keywords.some((term) => haystack.includes(term));
|
|
36
|
+
})
|
|
37
|
+
.slice(0, maxResults)
|
|
38
|
+
.map((p) => ({
|
|
39
|
+
id: `biorxiv_${p.doi.replace(/\//g, "_")}`,
|
|
40
|
+
source: "biorxiv",
|
|
41
|
+
title: p.title,
|
|
42
|
+
authors: p.authors.split(";").map((a) => a.trim()),
|
|
43
|
+
date: p.date,
|
|
44
|
+
study_type: "preprint",
|
|
45
|
+
abstract: p.abstract,
|
|
46
|
+
url: `https://www.medrxiv.org/content/${p.doi}`,
|
|
47
|
+
}));
|
|
32
48
|
}
|
|
33
49
|
//# sourceMappingURL=biorxiv.js.map
|
|
@@ -1 +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,CAChC,KAAa,EACb,UAAkB;IAElB,
|
|
1
|
+
{"version":3,"file":"biorxiv.js","sourceRoot":"","sources":["../../../src/providers/direct/biorxiv.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cmsNadac.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/cmsNadac.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoBpD,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"cmsNadac.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/cmsNadac.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoBpD,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2C7B"}
|
|
@@ -5,16 +5,28 @@ const BASE = "https://data.cms.gov/data-api/v1/dataset";
|
|
|
5
5
|
// NADAC dataset UUID (stable since 2022)
|
|
6
6
|
const NADAC_DATASET_ID = "dfa2ab14-06c2-4b99-9f0e-215a6713b5f2";
|
|
7
7
|
export async function fetchCmsNadac(query, maxResults) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
// The CMS data-api supports filter syntax. Use URLSearchParams because the
|
|
9
|
+
// JSONAPI filter key itself contains spaces and brackets.
|
|
10
|
+
const params = new URLSearchParams({
|
|
11
|
+
"filter[NDC Description][condition][path]": "NDC Description",
|
|
12
|
+
"filter[NDC Description][condition][operator]": "CONTAINS",
|
|
13
|
+
"filter[NDC Description][condition][value]": query.toUpperCase(),
|
|
14
|
+
size: String(Math.min(maxResults, 100)),
|
|
15
|
+
});
|
|
16
|
+
const url = `${BASE}/${NADAC_DATASET_ID}/data?${params}`;
|
|
17
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(15_000) });
|
|
18
|
+
if (!res.ok) {
|
|
19
|
+
const body = await res.text().catch(() => "");
|
|
20
|
+
throw new Error(`CMS NADAC API ${res.status}: ${body.slice(0, 200)}`);
|
|
21
|
+
}
|
|
22
|
+
const data = (await res.json());
|
|
23
|
+
if (!Array.isArray(data) || data.length === 0)
|
|
24
|
+
return getFallback(query, maxResults);
|
|
25
|
+
return data.slice(0, maxResults).map((row, i) => {
|
|
26
|
+
const resultParams = new URLSearchParams({
|
|
27
|
+
"filter[NDC]": row["NDC"] ?? "",
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
18
30
|
id: `cms_nadac_${row["NDC"] ?? i}`,
|
|
19
31
|
source: "cms_nadac",
|
|
20
32
|
title: `${row["NDC Description"] ?? "Unknown drug"} — NADAC $${row["NADAC Per Unit"] ?? "N/A"}/${row["Pricing Unit"] ?? "unit"}`,
|
|
@@ -30,12 +42,9 @@ export async function fetchCmsNadac(query, maxResults) {
|
|
|
30
42
|
`OTC: ${row["OTC"] ?? "N"}`,
|
|
31
43
|
`Effective: ${row["Effective Date"] ?? ""}`,
|
|
32
44
|
].join(" | "),
|
|
33
|
-
url: `https://data.cms.gov/dataset/dfa2ab14-06c2-4b99-9f0e-215a6713b5f2/data
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return getFallback(query, maxResults);
|
|
38
|
-
}
|
|
45
|
+
url: `https://data.cms.gov/dataset/dfa2ab14-06c2-4b99-9f0e-215a6713b5f2/data?${resultParams}`,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
39
48
|
}
|
|
40
49
|
function getFallback(query, maxResults) {
|
|
41
50
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cmsNadac.js","sourceRoot":"","sources":["../../../src/providers/direct/cmsNadac.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,qCAAqC;AACrC,4DAA4D;AAC5D,MAAM,IAAI,GAAG,0CAA0C,CAAC;AACxD,yCAAyC;AACzC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAahE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,UAAkB;IAElB,
|
|
1
|
+
{"version":3,"file":"cmsNadac.js","sourceRoot":"","sources":["../../../src/providers/direct/cmsNadac.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
1
|
import type { LiteratureResult } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Sanitise a raw search query before sending it to the Scopus free-text
|
|
4
|
+
* search endpoint. The Scopus translator returns 400 "Error translating
|
|
5
|
+
* query" when it encounters:
|
|
6
|
+
* - parentheses / curly- / square-brackets (grouping syntax it can't parse
|
|
7
|
+
* in free-text mode), e.g. `tirzepatide (obesity OR overweight)`
|
|
8
|
+
* - bare boolean operators adjacent to terms
|
|
9
|
+
* - field-prefix punctuation such as TITLE:"…"
|
|
10
|
+
*
|
|
11
|
+
* Reduction to a flat space-separated term list — which Scopus treats as
|
|
12
|
+
* implicit AND — is the most reliable strategy. Wildcards (* ?) are
|
|
13
|
+
* intentionally preserved.
|
|
14
|
+
*/
|
|
15
|
+
export declare function cleanScopusQuery(raw: string): {
|
|
16
|
+
cleaned: string;
|
|
17
|
+
stripped: string[];
|
|
18
|
+
};
|
|
2
19
|
export declare function fetchEmbase(query: string, maxResults: number, injectedApiKey?: string): Promise<LiteratureResult[]>;
|
|
3
20
|
//# sourceMappingURL=embase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embase.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/embase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"embase.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/embase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYpD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAYA;AAoBD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwD7B"}
|
|
@@ -1,10 +1,45 @@
|
|
|
1
1
|
// EMBASE records are indexed in Scopus and accessed via the Scopus Search API
|
|
2
2
|
// with dbId=embase. The standalone /content/search/embase endpoint returns 404.
|
|
3
3
|
const BASE = "https://api.elsevier.com/content/search/scopus";
|
|
4
|
+
// Database names that users/models sometimes append to queries but which kill
|
|
5
|
+
// Scopus results (Scopus treats all terms as mandatory AND — "EMBASE" in the
|
|
6
|
+
// query means the paper must contain the word "EMBASE").
|
|
7
|
+
const DB_NAME_PATTERN = /\b(embase|pubmed|scopus|medline|cinahl|cochrane|sciencedirect|web\s+of\s+science)\b/gi;
|
|
8
|
+
/**
|
|
9
|
+
* Sanitise a raw search query before sending it to the Scopus free-text
|
|
10
|
+
* search endpoint. The Scopus translator returns 400 "Error translating
|
|
11
|
+
* query" when it encounters:
|
|
12
|
+
* - parentheses / curly- / square-brackets (grouping syntax it can't parse
|
|
13
|
+
* in free-text mode), e.g. `tirzepatide (obesity OR overweight)`
|
|
14
|
+
* - bare boolean operators adjacent to terms
|
|
15
|
+
* - field-prefix punctuation such as TITLE:"…"
|
|
16
|
+
*
|
|
17
|
+
* Reduction to a flat space-separated term list — which Scopus treats as
|
|
18
|
+
* implicit AND — is the most reliable strategy. Wildcards (* ?) are
|
|
19
|
+
* intentionally preserved.
|
|
20
|
+
*/
|
|
21
|
+
export function cleanScopusQuery(raw) {
|
|
22
|
+
const stripped = [];
|
|
23
|
+
const cleaned = raw
|
|
24
|
+
.replace(DB_NAME_PATTERN, (match) => {
|
|
25
|
+
stripped.push(match.toLowerCase());
|
|
26
|
+
return "";
|
|
27
|
+
})
|
|
28
|
+
.replace(/[(){}[\]:"']/g, " ") // grouping / field-prefix / quote chars
|
|
29
|
+
.replace(/\b(?:AND|OR|NOT)\b/gi, " ") // bare boolean operators
|
|
30
|
+
.replace(/\s{2,}/g, " ")
|
|
31
|
+
.trim();
|
|
32
|
+
return { cleaned, stripped: [...new Set(stripped)] };
|
|
33
|
+
}
|
|
4
34
|
export async function fetchEmbase(query, maxResults, injectedApiKey) {
|
|
5
35
|
const apiKey = injectedApiKey ?? process.env.ELSEVIER_API_KEY;
|
|
6
36
|
if (!apiKey)
|
|
7
37
|
return [];
|
|
38
|
+
// Sanitise the query before sending to Scopus. Parentheses, bare boolean
|
|
39
|
+
// operators, and field-prefix punctuation cause Scopus to return
|
|
40
|
+
// 400 "Error translating query". Reduce to a flat term list so errors
|
|
41
|
+
// are never silently swallowed by the outer catch in the dispatcher.
|
|
42
|
+
const { cleaned: cleanedQuery } = cleanScopusQuery(query);
|
|
8
43
|
const instToken = process.env.ELSEVIER_INST_TOKEN;
|
|
9
44
|
const headers = {
|
|
10
45
|
"X-ELS-APIKey": apiKey,
|
|
@@ -12,44 +47,42 @@ export async function fetchEmbase(query, maxResults, injectedApiKey) {
|
|
|
12
47
|
};
|
|
13
48
|
if (instToken)
|
|
14
49
|
headers["X-ELS-Insttoken"] = instToken;
|
|
15
|
-
try
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const entries = data["search-results"]?.entry ?? [];
|
|
32
|
-
return entries
|
|
33
|
-
.filter((e) => e["dc:title"])
|
|
34
|
-
.map((e, i) => {
|
|
35
|
-
const doi = e["prism:doi"];
|
|
36
|
-
const scopusLink = e.link?.find((l) => l["@ref"] === "scopus")?.["@href"];
|
|
37
|
-
const url = doi ? `https://doi.org/${doi}` : (scopusLink ?? "");
|
|
38
|
-
return {
|
|
39
|
-
id: `embase_${doi ?? scopusLink ?? i}`,
|
|
40
|
-
source: "embase",
|
|
41
|
-
title: e["dc:title"] ?? "",
|
|
42
|
-
authors: e["dc:creator"] ? [e["dc:creator"]] : [],
|
|
43
|
-
date: e["prism:coverDate"] ?? "",
|
|
44
|
-
study_type: mapSubtype(e["subtypeDescription"]),
|
|
45
|
-
abstract: e["dc:description"] ?? "",
|
|
46
|
-
url,
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
return [];
|
|
50
|
+
// No try/catch here — let errors propagate so the dispatcher
|
|
51
|
+
// (src/providers/direct/index.ts) can record status:"failed" + error
|
|
52
|
+
// message in the audit trail instead of silently returning [].
|
|
53
|
+
const params = new URLSearchParams({
|
|
54
|
+
query: cleanedQuery,
|
|
55
|
+
count: String(maxResults),
|
|
56
|
+
dbId: "embase",
|
|
57
|
+
field: "title,creator,publicationName,coverDate,description,doi,subtypeDescription,link",
|
|
58
|
+
});
|
|
59
|
+
const res = await fetch(`${BASE}?${params}`, {
|
|
60
|
+
headers,
|
|
61
|
+
signal: AbortSignal.timeout(15_000),
|
|
62
|
+
});
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
const body = await res.text().catch(() => "");
|
|
65
|
+
throw new Error(`Scopus API ${res.status}: ${body.slice(0, 200)}`);
|
|
52
66
|
}
|
|
67
|
+
const data = (await res.json());
|
|
68
|
+
const entries = data["search-results"]?.entry ?? [];
|
|
69
|
+
return entries
|
|
70
|
+
.filter((e) => e["dc:title"])
|
|
71
|
+
.map((e, i) => {
|
|
72
|
+
const doi = e["prism:doi"];
|
|
73
|
+
const scopusLink = e.link?.find((l) => l["@ref"] === "scopus")?.["@href"];
|
|
74
|
+
const url = doi ? `https://doi.org/${doi}` : (scopusLink ?? "");
|
|
75
|
+
return {
|
|
76
|
+
id: `embase_${doi ?? scopusLink ?? i}`,
|
|
77
|
+
source: "embase",
|
|
78
|
+
title: e["dc:title"] ?? "",
|
|
79
|
+
authors: e["dc:creator"] ? [e["dc:creator"]] : [],
|
|
80
|
+
date: e["prism:coverDate"] ?? "",
|
|
81
|
+
study_type: mapSubtype(e["subtypeDescription"]),
|
|
82
|
+
abstract: e["dc:description"] ?? "",
|
|
83
|
+
url,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
53
86
|
}
|
|
54
87
|
function mapSubtype(subtype) {
|
|
55
88
|
if (!subtype)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embase.js","sourceRoot":"","sources":["../../../src/providers/direct/embase.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,IAAI,GAAG,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"embase.js","sourceRoot":"","sources":["../../../src/providers/direct/embase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"googleScholar.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/googleScholar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqBpD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"googleScholar.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/googleScholar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqBpD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6C7B"}
|
|
@@ -3,41 +3,47 @@ export async function fetchGoogleScholar(query, maxResults) {
|
|
|
3
3
|
const apiKey = process.env.SERPAPI_KEY;
|
|
4
4
|
if (!apiKey)
|
|
5
5
|
return [];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const yearMatch = pubSummary.match(/\b(19|20)\d{2}\b/);
|
|
19
|
-
return {
|
|
20
|
-
id: `gscholar_${r.result_id ?? i}`,
|
|
21
|
-
source: "google_scholar",
|
|
22
|
-
title: r.title ?? "Untitled",
|
|
23
|
-
authors,
|
|
24
|
-
date: yearMatch ? yearMatch[0] : "",
|
|
25
|
-
study_type: "unknown",
|
|
26
|
-
abstract: [
|
|
27
|
-
r.snippet ?? "",
|
|
28
|
-
pubSummary ? `Publication: ${pubSummary}` : null,
|
|
29
|
-
r.inline_links?.cited_by?.total
|
|
30
|
-
? `Cited by: ${r.inline_links.cited_by.total}`
|
|
31
|
-
: null,
|
|
32
|
-
]
|
|
33
|
-
.filter(Boolean)
|
|
34
|
-
.join(" | "),
|
|
35
|
-
url: r.link ?? "",
|
|
36
|
-
};
|
|
37
|
-
});
|
|
6
|
+
const params = new URLSearchParams({
|
|
7
|
+
engine: "google_scholar",
|
|
8
|
+
q: query,
|
|
9
|
+
num: String(Math.min(maxResults, 20)),
|
|
10
|
+
api_key: apiKey,
|
|
11
|
+
});
|
|
12
|
+
const res = await fetch(`${BASE}?${params}`, {
|
|
13
|
+
signal: AbortSignal.timeout(15_000),
|
|
14
|
+
});
|
|
15
|
+
if (!res.ok) {
|
|
16
|
+
const body = await res.text().catch(() => "");
|
|
17
|
+
throw new Error(`SerpAPI ${res.status}: ${body.slice(0, 200)}`);
|
|
38
18
|
}
|
|
39
|
-
|
|
19
|
+
const data = (await res.json());
|
|
20
|
+
if (data.error)
|
|
21
|
+
throw new Error(`SerpAPI error: ${data.error}`);
|
|
22
|
+
if (!data.organic_results)
|
|
40
23
|
return [];
|
|
41
|
-
|
|
24
|
+
return data.organic_results.slice(0, maxResults).map((r, i) => {
|
|
25
|
+
const authors = r.publication_info?.authors?.map((a) => a.name) ?? [];
|
|
26
|
+
const pubSummary = r.publication_info?.summary ?? "";
|
|
27
|
+
// pub summary often: "A Smith, B Jones - Journal Name, 2023 - publisher.com"
|
|
28
|
+
const yearMatch = pubSummary.match(/\b(19|20)\d{2}\b/);
|
|
29
|
+
return {
|
|
30
|
+
id: `gscholar_${r.result_id ?? i}`,
|
|
31
|
+
source: "google_scholar",
|
|
32
|
+
title: r.title ?? "Untitled",
|
|
33
|
+
authors,
|
|
34
|
+
date: yearMatch ? yearMatch[0] : "",
|
|
35
|
+
study_type: "unknown",
|
|
36
|
+
abstract: [
|
|
37
|
+
r.snippet ?? "",
|
|
38
|
+
pubSummary ? `Publication: ${pubSummary}` : null,
|
|
39
|
+
r.inline_links?.cited_by?.total
|
|
40
|
+
? `Cited by: ${r.inline_links.cited_by.total}`
|
|
41
|
+
: null,
|
|
42
|
+
]
|
|
43
|
+
.filter(Boolean)
|
|
44
|
+
.join(" | "),
|
|
45
|
+
url: r.link ?? "",
|
|
46
|
+
};
|
|
47
|
+
});
|
|
42
48
|
}
|
|
43
49
|
//# sourceMappingURL=googleScholar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"googleScholar.js","sourceRoot":"","sources":["../../../src/providers/direct/googleScholar.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAmB1C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,UAAkB;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"googleScholar.js","sourceRoot":"","sources":["../../../src/providers/direct/googleScholar.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAmB1C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,UAAkB;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,gBAAgB;QACxB,CAAC,EAAE,KAAK;QACR,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,EAAE;QAC3C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IACnD,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,CAAC,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtE,MAAM,UAAU,GAAG,CAAC,CAAC,gBAAgB,EAAE,OAAO,IAAI,EAAE,CAAC;QACrD,6EAA6E;QAC7E,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACvD,OAAO;YACL,EAAE,EAAE,YAAY,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE;YAClC,MAAM,EAAE,gBAAyB;YACjC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,UAAU;YAC5B,OAAO;YACP,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACnC,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE;gBACR,CAAC,CAAC,OAAO,IAAI,EAAE;gBACf,UAAU,CAAC,CAAC,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;gBAChD,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK;oBAC7B,CAAC,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE;oBAC9C,CAAC,CAAC,IAAI;aACT;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,KAAK,CAAC;YACd,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;SAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pubmed.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/pubmed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA6BpD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"pubmed.d.ts","sourceRoot":"","sources":["../../../src/providers/direct/pubmed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA6BpD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA8D7B"}
|