@huskly/ibkr-client 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -51
- package/dist/ibkr/ibkrApiTypes.d.ts +74 -0
- package/dist/ibkr/ibkrApiTypes.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.d.ts +23 -2
- package/dist/ibkr/ibkrClient.d.ts.map +1 -1
- package/dist/ibkr/ibkrClient.js +347 -5
- package/dist/ibkr/ibkrClient.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +67 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -6
- package/dist/types.js.map +1 -1
- package/package.json +4 -10
- package/dist/cli/account.d.ts +0 -7
- package/dist/cli/account.d.ts.map +0 -1
- package/dist/cli/account.js +0 -27
- package/dist/cli/account.js.map +0 -1
- package/dist/cli/index.d.ts +0 -3
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -50
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/orders.d.ts +0 -4
- package/dist/cli/orders.d.ts.map +0 -1
- package/dist/cli/orders.js +0 -5
- package/dist/cli/orders.js.map +0 -1
- package/dist/cli/positions.d.ts +0 -12
- package/dist/cli/positions.d.ts.map +0 -1
- package/dist/cli/positions.js +0 -106
- package/dist/cli/positions.js.map +0 -1
- package/dist/cli/quote.d.ts +0 -4
- package/dist/cli/quote.d.ts.map +0 -1
- package/dist/cli/quote.js +0 -5
- package/dist/cli/quote.js.map +0 -1
- package/dist/cli/shared.d.ts +0 -12
- package/dist/cli/shared.d.ts.map +0 -1
- package/dist/cli/shared.js +0 -31
- package/dist/cli/shared.js.map +0 -1
- package/dist/format.d.ts +0 -13
- package/dist/format.d.ts.map +0 -1
- package/dist/format.js +0 -32
- package/dist/format.js.map +0 -1
package/dist/types.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Broker-neutral domain types
|
|
2
|
+
* Broker-neutral domain types exposed by the IBKR client.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* serve either broker. The field names mirror huskly-cli's `getAccountBalances`
|
|
8
|
-
* / `SchwabPosition` shapes to keep that future merge mechanical.
|
|
4
|
+
* The client normalizes raw IBKR JSON into these shapes so consumers do not
|
|
5
|
+
* depend on provider-specific response payloads. The field names align with
|
|
6
|
+
* the broker-neutral interfaces consumed by huskly-cli.
|
|
9
7
|
*/
|
|
10
|
-
export type
|
|
8
|
+
export type BrokerInstrumentSearchProjection = "symbol-search" | "symbol-regex" | "desc-search" | "desc-regex" | "search" | "fundamental";
|
|
11
9
|
export interface AuthStatus {
|
|
12
10
|
authenticated: boolean;
|
|
13
11
|
competing: boolean;
|
|
@@ -43,6 +41,60 @@ export interface BrokerInstrument {
|
|
|
43
41
|
exchange?: string;
|
|
44
42
|
assetType?: string;
|
|
45
43
|
}
|
|
44
|
+
export interface BrokerTransferItem {
|
|
45
|
+
instrument?: {
|
|
46
|
+
assetType?: string;
|
|
47
|
+
symbol?: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
};
|
|
50
|
+
amount?: number;
|
|
51
|
+
cost?: number;
|
|
52
|
+
transferItemType?: string;
|
|
53
|
+
feeType?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface BrokerTransaction {
|
|
56
|
+
activityId: string | number;
|
|
57
|
+
time: string;
|
|
58
|
+
type: string;
|
|
59
|
+
status: string;
|
|
60
|
+
subAccount?: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
netAmount: number;
|
|
63
|
+
transferItems?: BrokerTransferItem[];
|
|
64
|
+
}
|
|
65
|
+
export interface BrokerTransactionHistory {
|
|
66
|
+
accountNumber: string;
|
|
67
|
+
transactions: BrokerTransaction[];
|
|
68
|
+
}
|
|
69
|
+
export interface BrokerOrderLeg {
|
|
70
|
+
instrument?: {
|
|
71
|
+
symbol?: string;
|
|
72
|
+
};
|
|
73
|
+
instruction?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface BrokerOrder {
|
|
76
|
+
orderId?: string | number;
|
|
77
|
+
enteredTime?: string;
|
|
78
|
+
status?: string;
|
|
79
|
+
orderType?: string;
|
|
80
|
+
complexOrderStrategyType?: string;
|
|
81
|
+
quantity?: number;
|
|
82
|
+
filledQuantity?: number;
|
|
83
|
+
remainingQuantity?: number;
|
|
84
|
+
price?: number;
|
|
85
|
+
stopPrice?: number;
|
|
86
|
+
orderLegCollection?: BrokerOrderLeg[];
|
|
87
|
+
}
|
|
88
|
+
export interface BrokerOrdersOptions {
|
|
89
|
+
fromEnteredTime: Date;
|
|
90
|
+
toEnteredTime: Date;
|
|
91
|
+
status?: string;
|
|
92
|
+
maxResults?: number;
|
|
93
|
+
}
|
|
94
|
+
export interface BrokerAccountOrders {
|
|
95
|
+
accountNumber: string;
|
|
96
|
+
orders: BrokerOrder[];
|
|
97
|
+
}
|
|
46
98
|
export interface BrokerQuoteReference {
|
|
47
99
|
description?: string;
|
|
48
100
|
exchange?: string;
|
|
@@ -97,6 +149,8 @@ export interface OptionMarketQuote extends OptionContract {
|
|
|
97
149
|
ask: number;
|
|
98
150
|
mid: number;
|
|
99
151
|
delta: number;
|
|
152
|
+
volume: number | null;
|
|
153
|
+
openInterest: number | null;
|
|
100
154
|
}
|
|
101
155
|
export interface PriceHistoryRequest {
|
|
102
156
|
symbol: string;
|
|
@@ -111,8 +165,9 @@ export interface OptionQuoteRequest {
|
|
|
111
165
|
right: OptionRight;
|
|
112
166
|
}
|
|
113
167
|
/**
|
|
114
|
-
* The contract
|
|
115
|
-
*
|
|
168
|
+
* The broker-neutral contract implemented by {@link IbkrClient}. Kept
|
|
169
|
+
* intentionally small around account, position, quote, transaction, and order
|
|
170
|
+
* data needed by consumers.
|
|
116
171
|
*/
|
|
117
172
|
export interface BrokerClient {
|
|
118
173
|
getAuthStatus(): Promise<AuthStatus>;
|
|
@@ -120,5 +175,8 @@ export interface BrokerClient {
|
|
|
120
175
|
getAccountBalances(): Promise<AccountBalances>;
|
|
121
176
|
getPositions(symbol?: string): Promise<BrokerPosition[]>;
|
|
122
177
|
getQuotes(symbols: string[]): Promise<Record<string, BrokerQuote>>;
|
|
178
|
+
searchInstruments(symbol: string, projection?: BrokerInstrumentSearchProjection): Promise<BrokerInstrument[]>;
|
|
179
|
+
fetchTransactionHistory(startDate: Date, endDate: Date): Promise<BrokerTransactionHistory[]>;
|
|
180
|
+
fetchOrders(options: BrokerOrdersOptions): Promise<BrokerAccountOrders[]>;
|
|
123
181
|
}
|
|
124
182
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Broker-neutral domain types
|
|
2
|
+
* Broker-neutral domain types exposed by the IBKR client.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* serve either broker. The field names mirror huskly-cli's `getAccountBalances`
|
|
8
|
-
* / `SchwabPosition` shapes to keep that future merge mechanical.
|
|
4
|
+
* The client normalizes raw IBKR JSON into these shapes so consumers do not
|
|
5
|
+
* depend on provider-specific response payloads. The field names align with
|
|
6
|
+
* the broker-neutral interfaces consumed by huskly-cli.
|
|
9
7
|
*/
|
|
10
8
|
export {};
|
|
11
9
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@huskly/ibkr-client",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Interactive Brokers Web API client
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Interactive Brokers Web API client with OAuth 1.0a authentication",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -11,9 +11,6 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"bin": {
|
|
15
|
-
"ibkr-cli": "./dist/cli/index.js"
|
|
16
|
-
},
|
|
17
14
|
"files": [
|
|
18
15
|
"dist"
|
|
19
16
|
],
|
|
@@ -25,7 +22,6 @@
|
|
|
25
22
|
},
|
|
26
23
|
"scripts": {
|
|
27
24
|
"build": "tsc",
|
|
28
|
-
"dev": "tsx src/cli/index.ts",
|
|
29
25
|
"lint": "eslint src --ext .ts",
|
|
30
26
|
"lint:fix": "eslint src --ext .ts --fix",
|
|
31
27
|
"format": "prettier --write \"{src,test}/**/*.ts\"",
|
|
@@ -33,12 +29,10 @@
|
|
|
33
29
|
"typecheck": "tsc --noEmit",
|
|
34
30
|
"test": "tsc --noEmit -p tsconfig.test.json && node --import tsx --test test/**/*.test.ts",
|
|
35
31
|
"clean": "rm -rf dist",
|
|
36
|
-
"check": "
|
|
37
|
-
"prepublishOnly": "
|
|
32
|
+
"check": "yarn lint && yarn format:check && yarn typecheck",
|
|
33
|
+
"prepublishOnly": "yarn clean && yarn build"
|
|
38
34
|
},
|
|
39
35
|
"dependencies": {
|
|
40
|
-
"chalk": "^5.6.2",
|
|
41
|
-
"commander": "^15.0.0",
|
|
42
36
|
"dotenv": "^17.2.3",
|
|
43
37
|
"ibkr-client": "^1.0.4"
|
|
44
38
|
},
|
package/dist/cli/account.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { BrokerName } from "../types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Show auth status and account balances.
|
|
4
|
-
* Ports the account-summary portion of main.py's main().
|
|
5
|
-
*/
|
|
6
|
-
export declare function handleAccount(broker: BrokerName): Promise<void>;
|
|
7
|
-
//# sourceMappingURL=account.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/cli/account.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrE"}
|
package/dist/cli/account.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import { apiClient } from "./shared.js";
|
|
3
|
-
import { fmtMoney } from "../format.js";
|
|
4
|
-
/**
|
|
5
|
-
* Show auth status and account balances.
|
|
6
|
-
* Ports the account-summary portion of main.py's main().
|
|
7
|
-
*/
|
|
8
|
-
export async function handleAccount(broker) {
|
|
9
|
-
const api = await apiClient(broker);
|
|
10
|
-
const auth = await api.getAuthStatus();
|
|
11
|
-
const accountId = await api.getAccountId();
|
|
12
|
-
const balances = await api.getAccountBalances();
|
|
13
|
-
console.log(chalk.bold("\n💰 Account Summary\n"));
|
|
14
|
-
console.log(chalk.gray("Authenticated: ") +
|
|
15
|
-
(auth.authenticated ? chalk.green("yes") : chalk.red("no")) +
|
|
16
|
-
chalk.gray(" Competing: ") +
|
|
17
|
-
(auth.competing ? chalk.red("yes") : chalk.green("no")));
|
|
18
|
-
console.log(chalk.gray("Account: ") + chalk.cyan(accountId));
|
|
19
|
-
console.log(chalk.gray("─".repeat(50)));
|
|
20
|
-
console.log(`Net Liquidation: ${chalk.green(fmtMoney(balances.netLiquidation))}`);
|
|
21
|
-
console.log(`Available Funds: ${chalk.blue(fmtMoney(balances.availableFunds))}`);
|
|
22
|
-
console.log(`Buying Power: ${chalk.magenta(fmtMoney(balances.buyingPower))}`);
|
|
23
|
-
console.log(`Cash Balance: ${chalk.yellow(fmtMoney(balances.cashBalance))}`);
|
|
24
|
-
console.log(chalk.gray("─".repeat(50)));
|
|
25
|
-
console.log();
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=account.js.map
|
package/dist/cli/account.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/cli/account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAkB;IACpD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,kBAAkB,EAAE,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC3B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC5B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAC1D,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/cli/index.d.ts
DELETED
package/dist/cli/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
package/dist/cli/index.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { Command } from "commander";
|
|
3
|
-
import chalk from "chalk";
|
|
4
|
-
import { handleAccount } from "./account.js";
|
|
5
|
-
import { handlePositions } from "./positions.js";
|
|
6
|
-
import { handleQuote } from "./quote.js";
|
|
7
|
-
import { handleOrders } from "./orders.js";
|
|
8
|
-
import { resolveBroker } from "./shared.js";
|
|
9
|
-
const program = new Command();
|
|
10
|
-
program
|
|
11
|
-
.name("ibkr-cli")
|
|
12
|
-
.description("Terminal-based trading tools for Interactive Brokers (and, later, Schwab)")
|
|
13
|
-
.version("0.1.0")
|
|
14
|
-
.option("--broker <name>", "Broker to use: ibkr or schwab", "ibkr");
|
|
15
|
-
/** The resolved broker from the global --broker option. */
|
|
16
|
-
const broker = () => resolveBroker(program.opts().broker);
|
|
17
|
-
program
|
|
18
|
-
.command("account")
|
|
19
|
-
.description("Show account balances and authentication status")
|
|
20
|
-
.action(async () => {
|
|
21
|
-
await handleAccount(broker());
|
|
22
|
-
});
|
|
23
|
-
program
|
|
24
|
-
.command("positions")
|
|
25
|
-
.description("Show account positions, optionally filtered by symbol or type")
|
|
26
|
-
.argument("[symbol]", "Optional symbol to filter positions")
|
|
27
|
-
.option("-t, --type <type>", "Filter by asset type (e.g., OPTION, EQUITY)")
|
|
28
|
-
.option("--csv", "Output in CSV format instead of table")
|
|
29
|
-
.action(async (symbol, options) => {
|
|
30
|
-
await handlePositions(broker(), symbol, options);
|
|
31
|
-
});
|
|
32
|
-
program
|
|
33
|
-
.command("quote")
|
|
34
|
-
.description("Get current price quotes for one or more symbols (not implemented yet)")
|
|
35
|
-
.argument("<symbols...>", "Symbols to quote")
|
|
36
|
-
.action((symbols) => {
|
|
37
|
-
handleQuote(broker(), symbols);
|
|
38
|
-
});
|
|
39
|
-
program
|
|
40
|
-
.command("orders")
|
|
41
|
-
.description("List account orders (not implemented yet)")
|
|
42
|
-
.action(() => {
|
|
43
|
-
handleOrders(broker());
|
|
44
|
-
});
|
|
45
|
-
program.parseAsync(process.argv).catch((error) => {
|
|
46
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
47
|
-
console.error(chalk.red("Error:"), message);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
});
|
|
50
|
-
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,2EAA2E,CAAC;KACxF,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,MAAM,CAAC,CAAC;AAEtE,2DAA2D;AAC3D,MAAM,MAAM,GAAG,GAAqC,EAAE,CACpD,aAAa,CAAC,OAAO,CAAC,IAAI,EAAuB,CAAC,MAAM,CAAC,CAAC;AAE5D,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,QAAQ,CAAC,UAAU,EAAE,qCAAqC,CAAC;KAC3D,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,OAAO,EAAE,uCAAuC,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAAyC,EAAE,EAAE;IACtF,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wEAAwE,CAAC;KACrF,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;KAC5C,MAAM,CAAC,CAAC,OAAiB,EAAE,EAAE;IAC5B,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,GAAG,EAAE;IACX,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/cli/orders.d.ts
DELETED
package/dist/cli/orders.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/cli/orders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAEtD"}
|
package/dist/cli/orders.js
DELETED
package/dist/cli/orders.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/cli/orders.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,OAAmB;IAC9C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC/D,CAAC"}
|
package/dist/cli/positions.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { BrokerName } from "../types.js";
|
|
2
|
-
interface PositionsOptions {
|
|
3
|
-
type?: string;
|
|
4
|
-
csv?: boolean;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Show account positions as a table (or CSV).
|
|
8
|
-
* Ports render_positions() from main.py.
|
|
9
|
-
*/
|
|
10
|
-
export declare function handlePositions(broker: BrokerName, symbol: string | undefined, options: PositionsOptions): Promise<void>;
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=positions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"positions.d.ts","sourceRoot":"","sources":["../../src/cli/positions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AAE9D,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AA6BD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
package/dist/cli/positions.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import { apiClient } from "./shared.js";
|
|
3
|
-
import { fmtMoney, fmtPct, pad, pnlColor } from "../format.js";
|
|
4
|
-
const HEADERS = [
|
|
5
|
-
"Symbol",
|
|
6
|
-
"Type",
|
|
7
|
-
"Long",
|
|
8
|
-
"Short",
|
|
9
|
-
"Avg Price",
|
|
10
|
-
"Cur Price",
|
|
11
|
-
"Mkt Value",
|
|
12
|
-
"Day P/L",
|
|
13
|
-
"P/L Open",
|
|
14
|
-
"P/L %",
|
|
15
|
-
];
|
|
16
|
-
/** Columns 0 (Symbol) and 1 (Type) are left-aligned; the rest right-aligned. */
|
|
17
|
-
const LEFT_ALIGNED = new Set([0, 1]);
|
|
18
|
-
/** Open P/L as a fraction of cost basis (marketValue net of open P/L). */
|
|
19
|
-
function plPercent(pos) {
|
|
20
|
-
const costBasis = pos.marketValue - pos.openProfitLoss;
|
|
21
|
-
return costBasis ? (pos.openProfitLoss / costBasis) * 100 : null;
|
|
22
|
-
}
|
|
23
|
-
/** Escape a value for CSV output. */
|
|
24
|
-
function escapeCsv(value) {
|
|
25
|
-
return /[",\n]/.test(value) ? `"${value.replace(/"/g, '""')}"` : value;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Show account positions as a table (or CSV).
|
|
29
|
-
* Ports render_positions() from main.py.
|
|
30
|
-
*/
|
|
31
|
-
export async function handlePositions(broker, symbol, options) {
|
|
32
|
-
const api = await apiClient(broker);
|
|
33
|
-
let positions = await api.getPositions(symbol);
|
|
34
|
-
if (options.type) {
|
|
35
|
-
const upper = options.type.toUpperCase();
|
|
36
|
-
positions = positions.filter((p) => p.assetType.toUpperCase() === upper);
|
|
37
|
-
}
|
|
38
|
-
positions = positions.sort((a, b) => a.symbol.localeCompare(b.symbol));
|
|
39
|
-
if (options.csv) {
|
|
40
|
-
renderCsv(positions);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
renderTable(symbol, options.type, positions);
|
|
44
|
-
}
|
|
45
|
-
function renderCsv(positions) {
|
|
46
|
-
if (positions.length === 0)
|
|
47
|
-
return;
|
|
48
|
-
console.log(HEADERS.join(","));
|
|
49
|
-
for (const p of positions) {
|
|
50
|
-
const pct = plPercent(p);
|
|
51
|
-
console.log([
|
|
52
|
-
escapeCsv(p.symbol),
|
|
53
|
-
escapeCsv(p.assetType),
|
|
54
|
-
p.longQuantity || "",
|
|
55
|
-
p.shortQuantity || "",
|
|
56
|
-
p.averagePrice.toFixed(2),
|
|
57
|
-
p.marketPrice.toFixed(2),
|
|
58
|
-
p.marketValue.toFixed(2),
|
|
59
|
-
p.currentDayProfitLoss.toFixed(2),
|
|
60
|
-
p.openProfitLoss.toFixed(2),
|
|
61
|
-
pct === null ? "" : pct.toFixed(2),
|
|
62
|
-
].join(","));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
function renderTable(symbol, type, positions) {
|
|
66
|
-
const filters = [symbol?.toUpperCase(), type?.toUpperCase()].filter(Boolean);
|
|
67
|
-
const filterText = filters.length ? `: ${filters.join(", ")}` : "";
|
|
68
|
-
console.log(chalk.bold(`\nAccount Positions${filterText}\n`));
|
|
69
|
-
if (positions.length === 0) {
|
|
70
|
-
console.log(chalk.yellow(" (no open positions)"));
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
// Each cell is [text, colorFn]; colorize after width is measured on raw text.
|
|
74
|
-
const rows = positions.map((p) => {
|
|
75
|
-
const pct = plPercent(p);
|
|
76
|
-
return [
|
|
77
|
-
[p.symbol, chalk.cyan],
|
|
78
|
-
[p.assetType, chalk.white],
|
|
79
|
-
[p.longQuantity > 0 ? String(p.longQuantity) : "-", chalk.green],
|
|
80
|
-
[p.shortQuantity > 0 ? String(p.shortQuantity) : "-", chalk.red],
|
|
81
|
-
[fmtMoney(p.averagePrice), chalk.white],
|
|
82
|
-
[fmtMoney(p.marketPrice), chalk.white],
|
|
83
|
-
[fmtMoney(p.marketValue), pnlColor(p.marketValue)],
|
|
84
|
-
[fmtMoney(p.currentDayProfitLoss, true), pnlColor(p.currentDayProfitLoss)],
|
|
85
|
-
[fmtMoney(p.openProfitLoss, true), pnlColor(p.openProfitLoss)],
|
|
86
|
-
[fmtPct(pct), pnlColor(pct)],
|
|
87
|
-
];
|
|
88
|
-
});
|
|
89
|
-
const widths = HEADERS.map((h) => h.length);
|
|
90
|
-
for (const row of rows) {
|
|
91
|
-
row.forEach(([text], i) => {
|
|
92
|
-
widths[i] = Math.max(widths[i] ?? 0, text.length);
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
const align = (i) => (LEFT_ALIGNED.has(i) ? "left" : "right");
|
|
96
|
-
const gap = " ";
|
|
97
|
-
const headerLine = HEADERS.map((h, i) => chalk.dim(pad(h, widths[i] ?? 0, align(i)))).join(gap);
|
|
98
|
-
const totalWidth = widths.reduce((sum, w) => sum + w, 0) + gap.length * (widths.length - 1);
|
|
99
|
-
console.log(headerLine);
|
|
100
|
-
console.log(chalk.dim("-".repeat(totalWidth)));
|
|
101
|
-
for (const row of rows) {
|
|
102
|
-
console.log(row.map(([text, color], i) => color(pad(text, widths[i] ?? 0, align(i)))).join(gap));
|
|
103
|
-
}
|
|
104
|
-
console.log();
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=positions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"positions.js","sourceRoot":"","sources":["../../src/cli/positions.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/quote.d.ts
DELETED
package/dist/cli/quote.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../src/cli/quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAEzE"}
|
package/dist/cli/quote.js
DELETED
package/dist/cli/quote.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quote.js","sourceRoot":"","sources":["../../src/cli/quote.ts"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,OAAmB,EAAE,QAAkB;IACjE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/cli/shared.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { BrokerClient, BrokerName } from "../types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Resolve an authenticated {@link BrokerClient} for the requested broker.
|
|
4
|
-
*
|
|
5
|
-
* Today only IBKR is implemented. The `schwab` branch is intentionally a
|
|
6
|
-
* placeholder: when this is merged into huskly-cli it will return a thin
|
|
7
|
-
* adapter over huskly's existing `SchwabClient`, satisfying the same interface.
|
|
8
|
-
*/
|
|
9
|
-
export declare function apiClient(broker?: BrokerName): Promise<BrokerClient>;
|
|
10
|
-
/** Resolve the broker from a Commander option, validating the value. */
|
|
11
|
-
export declare function resolveBroker(value: string | undefined): BrokerName;
|
|
12
|
-
//# sourceMappingURL=shared.d.ts.map
|
package/dist/cli/shared.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,MAAM,GAAE,UAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAclF;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAMnE"}
|
package/dist/cli/shared.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { IbkrClient } from "../ibkr/ibkrClient.js";
|
|
2
|
-
import { buildOauthConfig } from "../ibkr/oauthConfig.js";
|
|
3
|
-
/**
|
|
4
|
-
* Resolve an authenticated {@link BrokerClient} for the requested broker.
|
|
5
|
-
*
|
|
6
|
-
* Today only IBKR is implemented. The `schwab` branch is intentionally a
|
|
7
|
-
* placeholder: when this is merged into huskly-cli it will return a thin
|
|
8
|
-
* adapter over huskly's existing `SchwabClient`, satisfying the same interface.
|
|
9
|
-
*/
|
|
10
|
-
export async function apiClient(broker = "ibkr") {
|
|
11
|
-
switch (broker) {
|
|
12
|
-
case "ibkr": {
|
|
13
|
-
const client = new IbkrClient(buildOauthConfig());
|
|
14
|
-
await client.init();
|
|
15
|
-
return client;
|
|
16
|
-
}
|
|
17
|
-
case "schwab":
|
|
18
|
-
throw new Error("Broker 'schwab' is not supported yet. It will be wired up when this CLI is merged into huskly-cli.");
|
|
19
|
-
default:
|
|
20
|
-
throw new Error(`Unknown broker: ${String(broker)}`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
/** Resolve the broker from a Commander option, validating the value. */
|
|
24
|
-
export function resolveBroker(value) {
|
|
25
|
-
const broker = (value ?? "ibkr").toLowerCase();
|
|
26
|
-
if (broker !== "ibkr" && broker !== "schwab") {
|
|
27
|
-
throw new Error(`Invalid --broker '${broker}'. Expected 'ibkr' or 'schwab'.`);
|
|
28
|
-
}
|
|
29
|
-
return broker;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=shared.js.map
|
package/dist/cli/shared.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAqB,MAAM;IACzD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAClD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,QAAQ;YACX,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;QACJ;YACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,iCAAiC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/format.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Terminal formatting helpers, ported from main.py (fmt_money / fmt_pct /
|
|
3
|
-
* P&L coloring), using chalk instead of raw ANSI codes.
|
|
4
|
-
*/
|
|
5
|
-
/** Format a dollar amount. `signed` forces a leading +/- (for P&L). */
|
|
6
|
-
export declare function fmtMoney(value: number | null | undefined, signed?: boolean): string;
|
|
7
|
-
/** Format a percentage with an explicit +/- sign. */
|
|
8
|
-
export declare function fmtPct(value: number | null | undefined): string;
|
|
9
|
-
/** Green for non-negative P&L, red for losses. */
|
|
10
|
-
export declare function pnlColor(value: number | null | undefined): (text: string) => string;
|
|
11
|
-
/** Pad `text` into `width`, left- or right-aligned. */
|
|
12
|
-
export declare function pad(text: string, width: number, align?: "left" | "right"): string;
|
|
13
|
-
//# sourceMappingURL=format.d.ts.map
|
package/dist/format.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,UAAQ,GAAG,MAAM,CAQjF;AAED,qDAAqD;AACrD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAI/D;AAED,kDAAkD;AAClD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAEnF;AAED,uDAAuD;AACvD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,OAAgB,GAAG,MAAM,CAEzF"}
|
package/dist/format.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
/**
|
|
3
|
-
* Terminal formatting helpers, ported from main.py (fmt_money / fmt_pct /
|
|
4
|
-
* P&L coloring), using chalk instead of raw ANSI codes.
|
|
5
|
-
*/
|
|
6
|
-
/** Format a dollar amount. `signed` forces a leading +/- (for P&L). */
|
|
7
|
-
export function fmtMoney(value, signed = false) {
|
|
8
|
-
if (value === null || value === undefined)
|
|
9
|
-
return "-";
|
|
10
|
-
const sign = value < 0 ? "-" : signed ? "+" : "";
|
|
11
|
-
const abs = Math.abs(value).toLocaleString("en-US", {
|
|
12
|
-
minimumFractionDigits: 2,
|
|
13
|
-
maximumFractionDigits: 2,
|
|
14
|
-
});
|
|
15
|
-
return `${sign}$${abs}`;
|
|
16
|
-
}
|
|
17
|
-
/** Format a percentage with an explicit +/- sign. */
|
|
18
|
-
export function fmtPct(value) {
|
|
19
|
-
if (value === null || value === undefined)
|
|
20
|
-
return "-";
|
|
21
|
-
const sign = value < 0 ? "-" : "+";
|
|
22
|
-
return `${sign}${Math.abs(value).toFixed(2)}%`;
|
|
23
|
-
}
|
|
24
|
-
/** Green for non-negative P&L, red for losses. */
|
|
25
|
-
export function pnlColor(value) {
|
|
26
|
-
return (value ?? 0) < 0 ? chalk.red : chalk.green;
|
|
27
|
-
}
|
|
28
|
-
/** Pad `text` into `width`, left- or right-aligned. */
|
|
29
|
-
export function pad(text, width, align = "left") {
|
|
30
|
-
return align === "right" ? text.padStart(width) : text.padEnd(width);
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=format.js.map
|
package/dist/format.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AAEH,uEAAuE;AACvE,MAAM,UAAU,QAAQ,CAAC,KAAgC,EAAE,MAAM,GAAG,KAAK;IACvE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACtD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QAClD,qBAAqB,EAAE,CAAC;QACxB,qBAAqB,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,MAAM,CAAC,KAAgC;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACtD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACjD,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,QAAQ,CAAC,KAAgC;IACvD,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;AACpD,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,QAA0B,MAAM;IAC/E,OAAO,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
|