@vantagestack/mcp-server 0.1.59 → 0.1.63
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.
- package/dist/client.d.ts +25 -0
- package/dist/client.js +172 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1424 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/account-deletion.d.ts +6 -0
- package/dist/tools/account-deletion.js +92 -0
- package/dist/tools/account-deletion.js.map +1 -0
- package/dist/tools/account-health.d.ts +21 -0
- package/dist/tools/account-health.js +84 -0
- package/dist/tools/account-health.js.map +1 -0
- package/dist/tools/account.d.ts +19 -0
- package/dist/tools/account.js +291 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/account.test.d.ts +1 -0
- package/dist/tools/account.test.js +213 -0
- package/dist/tools/account.test.js.map +1 -0
- package/dist/tools/admin-test.d.ts +18 -0
- package/dist/tools/admin-test.js +108 -0
- package/dist/tools/admin-test.js.map +1 -0
- package/dist/tools/calendar.d.ts +4 -0
- package/dist/tools/calendar.js +85 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/calendar.test.d.ts +1 -0
- package/dist/tools/calendar.test.js +62 -0
- package/dist/tools/calendar.test.js.map +1 -0
- package/dist/tools/canary.d.ts +4 -0
- package/dist/tools/canary.js +25 -0
- package/dist/tools/canary.js.map +1 -0
- package/dist/tools/canary.test.d.ts +1 -0
- package/dist/tools/canary.test.js +46 -0
- package/dist/tools/canary.test.js.map +1 -0
- package/dist/tools/contract-configs.d.ts +9 -0
- package/dist/tools/contract-configs.js +187 -0
- package/dist/tools/contract-configs.js.map +1 -0
- package/dist/tools/contract-configs.test.d.ts +1 -0
- package/dist/tools/contract-configs.test.js +245 -0
- package/dist/tools/contract-configs.test.js.map +1 -0
- package/dist/tools/copier.d.ts +11 -0
- package/dist/tools/copier.js +52 -0
- package/dist/tools/copier.js.map +1 -0
- package/dist/tools/copier.test.d.ts +1 -0
- package/dist/tools/copier.test.js +75 -0
- package/dist/tools/copier.test.js.map +1 -0
- package/dist/tools/groups.d.ts +14 -0
- package/dist/tools/groups.js +44 -0
- package/dist/tools/groups.js.map +1 -0
- package/dist/tools/groups.test.d.ts +1 -0
- package/dist/tools/groups.test.js +72 -0
- package/dist/tools/groups.test.js.map +1 -0
- package/dist/tools/ip-allowlist.d.ts +6 -0
- package/dist/tools/ip-allowlist.js +69 -0
- package/dist/tools/ip-allowlist.js.map +1 -0
- package/dist/tools/journal.d.ts +6 -0
- package/dist/tools/journal.js +110 -0
- package/dist/tools/journal.js.map +1 -0
- package/dist/tools/journal.test.d.ts +1 -0
- package/dist/tools/journal.test.js +100 -0
- package/dist/tools/journal.test.js.map +1 -0
- package/dist/tools/latency.d.ts +3 -0
- package/dist/tools/latency.js +54 -0
- package/dist/tools/latency.js.map +1 -0
- package/dist/tools/market-history.d.ts +4 -0
- package/dist/tools/market-history.js +50 -0
- package/dist/tools/market-history.js.map +1 -0
- package/dist/tools/market-hours.d.ts +3 -0
- package/dist/tools/market-hours.js +19 -0
- package/dist/tools/market-hours.js.map +1 -0
- package/dist/tools/paper-trading.d.ts +12 -0
- package/dist/tools/paper-trading.js +284 -0
- package/dist/tools/paper-trading.js.map +1 -0
- package/dist/tools/paper-trading.test.d.ts +1 -0
- package/dist/tools/paper-trading.test.js +153 -0
- package/dist/tools/paper-trading.test.js.map +1 -0
- package/dist/tools/ping.d.ts +8 -0
- package/dist/tools/ping.js +22 -0
- package/dist/tools/ping.js.map +1 -0
- package/dist/tools/ping.test.d.ts +1 -0
- package/dist/tools/ping.test.js +25 -0
- package/dist/tools/ping.test.js.map +1 -0
- package/dist/tools/qc.d.ts +18 -0
- package/dist/tools/qc.js +418 -0
- package/dist/tools/qc.js.map +1 -0
- package/dist/tools/qc.test.d.ts +1 -0
- package/dist/tools/qc.test.js +218 -0
- package/dist/tools/qc.test.js.map +1 -0
- package/dist/tools/read.d.ts +7 -0
- package/dist/tools/read.js +154 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/read.test.d.ts +1 -0
- package/dist/tools/read.test.js +102 -0
- package/dist/tools/read.test.js.map +1 -0
- package/dist/tools/risk.d.ts +7 -0
- package/dist/tools/risk.js +108 -0
- package/dist/tools/risk.js.map +1 -0
- package/dist/tools/signal-templates.d.ts +6 -0
- package/dist/tools/signal-templates.js +90 -0
- package/dist/tools/signal-templates.js.map +1 -0
- package/dist/tools/signals.d.ts +8 -0
- package/dist/tools/signals.js +318 -0
- package/dist/tools/signals.js.map +1 -0
- package/dist/tools/signals.test.d.ts +1 -0
- package/dist/tools/signals.test.js +92 -0
- package/dist/tools/signals.test.js.map +1 -0
- package/dist/tools/sync-accounts.d.ts +18 -0
- package/dist/tools/sync-accounts.js +68 -0
- package/dist/tools/sync-accounts.js.map +1 -0
- package/dist/tools/trade.d.ts +3 -0
- package/dist/tools/trade.js +49 -0
- package/dist/tools/trade.js.map +1 -0
- package/dist/user.d.ts +19 -0
- package/dist/user.js +21 -0
- package/dist/user.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { sendSignal, exitPositions, flattenGroup } from "./signals.js";
|
|
3
|
+
const makeClient = (postWebhookImpl, postImpl) => ({
|
|
4
|
+
postWebhook: postWebhookImpl ?? (() => Promise.resolve({ success: true, dispatched: 2, total: 2, envelopeSignalId: 99, results: [] })),
|
|
5
|
+
post: postImpl ?? (() => Promise.resolve({ success: true, positionsFlattened: 1, ordersCancelled: 2 })),
|
|
6
|
+
});
|
|
7
|
+
const makeResolver = (userId = 42) => ({ resolve: async () => userId });
|
|
8
|
+
describe("send_signal", () => {
|
|
9
|
+
it("dispatches signal and returns summary", async () => {
|
|
10
|
+
const result = await sendSignal(makeClient(), makeResolver(), {
|
|
11
|
+
groupId: "7",
|
|
12
|
+
secret: "abc",
|
|
13
|
+
action: "buy",
|
|
14
|
+
ticker: "MYM1!",
|
|
15
|
+
quantity: 1,
|
|
16
|
+
});
|
|
17
|
+
expect(result.isError).toBeUndefined();
|
|
18
|
+
expect(result.content[0].text).toContain("2 of 2 accounts executed");
|
|
19
|
+
expect(result.content[0].text).toContain("99");
|
|
20
|
+
});
|
|
21
|
+
it("returns isError for invalid action", async () => {
|
|
22
|
+
const result = await sendSignal(makeClient(), makeResolver(), {
|
|
23
|
+
groupId: "7", secret: "abc", action: "short", ticker: "MYM1!",
|
|
24
|
+
});
|
|
25
|
+
expect(result.isError).toBe(true);
|
|
26
|
+
expect(result.content[0].text).toContain("buy, sell, exit");
|
|
27
|
+
});
|
|
28
|
+
it("returns isError for invalid orderType", async () => {
|
|
29
|
+
const result = await sendSignal(makeClient(), makeResolver(), {
|
|
30
|
+
groupId: "7", secret: "abc", action: "buy", ticker: "MYM1!", orderType: "twap",
|
|
31
|
+
});
|
|
32
|
+
expect(result.isError).toBe(true);
|
|
33
|
+
expect(result.content[0].text).toContain("market, limit, stop");
|
|
34
|
+
});
|
|
35
|
+
it("returns isError when API fails", async () => {
|
|
36
|
+
const client = makeClient(() => Promise.reject(new Error("503")));
|
|
37
|
+
const result = await sendSignal(client, makeResolver(), {
|
|
38
|
+
groupId: "7", secret: "abc", action: "buy", ticker: "MYM1!",
|
|
39
|
+
});
|
|
40
|
+
expect(result.isError).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it("returns isError when groupId missing", async () => {
|
|
43
|
+
const result = await sendSignal(makeClient(), makeResolver(), {
|
|
44
|
+
action: "buy", ticker: "MYM1!",
|
|
45
|
+
});
|
|
46
|
+
expect(result.isError).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("exit_positions", () => {
|
|
50
|
+
it("sends action=exit and returns summary", async () => {
|
|
51
|
+
const client = makeClient(() => Promise.resolve({ success: true, dispatched: 1, total: 1, results: [] }));
|
|
52
|
+
const result = await exitPositions(client, makeResolver(), {
|
|
53
|
+
groupId: "7", secret: "abc",
|
|
54
|
+
});
|
|
55
|
+
expect(result.isError).toBeUndefined();
|
|
56
|
+
expect(result.content[0].text).toContain("accounts received exit signal");
|
|
57
|
+
});
|
|
58
|
+
it("returns isError when groupId missing", async () => {
|
|
59
|
+
const result = await exitPositions(makeClient(), makeResolver(), {});
|
|
60
|
+
expect(result.isError).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe("flatten_group", () => {
|
|
64
|
+
it("returns isError without confirm:true", async () => {
|
|
65
|
+
const result = await flattenGroup(makeClient(), makeResolver(), {
|
|
66
|
+
groupId: "7",
|
|
67
|
+
});
|
|
68
|
+
expect(result.isError).toBe(true);
|
|
69
|
+
expect(result.content[0].text).toContain("confirm: true");
|
|
70
|
+
});
|
|
71
|
+
it("returns isError when confirm is false", async () => {
|
|
72
|
+
const result = await flattenGroup(makeClient(), makeResolver(), {
|
|
73
|
+
groupId: "7", confirm: false,
|
|
74
|
+
});
|
|
75
|
+
expect(result.isError).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
it("calls flatten endpoint and returns summary with confirm:true", async () => {
|
|
78
|
+
const result = await flattenGroup(makeClient(), makeResolver(), {
|
|
79
|
+
groupId: "7", confirm: true,
|
|
80
|
+
});
|
|
81
|
+
expect(result.isError).toBeUndefined();
|
|
82
|
+
expect(result.content[0].text).toContain("Closed 1 position(s), cancelled 2 order(s)");
|
|
83
|
+
});
|
|
84
|
+
it("returns isError when API fails", async () => {
|
|
85
|
+
const client = makeClient(undefined, () => Promise.reject(new Error("500")));
|
|
86
|
+
const result = await flattenGroup(client, makeResolver(), {
|
|
87
|
+
groupId: "7", confirm: true,
|
|
88
|
+
});
|
|
89
|
+
expect(result.isError).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=signals.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.test.js","sourceRoot":"","sources":["../../src/tools/signals.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { VantageClient } from "../client.js";
|
|
2
|
+
import { UserResolver, ToolResult } from "../user.js";
|
|
3
|
+
/**
|
|
4
|
+
* ACCT-DISC-LIVE-02 — `sync_connection_accounts` MCP tool.
|
|
5
|
+
*
|
|
6
|
+
* Triggers an on-demand broker /account/list refresh for one connection so
|
|
7
|
+
* newly-funded accounts (Topstep eval activations, prop-firm passes, new
|
|
8
|
+
* Tradovate sub-accounts) surface in VantagePipe within seconds — no need
|
|
9
|
+
* to wait for the periodic 15-min sweep, no need to click Reconnect on the
|
|
10
|
+
* connection-detail page.
|
|
11
|
+
*
|
|
12
|
+
* Server-side throttle: VP returns syncStatus="cached" if the same connection
|
|
13
|
+
* was synced <30s ago. Calling this tool repeatedly is free.
|
|
14
|
+
*
|
|
15
|
+
* Returns the post-sync account list so the caller doesn't need a second
|
|
16
|
+
* round-trip.
|
|
17
|
+
*/
|
|
18
|
+
export declare function syncConnectionAccounts(client: VantageClient, resolver: UserResolver, input: Record<string, unknown>): Promise<ToolResult>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { makeErrorResult } from "../user.js";
|
|
2
|
+
/**
|
|
3
|
+
* ACCT-DISC-LIVE-02 — `sync_connection_accounts` MCP tool.
|
|
4
|
+
*
|
|
5
|
+
* Triggers an on-demand broker /account/list refresh for one connection so
|
|
6
|
+
* newly-funded accounts (Topstep eval activations, prop-firm passes, new
|
|
7
|
+
* Tradovate sub-accounts) surface in VantagePipe within seconds — no need
|
|
8
|
+
* to wait for the periodic 15-min sweep, no need to click Reconnect on the
|
|
9
|
+
* connection-detail page.
|
|
10
|
+
*
|
|
11
|
+
* Server-side throttle: VP returns syncStatus="cached" if the same connection
|
|
12
|
+
* was synced <30s ago. Calling this tool repeatedly is free.
|
|
13
|
+
*
|
|
14
|
+
* Returns the post-sync account list so the caller doesn't need a second
|
|
15
|
+
* round-trip.
|
|
16
|
+
*/
|
|
17
|
+
export async function syncConnectionAccounts(client, resolver, input) {
|
|
18
|
+
try {
|
|
19
|
+
const connId = input?.connectionId;
|
|
20
|
+
if (typeof connId !== "number" || !Number.isInteger(connId) || connId <= 0) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: "text", text: "connectionId (positive integer) is required." }],
|
|
23
|
+
isError: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const userId = await resolver.resolve(client);
|
|
27
|
+
const res = await client.post(`/api/account/${userId}/connections/${connId}/sync-accounts`, {});
|
|
28
|
+
const lines = [];
|
|
29
|
+
switch (res.syncStatus) {
|
|
30
|
+
case "ok":
|
|
31
|
+
lines.push(`✅ Synced connection ${connId} with broker.`);
|
|
32
|
+
break;
|
|
33
|
+
case "cached":
|
|
34
|
+
lines.push(`⏱️ Connection ${connId} was synced recently (<30s ago) — returning cached account list.`);
|
|
35
|
+
break;
|
|
36
|
+
case "not_supported":
|
|
37
|
+
lines.push(`ℹ️ Broker for connection ${connId} does not have a periodic-sync adapter (LEAN). No sync attempted.`);
|
|
38
|
+
break;
|
|
39
|
+
case "auth_dead":
|
|
40
|
+
lines.push(`🔴 Connection ${connId}: stored credentials rejected by broker. The user needs to click Reconnect.`);
|
|
41
|
+
break;
|
|
42
|
+
case "failed":
|
|
43
|
+
lines.push(`⚠️ Sync failed for connection ${connId}: ${res.error ?? "unknown error"}. Returning last-known account list.`);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
if (res.lastSyncedAt) {
|
|
47
|
+
lines.push(`Last synced: ${res.lastSyncedAt}`);
|
|
48
|
+
}
|
|
49
|
+
lines.push("");
|
|
50
|
+
if (!res.accounts?.length) {
|
|
51
|
+
lines.push("_No accounts on this connection._");
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
lines.push(`### ${res.accounts.length} account${res.accounts.length === 1 ? "" : "s"}:`);
|
|
55
|
+
for (const a of res.accounts) {
|
|
56
|
+
const env = a.environment ? ` [${a.environment}]` : "";
|
|
57
|
+
const off = a.isEnabled ? "" : " (disabled)";
|
|
58
|
+
const stat = a.brokerStatus ? ` — ${a.brokerStatus}` : "";
|
|
59
|
+
lines.push(`- **${a.accountSpec ?? a.accountId}** (#${a.accountId})${env}${off}${stat}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return makeErrorResult(e);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=sync-accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-accounts.js","sourceRoot":"","sources":["../../src/tools/sync-accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// TRD-08 — MCP tool wrapping GET /api/trades/{id}/detail.
|
|
2
|
+
//
|
|
3
|
+
// Read-only counterpart to inspect_signal / get_signal_history. Returns the
|
|
4
|
+
// full per-trade aggregation (trade row, parent signal, account block,
|
|
5
|
+
// execution timeline, status log, broker logs, slippage, siblings).
|
|
6
|
+
import { makeErrorResult } from "../user.js";
|
|
7
|
+
export async function getTrade(client, _resolver, input) {
|
|
8
|
+
try {
|
|
9
|
+
const tradeId = Number(input.tradeId);
|
|
10
|
+
if (!Number.isFinite(tradeId) || tradeId <= 0)
|
|
11
|
+
return makeErrorResult(new Error("tradeId must be a positive integer"));
|
|
12
|
+
const r = await client.get(`/api/trades/${tradeId}/detail`);
|
|
13
|
+
const t = r.trade ?? {};
|
|
14
|
+
const a = r.account ?? {};
|
|
15
|
+
const sig = r.signal;
|
|
16
|
+
const accountStr = a.label
|
|
17
|
+
? `${a.label} · ${a.spec ?? a.rawId ?? ""}`
|
|
18
|
+
: (a.deleted ? "Deleted account" : (a.spec ?? a.rawId ?? "—"));
|
|
19
|
+
const pnl = t.pnlDollars;
|
|
20
|
+
const pnlStr = pnl == null
|
|
21
|
+
? "OPEN"
|
|
22
|
+
: (pnl > 0 ? `+$${pnl.toFixed(2)}` : (pnl < 0 ? `-$${Math.abs(pnl).toFixed(2)}` : "$0.00"));
|
|
23
|
+
const summary = [
|
|
24
|
+
`Trade #${t.id} · ${t.symbol} ${t.side?.toUpperCase()} ${t.quantity} · ${pnlStr}`,
|
|
25
|
+
`Account: ${accountStr} [${a.brokerType ?? "?"}]`,
|
|
26
|
+
sig ? `Signal: #${sig.id} ${sig.action} ${sig.ticker} (${sig.status})` : "Signal: none (CSV import or orphan)",
|
|
27
|
+
r.group ? `Group: ${r.group.name} (#${r.group.id})` : "",
|
|
28
|
+
`Entry: ${t.entryPrice ?? "?"} @ ${t.entryAtUtc ?? "?"}`,
|
|
29
|
+
t.exitPrice != null ? `Exit: ${t.exitPrice} @ ${t.exitAtUtc ?? "?"}` : "Exit: — (still open)",
|
|
30
|
+
].filter(Boolean).join("\n");
|
|
31
|
+
const execLines = (r.execution ?? [])
|
|
32
|
+
.map((s, i) => ` ${i + 1}. ${s.label ?? s.kind} @ ${s.t}${s.deltaMs != null ? ` (+${s.deltaMs}ms)` : ""}`)
|
|
33
|
+
.join("\n");
|
|
34
|
+
const execSection = execLines ? `\n\nExecution:\n${execLines}` : "";
|
|
35
|
+
const sibSection = (r.siblings ?? []).length > 0
|
|
36
|
+
? `\n\nFan-out siblings: ${(r.siblings ?? []).join(", ")}`
|
|
37
|
+
: "";
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{ type: "text", text: summary + execSection + sibSection },
|
|
41
|
+
{ type: "text", text: JSON.stringify(r, null, 2) },
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
return makeErrorResult(err);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=trade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.js","sourceRoot":"","sources":["../../src/tools/trade.ts"],"names":[],"mappings":"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"}
|
package/dist/user.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { VantageClient } from "./client.js";
|
|
2
|
+
export declare class UserResolver {
|
|
3
|
+
private userId;
|
|
4
|
+
resolve(client: VantageClient): Promise<number>;
|
|
5
|
+
}
|
|
6
|
+
export declare function makeErrorResult(err: unknown): {
|
|
7
|
+
content: Array<{
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}>;
|
|
11
|
+
isError: true;
|
|
12
|
+
};
|
|
13
|
+
export type ToolResult = {
|
|
14
|
+
content: Array<{
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}>;
|
|
18
|
+
isError?: true;
|
|
19
|
+
};
|
package/dist/user.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { apiErrorText } from "./client.js";
|
|
2
|
+
export class UserResolver {
|
|
3
|
+
userId = null;
|
|
4
|
+
async resolve(client) {
|
|
5
|
+
if (this.userId !== null)
|
|
6
|
+
return this.userId;
|
|
7
|
+
const me = await client.get("/api/auth/me");
|
|
8
|
+
if (!me.authenticated || !me.userId) {
|
|
9
|
+
throw new Error("API key authenticated but /api/auth/me returned no userId. Check key validity.");
|
|
10
|
+
}
|
|
11
|
+
this.userId = me.userId;
|
|
12
|
+
return this.userId;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function makeErrorResult(err) {
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: "text", text: apiErrorText(err) }],
|
|
18
|
+
isError: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=user.js.map
|
package/dist/user.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../src/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAC;AAO1D,MAAM,OAAO,YAAY;IACf,MAAM,GAAkB,IAAI,CAAC;IAErC,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAa,cAAc,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,GAAY;IAI1C,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED