jcc_hyper_tool 0.1.3 → 0.1.5
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 +53 -22
- package/dist/advisor/actionRunner.d.ts +29 -0
- package/dist/advisor/actionRunner.d.ts.map +1 -0
- package/dist/advisor/actionRunner.js +163 -0
- package/dist/advisor/actionRunner.js.map +1 -0
- package/dist/advisor/actionSchema.d.ts +417 -0
- package/dist/advisor/actionSchema.d.ts.map +1 -0
- package/dist/advisor/actionSchema.js +90 -0
- package/dist/advisor/actionSchema.js.map +1 -0
- package/dist/advisor/adviseEngine.d.ts +43 -0
- package/dist/advisor/adviseEngine.d.ts.map +1 -0
- package/dist/advisor/adviseEngine.js +91 -0
- package/dist/advisor/adviseEngine.js.map +1 -0
- package/dist/advisor/contextBuilder.d.ts +34 -0
- package/dist/advisor/contextBuilder.d.ts.map +1 -0
- package/dist/advisor/contextBuilder.js +134 -0
- package/dist/advisor/contextBuilder.js.map +1 -0
- package/dist/advisor/deepseekClient.d.ts +26 -0
- package/dist/advisor/deepseekClient.d.ts.map +1 -0
- package/dist/advisor/deepseekClient.js +96 -0
- package/dist/advisor/deepseekClient.js.map +1 -0
- package/dist/advisor/guards.d.ts +17 -0
- package/dist/advisor/guards.d.ts.map +1 -0
- package/dist/advisor/guards.js +71 -0
- package/dist/advisor/guards.js.map +1 -0
- package/dist/advisor/promptTemplate.d.ts +5 -0
- package/dist/advisor/promptTemplate.d.ts.map +1 -0
- package/dist/advisor/promptTemplate.js +78 -0
- package/dist/advisor/promptTemplate.js.map +1 -0
- package/dist/advisor/sessionLog.d.ts +41 -0
- package/dist/advisor/sessionLog.d.ts.map +1 -0
- package/dist/advisor/sessionLog.js +7 -0
- package/dist/advisor/sessionLog.js.map +1 -0
- package/dist/cli/advisorCli.d.ts +3 -0
- package/dist/cli/advisorCli.d.ts.map +1 -0
- package/dist/cli/advisorCli.js +354 -0
- package/dist/cli/advisorCli.js.map +1 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/strategyCli.js +1 -1
- package/dist/cli/tradingCli.d.ts.map +1 -1
- package/dist/cli/tradingCli.js +3 -1
- package/dist/cli/tradingCli.js.map +1 -1
- package/dist/core/cliBin.d.ts +8 -0
- package/dist/core/cliBin.d.ts.map +1 -0
- package/dist/core/cliBin.js +15 -0
- package/dist/core/cliBin.js.map +1 -0
- package/dist/core/errorFormat.d.ts +7 -0
- package/dist/core/errorFormat.d.ts.map +1 -0
- package/dist/core/errorFormat.js +59 -0
- package/dist/core/errorFormat.js.map +1 -0
- package/dist/core/errors.d.ts +2 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +3 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/hyperliquid/client.d.ts +3 -0
- package/dist/core/hyperliquid/client.d.ts.map +1 -1
- package/dist/core/hyperliquid/client.js +31 -21
- package/dist/core/hyperliquid/client.js.map +1 -1
- package/dist/core/hyperliquid/exchange.d.ts +3 -0
- package/dist/core/hyperliquid/exchange.d.ts.map +1 -1
- package/dist/core/hyperliquid/exchange.js +31 -21
- package/dist/core/hyperliquid/exchange.js.map +1 -1
- package/dist/core/hyperliquid/exchangeParse.d.ts +3 -0
- package/dist/core/hyperliquid/exchangeParse.d.ts.map +1 -1
- package/dist/core/hyperliquid/exchangeParse.js +62 -0
- package/dist/core/hyperliquid/exchangeParse.js.map +1 -1
- package/dist/core/hyperliquid/httpRequest.d.ts +36 -0
- package/dist/core/hyperliquid/httpRequest.d.ts.map +1 -0
- package/dist/core/hyperliquid/httpRequest.js +171 -0
- package/dist/core/hyperliquid/httpRequest.js.map +1 -0
- package/dist/core/hyperliquid/watchOrders.d.ts.map +1 -1
- package/dist/core/hyperliquid/watchOrders.js +2 -1
- package/dist/core/hyperliquid/watchOrders.js.map +1 -1
- package/dist/core/state/gcTradeState.js +1 -1
- package/dist/core/state/gcTradeState.js.map +1 -1
- package/dist/core/state/openOrdersAgg.d.ts +13 -0
- package/dist/core/state/openOrdersAgg.d.ts.map +1 -0
- package/dist/core/state/openOrdersAgg.js +50 -0
- package/dist/core/state/openOrdersAgg.js.map +1 -0
- package/dist/core/state/profileStore.d.ts +6 -0
- package/dist/core/state/profileStore.d.ts.map +1 -0
- package/dist/core/state/profileStore.js +30 -0
- package/dist/core/state/profileStore.js.map +1 -0
- package/dist/core/state/runCancelOpen.js +3 -3
- package/dist/core/state/runCancelOpen.js.map +1 -1
- package/dist/core/state/runReconcile.d.ts.map +1 -1
- package/dist/core/state/runReconcile.js +43 -18
- package/dist/core/state/runReconcile.js.map +1 -1
- package/dist/core/state/schema.d.ts +148 -78
- package/dist/core/state/schema.d.ts.map +1 -1
- package/dist/core/state/schema.js +11 -0
- package/dist/core/state/schema.js.map +1 -1
- package/dist/core/state/statePaths.d.ts +1 -0
- package/dist/core/state/statePaths.d.ts.map +1 -1
- package/dist/core/state/statePaths.js +4 -0
- package/dist/core/state/statePaths.js.map +1 -1
- package/dist/core/state/store.js +1 -1
- package/dist/core/state/store.js.map +1 -1
- package/dist/daemon/index.js +3 -3
- package/dist/daemon/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorFormat.d.ts","sourceRoot":"","sources":["../../src/core/errorFormat.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED,yEAAyE;AACzE,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUzE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiC3D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ConfigError, HyperliquidApiError } from "./errors.js";
|
|
2
|
+
import { formatErrorChain } from "./hyperliquid/httpRequest.js";
|
|
3
|
+
/** Max response body bytes embedded in CLI stderr (beyond this, note truncation). */
|
|
4
|
+
export const HTTP_ERROR_BODY_MAX_BYTES = 65_536;
|
|
5
|
+
export function formatHttpResponseBody(bodyText) {
|
|
6
|
+
const trimmed = bodyText.trimEnd();
|
|
7
|
+
if (trimmed.length === 0) {
|
|
8
|
+
return "";
|
|
9
|
+
}
|
|
10
|
+
if (trimmed.length <= HTTP_ERROR_BODY_MAX_BYTES) {
|
|
11
|
+
return trimmed;
|
|
12
|
+
}
|
|
13
|
+
return `${trimmed.slice(0, HTTP_ERROR_BODY_MAX_BYTES)}\n… (truncated; ${trimmed.length} bytes total)`;
|
|
14
|
+
}
|
|
15
|
+
/** Pretty-print JSON bodies when possible; otherwise return raw text. */
|
|
16
|
+
export function formatHttpResponseBodyForDisplay(bodyText) {
|
|
17
|
+
const raw = formatHttpResponseBody(bodyText);
|
|
18
|
+
if (!raw) {
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
return JSON.stringify(JSON.parse(raw), null, 2);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return raw;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function formatErrorForStderr(error) {
|
|
29
|
+
if (error instanceof HyperliquidApiError) {
|
|
30
|
+
const lines = [error.message];
|
|
31
|
+
const body = formatHttpResponseBodyForDisplay(error.bodyText);
|
|
32
|
+
if (body && !error.message.includes(body.slice(0, 200))) {
|
|
33
|
+
lines.push("", "── Response body ──", body);
|
|
34
|
+
}
|
|
35
|
+
const meta = [];
|
|
36
|
+
if (error.requestHint) {
|
|
37
|
+
meta.push(`request=${error.requestHint}`);
|
|
38
|
+
}
|
|
39
|
+
if (error.status !== undefined) {
|
|
40
|
+
meta.push(`httpStatus=${error.status}`);
|
|
41
|
+
}
|
|
42
|
+
if (meta.length > 0) {
|
|
43
|
+
lines.push("", meta.join(", "));
|
|
44
|
+
}
|
|
45
|
+
return lines.join("\n");
|
|
46
|
+
}
|
|
47
|
+
if (error instanceof ConfigError) {
|
|
48
|
+
return error.message;
|
|
49
|
+
}
|
|
50
|
+
if (error instanceof Error) {
|
|
51
|
+
const lines = [`${error.name}: ${error.message}`];
|
|
52
|
+
if (error.cause !== undefined) {
|
|
53
|
+
lines.push(`Caused by: ${formatErrorChain(error.cause)}`);
|
|
54
|
+
}
|
|
55
|
+
return lines.join("\n");
|
|
56
|
+
}
|
|
57
|
+
return String(error);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=errorFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorFormat.js","sourceRoot":"","sources":["../../src/core/errorFormat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,qFAAqF;AACrF,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,mBAAmB,OAAO,CAAC,MAAM,eAAe,CAAC;AACxG,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gCAAgC,CAAC,QAAgB;IAC/D,MAAM,GAAG,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,gCAAgC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,cAAc,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export declare class HyperliquidApiError extends Error {
|
|
2
2
|
readonly status: number;
|
|
3
3
|
readonly bodyText: string;
|
|
4
|
-
|
|
4
|
+
readonly requestHint?: string;
|
|
5
|
+
constructor(message: string, status: number, bodyText: string, requestHint?: string);
|
|
5
6
|
}
|
|
6
7
|
export declare class ConfigError extends Error {
|
|
7
8
|
constructor(message: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAOpF;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/core/errors.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export class HyperliquidApiError extends Error {
|
|
2
2
|
status;
|
|
3
3
|
bodyText;
|
|
4
|
-
|
|
4
|
+
requestHint;
|
|
5
|
+
constructor(message, status, bodyText, requestHint) {
|
|
5
6
|
super(message);
|
|
6
7
|
this.name = "HyperliquidApiError";
|
|
7
8
|
this.status = status;
|
|
8
9
|
this.bodyText = bodyText;
|
|
10
|
+
this.requestHint = requestHint;
|
|
9
11
|
}
|
|
10
12
|
}
|
|
11
13
|
export class ConfigError extends Error {
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,MAAM,CAAS;IACf,QAAQ,CAAS;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,WAAW,CAAU;IAE9B,YAAY,OAAe,EAAE,MAAc,EAAE,QAAgB,EAAE,WAAoB;QACjF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import type { JsonValue } from "./types.js";
|
|
2
|
+
import { type HyperliquidHttpRetryOptions } from "./httpRequest.js";
|
|
2
3
|
export type FetchLike = (input: string | URL | globalThis.Request, init?: RequestInit) => Promise<Response>;
|
|
3
4
|
export type InfoRequestBody = Record<string, unknown>;
|
|
4
5
|
export declare class HyperliquidInfoClient {
|
|
5
6
|
private readonly fetchImpl;
|
|
7
|
+
private readonly retry;
|
|
6
8
|
readonly infoUrl: string;
|
|
7
9
|
constructor(opts: {
|
|
8
10
|
infoOrigin: string;
|
|
9
11
|
fetchImpl?: FetchLike;
|
|
12
|
+
retry?: HyperliquidHttpRetryOptions;
|
|
10
13
|
});
|
|
11
14
|
info(body: InfoRequestBody): Promise<JsonValue>;
|
|
12
15
|
meta(dex?: string): Promise<JsonValue>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,EACxC,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,2BAA2B,CAAA;KAAE;IAO9F,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAmDrD,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAItC,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IAI9B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzC,kBAAkB,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQzE,UAAU,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAMjE,uFAAuF;IACvF,SAAS,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAQxF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAWzF;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,SAAS,CAAC;CAWvB"}
|
|
@@ -1,40 +1,50 @@
|
|
|
1
1
|
import { HyperliquidApiError } from "../errors.js";
|
|
2
|
+
import { formatHyperliquidHttpError, postJsonWithRetry, requestHintFromJsonBody, } from "./httpRequest.js";
|
|
2
3
|
export class HyperliquidInfoClient {
|
|
3
4
|
fetchImpl;
|
|
5
|
+
retry;
|
|
4
6
|
infoUrl;
|
|
5
7
|
constructor(opts) {
|
|
6
8
|
const origin = opts.infoOrigin.replace(/\/+$/, "");
|
|
7
9
|
this.infoUrl = `${origin}/info`;
|
|
8
10
|
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
11
|
+
this.retry = opts.retry ?? {};
|
|
9
12
|
}
|
|
10
13
|
async info(body) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
},
|
|
19
|
-
body: JSON.stringify(body),
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
catch (e) {
|
|
23
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
24
|
-
throw new HyperliquidApiError(`Network error calling POST ${this.infoUrl}: ${msg}`, 0, "");
|
|
25
|
-
}
|
|
26
|
-
const text = await res.text();
|
|
14
|
+
const requestHint = requestHintFromJsonBody(body);
|
|
15
|
+
const res = await postJsonWithRetry({
|
|
16
|
+
url: this.infoUrl,
|
|
17
|
+
body,
|
|
18
|
+
fetchImpl: this.fetchImpl,
|
|
19
|
+
retry: this.retry,
|
|
20
|
+
});
|
|
27
21
|
let parsed;
|
|
28
|
-
if (text.length > 0) {
|
|
22
|
+
if (res.text.length > 0) {
|
|
29
23
|
try {
|
|
30
|
-
parsed = JSON.parse(text);
|
|
24
|
+
parsed = JSON.parse(res.text);
|
|
31
25
|
}
|
|
32
26
|
catch {
|
|
33
|
-
throw new HyperliquidApiError(
|
|
27
|
+
throw new HyperliquidApiError(formatHyperliquidHttpError({
|
|
28
|
+
method: "POST",
|
|
29
|
+
url: this.infoUrl,
|
|
30
|
+
status: res.status,
|
|
31
|
+
statusText: res.statusText,
|
|
32
|
+
bodyText: res.text,
|
|
33
|
+
requestHint,
|
|
34
|
+
retriesAttempted: res.attemptsMade - 1,
|
|
35
|
+
}), res.status, res.text, requestHint);
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
|
-
if (
|
|
37
|
-
throw new HyperliquidApiError(
|
|
38
|
+
if (res.status < 200 || res.status >= 300) {
|
|
39
|
+
throw new HyperliquidApiError(formatHyperliquidHttpError({
|
|
40
|
+
method: "POST",
|
|
41
|
+
url: this.infoUrl,
|
|
42
|
+
status: res.status,
|
|
43
|
+
statusText: res.statusText,
|
|
44
|
+
bodyText: res.text,
|
|
45
|
+
requestHint,
|
|
46
|
+
retriesAttempted: res.attemptsMade - 1,
|
|
47
|
+
}), res.status, res.text, requestHint);
|
|
38
48
|
}
|
|
39
49
|
return parsed ?? null;
|
|
40
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import type { JsonValue } from "./types.js";
|
|
2
2
|
import type { FetchLike } from "./client.js";
|
|
3
|
+
import { type HyperliquidHttpRetryOptions } from "./httpRequest.js";
|
|
3
4
|
export type SignedExchangeEnvelope = Record<string, unknown>;
|
|
4
5
|
export type ExchangePostBody = SignedExchangeEnvelope;
|
|
5
6
|
export declare class HyperliquidExchangeClient {
|
|
6
7
|
private readonly fetchImpl;
|
|
8
|
+
private readonly retry;
|
|
7
9
|
readonly exchangeUrl: string;
|
|
8
10
|
constructor(opts: {
|
|
9
11
|
apiOrigin: string;
|
|
10
12
|
fetchImpl?: FetchLike;
|
|
13
|
+
retry?: HyperliquidHttpRetryOptions;
|
|
11
14
|
});
|
|
12
15
|
exchange(body: ExchangePostBody): Promise<JsonValue>;
|
|
13
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchange.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7D,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEtD,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,IAAI,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,KAAK,CAAC,EAAE,2BAA2B,CAAC;KACrC;IAOK,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;CAkD3D"}
|
|
@@ -1,41 +1,51 @@
|
|
|
1
|
+
import { assertExchangeResponseOk, } from "./exchangeParse.js";
|
|
1
2
|
import { HyperliquidApiError } from "../errors.js";
|
|
3
|
+
import { formatHyperliquidHttpError, postJsonWithRetry, } from "./httpRequest.js";
|
|
2
4
|
export class HyperliquidExchangeClient {
|
|
3
5
|
fetchImpl;
|
|
6
|
+
retry;
|
|
4
7
|
exchangeUrl;
|
|
5
8
|
constructor(opts) {
|
|
6
9
|
const origin = opts.apiOrigin.replace(/\/+$/, "");
|
|
7
10
|
this.exchangeUrl = `${origin}/exchange`;
|
|
8
11
|
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
12
|
+
this.retry = opts.retry ?? {};
|
|
9
13
|
}
|
|
10
14
|
async exchange(body) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"Content-Type": "application/json",
|
|
18
|
-
},
|
|
19
|
-
body: JSON.stringify(body),
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
catch (e) {
|
|
23
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
24
|
-
throw new HyperliquidApiError(`Network error POST ${this.exchangeUrl}: ${msg}`, 0, "");
|
|
25
|
-
}
|
|
26
|
-
const text = await res.text();
|
|
15
|
+
const res = await postJsonWithRetry({
|
|
16
|
+
url: this.exchangeUrl,
|
|
17
|
+
body,
|
|
18
|
+
fetchImpl: this.fetchImpl,
|
|
19
|
+
retry: this.retry,
|
|
20
|
+
});
|
|
27
21
|
let parsed;
|
|
28
|
-
if (text.length > 0) {
|
|
22
|
+
if (res.text.length > 0) {
|
|
29
23
|
try {
|
|
30
|
-
parsed = JSON.parse(text);
|
|
24
|
+
parsed = JSON.parse(res.text);
|
|
31
25
|
}
|
|
32
26
|
catch {
|
|
33
|
-
throw new HyperliquidApiError(
|
|
27
|
+
throw new HyperliquidApiError(formatHyperliquidHttpError({
|
|
28
|
+
method: "POST",
|
|
29
|
+
url: this.exchangeUrl,
|
|
30
|
+
status: res.status,
|
|
31
|
+
statusText: res.statusText,
|
|
32
|
+
bodyText: res.text,
|
|
33
|
+
requestHint: "exchange",
|
|
34
|
+
}), res.status, res.text, "exchange");
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
|
-
if (
|
|
37
|
-
throw new HyperliquidApiError(
|
|
37
|
+
if (res.status < 200 || res.status >= 300) {
|
|
38
|
+
throw new HyperliquidApiError(formatHyperliquidHttpError({
|
|
39
|
+
method: "POST",
|
|
40
|
+
url: this.exchangeUrl,
|
|
41
|
+
status: res.status,
|
|
42
|
+
statusText: res.statusText,
|
|
43
|
+
bodyText: res.text,
|
|
44
|
+
requestHint: "exchange",
|
|
45
|
+
retriesAttempted: res.attemptsMade - 1,
|
|
46
|
+
}), res.status, res.text, "exchange");
|
|
38
47
|
}
|
|
48
|
+
assertExchangeResponseOk(parsed ?? null);
|
|
39
49
|
return parsed ?? null;
|
|
40
50
|
}
|
|
41
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAM1B,MAAM,OAAO,yBAAyB;IACnB,SAAS,CAAY;IACrB,KAAK,CAA8B;IAC3C,WAAW,CAAS;IAE7B,YAAY,IAIX;QACC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,GAAG,MAAM,WAAW,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAsB;QACnC,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC;YAClC,GAAG,EAAE,IAAI,CAAC,WAAW;YACrB,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QAEH,IAAI,MAA6B,CAAC;QAClC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAc,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,mBAAmB,CAC3B,0BAA0B,CAAC;oBACzB,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,IAAI,CAAC,WAAW;oBACrB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,QAAQ,EAAE,GAAG,CAAC,IAAI;oBAClB,WAAW,EAAE,UAAU;iBACxB,CAAC,EACF,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,IAAI,EACR,UAAU,CACX,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,MAAM,IAAI,mBAAmB,CAC3B,0BAA0B,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ,EAAE,GAAG,CAAC,IAAI;gBAClB,WAAW,EAAE,UAAU;gBACvB,gBAAgB,EAAE,GAAG,CAAC,YAAY,GAAG,CAAC;aACvC,CAAC,EACF,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,IAAI,EACR,UAAU,CACX,CAAC;QACJ,CAAC;QAED,wBAAwB,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QAEzC,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { JsonValue } from "./types.js";
|
|
2
|
+
/** Collect HL /exchange application-level errors (HTTP may still be 200). */
|
|
3
|
+
export declare function collectExchangeApplicationErrors(resp: JsonValue): string[];
|
|
4
|
+
export declare function assertExchangeResponseOk(resp: JsonValue, context?: string): void;
|
|
2
5
|
/**
|
|
3
6
|
* Best-effort extraction of HL order ids from /exchange JSON responses.
|
|
4
7
|
* Shapes vary; callers should reconcile with openOrders when unsure.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchangeParse.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchangeParse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"exchangeParse.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchangeParse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA+B5C,6EAA6E;AAC7E,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAgC1E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAmBhF;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAuB9E"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { HyperliquidApiError } from "../errors.js";
|
|
2
|
+
import { formatHttpResponseBodyForDisplay } from "../errorFormat.js";
|
|
1
3
|
function collectOidsFromStatusEntry(entry, out) {
|
|
2
4
|
if (typeof entry !== "object" || entry === null) {
|
|
3
5
|
return;
|
|
@@ -13,6 +15,66 @@ function collectOidsFromStatusEntry(entry, out) {
|
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
17
|
}
|
|
18
|
+
function stringifyExchangeErr(value) {
|
|
19
|
+
if (typeof value === "string") {
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return JSON.stringify(value);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return String(value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Collect HL /exchange application-level errors (HTTP may still be 200). */
|
|
30
|
+
export function collectExchangeApplicationErrors(resp) {
|
|
31
|
+
const errors = [];
|
|
32
|
+
if (typeof resp !== "object" || resp === null) {
|
|
33
|
+
return errors;
|
|
34
|
+
}
|
|
35
|
+
const root = resp;
|
|
36
|
+
if (root.status === "err") {
|
|
37
|
+
errors.push(stringifyExchangeErr(root.response ?? root));
|
|
38
|
+
}
|
|
39
|
+
const response = root.response;
|
|
40
|
+
if (typeof response !== "object" || response === null) {
|
|
41
|
+
return errors;
|
|
42
|
+
}
|
|
43
|
+
const data = response.data;
|
|
44
|
+
if (typeof data !== "object" || data === null) {
|
|
45
|
+
return errors;
|
|
46
|
+
}
|
|
47
|
+
const statuses = data.statuses;
|
|
48
|
+
if (!Array.isArray(statuses)) {
|
|
49
|
+
return errors;
|
|
50
|
+
}
|
|
51
|
+
for (let i = 0; i < statuses.length; i++) {
|
|
52
|
+
const entry = statuses[i];
|
|
53
|
+
if (typeof entry !== "object" || entry === null) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const err = entry.error;
|
|
57
|
+
if (typeof err === "string" && err.trim()) {
|
|
58
|
+
errors.push(`statuses[${i}]: ${err.trim()}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return errors;
|
|
62
|
+
}
|
|
63
|
+
export function assertExchangeResponseOk(resp, context) {
|
|
64
|
+
const errors = collectExchangeApplicationErrors(resp);
|
|
65
|
+
if (errors.length === 0) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const full = formatHttpResponseBodyForDisplay(JSON.stringify(resp));
|
|
69
|
+
const prefix = context ? `${context}: ` : "";
|
|
70
|
+
throw new HyperliquidApiError([
|
|
71
|
+
`${prefix}Hyperliquid /exchange application error:`,
|
|
72
|
+
...errors.map((e) => `- ${e}`),
|
|
73
|
+
"",
|
|
74
|
+
"Full response:",
|
|
75
|
+
full,
|
|
76
|
+
].join("\n"), 200, JSON.stringify(resp), "exchange");
|
|
77
|
+
}
|
|
16
78
|
/**
|
|
17
79
|
* Best-effort extraction of HL order ids from /exchange JSON responses.
|
|
18
80
|
* Shapes vary; callers should reconcile with openOrders when unsure.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchangeParse.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchangeParse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exchangeParse.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/exchangeParse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FetchLike } from "./client.js";
|
|
2
|
+
/** Hyperliquid REST IP weight budget (see HL rate-limits docs). */
|
|
3
|
+
export declare const HL_REST_WEIGHT_LIMIT_PER_MINUTE = 1200;
|
|
4
|
+
export type HyperliquidHttpRetryOptions = {
|
|
5
|
+
maxRetries?: number;
|
|
6
|
+
retryBaseDelayMs?: number;
|
|
7
|
+
};
|
|
8
|
+
export type PostJsonResult = {
|
|
9
|
+
status: number;
|
|
10
|
+
statusText: string;
|
|
11
|
+
text: string;
|
|
12
|
+
headers: Headers;
|
|
13
|
+
/** 1-based attempt count for this request. */
|
|
14
|
+
attemptsMade: number;
|
|
15
|
+
};
|
|
16
|
+
export declare function defaultHyperliquidHttpRetryOptions(): Required<HyperliquidHttpRetryOptions>;
|
|
17
|
+
export declare function requestHintFromJsonBody(body: unknown): string | undefined;
|
|
18
|
+
/** Unwrap Error.cause chains (Node fetch often surfaces only "fetch failed" at the top). */
|
|
19
|
+
export declare function formatErrorChain(error: unknown): string;
|
|
20
|
+
export declare function hyperliquidRateLimitHint(): string;
|
|
21
|
+
export declare function formatHyperliquidHttpError(params: {
|
|
22
|
+
method: string;
|
|
23
|
+
url: string;
|
|
24
|
+
status: number;
|
|
25
|
+
statusText?: string;
|
|
26
|
+
bodyText: string;
|
|
27
|
+
requestHint?: string;
|
|
28
|
+
retriesAttempted?: number;
|
|
29
|
+
}): string;
|
|
30
|
+
export declare function postJsonWithRetry(params: {
|
|
31
|
+
url: string;
|
|
32
|
+
body: unknown;
|
|
33
|
+
fetchImpl: FetchLike;
|
|
34
|
+
retry?: HyperliquidHttpRetryOptions;
|
|
35
|
+
}): Promise<PostJsonResult>;
|
|
36
|
+
//# sourceMappingURL=httpRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpRequest.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/httpRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,mEAAmE;AACnE,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,MAAM,MAAM,2BAA2B,GAAG;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAWF,wBAAgB,kCAAkC,IAAI,QAAQ,CAAC,2BAA2B,CAAC,CAK1F;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMzE;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAmBvD;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAQjD;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAqCT;AAoCD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,2BAA2B,CAAC;CACrC,GAAG,OAAO,CAAC,cAAc,CAAC,CAmE1B"}
|