@vantagestack/mcp-server 0.1.1 → 0.1.3

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.
@@ -0,0 +1,198 @@
1
+ import { makeErrorResult } from "../user.js";
2
+ export async function getBalance(client, resolver, _input) {
3
+ try {
4
+ const userId = await resolver.resolve(client);
5
+ const res = await client.get(`/api/account/${userId}/balance`);
6
+ const accounts = res.accounts ?? [];
7
+ if (!accounts.length) {
8
+ return {
9
+ content: [
10
+ { type: "text", text: "No account balance data available." },
11
+ { type: "text", text: JSON.stringify(res, null, 2) },
12
+ ],
13
+ };
14
+ }
15
+ const lines = accounts.map((a) => {
16
+ const parts = [`• ${a.accountSpec ?? "?"}`];
17
+ if (a.cashBalance != null)
18
+ parts.push(`cash=${a.cashBalance.toFixed(2)}`);
19
+ if (a.openPnl != null)
20
+ parts.push(`openPnl=${a.openPnl >= 0 ? "+" : ""}${a.openPnl.toFixed(2)}`);
21
+ if (a.marginUsed != null)
22
+ parts.push(`margin=${a.marginUsed.toFixed(2)}`);
23
+ if (a.totalEquity != null)
24
+ parts.push(`equity=${a.totalEquity.toFixed(2)}`);
25
+ return parts.join(" ");
26
+ });
27
+ return {
28
+ content: [
29
+ { type: "text", text: `${accounts.length} account(s):\n${lines.join("\n")}` },
30
+ { type: "text", text: JSON.stringify(res, null, 2) },
31
+ ],
32
+ };
33
+ }
34
+ catch (err) {
35
+ return makeErrorResult(err);
36
+ }
37
+ }
38
+ export async function getPositions(client, resolver, _input) {
39
+ try {
40
+ const userId = await resolver.resolve(client);
41
+ const positions = await client.get(`/api/account/${userId}/positions`);
42
+ if (!positions.length) {
43
+ return {
44
+ content: [
45
+ { type: "text", text: "No open positions — all accounts are flat." },
46
+ { type: "text", text: "[]" },
47
+ ],
48
+ };
49
+ }
50
+ const lines = positions.map((p) => {
51
+ const side = p.netPos != null ? (p.netPos > 0 ? "LONG" : "SHORT") : (p.side ?? "?");
52
+ const qty = p.netPos != null ? Math.abs(p.netPos) : "?";
53
+ const pnl = p.openPnl != null ? ` openPnl=${p.openPnl >= 0 ? "+" : ""}${p.openPnl.toFixed(2)}` : "";
54
+ return `• ${p.accountSpec ?? "?"} ${p.ticker ?? "?"} ${side} ${qty} @ ${p.avgPrice ?? "?"}${pnl}`;
55
+ });
56
+ return {
57
+ content: [
58
+ { type: "text", text: `${positions.length} open position(s):\n${lines.join("\n")}` },
59
+ { type: "text", text: JSON.stringify(positions, null, 2) },
60
+ ],
61
+ };
62
+ }
63
+ catch (err) {
64
+ return makeErrorResult(err);
65
+ }
66
+ }
67
+ export async function getOrderHistory(client, resolver, input) {
68
+ const groupId = String(input.groupId ?? "");
69
+ if (!groupId)
70
+ return makeErrorResult(new Error("groupId is required"));
71
+ try {
72
+ const userId = await resolver.resolve(client);
73
+ const params = new URLSearchParams();
74
+ if (input.limit)
75
+ params.set("limit", String(input.limit));
76
+ const qs = params.toString() ? `?${params}` : "";
77
+ const orders = await client.get(`/api/account/${userId}/groups/${groupId}/orders${qs}`);
78
+ if (!orders.length) {
79
+ return {
80
+ content: [
81
+ { type: "text", text: "No orders found for this group." },
82
+ { type: "text", text: "[]" },
83
+ ],
84
+ };
85
+ }
86
+ const lines = orders.map((o) => `• [${o.createdAt ?? "?"}] ${o.action ?? "?"} ${o.ticker ?? "?"} ` +
87
+ `${o.orderType ?? "market"} qty=${o.qty ?? "?"} ` +
88
+ `fill=${o.fillPrice ?? "pending"} status=${o.status ?? "?"}`);
89
+ return {
90
+ content: [
91
+ { type: "text", text: `${orders.length} order(s):\n${lines.join("\n")}` },
92
+ { type: "text", text: JSON.stringify(orders, null, 2) },
93
+ ],
94
+ };
95
+ }
96
+ catch (err) {
97
+ return makeErrorResult(err);
98
+ }
99
+ }
100
+ export async function getMarketPrice(client, _resolver, input) {
101
+ const groupId = String(input.groupId ?? "");
102
+ const secret = String(input.secret ?? "");
103
+ const ticker = String(input.ticker ?? "");
104
+ if (!groupId || !secret || !ticker)
105
+ return makeErrorResult(new Error("groupId, secret, and ticker are required"));
106
+ try {
107
+ const res = await client.getWebhook(groupId, secret, `market-price/${encodeURIComponent(ticker)}`);
108
+ const parts = [`${ticker}:`];
109
+ if (res.last != null)
110
+ parts.push(`last=${res.last}`);
111
+ if (res.bid != null)
112
+ parts.push(`bid=${res.bid}`);
113
+ if (res.ask != null)
114
+ parts.push(`ask=${res.ask}`);
115
+ if (res.timestamp)
116
+ parts.push(`at ${res.timestamp}`);
117
+ return {
118
+ content: [
119
+ { type: "text", text: parts.join(" ") },
120
+ { type: "text", text: JSON.stringify(res, null, 2) },
121
+ ],
122
+ };
123
+ }
124
+ catch (err) {
125
+ return makeErrorResult(err);
126
+ }
127
+ }
128
+ export async function getAlerts(client, resolver, input) {
129
+ try {
130
+ const userId = await resolver.resolve(client);
131
+ const params = new URLSearchParams();
132
+ if (input.unreadOnly)
133
+ params.set("unreadOnly", "true");
134
+ const qs = params.toString() ? `?${params}` : "";
135
+ const alerts = await client.get(`/api/account/${userId}/alerts${qs}`);
136
+ if (!alerts.length) {
137
+ return {
138
+ content: [
139
+ { type: "text", text: "No alerts." },
140
+ { type: "text", text: "[]" },
141
+ ],
142
+ };
143
+ }
144
+ const unread = alerts.filter((a) => !a.isRead);
145
+ const lines = alerts.map((a) => `• [${a.createdAt ?? "?"}] ${a.isRead ? "" : "🔵 "}${a.type ?? "info"}: ${a.message ?? ""}`);
146
+ return {
147
+ content: [
148
+ { type: "text", text: `${alerts.length} alert(s), ${unread.length} unread:\n${lines.join("\n")}` },
149
+ { type: "text", text: JSON.stringify(alerts, null, 2) },
150
+ ],
151
+ };
152
+ }
153
+ catch (err) {
154
+ return makeErrorResult(err);
155
+ }
156
+ }
157
+ export async function ackAlert(client, resolver, input) {
158
+ const alertId = String(input.alertId ?? "");
159
+ if (!alertId)
160
+ return makeErrorResult(new Error("alertId is required"));
161
+ try {
162
+ const userId = await resolver.resolve(client);
163
+ await client.post(`/api/account/${userId}/alerts/${alertId}/ack`, {});
164
+ return {
165
+ content: [{ type: "text", text: `Alert ${alertId} acknowledged.` }],
166
+ };
167
+ }
168
+ catch (err) {
169
+ return makeErrorResult(err);
170
+ }
171
+ }
172
+ export async function getSignalBrokerLogs(client, _resolver, input) {
173
+ const signalId = String(input.signalId ?? "");
174
+ if (!signalId)
175
+ return makeErrorResult(new Error("signalId is required"));
176
+ try {
177
+ const logs = await client.get(`/api/signals/${signalId}/broker-logs`);
178
+ if (!logs.length) {
179
+ return {
180
+ content: [
181
+ { type: "text", text: `No broker logs available for signal ${signalId}.` },
182
+ { type: "text", text: "[]" },
183
+ ],
184
+ };
185
+ }
186
+ const lines = logs.map((l) => `• [${l.timestamp ?? "?"}] ${l.direction ?? "?"} ${l.endpoint ?? "?"} → ${l.statusCode ?? "?"}`);
187
+ return {
188
+ content: [
189
+ { type: "text", text: `${logs.length} broker log entry(ies) for signal ${signalId}:\n${lines.join("\n")}` },
190
+ { type: "text", text: JSON.stringify(logs, null, 2) },
191
+ ],
192
+ };
193
+ }
194
+ catch (err) {
195
+ return makeErrorResult(err);
196
+ }
197
+ }
198
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/tools/account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,163 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { getBalance, getPositions, getOrderHistory, 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
+ // ─── getMarketPrice ────────────────────────────────────────────────────────
80
+ describe("getMarketPrice", () => {
81
+ const PRICE = { ticker: "MYMM6", last: 49550, bid: 49549, ask: 49551, timestamp: "2026-04-30T18:00:00Z" };
82
+ it("returns price summary", async () => {
83
+ const result = await getMarketPrice(makeClient({ getWebhook: () => Promise.resolve(PRICE) }), makeResolver(), {
84
+ groupId: "567", secret: "abc", ticker: "MYMM6",
85
+ });
86
+ expect(result.isError).toBeUndefined();
87
+ expect(result.content[0].text).toContain("MYMM6");
88
+ expect(result.content[0].text).toContain("last=49550");
89
+ expect(result.content[0].text).toContain("bid=49549");
90
+ });
91
+ it("returns isError when params missing", async () => {
92
+ const result = await getMarketPrice(makeClient(), makeResolver(), { groupId: "567" });
93
+ expect(result.isError).toBe(true);
94
+ });
95
+ it("returns isError on API failure", async () => {
96
+ const result = await getMarketPrice(makeClient({ getWebhook: () => Promise.reject(new Error("404")) }), makeResolver(), { groupId: "567", secret: "abc", ticker: "MYMM6" });
97
+ expect(result.isError).toBe(true);
98
+ });
99
+ });
100
+ // ─── getAlerts ─────────────────────────────────────────────────────────────
101
+ describe("getAlerts", () => {
102
+ const ALERTS = [
103
+ { id: 1, type: "token_expiry", message: "Token expiring soon", isRead: false, createdAt: "2026-04-30T10:00:00Z" },
104
+ { id: 2, type: "signal_failed", message: "Signal 123 failed", isRead: true, createdAt: "2026-04-29T10:00:00Z" },
105
+ ];
106
+ it("returns alert list with unread count", async () => {
107
+ const result = await getAlerts(makeClient({ get: () => Promise.resolve(ALERTS) }), makeResolver(), {});
108
+ expect(result.isError).toBeUndefined();
109
+ expect(result.content[0].text).toContain("2 alert(s), 1 unread");
110
+ expect(result.content[0].text).toContain("🔵");
111
+ });
112
+ it("returns empty message when no alerts", async () => {
113
+ const result = await getAlerts(makeClient({ get: () => Promise.resolve([]) }), makeResolver(), {});
114
+ expect(result.content[0].text).toContain("No alerts");
115
+ });
116
+ it("returns isError on API failure", async () => {
117
+ const result = await getAlerts(makeClient({ get: () => Promise.reject(new Error("500")) }), makeResolver(), {});
118
+ expect(result.isError).toBe(true);
119
+ });
120
+ });
121
+ // ─── ackAlert ──────────────────────────────────────────────────────────────
122
+ describe("ackAlert", () => {
123
+ it("confirms acknowledgment", async () => {
124
+ const result = await ackAlert(makeClient({ post: () => Promise.resolve({}) }), makeResolver(), { alertId: "42" });
125
+ expect(result.isError).toBeUndefined();
126
+ expect(result.content[0].text).toContain("42");
127
+ expect(result.content[0].text).toContain("acknowledged");
128
+ });
129
+ it("returns isError when alertId missing", async () => {
130
+ const result = await ackAlert(makeClient(), makeResolver(), {});
131
+ expect(result.isError).toBe(true);
132
+ });
133
+ it("returns isError on API failure", async () => {
134
+ const result = await ackAlert(makeClient({ post: () => Promise.reject(new Error("404")) }), makeResolver(), { alertId: "42" });
135
+ expect(result.isError).toBe(true);
136
+ });
137
+ });
138
+ // ─── getSignalBrokerLogs ───────────────────────────────────────────────────
139
+ describe("getSignalBrokerLogs", () => {
140
+ const LOGS = [
141
+ { timestamp: "2026-04-30T10:00:00Z", direction: "OUT", endpoint: "/order/placeorder", statusCode: 200 },
142
+ { timestamp: "2026-04-30T10:00:01Z", direction: "IN", endpoint: "/order/placeorder", statusCode: 200 },
143
+ ];
144
+ it("returns log entries", async () => {
145
+ const result = await getSignalBrokerLogs(makeClient({ get: () => Promise.resolve(LOGS) }), makeResolver(), { signalId: "3392" });
146
+ expect(result.isError).toBeUndefined();
147
+ expect(result.content[0].text).toContain("2 broker log entry(ies)");
148
+ expect(result.content[0].text).toContain("/order/placeorder");
149
+ });
150
+ it("returns isError when signalId missing", async () => {
151
+ const result = await getSignalBrokerLogs(makeClient(), makeResolver(), {});
152
+ expect(result.isError).toBe(true);
153
+ });
154
+ it("returns graceful message when no logs", async () => {
155
+ const result = await getSignalBrokerLogs(makeClient({ get: () => Promise.resolve([]) }), makeResolver(), { signalId: "3392" });
156
+ expect(result.content[0].text).toContain("No broker logs");
157
+ });
158
+ it("returns isError on API failure", async () => {
159
+ const result = await getSignalBrokerLogs(makeClient({ get: () => Promise.reject(new Error("404")) }), makeResolver(), { signalId: "3392" });
160
+ expect(result.isError).toBe(true);
161
+ });
162
+ });
163
+ //# sourceMappingURL=account.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.test.js","sourceRoot":"","sources":["../../src/tools/account.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
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>;
@@ -0,0 +1,85 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.test.js","sourceRoot":"","sources":["../../src/tools/calendar.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { VantageClient } from "../client.js";
2
+ import { UserResolver, ToolResult } from "../user.js";
3
+ export declare function getJournalTrades(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
4
+ export declare function getJournalDashboard(client: VantageClient, _resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
5
+ export declare function getJournalEntries(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
6
+ export declare function addJournalEntry(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;