@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,108 @@
1
+ import { makeErrorResult } from "../user.js";
2
+ export async function getJournalTrades(client, _resolver, input) {
3
+ try {
4
+ const params = new URLSearchParams();
5
+ if (input.startDate)
6
+ params.set("startDate", String(input.startDate));
7
+ if (input.endDate)
8
+ params.set("endDate", String(input.endDate));
9
+ if (input.accountSpec)
10
+ params.set("accountSpec", String(input.accountSpec));
11
+ if (input.limit)
12
+ params.set("limit", String(input.limit));
13
+ const qs = params.toString() ? `?${params}` : "";
14
+ const trades = await client.get(`/api/journal/trades${qs}`);
15
+ if (!trades.length) {
16
+ return { content: [{ type: "text", text: "No trades found for the specified filters." }, { type: "text", text: "[]" }] };
17
+ }
18
+ const wins = trades.filter((t) => (t.pnl ?? 0) > 0);
19
+ const losses = trades.filter((t) => (t.pnl ?? 0) <= 0);
20
+ const netPnl = trades.reduce((s, t) => s + (t.pnl ?? 0), 0);
21
+ const summary = `${trades.length} trade(s): ${wins.length}W / ${losses.length}L, net P&L ${netPnl >= 0 ? "+" : ""}${netPnl.toFixed(2)}`;
22
+ const lines = trades.map((t) => `• [${t.entryTime ?? "?"}] ${t.action ?? "?"} ${t.ticker ?? "?"} qty=${t.quantity ?? "?"} ` +
23
+ `entry=${t.entryPrice ?? "?"} exit=${t.exitPrice ?? "?"} pnl=${t.pnl != null ? (t.pnl >= 0 ? "+" : "") + t.pnl.toFixed(2) : "?"}`);
24
+ return {
25
+ content: [
26
+ { type: "text", text: `${summary}\n${lines.join("\n")}` },
27
+ { type: "text", text: JSON.stringify(trades, null, 2) },
28
+ ],
29
+ };
30
+ }
31
+ catch (err) {
32
+ return makeErrorResult(err);
33
+ }
34
+ }
35
+ export async function getJournalDashboard(client, _resolver, _input) {
36
+ try {
37
+ const bundle = await client.get("/api/journal/dashboard-bundle");
38
+ const pnlStr = bundle.netPnl != null
39
+ ? `${bundle.netPnl >= 0 ? "+" : ""}${bundle.netPnl.toFixed(2)}`
40
+ : "?";
41
+ const winRateStr = bundle.winRate != null ? `${(bundle.winRate * 100).toFixed(1)}%` : "?";
42
+ const pfStr = bundle.profitFactor != null ? bundle.profitFactor.toFixed(2) : "?";
43
+ const summary = [
44
+ `Net P&L: ${pnlStr}`,
45
+ `Trades: ${bundle.tradeCount ?? "?"} (${bundle.winCount ?? "?"}W / ${bundle.lossCount ?? "?"}L)`,
46
+ `Win rate: ${winRateStr}`,
47
+ `Profit factor: ${pfStr}`,
48
+ bundle.avgWin != null ? `Avg win: +${bundle.avgWin.toFixed(2)}` : null,
49
+ bundle.avgLoss != null ? `Avg loss: ${bundle.avgLoss.toFixed(2)}` : null,
50
+ bundle.maxDrawdown != null ? `Max drawdown: ${bundle.maxDrawdown.toFixed(2)}` : null,
51
+ bundle.sharpe != null ? `Sharpe: ${bundle.sharpe.toFixed(2)}` : null,
52
+ ]
53
+ .filter(Boolean)
54
+ .join(" | ");
55
+ return {
56
+ content: [
57
+ { type: "text", text: summary },
58
+ { type: "text", text: JSON.stringify(bundle, null, 2) },
59
+ ],
60
+ };
61
+ }
62
+ catch (err) {
63
+ return makeErrorResult(err);
64
+ }
65
+ }
66
+ export async function getJournalEntries(client, _resolver, input) {
67
+ try {
68
+ const params = new URLSearchParams();
69
+ if (input.startDate)
70
+ params.set("startDate", String(input.startDate));
71
+ if (input.endDate)
72
+ params.set("endDate", String(input.endDate));
73
+ const qs = params.toString() ? `?${params}` : "";
74
+ const entries = await client.get(`/api/journal/entries${qs}`);
75
+ if (!entries.length) {
76
+ return { content: [{ type: "text", text: "No journal entries found." }, { type: "text", text: "[]" }] };
77
+ }
78
+ const lines = entries.map((e) => `• [${e.date ?? e.createdAt ?? "?"}] ${e.text ?? ""}`);
79
+ return {
80
+ content: [
81
+ { type: "text", text: `${entries.length} entry(ies):\n${lines.join("\n")}` },
82
+ { type: "text", text: JSON.stringify(entries, null, 2) },
83
+ ],
84
+ };
85
+ }
86
+ catch (err) {
87
+ return makeErrorResult(err);
88
+ }
89
+ }
90
+ export async function addJournalEntry(client, _resolver, input) {
91
+ const date = String(input.date ?? "");
92
+ const text = String(input.text ?? "");
93
+ if (!date || !text)
94
+ return makeErrorResult(new Error("date and text are required"));
95
+ try {
96
+ const entry = await client.post("/api/journal/entries", { date, text });
97
+ return {
98
+ content: [
99
+ { type: "text", text: `Journal entry created (id=${entry.id ?? "?"}): [${date}] ${text}` },
100
+ { type: "text", text: JSON.stringify(entry, null, 2) },
101
+ ],
102
+ };
103
+ }
104
+ catch (err) {
105
+ return makeErrorResult(err);
106
+ }
107
+ }
108
+ //# sourceMappingURL=journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/tools/journal.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,eAAe,EAAc,MAAM,YAAY,CAAC;AAwCvE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAqB,EACrB,SAAuB,EACvB,KAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,WAAW;YAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgB,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAE3E,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4CAA4C,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3H,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,cAAc,IAAI,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,cAAc,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAExI,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,MAAM,CAAC,CAAC,SAAS,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,QAAQ,IAAI,GAAG,GAAG;YAC3F,SAAS,CAAC,CAAC,UAAU,IAAI,GAAG,SAAS,CAAC,CAAC,SAAS,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CACpI,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;gBACzD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACxD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAqB,EACrB,SAAuB,EACvB,MAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkB,+BAA+B,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI;YAClC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC/D,CAAC,CAAC,GAAG,CAAC;QACR,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAEjF,MAAM,OAAO,GAAG;YACd,YAAY,MAAM,EAAE;YACpB,WAAW,MAAM,CAAC,UAAU,IAAI,GAAG,KAAK,MAAM,CAAC,QAAQ,IAAI,GAAG,OAAO,MAAM,CAAC,SAAS,IAAI,GAAG,IAAI;YAChG,aAAa,UAAU,EAAE;YACzB,kBAAkB,KAAK,EAAE;YACzB,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACtE,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACxE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACpF,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;SACrE;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,KAAK,CAAC,CAAC;QAEf,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;gBAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACxD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAqB,EACrB,SAAuB,EACvB,KAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,uBAAuB,EAAE,EAAE,CAAC,CAAC;QAE9E,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1G,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACxF,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;gBAC5E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACzD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAqB,EACrB,SAAuB,EACvB,KAA8B;IAE9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,eAAe,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAEpF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAe,sBAAsB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtF,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,IAAI,KAAK,IAAI,EAAE,EAAE;gBAC1F,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACvD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,100 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { getJournalTrades, getJournalDashboard, getJournalEntries, addJournalEntry } from "./journal.js";
3
+ const makeClient = (getImpl, postImpl) => ({
4
+ get: getImpl ?? (() => Promise.resolve([])),
5
+ post: postImpl ?? (() => Promise.resolve({ id: 99 })),
6
+ });
7
+ const resolver = {};
8
+ const TRADES = [
9
+ { id: 1, ticker: "MYMM6", action: "buy", quantity: 1, entryPrice: 49500, exitPrice: 49600, entryTime: "2026-04-30T10:00:00Z", pnl: 100 },
10
+ { id: 2, ticker: "MYMM6", action: "sell", quantity: 1, entryPrice: 49700, exitPrice: 49650, entryTime: "2026-04-30T11:00:00Z", pnl: -50 },
11
+ ];
12
+ describe("getJournalTrades", () => {
13
+ it("returns trade summary with win/loss counts and net P&L", async () => {
14
+ const result = await getJournalTrades(makeClient(() => Promise.resolve(TRADES)), resolver, {});
15
+ expect(result.isError).toBeUndefined();
16
+ expect(result.content[0].text).toContain("2 trade(s)");
17
+ expect(result.content[0].text).toContain("1W / 1L");
18
+ expect(result.content[0].text).toContain("+50.00");
19
+ });
20
+ it("returns empty message when no trades", async () => {
21
+ const result = await getJournalTrades(makeClient(() => Promise.resolve([])), resolver, {});
22
+ expect(result.isError).toBeUndefined();
23
+ expect(result.content[0].text).toContain("No trades found");
24
+ });
25
+ it("returns isError on API failure", async () => {
26
+ const result = await getJournalTrades(makeClient(() => Promise.reject(new Error("500"))), resolver, {});
27
+ expect(result.isError).toBe(true);
28
+ });
29
+ it("includes JSON in second content block", async () => {
30
+ const result = await getJournalTrades(makeClient(() => Promise.resolve(TRADES)), resolver, {});
31
+ expect(JSON.parse(result.content[1].text)).toHaveLength(2);
32
+ });
33
+ });
34
+ describe("getJournalDashboard", () => {
35
+ const BUNDLE = {
36
+ netPnl: 1500.5,
37
+ tradeCount: 42,
38
+ winCount: 28,
39
+ lossCount: 14,
40
+ winRate: 0.667,
41
+ profitFactor: 2.1,
42
+ avgWin: 120.5,
43
+ avgLoss: -60.25,
44
+ maxDrawdown: -850,
45
+ sharpe: 1.8,
46
+ };
47
+ it("returns formatted stats summary", async () => {
48
+ const result = await getJournalDashboard(makeClient(() => Promise.resolve(BUNDLE)), resolver, {});
49
+ expect(result.isError).toBeUndefined();
50
+ expect(result.content[0].text).toContain("+1500.50");
51
+ expect(result.content[0].text).toContain("42");
52
+ expect(result.content[0].text).toContain("66.7%");
53
+ expect(result.content[0].text).toContain("2.10");
54
+ });
55
+ it("returns isError on API failure", async () => {
56
+ const result = await getJournalDashboard(makeClient(() => Promise.reject(new Error("500"))), resolver, {});
57
+ expect(result.isError).toBe(true);
58
+ });
59
+ });
60
+ describe("getJournalEntries", () => {
61
+ const ENTRIES = [
62
+ { id: 1, date: "2026-04-29", text: "Tight range day, stayed out." },
63
+ { id: 2, date: "2026-04-30", text: "Good breakout, hit target." },
64
+ ];
65
+ it("returns entry list", async () => {
66
+ const result = await getJournalEntries(makeClient(() => Promise.resolve(ENTRIES)), resolver, {});
67
+ expect(result.isError).toBeUndefined();
68
+ expect(result.content[0].text).toContain("2 entry(ies)");
69
+ expect(result.content[0].text).toContain("Tight range day");
70
+ });
71
+ it("returns empty message when no entries", async () => {
72
+ const result = await getJournalEntries(makeClient(() => Promise.resolve([])), resolver, {});
73
+ expect(result.content[0].text).toContain("No journal entries");
74
+ });
75
+ it("returns isError on API failure", async () => {
76
+ const result = await getJournalEntries(makeClient(() => Promise.reject(new Error("404"))), resolver, {});
77
+ expect(result.isError).toBe(true);
78
+ });
79
+ });
80
+ describe("addJournalEntry", () => {
81
+ it("creates entry and returns confirmation", async () => {
82
+ const result = await addJournalEntry(makeClient(undefined, () => Promise.resolve({ id: 42 })), resolver, { date: "2026-04-30", text: "Good session today." });
83
+ expect(result.isError).toBeUndefined();
84
+ expect(result.content[0].text).toContain("id=42");
85
+ expect(result.content[0].text).toContain("Good session today");
86
+ });
87
+ it("returns isError when date missing", async () => {
88
+ const result = await addJournalEntry(makeClient(), resolver, { text: "no date" });
89
+ expect(result.isError).toBe(true);
90
+ });
91
+ it("returns isError when text missing", async () => {
92
+ const result = await addJournalEntry(makeClient(), resolver, { date: "2026-04-30" });
93
+ expect(result.isError).toBe(true);
94
+ });
95
+ it("returns isError on API failure", async () => {
96
+ const result = await addJournalEntry(makeClient(undefined, () => Promise.reject(new Error("500"))), resolver, { date: "2026-04-30", text: "test" });
97
+ expect(result.isError).toBe(true);
98
+ });
99
+ });
100
+ //# sourceMappingURL=journal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.test.js","sourceRoot":"","sources":["../../src/tools/journal.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { VantageClient } from "../client.js";
2
+ import { UserResolver, ToolResult } from "../user.js";
3
+ export declare function listQcAlgorithms(client: VantageClient, _resolver: UserResolver, _input: Record<string, unknown>): Promise<ToolResult>;
4
+ export declare function getQcAlgorithm(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
5
+ export declare function getAlgorithmFile(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
6
+ export declare function createQcAlgorithm(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
7
+ export declare function updateQcAlgorithm(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
8
+ export declare function listStrategyInstances(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
9
+ export declare function getStrategyInstance(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
10
+ export declare function launchStrategy(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
11
+ export declare function stopStrategy(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
12
+ export declare function getStrategyLogs(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
13
+ export declare function getStrategyStats(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
14
+ export declare function getStrategyOrders(client: VantageClient, _resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
@@ -0,0 +1,278 @@
1
+ import { makeErrorResult } from "../user.js";
2
+ function parseOrdersCsv(csv) {
3
+ const lines = csv.trim().split("\n");
4
+ if (lines.length <= 1)
5
+ return "No orders in export.";
6
+ const header = lines[0];
7
+ const cols = header.split(",").map((c) => c.trim());
8
+ const rows = lines.slice(1).map((l) => {
9
+ const vals = l.split(",");
10
+ return Object.fromEntries(cols.map((c, i) => [c, vals[i]?.trim() ?? ""]));
11
+ });
12
+ const summary = rows
13
+ .slice(0, 20)
14
+ .map((r) => {
15
+ const time = r["Time"] ?? r["Date"] ?? r["EntryTime"] ?? "?";
16
+ const sym = r["Symbol"] ?? r["Ticker"] ?? "?";
17
+ const dir = r["Direction"] ?? r["Action"] ?? "?";
18
+ const qty = r["Quantity"] ?? r["Qty"] ?? "?";
19
+ const price = r["FillPrice"] ?? r["Price"] ?? "?";
20
+ const pnl = r["PnL"] ?? r["NetProfit"] ?? "";
21
+ return `• [${time}] ${dir} ${sym} qty=${qty} @${price}${pnl ? ` pnl=${pnl}` : ""}`;
22
+ })
23
+ .join("\n");
24
+ const trailer = rows.length > 20 ? `\n… and ${rows.length - 20} more` : "";
25
+ return `${rows.length} order(s):\n${summary}${trailer}`;
26
+ }
27
+ export async function listQcAlgorithms(client, _resolver, _input) {
28
+ try {
29
+ const algos = await client.get("/api/qc-algorithms");
30
+ if (!algos.length) {
31
+ return { content: [{ type: "text", text: "No QC algorithms found. Use create_qc_algorithm to create one." }, { type: "text", text: "[]" }] };
32
+ }
33
+ const lines = algos.map((a) => `• id=${a.id} "${a.name ?? "?"}" (updated ${a.updatedAt ?? "?"})`);
34
+ return {
35
+ content: [
36
+ { type: "text", text: `${algos.length} algorithm(s):\n${lines.join("\n")}` },
37
+ { type: "text", text: JSON.stringify(algos, null, 2) },
38
+ ],
39
+ };
40
+ }
41
+ catch (err) {
42
+ return makeErrorResult(err);
43
+ }
44
+ }
45
+ export async function getQcAlgorithm(client, _resolver, input) {
46
+ const algorithmId = String(input.algorithmId ?? "");
47
+ if (!algorithmId)
48
+ return makeErrorResult(new Error("algorithmId is required"));
49
+ try {
50
+ const algo = await client.get(`/api/qc-algorithms/${algorithmId}`);
51
+ const files = algo.files ?? [];
52
+ const summary = `Algorithm "${algo.name ?? "?"}" (id=${algo.id}), ${files.length} file(s): ${files.join(", ")}`;
53
+ return {
54
+ content: [
55
+ { type: "text", text: summary },
56
+ { type: "text", text: JSON.stringify(algo, null, 2) },
57
+ ],
58
+ };
59
+ }
60
+ catch (err) {
61
+ return makeErrorResult(err);
62
+ }
63
+ }
64
+ export async function getAlgorithmFile(client, _resolver, input) {
65
+ const algorithmId = String(input.algorithmId ?? "");
66
+ const filename = String(input.filename ?? "");
67
+ if (!algorithmId || !filename)
68
+ return makeErrorResult(new Error("algorithmId and filename are required"));
69
+ try {
70
+ const content = await client.getText(`/api/qc-algorithms/${algorithmId}/files/${encodeURIComponent(filename)}`);
71
+ const lines = content.split("\n").length;
72
+ return {
73
+ content: [
74
+ { type: "text", text: `${filename} (${lines} lines):` },
75
+ { type: "text", text: content },
76
+ ],
77
+ };
78
+ }
79
+ catch (err) {
80
+ return makeErrorResult(err);
81
+ }
82
+ }
83
+ export async function createQcAlgorithm(client, _resolver, input) {
84
+ const name = String(input.name ?? "");
85
+ if (!name)
86
+ return makeErrorResult(new Error("name is required"));
87
+ const files = input.files;
88
+ try {
89
+ const algo = await client.post("/api/qc-algorithms", { name, files: files ?? [] });
90
+ return {
91
+ content: [
92
+ { type: "text", text: `Algorithm "${name}" created with id=${algo.id}` },
93
+ { type: "text", text: JSON.stringify(algo, null, 2) },
94
+ ],
95
+ };
96
+ }
97
+ catch (err) {
98
+ return makeErrorResult(err);
99
+ }
100
+ }
101
+ export async function updateQcAlgorithm(client, _resolver, input) {
102
+ const algorithmId = String(input.algorithmId ?? "");
103
+ if (!algorithmId)
104
+ return makeErrorResult(new Error("algorithmId is required"));
105
+ const files = input.files;
106
+ if (!files?.length)
107
+ return makeErrorResult(new Error("files array is required"));
108
+ try {
109
+ const algo = await client.patch(`/api/qc-algorithms/${algorithmId}`, { files });
110
+ const fileNames = files.map((f) => f.filename).join(", ");
111
+ return {
112
+ content: [
113
+ { type: "text", text: `Algorithm ${algorithmId} updated — files: ${fileNames}` },
114
+ { type: "text", text: JSON.stringify(algo, null, 2) },
115
+ ],
116
+ };
117
+ }
118
+ catch (err) {
119
+ return makeErrorResult(err);
120
+ }
121
+ }
122
+ export async function listStrategyInstances(client, _resolver, input) {
123
+ try {
124
+ const params = new URLSearchParams();
125
+ if (input.status)
126
+ params.set("status", String(input.status));
127
+ const qs = params.toString() ? `?${params}` : "";
128
+ const instances = await client.get(`/api/strategy-instances${qs}`);
129
+ if (!instances.length) {
130
+ return { content: [{ type: "text", text: "No strategy instances found." }, { type: "text", text: "[]" }] };
131
+ }
132
+ const lines = instances.map((i) => `• id=${i.id} "${i.algorithmName ?? "?"}" [${i.status ?? "?"}] mode=${i.mode ?? "?"} created=${i.createdAt ?? "?"}`);
133
+ return {
134
+ content: [
135
+ { type: "text", text: `${instances.length} instance(s):\n${lines.join("\n")}` },
136
+ { type: "text", text: JSON.stringify(instances, null, 2) },
137
+ ],
138
+ };
139
+ }
140
+ catch (err) {
141
+ return makeErrorResult(err);
142
+ }
143
+ }
144
+ export async function getStrategyInstance(client, _resolver, input) {
145
+ const instanceId = String(input.instanceId ?? "");
146
+ if (!instanceId)
147
+ return makeErrorResult(new Error("instanceId is required"));
148
+ try {
149
+ const inst = await client.get(`/api/strategy-instances/${instanceId}`);
150
+ const progress = inst.progress != null ? ` (${(inst.progress * 100).toFixed(0)}%)` : "";
151
+ const errStr = inst.error ? ` ERROR: ${inst.error}` : "";
152
+ const summary = `Instance ${instanceId}: "${inst.algorithmName ?? "?"}" [${inst.status ?? "?"}]${progress} mode=${inst.mode ?? "?"}${errStr}`;
153
+ return {
154
+ content: [
155
+ { type: "text", text: summary },
156
+ { type: "text", text: JSON.stringify(inst, null, 2) },
157
+ ],
158
+ };
159
+ }
160
+ catch (err) {
161
+ return makeErrorResult(err);
162
+ }
163
+ }
164
+ export async function launchStrategy(client, _resolver, input) {
165
+ const algorithmId = String(input.algorithmId ?? "");
166
+ const mode = String(input.mode ?? "backtest");
167
+ if (!algorithmId)
168
+ return makeErrorResult(new Error("algorithmId is required"));
169
+ const body = { algorithmId, mode };
170
+ if (input.startDate)
171
+ body.startDate = String(input.startDate);
172
+ if (input.endDate)
173
+ body.endDate = String(input.endDate);
174
+ if (input.config)
175
+ body.config = input.config;
176
+ try {
177
+ const inst = await client.post("/api/strategy-instances", body);
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: `Strategy launched: instanceId=${inst.id}, mode=${mode}, status=${inst.status ?? "?"}. Use get_strategy_logs(instanceId: "${inst.id}") to monitor.`,
183
+ },
184
+ { type: "text", text: JSON.stringify(inst, null, 2) },
185
+ ],
186
+ };
187
+ }
188
+ catch (err) {
189
+ return makeErrorResult(err);
190
+ }
191
+ }
192
+ export async function stopStrategy(client, _resolver, input) {
193
+ const instanceId = String(input.instanceId ?? "");
194
+ if (!instanceId)
195
+ return makeErrorResult(new Error("instanceId is required"));
196
+ try {
197
+ await client.delete(`/api/strategy-instances/${instanceId}`);
198
+ return {
199
+ content: [{ type: "text", text: `Strategy instance ${instanceId} stopped.` }],
200
+ };
201
+ }
202
+ catch (err) {
203
+ return makeErrorResult(err);
204
+ }
205
+ }
206
+ export async function getStrategyLogs(client, _resolver, input) {
207
+ const instanceId = String(input.instanceId ?? "");
208
+ if (!instanceId)
209
+ return makeErrorResult(new Error("instanceId is required"));
210
+ const tail = input.tail ? Number(input.tail) : 100;
211
+ try {
212
+ const raw = await client.getText(`/api/strategy-instances/${instanceId}/logs`);
213
+ if (!raw.trim()) {
214
+ return { content: [{ type: "text", text: `No logs yet for instance ${instanceId}.` }] };
215
+ }
216
+ const lines = raw.trim().split("\n");
217
+ const slice = lines.slice(-tail);
218
+ const header = lines.length > tail ? `(showing last ${tail} of ${lines.length} lines)\n` : "";
219
+ return {
220
+ content: [{ type: "text", text: `${header}${slice.join("\n")}` }],
221
+ };
222
+ }
223
+ catch (err) {
224
+ return makeErrorResult(err);
225
+ }
226
+ }
227
+ export async function getStrategyStats(client, _resolver, input) {
228
+ const instanceId = String(input.instanceId ?? "");
229
+ if (!instanceId)
230
+ return makeErrorResult(new Error("instanceId is required"));
231
+ try {
232
+ const stats = await client.get(`/api/strategy-instances/${instanceId}/export/stats.json`);
233
+ const pnlStr = stats.netPnl != null ? `${stats.netPnl >= 0 ? "+" : ""}${stats.netPnl.toFixed(2)}` : "?";
234
+ const wrStr = stats.winRate != null ? `${(stats.winRate * 100).toFixed(1)}%` : "?";
235
+ const pfStr = stats.profitFactor != null ? stats.profitFactor.toFixed(2) : "?";
236
+ const shStr = stats.sharpe != null ? stats.sharpe.toFixed(2) : "?";
237
+ const ddStr = stats.maxDrawdown != null ? stats.maxDrawdown.toFixed(2) : "?";
238
+ const summary = [
239
+ `Net P&L: ${pnlStr}`,
240
+ `Trades: ${stats.totalTrades ?? "?"}`,
241
+ `Win rate: ${wrStr}`,
242
+ `Profit factor: ${pfStr}`,
243
+ `Sharpe: ${shStr}`,
244
+ `Max drawdown: ${ddStr}`,
245
+ ].join(" | ");
246
+ return {
247
+ content: [
248
+ { type: "text", text: summary },
249
+ { type: "text", text: JSON.stringify(stats, null, 2) },
250
+ ],
251
+ };
252
+ }
253
+ catch (err) {
254
+ return makeErrorResult(err);
255
+ }
256
+ }
257
+ export async function getStrategyOrders(client, _resolver, input) {
258
+ const instanceId = String(input.instanceId ?? "");
259
+ if (!instanceId)
260
+ return makeErrorResult(new Error("instanceId is required"));
261
+ try {
262
+ const csv = await client.getText(`/api/strategy-instances/${instanceId}/export/orders.csv`);
263
+ if (!csv.trim()) {
264
+ return { content: [{ type: "text", text: `No orders exported for instance ${instanceId}.` }] };
265
+ }
266
+ const summary = parseOrdersCsv(csv);
267
+ return {
268
+ content: [
269
+ { type: "text", text: summary },
270
+ { type: "text", text: csv },
271
+ ],
272
+ };
273
+ }
274
+ catch (err) {
275
+ return makeErrorResult(err);
276
+ }
277
+ }
278
+ //# sourceMappingURL=qc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qc.js","sourceRoot":"","sources":["../../src/tools/qc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};