heor-agent-mcp 1.4.1 → 1.5.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 (42) hide show
  1. package/dist/data/niceTaPrecedents.d.ts +1 -0
  2. package/dist/data/niceTaPrecedents.d.ts.map +1 -1
  3. package/dist/data/niceTaPrecedents.js +63 -8
  4. package/dist/data/niceTaPrecedents.js.map +1 -1
  5. package/dist/irb/coverLetters.d.ts +19 -0
  6. package/dist/irb/coverLetters.d.ts.map +1 -0
  7. package/dist/irb/coverLetters.js +69 -0
  8. package/dist/irb/coverLetters.js.map +1 -0
  9. package/dist/irb/decisionTree.d.ts +3 -0
  10. package/dist/irb/decisionTree.d.ts.map +1 -0
  11. package/dist/irb/decisionTree.js +518 -0
  12. package/dist/irb/decisionTree.js.map +1 -0
  13. package/dist/irb/rulesets.d.ts +61 -0
  14. package/dist/irb/rulesets.d.ts.map +1 -0
  15. package/dist/irb/rulesets.js +192 -0
  16. package/dist/irb/rulesets.js.map +1 -0
  17. package/dist/irb/types.d.ts +106 -0
  18. package/dist/irb/types.d.ts.map +1 -0
  19. package/dist/irb/types.js +12 -0
  20. package/dist/irb/types.js.map +1 -0
  21. package/dist/jca/countryRegistry.d.ts.map +1 -1
  22. package/dist/jca/countryRegistry.js +28 -6
  23. package/dist/jca/countryRegistry.js.map +1 -1
  24. package/dist/jca/scopeEligibility.d.ts +1 -1
  25. package/dist/jca/scopeEligibility.js +2 -2
  26. package/dist/jca/types.d.ts +1 -1
  27. package/dist/jca/types.d.ts.map +1 -1
  28. package/dist/server.js +5 -0
  29. package/dist/server.js.map +1 -1
  30. package/dist/tools/htaWorkflow.d.ts +2 -2
  31. package/dist/tools/htaWorkflow.d.ts.map +1 -1
  32. package/dist/tools/htaWorkflow.js +62 -10
  33. package/dist/tools/htaWorkflow.js.map +1 -1
  34. package/dist/tools/irbReview.d.ts +126 -0
  35. package/dist/tools/irbReview.d.ts.map +1 -0
  36. package/dist/tools/irbReview.js +333 -0
  37. package/dist/tools/irbReview.js.map +1 -0
  38. package/dist/tools/jcaPicoScope.d.ts +9 -0
  39. package/dist/tools/jcaPicoScope.d.ts.map +1 -1
  40. package/dist/tools/jcaPicoScope.js +19 -0
  41. package/dist/tools/jcaPicoScope.js.map +1 -1
  42. package/package.json +2 -2
@@ -69,4 +69,5 @@ export interface PrecedentMismatch {
69
69
  }
70
70
  export declare function detectMismatch(drug: string, indication: string, userSuppliedTaNumber: string | null | undefined): PrecedentMismatch | null;
71
71
  export declare function extractTaNumber(text: string): string | null;
72
+ export declare function extractAllTaNumbers(text: string): string[];
72
73
  //# sourceMappingURL=niceTaPrecedents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"niceTaPrecedents.d.ts","sourceRoot":"","sources":["../../src/data/niceTaPrecedents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC/B;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,aAAa,CAuEnD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,aAAa,EAAE,CAkBjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9C,iBAAiB,GAAG,IAAI,CAiC1B;AAQD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3D"}
1
+ {"version":3,"file":"niceTaPrecedents.d.ts","sourceRoot":"","sources":["../../src/data/niceTaPrecedents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC/B;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,aAAa,CAiGnD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,aAAa,EAAE,CA+BjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9C,iBAAiB,GAAG,IAAI,CAiC1B;AAYD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3D;AAQD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY1D"}
@@ -10,7 +10,11 @@ export const PRECEDENTS = [
10
10
  {
11
11
  ta_number: "TA679",
12
12
  drug: "dapagliflozin",
13
- indication_keywords: ["hfref", "heart failure with reduced ejection fraction", "reduced ejection fraction"],
13
+ indication_keywords: [
14
+ "hfref",
15
+ "heart failure with reduced ejection fraction",
16
+ "reduced ejection fraction",
17
+ ],
14
18
  title: "Dapagliflozin for treating chronic heart failure with reduced ejection fraction",
15
19
  date: "2021-02",
16
20
  url: "https://www.nice.org.uk/guidance/ta679",
@@ -20,7 +24,12 @@ export const PRECEDENTS = [
20
24
  {
21
25
  ta_number: "TA902",
22
26
  drug: "dapagliflozin",
23
- indication_keywords: ["hfpef", "hfmref", "preserved ejection fraction", "mildly reduced ejection fraction"],
27
+ indication_keywords: [
28
+ "hfpef",
29
+ "hfmref",
30
+ "preserved ejection fraction",
31
+ "mildly reduced ejection fraction",
32
+ ],
24
33
  title: "Dapagliflozin for treating chronic heart failure with preserved or mildly reduced ejection fraction",
25
34
  date: "2023-06",
26
35
  url: "https://www.nice.org.uk/guidance/ta902",
@@ -30,7 +39,10 @@ export const PRECEDENTS = [
30
39
  {
31
40
  ta_number: "TA773",
32
41
  drug: "empagliflozin",
33
- indication_keywords: ["hfref", "heart failure with reduced ejection fraction"],
42
+ indication_keywords: [
43
+ "hfref",
44
+ "heart failure with reduced ejection fraction",
45
+ ],
34
46
  title: "Empagliflozin for treating chronic heart failure with reduced ejection fraction",
35
47
  date: "2022-03",
36
48
  url: "https://www.nice.org.uk/guidance/ta773",
@@ -39,7 +51,12 @@ export const PRECEDENTS = [
39
51
  {
40
52
  ta_number: "TA929",
41
53
  drug: "empagliflozin",
42
- indication_keywords: ["hfpef", "hfmref", "preserved ejection fraction", "mildly reduced ejection fraction"],
54
+ indication_keywords: [
55
+ "hfpef",
56
+ "hfmref",
57
+ "preserved ejection fraction",
58
+ "mildly reduced ejection fraction",
59
+ ],
43
60
  title: "Empagliflozin for treating chronic heart failure with preserved or mildly reduced ejection fraction",
44
61
  date: "2023-09",
45
62
  url: "https://www.nice.org.uk/guidance/ta929",
@@ -69,7 +86,11 @@ export const PRECEDENTS = [
69
86
  {
70
87
  ta_number: "TA388",
71
88
  drug: "sacubitril valsartan",
72
- indication_keywords: ["heart failure", "hfref", "reduced ejection fraction"],
89
+ indication_keywords: [
90
+ "heart failure",
91
+ "hfref",
92
+ "reduced ejection fraction",
93
+ ],
73
94
  title: "Sacubitril valsartan for treating symptomatic chronic heart failure with reduced ejection fraction",
74
95
  date: "2016-04",
75
96
  url: "https://www.nice.org.uk/guidance/ta388",
@@ -91,8 +112,19 @@ export function findPrecedents(drug, indication) {
91
112
  const indicationLower = indication.toLowerCase().trim();
92
113
  if (!drugLower || !indicationLower)
93
114
  return [];
115
+ // Token-set drug match: split both sides on whitespace AND hyphen
116
+ // ("sacubitril-valsartan" ↔ "sacubitril valsartan"), then require the
117
+ // two token sets to be EQUAL. Prevents false positives like single-word
118
+ // "valsartan" (ARB) matching multi-word "sacubitril valsartan" (ARNI).
119
+ // Bare "valsartan" → set {valsartan} ≠ {sacubitril, valsartan} → no match.
120
+ // "sacubitril valsartan" → set {sacubitril, valsartan} = {sacubitril,
121
+ // valsartan} → match.
122
+ const tokenize = (s) => new Set(s.split(/[\s-]+/).filter(Boolean));
123
+ const drugTokens = tokenize(drugLower);
94
124
  const scored = PRECEDENTS.map((p) => {
95
- const drugMatch = drugLower.includes(p.drug) || p.drug.includes(drugLower);
125
+ const pTokens = tokenize(p.drug);
126
+ const drugMatch = drugTokens.size === pTokens.size &&
127
+ [...drugTokens].every((w) => pTokens.has(w));
96
128
  if (!drugMatch)
97
129
  return { p, score: 0 };
98
130
  const matchedKeywords = p.indication_keywords.filter((kw) => indicationLower.includes(kw));
@@ -143,10 +175,33 @@ export function detectMismatch(drug, indication, userSuppliedTaNumber) {
143
175
  * Extract a TA number (e.g. "TA902") from arbitrary prose. Returns
144
176
  * the first match or null. Used to scan e.g. evidence_summary for
145
177
  * a TA number the user may have referenced informally.
178
+ *
179
+ * Handles common prose variations: "TA679", "TA 679", "NICE TA 773",
180
+ * "TA679." (with trailing punctuation). Output is normalised to
181
+ * "TA<digits>" form (no internal whitespace).
146
182
  */
147
- const TA_NUMBER_REGEX = /\b(TA\d{2,4})\b/i;
183
+ const TA_NUMBER_REGEX = /\bTA\s*(\d{2,4})\b/i;
148
184
  export function extractTaNumber(text) {
149
185
  const m = text.match(TA_NUMBER_REGEX);
150
- return m ? m[1].toUpperCase() : null;
186
+ return m ? `TA${m[1]}` : null;
187
+ }
188
+ /**
189
+ * Extract ALL TA numbers from arbitrary prose (not just the first).
190
+ * Useful when an evidence summary references multiple appraisals
191
+ * (e.g. "Per TA902 for HFpEF and TA679 for HFrEF").
192
+ */
193
+ const TA_NUMBER_REGEX_GLOBAL = /\bTA\s*(\d{2,4})\b/gi;
194
+ export function extractAllTaNumbers(text) {
195
+ const matches = Array.from(text.matchAll(TA_NUMBER_REGEX_GLOBAL));
196
+ const seen = new Set();
197
+ const out = [];
198
+ for (const m of matches) {
199
+ const norm = `TA${m[1]}`;
200
+ if (!seen.has(norm)) {
201
+ seen.add(norm);
202
+ out.push(norm);
203
+ }
204
+ }
205
+ return out;
151
206
  }
152
207
  //# sourceMappingURL=niceTaPrecedents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"niceTaPrecedents.js","sourceRoot":"","sources":["../../src/data/niceTaPrecedents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"niceTaPrecedents.js","sourceRoot":"","sources":["../../src/data/niceTaPrecedents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Cover-letter template for irb_review.
3
+ *
4
+ * Returns a single paragraph string (~200 words) ready to paste into an IRB /
5
+ * EC submission portal. Includes drug, indication, review tier, COI status,
6
+ * data-handling approach, and SAE framework. Customer pastes and edits in
7
+ * place — we don't try to produce a finished submission, only the structural
8
+ * scaffold so the human knows what sections must be present.
9
+ */
10
+ import type { CoiFramework, IrbReviewInput, ReviewTierEu, ReviewTierUs, SaeFramework } from "./types.js";
11
+ export declare function buildCoverLetter(args: {
12
+ input: IrbReviewInput;
13
+ reviewTierUs: ReviewTierUs | null;
14
+ reviewTierEu: ReviewTierEu | null;
15
+ saeFramework: SaeFramework;
16
+ coiFramework: CoiFramework;
17
+ coiRequired: boolean;
18
+ }): string;
19
+ //# sourceMappingURL=coverLetters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverLetters.d.ts","sourceRoot":"","sources":["../../src/irb/coverLetters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAmCpB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,cAAc,CAAC;IACtB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,MAAM,CAwCT"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Cover-letter template for irb_review.
3
+ *
4
+ * Returns a single paragraph string (~200 words) ready to paste into an IRB /
5
+ * EC submission portal. Includes drug, indication, review tier, COI status,
6
+ * data-handling approach, and SAE framework. Customer pastes and edits in
7
+ * place — we don't try to produce a finished submission, only the structural
8
+ * scaffold so the human knows what sections must be present.
9
+ */
10
+ const TIER_LABEL_US = {
11
+ exempt: "Exempt determination under 45 CFR 46.104",
12
+ expedited: "Expedited review under 45 CFR 46.110",
13
+ full_board: "Full Board review under 45 CFR 46.108",
14
+ not_applicable: "(US IRB tier not applicable)",
15
+ };
16
+ const TIER_LABEL_EU = {
17
+ national_only: "National-level Ethics Committee review",
18
+ ctr_multi_state: "Coordinated Multi-State EC Review under EU Regulation 536/2014 (CTR)",
19
+ non_interventional_only: "EC review under national non-interventional study framework (CTR 536/2014 not applicable)",
20
+ };
21
+ const SAE_LABEL = {
22
+ ctr_536_2014: "EU CTR 536/2014 Annex III SUSAR / SAE timelines",
23
+ fda_ind_safety: "FDA IND Safety Reporting (21 CFR 312.32)",
24
+ post_marketing_psur: "Periodic Safety Update Reports (PSUR) and EudraVigilance ICSRs",
25
+ none: "No SAE-reporting framework (study design not subject to expedited safety reporting)",
26
+ };
27
+ const COI_LABEL = {
28
+ phs_42_cfr_50: "PHS 42 CFR 50 Subpart F (Promoting Objectivity in Research)",
29
+ eu_ctr_article_14: "EU CTR 536/2014 Article 14 (transparency and conflict-of-interest disclosure)",
30
+ both: "PHS 42 CFR 50 Subpart F (US) and EU CTR 536/2014 Article 14 (EU)",
31
+ none: "No conflict-of-interest framework triggered (non-industry funding)",
32
+ };
33
+ export function buildCoverLetter(args) {
34
+ const { input, reviewTierUs, reviewTierEu, saeFramework, coiFramework } = args;
35
+ const tierUs = reviewTierUs ? TIER_LABEL_US[reviewTierUs] : null;
36
+ const tierEu = reviewTierEu ? TIER_LABEL_EU[reviewTierEu] : null;
37
+ const tiers = [tierUs, tierEu].filter(Boolean).join(" + ");
38
+ const saeText = SAE_LABEL[saeFramework];
39
+ const coiText = COI_LABEL[coiFramework];
40
+ const populationCaveats = [];
41
+ if (input.population_includes_pediatric)
42
+ populationCaveats.push("paediatric subjects (45 CFR 46 Subpart D)");
43
+ if (input.population_includes_pregnant)
44
+ populationCaveats.push("pregnant subjects (45 CFR 46 Subpart B)");
45
+ if (input.population_includes_prisoners)
46
+ populationCaveats.push("incarcerated subjects (45 CFR 46 Subpart C)");
47
+ if (input.population_includes_decisionally_impaired)
48
+ populationCaveats.push("subjects with diminished decision-making capacity");
49
+ const populationLine = populationCaveats.length > 0
50
+ ? `The study population includes ${populationCaveats.join(", ")}, and the protocol incorporates the additional safeguards required for these vulnerable groups. `
51
+ : "";
52
+ return [
53
+ `Dear Members of the Institutional Review Board / Ethics Committee,`,
54
+ ``,
55
+ `We are submitting the attached protocol and supporting materials for your review of a planned study of ${input.intervention} in ${input.indication}. The study is designed as a ${input.study_design.replace(/_/g, " ")}, and the requested review pathway is: ${tiers || "(jurisdiction-specific tiers not established)"}.`,
56
+ ``,
57
+ `Risk classification: ${input.risk_level}. The data-handling approach is "${input.data_handling}" — the Data Management Plan section of this submission details the de-identification and cross-border transfer obligations as applicable. ${populationLine}Safety monitoring will follow ${saeText}, with the SAE / SUSAR reporting timelines tabulated in the protocol.`,
58
+ ``,
59
+ `Conflict-of-interest disclosures: this study is funded by ${input.funding_source}. The applicable framework is ${coiText}, and individual investigator disclosures are filed with this submission. ${input.multi_site ? "This is a multi-site study, and coordination across sites follows the lead site's framework with local-site ethics oversight where required. " : ""}`,
60
+ ``,
61
+ `We confirm that the protocol, ICF, and supporting documents have undergone scientific review and are ready for ethics review. We are available to address any questions or to revise the submission per Committee feedback. Thank you for your consideration.`,
62
+ ``,
63
+ `Sincerely,`,
64
+ `[Principal Investigator]`,
65
+ `[Institution]`,
66
+ `[Date]`,
67
+ ].join("\n");
68
+ }
69
+ //# sourceMappingURL=coverLetters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverLetters.js","sourceRoot":"","sources":["../../src/irb/coverLetters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,aAAa,GAAiC;IAClD,MAAM,EAAE,0CAA0C;IAClD,SAAS,EAAE,sCAAsC;IACjD,UAAU,EAAE,uCAAuC;IACnD,cAAc,EAAE,8BAA8B;CAC/C,CAAC;AAEF,MAAM,aAAa,GAAiC;IAClD,aAAa,EAAE,wCAAwC;IACvD,eAAe,EACb,sEAAsE;IACxE,uBAAuB,EACrB,2FAA2F;CAC9F,CAAC;AAEF,MAAM,SAAS,GAAiC;IAC9C,YAAY,EAAE,iDAAiD;IAC/D,cAAc,EAAE,0CAA0C;IAC1D,mBAAmB,EACjB,gEAAgE;IAClE,IAAI,EAAE,qFAAqF;CAC5F,CAAC;AAEF,MAAM,SAAS,GAAiC;IAC9C,aAAa,EACX,6DAA6D;IAC/D,iBAAiB,EACf,+EAA+E;IACjF,IAAI,EACF,kEAAkE;IACpE,IAAI,EAAE,oEAAoE;CAC3E,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,IAOhC;IACC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GACrE,IAAI,CAAC;IAEP,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IAExC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,6BAA6B;QACrC,iBAAiB,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACtE,IAAI,KAAK,CAAC,4BAA4B;QACpC,iBAAiB,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACpE,IAAI,KAAK,CAAC,6BAA6B;QACrC,iBAAiB,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,yCAAyC;QACjD,iBAAiB,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAC9E,MAAM,cAAc,GAClB,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAC1B,CAAC,CAAC,iCAAiC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,kGAAkG;QACjK,CAAC,CAAC,EAAE,CAAC;IAET,OAAO;QACL,oEAAoE;QACpE,EAAE;QACF,0GAA0G,KAAK,CAAC,YAAY,OAAO,KAAK,CAAC,UAAU,gCAAgC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,0CAA0C,KAAK,IAAI,+CAA+C,GAAG;QAC7T,EAAE;QACF,wBAAwB,KAAK,CAAC,UAAU,oCAAoC,KAAK,CAAC,aAAa,8IAA8I,cAAc,iCAAiC,OAAO,uEAAuE;QAC1W,EAAE;QACF,6DAA6D,KAAK,CAAC,cAAc,iCAAiC,OAAO,6EAA6E,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,+IAA+I,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/W,EAAE;QACF,+PAA+P;QAC/P,EAAE;QACF,YAAY;QACZ,0BAA0B;QAC1B,eAAe;QACf,QAAQ;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type IrbAssessment, type IrbReviewInput } from "./types.js";
2
+ export declare function assessIrb(input: IrbReviewInput): IrbAssessment;
3
+ //# sourceMappingURL=decisionTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisionTree.d.ts","sourceRoot":"","sources":["../../src/irb/decisionTree.ts"],"names":[],"mappings":"AAuBA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,cAAc,EAKpB,MAAM,YAAY,CAAC;AA4gBpB,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CA0E9D"}