heor-agent-mcp 0.2.0 → 0.7.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 (93) hide show
  1. package/README.md +44 -0
  2. package/dist/formatters/comparisonMarkdown.d.ts +3 -0
  3. package/dist/formatters/comparisonMarkdown.d.ts.map +1 -0
  4. package/dist/formatters/comparisonMarkdown.js +68 -0
  5. package/dist/formatters/comparisonMarkdown.js.map +1 -0
  6. package/dist/models/evppi.d.ts +33 -0
  7. package/dist/models/evppi.d.ts.map +1 -0
  8. package/dist/models/evppi.js +75 -0
  9. package/dist/models/evppi.js.map +1 -0
  10. package/dist/models/modelUtils.d.ts +7 -2
  11. package/dist/models/modelUtils.d.ts.map +1 -1
  12. package/dist/models/modelUtils.js +49 -31
  13. package/dist/models/modelUtils.js.map +1 -1
  14. package/dist/models/psa.d.ts +4 -0
  15. package/dist/models/psa.d.ts.map +1 -1
  16. package/dist/models/psa.js +29 -2
  17. package/dist/models/psa.js.map +1 -1
  18. package/dist/models/survivalFitting.d.ts +47 -0
  19. package/dist/models/survivalFitting.d.ts.map +1 -0
  20. package/dist/models/survivalFitting.js +342 -0
  21. package/dist/models/survivalFitting.js.map +1 -0
  22. package/dist/network/bucher.d.ts +29 -0
  23. package/dist/network/bucher.d.ts.map +1 -0
  24. package/dist/network/bucher.js +125 -0
  25. package/dist/network/bucher.js.map +1 -0
  26. package/dist/network/frequentistNma.d.ts +12 -0
  27. package/dist/network/frequentistNma.d.ts.map +1 -0
  28. package/dist/network/frequentistNma.js +230 -0
  29. package/dist/network/frequentistNma.js.map +1 -0
  30. package/dist/network/index.d.ts +4 -1
  31. package/dist/network/index.d.ts.map +1 -1
  32. package/dist/network/index.js +3 -0
  33. package/dist/network/index.js.map +1 -1
  34. package/dist/network/pathfinder.d.ts +14 -0
  35. package/dist/network/pathfinder.d.ts.map +1 -0
  36. package/dist/network/pathfinder.js +93 -0
  37. package/dist/network/pathfinder.js.map +1 -0
  38. package/dist/network/types.d.ts +45 -0
  39. package/dist/network/types.d.ts.map +1 -1
  40. package/dist/providers/direct/index.d.ts.map +1 -1
  41. package/dist/providers/direct/index.js +82 -27
  42. package/dist/providers/direct/index.js.map +1 -1
  43. package/dist/providers/direct/iqwig.js +1 -1
  44. package/dist/providers/direct/iqwig.js.map +1 -1
  45. package/dist/providers/direct/niceTa.d.ts +4 -0
  46. package/dist/providers/direct/niceTa.d.ts.map +1 -1
  47. package/dist/providers/direct/niceTa.js +76 -25
  48. package/dist/providers/direct/niceTa.js.map +1 -1
  49. package/dist/providers/direct/tlv.js +1 -1
  50. package/dist/providers/direct/tlv.js.map +1 -1
  51. package/dist/providers/types.d.ts +6 -0
  52. package/dist/providers/types.d.ts.map +1 -1
  53. package/dist/server.js +89 -9
  54. package/dist/server.js.map +1 -1
  55. package/dist/tools/budgetImpactModel.d.ts +116 -0
  56. package/dist/tools/budgetImpactModel.d.ts.map +1 -0
  57. package/dist/tools/budgetImpactModel.js +257 -0
  58. package/dist/tools/budgetImpactModel.js.map +1 -0
  59. package/dist/tools/costEffectivenessModel.d.ts +18 -0
  60. package/dist/tools/costEffectivenessModel.d.ts.map +1 -1
  61. package/dist/tools/costEffectivenessModel.js +155 -27
  62. package/dist/tools/costEffectivenessModel.js.map +1 -1
  63. package/dist/tools/htaDossierPrep.d.ts.map +1 -1
  64. package/dist/tools/htaDossierPrep.js +119 -0
  65. package/dist/tools/htaDossierPrep.js.map +1 -1
  66. package/dist/tools/indirectComparison.d.ts +73 -0
  67. package/dist/tools/indirectComparison.d.ts.map +1 -0
  68. package/dist/tools/indirectComparison.js +191 -0
  69. package/dist/tools/indirectComparison.js.map +1 -0
  70. package/dist/tools/knowledgeWrite.d.ts.map +1 -1
  71. package/dist/tools/knowledgeWrite.js +17 -3
  72. package/dist/tools/knowledgeWrite.js.map +1 -1
  73. package/dist/tools/literatureSearch.d.ts +4 -0
  74. package/dist/tools/literatureSearch.d.ts.map +1 -1
  75. package/dist/tools/literatureSearch.js +43 -1
  76. package/dist/tools/literatureSearch.js.map +1 -1
  77. package/dist/tools/populationAdjustedComparison.d.ts +145 -0
  78. package/dist/tools/populationAdjustedComparison.d.ts.map +1 -0
  79. package/dist/tools/populationAdjustedComparison.js +431 -0
  80. package/dist/tools/populationAdjustedComparison.js.map +1 -0
  81. package/dist/tools/screenAbstracts.d.ts +99 -0
  82. package/dist/tools/screenAbstracts.d.ts.map +1 -0
  83. package/dist/tools/screenAbstracts.js +442 -0
  84. package/dist/tools/screenAbstracts.js.map +1 -0
  85. package/dist/tools/survivalFitting.d.ts +56 -0
  86. package/dist/tools/survivalFitting.d.ts.map +1 -0
  87. package/dist/tools/survivalFitting.js +147 -0
  88. package/dist/tools/survivalFitting.js.map +1 -0
  89. package/dist/tools/validateLinks.d.ts +24 -0
  90. package/dist/tools/validateLinks.d.ts.map +1 -0
  91. package/dist/tools/validateLinks.js +171 -0
  92. package/dist/tools/validateLinks.js.map +1 -0
  93. package/package.json +4 -2
@@ -0,0 +1,56 @@
1
+ import type { ToolResult } from "../providers/types.js";
2
+ export declare function handleSurvivalFitting(rawParams: unknown): Promise<ToolResult>;
3
+ export declare const survivalFittingToolSchema: {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: string;
8
+ properties: {
9
+ km_data: {
10
+ type: string;
11
+ description: string;
12
+ items: {
13
+ type: string;
14
+ properties: {
15
+ time: {
16
+ type: string;
17
+ description: string;
18
+ };
19
+ survival: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ n_at_risk: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ n_events: {
28
+ type: string;
29
+ description: string;
30
+ };
31
+ };
32
+ required: string[];
33
+ };
34
+ };
35
+ time_unit: {
36
+ type: string;
37
+ enum: string[];
38
+ description: string;
39
+ };
40
+ endpoint: {
41
+ type: string;
42
+ description: string;
43
+ };
44
+ output_format: {
45
+ type: string;
46
+ enum: string[];
47
+ };
48
+ project: {
49
+ type: string;
50
+ description: string;
51
+ };
52
+ };
53
+ required: string[];
54
+ };
55
+ };
56
+ //# sourceMappingURL=survivalFitting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"survivalFitting.d.ts","sourceRoot":"","sources":["../../src/tools/survivalFitting.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA4GxD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CrC,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { z } from "zod";
2
+ import { createAuditRecord, addAssumption, setMethodology, } from "../audit/builder.js";
3
+ import { auditToMarkdown } from "../formatters/markdown.js";
4
+ import { fitSurvivalCurves, } from "../models/survivalFitting.js";
5
+ const SurvivalFittingSchema = z.object({
6
+ km_data: z
7
+ .array(z.object({
8
+ time: z.number().nonnegative(),
9
+ survival: z.number().min(0).max(1),
10
+ n_at_risk: z.number().int().positive().optional(),
11
+ n_events: z.number().int().nonnegative().optional(),
12
+ }))
13
+ .min(3, "At least 3 KM data points required"),
14
+ time_unit: z.enum(["months", "years"]).default("months"),
15
+ endpoint: z.string().default("OS"),
16
+ output_format: z.enum(["text", "json"]).optional(),
17
+ project: z.string().optional(),
18
+ });
19
+ function formatResult(result, endpoint) {
20
+ const unit = result.time_unit;
21
+ const lines = [
22
+ `## Survival Curve Fitting: ${endpoint}`,
23
+ ``,
24
+ `### Model Comparison`,
25
+ `| Distribution | AIC | BIC | Log-L | Median (${unit}) | Parameters |`,
26
+ `|-------------|-----|-----|-------|--------|------------|`,
27
+ ];
28
+ for (const fit of result.fits) {
29
+ const paramStr = Object.entries(fit.params)
30
+ .map(([k, v]) => `${k}=${v.toFixed(4)}`)
31
+ .join(", ");
32
+ const isBestAIC = fit.name === result.best_aic.name;
33
+ const isBestBIC = fit.name === result.best_bic.name;
34
+ const badge = isBestAIC && isBestBIC
35
+ ? " **[Best]**"
36
+ : isBestAIC
37
+ ? " *[Best AIC]*"
38
+ : isBestBIC
39
+ ? " *[Best BIC]*"
40
+ : "";
41
+ lines.push(`| ${fit.name}${badge} | ${fit.aic.toFixed(1)} | ${fit.bic.toFixed(1)} | ${fit.log_likelihood.toFixed(1)} | ${fit.median_survival.toFixed(1)} | ${paramStr} |`);
42
+ }
43
+ lines.push(``);
44
+ lines.push(`### Recommended Model`);
45
+ lines.push(`**${result.best_aic.name}** (AIC: ${result.best_aic.aic.toFixed(1)}) — median ${endpoint}: ${result.best_aic.median_survival.toFixed(1)} ${unit}`);
46
+ if (result.best_aic.name !== result.best_bic.name) {
47
+ lines.push(`Note: BIC prefers **${result.best_bic.name}** — consider clinical plausibility when AIC/BIC disagree.`);
48
+ }
49
+ lines.push(``);
50
+ lines.push(`### Extrapolation Table`);
51
+ lines.push(`| Time (${unit}) | KM Observed | Exponential | Weibull | Log-logistic | Log-normal | Gompertz |`);
52
+ lines.push(`|------|------------|-------------|---------|-------------|------------|----------|`);
53
+ for (const row of result.extrapolations) {
54
+ const km = row.km_observed !== undefined ? row.km_observed.toFixed(3) : "—";
55
+ lines.push(`| ${row.time.toFixed(1)} | ${km} | ${row.exponential.toFixed(3)} | ${row.weibull.toFixed(3)} | ${row.log_logistic.toFixed(3)} | ${row.log_normal.toFixed(3)} | ${row.gompertz.toFixed(3)} |`);
56
+ }
57
+ lines.push(``);
58
+ lines.push(`### Clinical Plausibility Check`);
59
+ lines.push(`Per NICE DSU TSD 14, statistical fit (AIC/BIC) should be considered alongside:`);
60
+ lines.push(`1. **Visual fit** to the KM curve`);
61
+ lines.push(`2. **Clinical plausibility** of the long-term extrapolation`);
62
+ lines.push(`3. **External data** (registry data, natural history studies)`);
63
+ lines.push(`4. **Hazard function shape** — does it match expected disease trajectory?`);
64
+ lines.push(``);
65
+ const bestFit = result.best_aic;
66
+ if (bestFit.name === "log_logistic" || bestFit.name === "log_normal") {
67
+ lines.push(`> **Note:** ${bestFit.name} has a long tail — extrapolated survival may be optimistic for long time horizons. Compare against Gompertz/Weibull for conservative estimates.`);
68
+ }
69
+ return lines.join("\n");
70
+ }
71
+ export async function handleSurvivalFitting(rawParams) {
72
+ const params = SurvivalFittingSchema.parse(rawParams);
73
+ const outputFormat = params.output_format ?? "text";
74
+ let audit = createAuditRecord("survival_fitting", params, outputFormat);
75
+ audit = setMethodology(audit, "Parametric survival curve fitting per NICE DSU TSD 14 (Latimer 2013). MLE via Nelder-Mead. Model selection via AIC/BIC.");
76
+ audit = addAssumption(audit, `${params.km_data.length} KM data points provided`);
77
+ audit = addAssumption(audit, `Endpoint: ${params.endpoint}, time unit: ${params.time_unit}`);
78
+ audit = addAssumption(audit, `Distributions fitted: Exponential, Weibull, Log-logistic, Log-normal, Gompertz`);
79
+ const result = fitSurvivalCurves(params.km_data, params.time_unit);
80
+ if (outputFormat === "json") {
81
+ return {
82
+ content: {
83
+ fits: result.fits.map((f) => ({
84
+ name: f.name,
85
+ params: f.params,
86
+ aic: f.aic,
87
+ bic: f.bic,
88
+ log_likelihood: f.log_likelihood,
89
+ median_survival: f.median_survival,
90
+ mean_survival_restricted: f.mean_survival_restricted,
91
+ })),
92
+ best_aic: result.best_aic.name,
93
+ best_bic: result.best_bic.name,
94
+ extrapolations: result.extrapolations,
95
+ time_unit: result.time_unit,
96
+ },
97
+ audit,
98
+ };
99
+ }
100
+ const text = formatResult(result, params.endpoint) + "\n" + auditToMarkdown(audit);
101
+ return { content: text, audit };
102
+ }
103
+ export const survivalFittingToolSchema = {
104
+ name: "survival_fitting",
105
+ description: "Fit parametric survival distributions (Exponential, Weibull, Log-logistic, Log-normal, Gompertz) to Kaplan-Meier data. Returns AIC/BIC model comparison, parameter estimates, median survival, and extrapolation table. Follows NICE DSU TSD 14 guidance. Use to select the best-fitting distribution for PartSA models.",
106
+ inputSchema: {
107
+ type: "object",
108
+ properties: {
109
+ km_data: {
110
+ type: "array",
111
+ description: "Kaplan-Meier data points. At least 3 required. Extract from published KM curves or trial reports.",
112
+ items: {
113
+ type: "object",
114
+ properties: {
115
+ time: { type: "number", description: "Time point" },
116
+ survival: {
117
+ type: "number",
118
+ description: "Survival proportion (0-1)",
119
+ },
120
+ n_at_risk: {
121
+ type: "number",
122
+ description: "Number at risk (optional, improves fit)",
123
+ },
124
+ n_events: {
125
+ type: "number",
126
+ description: "Events in interval (optional)",
127
+ },
128
+ },
129
+ required: ["time", "survival"],
130
+ },
131
+ },
132
+ time_unit: {
133
+ type: "string",
134
+ enum: ["months", "years"],
135
+ description: "Time unit for KM data (default: months)",
136
+ },
137
+ endpoint: {
138
+ type: "string",
139
+ description: "Endpoint name (e.g., 'OS', 'PFS', 'DFS'). Default: 'OS'.",
140
+ },
141
+ output_format: { type: "string", enum: ["text", "json"] },
142
+ project: { type: "string", description: "Project ID for persistence" },
143
+ },
144
+ required: ["km_data"],
145
+ },
146
+ };
147
+ //# sourceMappingURL=survivalFitting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"survivalFitting.js","sourceRoot":"","sources":["../../src/tools/survivalFitting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ToolResult } from "../providers/types.js";
2
+ export declare function handleValidateLinks(rawParams: unknown): Promise<ToolResult>;
3
+ export declare const validateLinksToolSchema: {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: {
7
+ type: string;
8
+ properties: {
9
+ urls: {
10
+ type: string;
11
+ items: {
12
+ type: string;
13
+ };
14
+ description: string;
15
+ };
16
+ timeout_ms: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ };
21
+ required: string[];
22
+ };
23
+ };
24
+ //# sourceMappingURL=validateLinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateLinks.d.ts","sourceRoot":"","sources":["../../src/tools/validateLinks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA6HxD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,UAAU,CAAC,CAuErB;AAED,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;CAmBnC,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { z } from "zod";
2
+ import { createAuditRecord, addAssumption, setMethodology, } from "../audit/builder.js";
3
+ /**
4
+ * Validate Links Tool
5
+ *
6
+ * Checks whether URLs return 200 OK, 404, or other status codes.
7
+ * Validates links BEFORE presenting them to users so we never
8
+ * mislead with broken references.
9
+ *
10
+ * Handles sites that block automated requests (return 403):
11
+ * - CADTH, HAS, and some others block bots but work in browsers
12
+ * - These are marked "browser_only" instead of "broken"
13
+ */
14
+ const ValidateLinksSchema = z.object({
15
+ urls: z
16
+ .array(z.string().url())
17
+ .min(1)
18
+ .max(50)
19
+ .describe("URLs to validate"),
20
+ timeout_ms: z
21
+ .number()
22
+ .int()
23
+ .min(1000)
24
+ .max(30000)
25
+ .default(10000)
26
+ .optional(),
27
+ });
28
+ // Domains known to block bots but work in browsers
29
+ const BROWSER_ONLY_DOMAINS = [
30
+ "cda-amc.ca",
31
+ "cadth.ca",
32
+ "has-sante.fr",
33
+ "pbs.gov.au",
34
+ "cochranelibrary.com",
35
+ ];
36
+ function categorize(url, status) {
37
+ if (status >= 200 && status < 400)
38
+ return "working";
39
+ if (status === 403) {
40
+ const host = new URL(url).hostname;
41
+ if (BROWSER_ONLY_DOMAINS.some((d) => host.includes(d))) {
42
+ return "browser_only";
43
+ }
44
+ return "broken";
45
+ }
46
+ if (status === 404 || status === 410)
47
+ return "broken";
48
+ if (status === 429)
49
+ return "broken"; // rate limited
50
+ if (status === 0)
51
+ return "timeout";
52
+ return "error";
53
+ }
54
+ async function checkUrl(url, timeoutMs) {
55
+ try {
56
+ const res = await fetch(url, {
57
+ method: "HEAD",
58
+ redirect: "follow",
59
+ signal: AbortSignal.timeout(timeoutMs),
60
+ headers: {
61
+ "User-Agent": "Mozilla/5.0 (HEORAgent Link Validator) AppleWebKit/537.36",
62
+ },
63
+ });
64
+ // Some servers reject HEAD — fall back to GET
65
+ if (res.status === 405 || res.status === 501) {
66
+ const getRes = await fetch(url, {
67
+ method: "GET",
68
+ redirect: "follow",
69
+ signal: AbortSignal.timeout(timeoutMs),
70
+ headers: {
71
+ "User-Agent": "Mozilla/5.0 (HEORAgent Link Validator) AppleWebKit/537.36",
72
+ },
73
+ });
74
+ return {
75
+ url,
76
+ status_code: getRes.status,
77
+ ok: getRes.ok,
78
+ category: categorize(url, getRes.status),
79
+ message: getRes.statusText || "",
80
+ final_url: getRes.url !== url ? getRes.url : undefined,
81
+ };
82
+ }
83
+ return {
84
+ url,
85
+ status_code: res.status,
86
+ ok: res.ok,
87
+ category: categorize(url, res.status),
88
+ message: res.statusText || "",
89
+ final_url: res.url !== url ? res.url : undefined,
90
+ };
91
+ }
92
+ catch (err) {
93
+ const msg = err instanceof Error ? err.message : String(err);
94
+ return {
95
+ url,
96
+ status_code: 0,
97
+ ok: false,
98
+ category: msg.includes("abort") || msg.includes("timeout")
99
+ ? "timeout"
100
+ : "error",
101
+ message: msg,
102
+ };
103
+ }
104
+ }
105
+ export async function handleValidateLinks(rawParams) {
106
+ const params = ValidateLinksSchema.parse(rawParams);
107
+ const timeoutMs = params.timeout_ms ?? 10000;
108
+ let audit = createAuditRecord("validate_links", { n_urls: params.urls.length }, "text");
109
+ audit = setMethodology(audit, "HTTP HEAD request with redirect follow");
110
+ audit = addAssumption(audit, `Timeout: ${timeoutMs}ms per URL. Sites blocking bots (403) marked "browser_only".`);
111
+ // Validate all URLs in parallel
112
+ const results = await Promise.all(params.urls.map((url) => checkUrl(url, timeoutMs)));
113
+ const working = results.filter((r) => r.category === "working").length;
114
+ const browserOnly = results.filter((r) => r.category === "browser_only").length;
115
+ const broken = results.filter((r) => r.category === "broken" || r.category === "timeout" || r.category === "error").length;
116
+ const lines = [
117
+ `## Link Validation Report`,
118
+ ``,
119
+ `**Summary:** ${working} working | ${browserOnly} browser-only (403 to bots, works in browser) | ${broken} broken`,
120
+ ``,
121
+ `| URL | Status | Category | Notes |`,
122
+ `|-----|--------|----------|-------|`,
123
+ ];
124
+ for (const r of results) {
125
+ const icon = r.category === "working"
126
+ ? "OK"
127
+ : r.category === "browser_only"
128
+ ? "Browser"
129
+ : "BROKEN";
130
+ const shortUrl = r.url.length > 60 ? r.url.slice(0, 57) + "..." : r.url;
131
+ const note = r.final_url
132
+ ? `Redirected to ${r.final_url}`
133
+ : r.message || "";
134
+ lines.push(`| ${shortUrl} | ${r.status_code || "—"} | ${icon} | ${note} |`);
135
+ }
136
+ lines.push(``);
137
+ if (broken > 0) {
138
+ lines.push(`> **WARNING:** ${broken} link(s) are broken. Do NOT present these to the user. Replace with working alternatives or omit.`);
139
+ }
140
+ if (browserOnly > 0) {
141
+ lines.push(`> **Note:** ${browserOnly} link(s) return 403 to automated requests but work in browsers. These are safe to present.`);
142
+ }
143
+ return {
144
+ content: {
145
+ summary: { total: results.length, working, browser_only: browserOnly, broken },
146
+ results,
147
+ text: lines.join("\n"),
148
+ },
149
+ audit,
150
+ };
151
+ }
152
+ export const validateLinksToolSchema = {
153
+ name: "validate_links",
154
+ description: "Validate URLs by making HEAD requests and checking HTTP status codes. Returns categorization: working (200), browser_only (403 from bot-blocking sites that work in browsers), broken (404/410), or timeout/error. ALWAYS use this before presenting reference links to users — broken links destroy trust. Pass all URLs you plan to cite.",
155
+ inputSchema: {
156
+ type: "object",
157
+ properties: {
158
+ urls: {
159
+ type: "array",
160
+ items: { type: "string" },
161
+ description: "List of URLs to validate (max 50)",
162
+ },
163
+ timeout_ms: {
164
+ type: "number",
165
+ description: "Timeout per URL in ms (default 10000, max 30000)",
166
+ },
167
+ },
168
+ required: ["urls"],
169
+ },
170
+ };
171
+ //# sourceMappingURL=validateLinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateLinks.js","sourceRoot":"","sources":["../../src/tools/validateLinks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heor-agent-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.7.0",
4
4
  "license": "MIT",
5
5
  "author": "mnaumov",
6
6
  "engines": {
@@ -49,6 +49,7 @@
49
49
  "url": "https://github.com/neptun2000/HEORAgent/issues"
50
50
  },
51
51
  "scripts": {
52
+ "start": "node dist/server.js",
52
53
  "build": "tsc",
53
54
  "dev": "tsx src/server.ts",
54
55
  "test": "jest",
@@ -60,6 +61,7 @@
60
61
  "docx": "^9.6.1",
61
62
  "express": "^5.2.1",
62
63
  "posthog-node": "^5.29.2",
64
+ "typescript": "^5.9.3",
63
65
  "zod": "^3.22.4"
64
66
  },
65
67
  "devDependencies": {
@@ -69,6 +71,6 @@
69
71
  "jest": "^29.7.0",
70
72
  "ts-jest": "^29.1.1",
71
73
  "tsx": "^4.7.0",
72
- "typescript": "^5.3.3"
74
+ "typescript": "^5.9.3"
73
75
  }
74
76
  }