@vantagestack/mcp-server 0.1.52 → 0.1.59

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 (103) hide show
  1. package/package.json +1 -1
  2. package/dist/client.d.ts +0 -25
  3. package/dist/client.js +0 -172
  4. package/dist/client.js.map +0 -1
  5. package/dist/index.d.ts +0 -2
  6. package/dist/index.js +0 -1185
  7. package/dist/index.js.map +0 -1
  8. package/dist/tools/account-deletion.d.ts +0 -6
  9. package/dist/tools/account-deletion.js +0 -92
  10. package/dist/tools/account-deletion.js.map +0 -1
  11. package/dist/tools/account-health.d.ts +0 -21
  12. package/dist/tools/account-health.js +0 -84
  13. package/dist/tools/account-health.js.map +0 -1
  14. package/dist/tools/account.d.ts +0 -19
  15. package/dist/tools/account.js +0 -291
  16. package/dist/tools/account.js.map +0 -1
  17. package/dist/tools/account.test.d.ts +0 -1
  18. package/dist/tools/account.test.js +0 -213
  19. package/dist/tools/account.test.js.map +0 -1
  20. package/dist/tools/calendar.d.ts +0 -4
  21. package/dist/tools/calendar.js +0 -85
  22. package/dist/tools/calendar.js.map +0 -1
  23. package/dist/tools/calendar.test.d.ts +0 -1
  24. package/dist/tools/calendar.test.js +0 -62
  25. package/dist/tools/calendar.test.js.map +0 -1
  26. package/dist/tools/canary.d.ts +0 -4
  27. package/dist/tools/canary.js +0 -25
  28. package/dist/tools/canary.js.map +0 -1
  29. package/dist/tools/canary.test.d.ts +0 -1
  30. package/dist/tools/canary.test.js +0 -46
  31. package/dist/tools/canary.test.js.map +0 -1
  32. package/dist/tools/contract-configs.d.ts +0 -9
  33. package/dist/tools/contract-configs.js +0 -187
  34. package/dist/tools/contract-configs.js.map +0 -1
  35. package/dist/tools/contract-configs.test.d.ts +0 -1
  36. package/dist/tools/contract-configs.test.js +0 -245
  37. package/dist/tools/contract-configs.test.js.map +0 -1
  38. package/dist/tools/copier.d.ts +0 -11
  39. package/dist/tools/copier.js +0 -52
  40. package/dist/tools/copier.js.map +0 -1
  41. package/dist/tools/copier.test.d.ts +0 -1
  42. package/dist/tools/copier.test.js +0 -75
  43. package/dist/tools/copier.test.js.map +0 -1
  44. package/dist/tools/groups.d.ts +0 -14
  45. package/dist/tools/groups.js +0 -44
  46. package/dist/tools/groups.js.map +0 -1
  47. package/dist/tools/groups.test.d.ts +0 -1
  48. package/dist/tools/groups.test.js +0 -72
  49. package/dist/tools/groups.test.js.map +0 -1
  50. package/dist/tools/ip-allowlist.d.ts +0 -6
  51. package/dist/tools/ip-allowlist.js +0 -69
  52. package/dist/tools/ip-allowlist.js.map +0 -1
  53. package/dist/tools/journal.d.ts +0 -6
  54. package/dist/tools/journal.js +0 -110
  55. package/dist/tools/journal.js.map +0 -1
  56. package/dist/tools/journal.test.d.ts +0 -1
  57. package/dist/tools/journal.test.js +0 -100
  58. package/dist/tools/journal.test.js.map +0 -1
  59. package/dist/tools/latency.d.ts +0 -3
  60. package/dist/tools/latency.js +0 -54
  61. package/dist/tools/latency.js.map +0 -1
  62. package/dist/tools/market-hours.d.ts +0 -3
  63. package/dist/tools/market-hours.js +0 -19
  64. package/dist/tools/market-hours.js.map +0 -1
  65. package/dist/tools/ping.d.ts +0 -8
  66. package/dist/tools/ping.js +0 -22
  67. package/dist/tools/ping.js.map +0 -1
  68. package/dist/tools/ping.test.d.ts +0 -1
  69. package/dist/tools/ping.test.js +0 -25
  70. package/dist/tools/ping.test.js.map +0 -1
  71. package/dist/tools/qc.d.ts +0 -18
  72. package/dist/tools/qc.js +0 -415
  73. package/dist/tools/qc.js.map +0 -1
  74. package/dist/tools/qc.test.d.ts +0 -1
  75. package/dist/tools/qc.test.js +0 -218
  76. package/dist/tools/qc.test.js.map +0 -1
  77. package/dist/tools/read.d.ts +0 -7
  78. package/dist/tools/read.js +0 -154
  79. package/dist/tools/read.js.map +0 -1
  80. package/dist/tools/read.test.d.ts +0 -1
  81. package/dist/tools/read.test.js +0 -102
  82. package/dist/tools/read.test.js.map +0 -1
  83. package/dist/tools/risk.d.ts +0 -7
  84. package/dist/tools/risk.js +0 -108
  85. package/dist/tools/risk.js.map +0 -1
  86. package/dist/tools/signal-templates.d.ts +0 -6
  87. package/dist/tools/signal-templates.js +0 -90
  88. package/dist/tools/signal-templates.js.map +0 -1
  89. package/dist/tools/signals.d.ts +0 -8
  90. package/dist/tools/signals.js +0 -318
  91. package/dist/tools/signals.js.map +0 -1
  92. package/dist/tools/signals.test.d.ts +0 -1
  93. package/dist/tools/signals.test.js +0 -92
  94. package/dist/tools/signals.test.js.map +0 -1
  95. package/dist/tools/sync-accounts.d.ts +0 -18
  96. package/dist/tools/sync-accounts.js +0 -68
  97. package/dist/tools/sync-accounts.js.map +0 -1
  98. package/dist/tools/trade.d.ts +0 -3
  99. package/dist/tools/trade.js +0 -49
  100. package/dist/tools/trade.js.map +0 -1
  101. package/dist/user.d.ts +0 -19
  102. package/dist/user.js +0 -21
  103. package/dist/user.js.map +0 -1
@@ -1 +0,0 @@
1
- export {};
@@ -1,213 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { getBalance, getPositions, getOrderHistory, getBrokerOrderHistory, getMarketPrice, getAlerts, ackAlert, getSignalBrokerLogs, } from "./account.js";
3
- const makeClient = (overrides = {}) => ({
4
- get: overrides.get ?? (() => Promise.resolve([])),
5
- post: overrides.post ?? (() => Promise.resolve({})),
6
- getWebhook: overrides.getWebhook ?? (() => Promise.resolve({})),
7
- });
8
- const makeResolver = (userId = 1) => ({ resolve: async () => userId });
9
- // ─── getBalance ────────────────────────────────────────────────────────────
10
- describe("getBalance", () => {
11
- const BALANCE = {
12
- accounts: [
13
- { accountSpec: "DEMO4424965", cashBalance: 50000, openPnl: 250.5, marginUsed: 1200, totalEquity: 50250.5 },
14
- ],
15
- };
16
- it("returns per-account summary", async () => {
17
- const result = await getBalance(makeClient({ get: () => Promise.resolve(BALANCE) }), makeResolver(), {});
18
- expect(result.isError).toBeUndefined();
19
- expect(result.content[0].text).toContain("DEMO4424965");
20
- expect(result.content[0].text).toContain("50000.00");
21
- expect(result.content[0].text).toContain("+250.50");
22
- });
23
- it("returns empty message when no accounts", async () => {
24
- const result = await getBalance(makeClient({ get: () => Promise.resolve({ accounts: [] }) }), makeResolver(), {});
25
- expect(result.content[0].text).toContain("No account balance");
26
- });
27
- it("returns isError on API failure", async () => {
28
- const result = await getBalance(makeClient({ get: () => Promise.reject(new Error("500")) }), makeResolver(), {});
29
- expect(result.isError).toBe(true);
30
- });
31
- });
32
- // ─── getPositions ──────────────────────────────────────────────────────────
33
- describe("getPositions", () => {
34
- const POSITIONS = [
35
- { accountSpec: "DEMO4424965", ticker: "MYMM6", netPos: 2, avgPrice: 49500, openPnl: 100 },
36
- { accountSpec: "DEMO4424965", ticker: "ESM6", netPos: -1, avgPrice: 5300, openPnl: -50 },
37
- ];
38
- it("returns position list with side and P&L", async () => {
39
- const result = await getPositions(makeClient({ get: () => Promise.resolve(POSITIONS) }), makeResolver(), {});
40
- expect(result.isError).toBeUndefined();
41
- expect(result.content[0].text).toContain("2 open position(s)");
42
- expect(result.content[0].text).toContain("LONG 2");
43
- expect(result.content[0].text).toContain("SHORT 1");
44
- });
45
- it("returns flat message when no positions", async () => {
46
- const result = await getPositions(makeClient({ get: () => Promise.resolve([]) }), makeResolver(), {});
47
- expect(result.content[0].text).toContain("flat");
48
- });
49
- it("returns isError on API failure", async () => {
50
- const result = await getPositions(makeClient({ get: () => Promise.reject(new Error("500")) }), makeResolver(), {});
51
- expect(result.isError).toBe(true);
52
- });
53
- });
54
- // ─── getOrderHistory ───────────────────────────────────────────────────────
55
- describe("getOrderHistory", () => {
56
- const ORDERS = [
57
- { id: 1, ticker: "MYMM6", action: "buy", orderType: "market", qty: 1, fillPrice: 49500, status: "filled", createdAt: "2026-04-30T10:00:00Z" },
58
- ];
59
- it("returns order list", async () => {
60
- const result = await getOrderHistory(makeClient({ get: () => Promise.resolve(ORDERS) }), makeResolver(), { groupId: "567" });
61
- expect(result.isError).toBeUndefined();
62
- expect(result.content[0].text).toContain("1 order(s)");
63
- expect(result.content[0].text).toContain("MYMM6");
64
- expect(result.content[0].text).toContain("49500");
65
- });
66
- it("returns isError when groupId missing", async () => {
67
- const result = await getOrderHistory(makeClient(), makeResolver(), {});
68
- expect(result.isError).toBe(true);
69
- });
70
- it("returns empty message when no orders", async () => {
71
- const result = await getOrderHistory(makeClient({ get: () => Promise.resolve([]) }), makeResolver(), { groupId: "567" });
72
- expect(result.content[0].text).toContain("No orders found");
73
- });
74
- it("returns isError on API failure", async () => {
75
- const result = await getOrderHistory(makeClient({ get: () => Promise.reject(new Error("500")) }), makeResolver(), { groupId: "567" });
76
- expect(result.isError).toBe(true);
77
- });
78
- });
79
- // ─── getBrokerOrderHistory (LBENCH-01) ─────────────────────────────────────
80
- describe("getBrokerOrderHistory", () => {
81
- const BROKER_ORDERS = [
82
- {
83
- orderId: 503669136105,
84
- parentId: null,
85
- symbol: "MYMM6",
86
- action: "Sell",
87
- orderQty: 1,
88
- ordStatus: "Filled",
89
- orderType: "Stop",
90
- stopPrice: 49585,
91
- price: null,
92
- avgFillPrice: 49585,
93
- placementTime: "2026-05-19T10:35:01.847Z",
94
- bracketRole: "entry",
95
- },
96
- ];
97
- it("returns broker-side order list", async () => {
98
- const result = await getBrokerOrderHistory(makeClient({ get: () => Promise.resolve(BROKER_ORDERS) }), makeResolver(), { connectionId: 7, accountId: "DEMO4424965", sinceUtc: "2026-05-19T10:34:00Z" });
99
- expect(result.isError).toBeUndefined();
100
- expect(result.content[0].text).toContain("1 order(s)");
101
- expect(result.content[0].text).toContain("503669136105");
102
- expect(result.content[0].text).toContain("MYMM6");
103
- });
104
- it("returns isError when required fields are missing", async () => {
105
- const r1 = await getBrokerOrderHistory(makeClient(), makeResolver(), { accountId: "DEMO4424965", sinceUtc: "2026-05-19T10:34:00Z" });
106
- expect(r1.isError).toBe(true);
107
- const r2 = await getBrokerOrderHistory(makeClient(), makeResolver(), { connectionId: 7, sinceUtc: "2026-05-19T10:34:00Z" });
108
- expect(r2.isError).toBe(true);
109
- const r3 = await getBrokerOrderHistory(makeClient(), makeResolver(), { connectionId: 7, accountId: "DEMO4424965" });
110
- expect(r3.isError).toBe(true);
111
- });
112
- it("returns empty message when window has no orders", async () => {
113
- const result = await getBrokerOrderHistory(makeClient({ get: () => Promise.resolve([]) }), makeResolver(), { connectionId: 7, accountId: "DEMO4424965", sinceUtc: "2026-05-19T10:34:00Z" });
114
- expect(result.content[0].text).toContain("No orders found in submission window");
115
- });
116
- it("passes correlation filter and limit through to backend", async () => {
117
- let capturedUrl = "";
118
- const result = await getBrokerOrderHistory(makeClient({ get: (path) => { capturedUrl = path; return Promise.resolve([]); } }), makeResolver(), { connectionId: 7, accountId: "DEMO4424965", sinceUtc: "2026-05-19T10:34:00Z", untilUtc: "2026-05-19T10:36:00Z", filter: "LBench_iter1", limit: 50 });
119
- expect(result.isError).toBeUndefined();
120
- expect(capturedUrl).toContain("/orders/submission-window");
121
- expect(capturedUrl).toContain("filter=LBench_iter1");
122
- expect(capturedUrl).toContain("limit=50");
123
- });
124
- it("returns isError on API failure (e.g. 501 NotImplemented)", async () => {
125
- const result = await getBrokerOrderHistory(makeClient({ get: () => Promise.reject(new Error("501")) }), makeResolver(), { connectionId: 7, accountId: "DEMO4424965", sinceUtc: "2026-05-19T10:34:00Z" });
126
- expect(result.isError).toBe(true);
127
- });
128
- });
129
- // ─── getMarketPrice ────────────────────────────────────────────────────────
130
- describe("getMarketPrice", () => {
131
- const PRICE = { ticker: "MYMM6", last: 49550, bid: 49549, ask: 49551, timestamp: "2026-04-30T18:00:00Z" };
132
- it("returns price summary", async () => {
133
- const result = await getMarketPrice(makeClient({ getWebhook: () => Promise.resolve(PRICE) }), makeResolver(), {
134
- groupId: "567", secret: "abc", ticker: "MYMM6",
135
- });
136
- expect(result.isError).toBeUndefined();
137
- expect(result.content[0].text).toContain("MYMM6");
138
- expect(result.content[0].text).toContain("last=49550");
139
- expect(result.content[0].text).toContain("bid=49549");
140
- });
141
- it("returns isError when params missing", async () => {
142
- const result = await getMarketPrice(makeClient(), makeResolver(), { groupId: "567" });
143
- expect(result.isError).toBe(true);
144
- });
145
- it("returns isError on API failure", async () => {
146
- const result = await getMarketPrice(makeClient({ getWebhook: () => Promise.reject(new Error("404")) }), makeResolver(), { groupId: "567", secret: "abc", ticker: "MYMM6" });
147
- expect(result.isError).toBe(true);
148
- });
149
- });
150
- // ─── getAlerts ─────────────────────────────────────────────────────────────
151
- describe("getAlerts", () => {
152
- const ALERTS = [
153
- { id: 1, type: "token_expiry", message: "Token expiring soon", isRead: false, createdAt: "2026-04-30T10:00:00Z" },
154
- { id: 2, type: "signal_failed", message: "Signal 123 failed", isRead: true, createdAt: "2026-04-29T10:00:00Z" },
155
- ];
156
- it("returns alert list with unread count", async () => {
157
- const result = await getAlerts(makeClient({ get: () => Promise.resolve(ALERTS) }), makeResolver(), {});
158
- expect(result.isError).toBeUndefined();
159
- expect(result.content[0].text).toContain("2 alert(s), 1 unread");
160
- expect(result.content[0].text).toContain("🔵");
161
- });
162
- it("returns empty message when no alerts", async () => {
163
- const result = await getAlerts(makeClient({ get: () => Promise.resolve([]) }), makeResolver(), {});
164
- expect(result.content[0].text).toContain("No alerts");
165
- });
166
- it("returns isError on API failure", async () => {
167
- const result = await getAlerts(makeClient({ get: () => Promise.reject(new Error("500")) }), makeResolver(), {});
168
- expect(result.isError).toBe(true);
169
- });
170
- });
171
- // ─── ackAlert ──────────────────────────────────────────────────────────────
172
- describe("ackAlert", () => {
173
- it("confirms acknowledgment", async () => {
174
- const result = await ackAlert(makeClient({ post: () => Promise.resolve({}) }), makeResolver(), { alertId: "42" });
175
- expect(result.isError).toBeUndefined();
176
- expect(result.content[0].text).toContain("42");
177
- expect(result.content[0].text).toContain("acknowledged");
178
- });
179
- it("returns isError when alertId missing", async () => {
180
- const result = await ackAlert(makeClient(), makeResolver(), {});
181
- expect(result.isError).toBe(true);
182
- });
183
- it("returns isError on API failure", async () => {
184
- const result = await ackAlert(makeClient({ post: () => Promise.reject(new Error("404")) }), makeResolver(), { alertId: "42" });
185
- expect(result.isError).toBe(true);
186
- });
187
- });
188
- // ─── getSignalBrokerLogs ───────────────────────────────────────────────────
189
- describe("getSignalBrokerLogs", () => {
190
- const LOGS = [
191
- { timestamp: "2026-04-30T10:00:00Z", direction: "OUT", endpoint: "/order/placeorder", statusCode: 200 },
192
- { timestamp: "2026-04-30T10:00:01Z", direction: "IN", endpoint: "/order/placeorder", statusCode: 200 },
193
- ];
194
- it("returns log entries", async () => {
195
- const result = await getSignalBrokerLogs(makeClient({ get: () => Promise.resolve(LOGS) }), makeResolver(), { signalId: "3392" });
196
- expect(result.isError).toBeUndefined();
197
- expect(result.content[0].text).toContain("2 broker log entry(ies)");
198
- expect(result.content[0].text).toContain("/order/placeorder");
199
- });
200
- it("returns isError when signalId missing", async () => {
201
- const result = await getSignalBrokerLogs(makeClient(), makeResolver(), {});
202
- expect(result.isError).toBe(true);
203
- });
204
- it("returns graceful message when no logs", async () => {
205
- const result = await getSignalBrokerLogs(makeClient({ get: () => Promise.resolve([]) }), makeResolver(), { signalId: "3392" });
206
- expect(result.content[0].text).toContain("No broker logs");
207
- });
208
- it("returns isError on API failure", async () => {
209
- const result = await getSignalBrokerLogs(makeClient({ get: () => Promise.reject(new Error("404")) }), makeResolver(), { signalId: "3392" });
210
- expect(result.isError).toBe(true);
211
- });
212
- });
213
- //# sourceMappingURL=account.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"account.test.js","sourceRoot":"","sources":["../../src/tools/account.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { VantageClient } from "../client.js";
2
- import { UserResolver, ToolResult } from "../user.js";
3
- export declare function getEconomicEvents(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
4
- export declare function getEconomicEventsMonth(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
@@ -1,85 +0,0 @@
1
- import { makeErrorResult } from "../user.js";
2
- function severityEmoji(s) {
3
- const v = (s ?? "").toLowerCase();
4
- if (v === "high" || v === "3")
5
- return "🔴";
6
- if (v === "medium" || v === "2")
7
- return "🟡";
8
- return "🟢";
9
- }
10
- function formatEvent(e) {
11
- const emoji = severityEmoji(e.severity ?? e.impact);
12
- const time = e.time ?? e.date ?? "?";
13
- const actStr = e.actual != null ? ` actual=${e.actual}` : "";
14
- const fcStr = e.forecast != null ? ` forecast=${e.forecast}` : "";
15
- return `${emoji} [${time}] ${e.name ?? "?"}${actStr}${fcStr}`;
16
- }
17
- export async function getEconomicEvents(client, _resolver, input) {
18
- try {
19
- const params = new URLSearchParams();
20
- if (input.startDate)
21
- params.set("startDate", String(input.startDate));
22
- if (input.endDate)
23
- params.set("endDate", String(input.endDate));
24
- if (input.severity)
25
- params.set("severity", String(input.severity));
26
- const qs = params.toString() ? `?${params}` : "";
27
- const events = await client.get(`/api/economic-events${qs}`);
28
- if (!events.length) {
29
- return { content: [{ type: "text", text: "No economic events found for the specified range." }, { type: "text", text: "[]" }] };
30
- }
31
- const high = events.filter((e) => ["high", "3"].includes((e.severity ?? e.impact ?? "").toLowerCase()));
32
- const summary = `${events.length} event(s), ${high.length} high-impact`;
33
- const lines = events.map(formatEvent);
34
- return {
35
- content: [
36
- { type: "text", text: `${summary}:\n${lines.join("\n")}` },
37
- { type: "text", text: JSON.stringify(events, null, 2) },
38
- ],
39
- };
40
- }
41
- catch (err) {
42
- return makeErrorResult(err);
43
- }
44
- }
45
- export async function getEconomicEventsMonth(client, _resolver, input) {
46
- const year = input.year ? String(input.year) : "";
47
- const month = input.month ? String(input.month) : "";
48
- try {
49
- const params = new URLSearchParams();
50
- if (year)
51
- params.set("year", year);
52
- if (month)
53
- params.set("month", month);
54
- const qs = params.toString() ? `?${params}` : "";
55
- const events = await client.get(`/api/economic-events/month${qs}`);
56
- if (!events.length) {
57
- return { content: [{ type: "text", text: "No economic events found for this month." }, { type: "text", text: "[]" }] };
58
- }
59
- // Group by date for a calendar-style summary
60
- const byDate = new Map();
61
- for (const e of events) {
62
- const key = (e.date ?? e.time ?? "unknown").split("T")[0];
63
- if (!byDate.has(key))
64
- byDate.set(key, []);
65
- byDate.get(key).push(e);
66
- }
67
- const high = events.filter((e) => ["high", "3"].includes((e.severity ?? e.impact ?? "").toLowerCase()));
68
- const dayLines = [];
69
- for (const [date, dayEvents] of [...byDate.entries()].sort()) {
70
- const highDay = dayEvents.filter((e) => ["high", "3"].includes((e.severity ?? e.impact ?? "").toLowerCase()));
71
- dayLines.push(`${date} (${dayEvents.length} events, ${highDay.length} high):`);
72
- dayLines.push(...dayEvents.map((e) => ` ${formatEvent(e)}`));
73
- }
74
- return {
75
- content: [
76
- { type: "text", text: `${events.length} event(s) in ${year ? `${year}-${month}` : "current month"}, ${high.length} high-impact:\n${dayLines.join("\n")}` },
77
- { type: "text", text: JSON.stringify(events, null, 2) },
78
- ],
79
- };
80
- }
81
- catch (err) {
82
- return makeErrorResult(err);
83
- }
84
- }
85
- //# sourceMappingURL=calendar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,62 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { getEconomicEvents, getEconomicEventsMonth } from "./calendar.js";
3
- const makeClient = (getImpl) => ({ get: getImpl ?? (() => Promise.resolve([])) });
4
- const resolver = {};
5
- const EVENTS = [
6
- { id: 1, name: "CPI", time: "2026-04-30T12:30:00Z", date: "2026-04-30", severity: "high", actual: "3.2%", forecast: "3.1%" },
7
- { id: 2, name: "Jobless Claims", time: "2026-04-30T12:30:00Z", date: "2026-04-30", severity: "medium", actual: "215K", forecast: "220K" },
8
- { id: 3, name: "PMI", time: "2026-04-30T14:00:00Z", date: "2026-04-30", severity: "low" },
9
- ];
10
- describe("getEconomicEvents", () => {
11
- it("returns event count and high-impact count", async () => {
12
- const result = await getEconomicEvents(makeClient(() => Promise.resolve(EVENTS)), resolver, {});
13
- expect(result.isError).toBeUndefined();
14
- expect(result.content[0].text).toContain("3 event(s)");
15
- expect(result.content[0].text).toContain("1 high-impact");
16
- });
17
- it("includes severity emoji in output", async () => {
18
- const result = await getEconomicEvents(makeClient(() => Promise.resolve(EVENTS)), resolver, {});
19
- expect(result.content[0].text).toContain("🔴");
20
- expect(result.content[0].text).toContain("🟡");
21
- expect(result.content[0].text).toContain("🟢");
22
- });
23
- it("returns empty message when no events", async () => {
24
- const result = await getEconomicEvents(makeClient(() => Promise.resolve([])), resolver, {});
25
- expect(result.content[0].text).toContain("No economic events");
26
- });
27
- it("returns isError on API failure", async () => {
28
- const result = await getEconomicEvents(makeClient(() => Promise.reject(new Error("500"))), resolver, {});
29
- expect(result.isError).toBe(true);
30
- });
31
- it("includes JSON in second content block", async () => {
32
- const result = await getEconomicEvents(makeClient(() => Promise.resolve(EVENTS)), resolver, {});
33
- expect(JSON.parse(result.content[1].text)).toHaveLength(3);
34
- });
35
- });
36
- describe("getEconomicEventsMonth", () => {
37
- const MONTH_EVENTS = [
38
- { id: 1, name: "CPI", date: "2026-04-15", time: "2026-04-15T12:30:00Z", severity: "high" },
39
- { id: 2, name: "FOMC", date: "2026-04-30", time: "2026-04-30T18:00:00Z", severity: "high" },
40
- { id: 3, name: "PMI", date: "2026-04-30", time: "2026-04-30T14:00:00Z", severity: "low" },
41
- ];
42
- it("groups events by date", async () => {
43
- const result = await getEconomicEventsMonth(makeClient(() => Promise.resolve(MONTH_EVENTS)), resolver, { year: "2026", month: "4" });
44
- expect(result.isError).toBeUndefined();
45
- expect(result.content[0].text).toContain("3 event(s)");
46
- expect(result.content[0].text).toContain("2026-04-15");
47
- expect(result.content[0].text).toContain("2026-04-30");
48
- });
49
- it("shows high-impact count in header", async () => {
50
- const result = await getEconomicEventsMonth(makeClient(() => Promise.resolve(MONTH_EVENTS)), resolver, { year: "2026", month: "4" });
51
- expect(result.content[0].text).toContain("2 high-impact");
52
- });
53
- it("returns empty message when no events", async () => {
54
- const result = await getEconomicEventsMonth(makeClient(() => Promise.resolve([])), resolver, {});
55
- expect(result.content[0].text).toContain("No economic events");
56
- });
57
- it("returns isError on API failure", async () => {
58
- const result = await getEconomicEventsMonth(makeClient(() => Promise.reject(new Error("500"))), resolver, {});
59
- expect(result.isError).toBe(true);
60
- });
61
- });
62
- //# sourceMappingURL=calendar.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar.test.js","sourceRoot":"","sources":["../../src/tools/calendar.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { VantageClient } from "../client.js";
2
- import { UserResolver, ToolResult } from "../user.js";
3
- /** ADMINCANARY-04 — read-only canary_config singleton via GET /api/admin/canary. */
4
- export declare function getCanaryConfig(client: VantageClient, _resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
@@ -1,25 +0,0 @@
1
- import { makeErrorResult } from "../user.js";
2
- /** ADMINCANARY-04 — read-only canary_config singleton via GET /api/admin/canary. */
3
- export async function getCanaryConfig(client, _resolver, _input) {
4
- try {
5
- const cfg = await client.get("/api/admin/canary");
6
- const lines = [
7
- `## Canary Config`,
8
- `- **enabled**: ${cfg.enabled}`,
9
- `- **periodMinutes**: ${cfg.periodMinutes}`,
10
- `- **skipClosedHours**: ${cfg.skipClosedHours}`,
11
- `- **updatedAt**: ${cfg.updatedAt}`,
12
- `- **updatedByUserId**: ${cfg.updatedByUserId ?? "—"}`,
13
- ];
14
- return {
15
- content: [
16
- { type: "text", text: lines.join("\n") },
17
- { type: "text", text: JSON.stringify(cfg, null, 2) },
18
- ],
19
- };
20
- }
21
- catch (err) {
22
- return makeErrorResult(err);
23
- }
24
- }
25
- //# sourceMappingURL=canary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canary.js","sourceRoot":"","sources":["../../src/tools/canary.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,eAAe,EAAc,MAAM,YAAY,CAAC;AAUvE,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAqB,EACrB,SAAuB,EACvB,MAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAe,mBAAmB,CAAC,CAAC;QAEhE,MAAM,KAAK,GAAG;YACZ,kBAAkB;YAClB,kBAAkB,GAAG,CAAC,OAAO,EAAE;YAC/B,wBAAwB,GAAG,CAAC,aAAa,EAAE;YAC3C,0BAA0B,GAAG,CAAC,eAAe,EAAE;YAC/C,oBAAoB,GAAG,CAAC,SAAS,EAAE;YACnC,0BAA0B,GAAG,CAAC,eAAe,IAAI,GAAG,EAAE;SACvD,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACrD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,46 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { getCanaryConfig } from "./canary.js";
3
- const makeClient = (getImpl) => ({ get: getImpl });
4
- const resolver = {};
5
- describe("get_canary_config", () => {
6
- it("returns formatted config when API responds", async () => {
7
- const payload = {
8
- enabled: true,
9
- periodMinutes: 5,
10
- skipClosedHours: true,
11
- updatedAt: "2026-05-19T20:00:00Z",
12
- updatedByUserId: 42,
13
- };
14
- const client = makeClient(() => Promise.resolve(payload));
15
- const result = await getCanaryConfig(client, resolver, {});
16
- expect(result.isError).toBeUndefined();
17
- const text = result.content[0].text;
18
- expect(text).toContain("enabled");
19
- expect(text).toContain("periodMinutes");
20
- expect(text).toContain("skipClosedHours");
21
- // second content block is the raw JSON
22
- const json = JSON.parse(result.content[1].text);
23
- expect(json.enabled).toBe(true);
24
- expect(json.periodMinutes).toBe(5);
25
- });
26
- it("returns formatted config with null updatedByUserId", async () => {
27
- const payload = {
28
- enabled: false,
29
- periodMinutes: 15,
30
- skipClosedHours: false,
31
- updatedAt: "2026-05-19T20:00:00Z",
32
- updatedByUserId: null,
33
- };
34
- const client = makeClient(() => Promise.resolve(payload));
35
- const result = await getCanaryConfig(client, resolver, {});
36
- expect(result.isError).toBeUndefined();
37
- expect(result.content[0].text).toContain("—");
38
- });
39
- it("returns isError true when API call throws", async () => {
40
- const client = makeClient(() => Promise.reject(new Error("forbidden")));
41
- const result = await getCanaryConfig(client, resolver, {});
42
- expect(result.isError).toBe(true);
43
- expect(result.content[0].text).toContain("forbidden");
44
- });
45
- });
46
- //# sourceMappingURL=canary.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canary.test.js","sourceRoot":"","sources":["../../src/tools/canary.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { VantageClient } from "../client.js";
2
- import { UserResolver, ToolResult } from "../user.js";
3
- export declare function listContractConfigs(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
4
- export declare function createContractConfig(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
5
- export declare function updateContractConfig(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
6
- export declare function deleteContractConfig(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
7
- export declare function rollContractConfig(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
8
- export declare function setContractConfigLeader(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
9
- export declare function updateContractConfigFollower(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;