jcc_hyper_tool 0.1.4 → 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 +43 -12
- 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 +4 -2
- 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/state/gcTradeState.js +1 -1
- package/dist/core/state/gcTradeState.js.map +1 -1
- 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/runReconcile.d.ts.map +1 -1
- package/dist/core/state/runReconcile.js +40 -13
- package/dist/core/state/runReconcile.js.map +1 -1
- package/dist/core/state/schema.d.ts +188 -118
- 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,34 @@
|
|
|
1
|
+
import type { HyperliquidInfoClient } from "../core/hyperliquid/client.js";
|
|
2
|
+
import type { JsonValue } from "../core/hyperliquid/types.js";
|
|
3
|
+
export type AdvisorPositionRow = {
|
|
4
|
+
signed_sz: number;
|
|
5
|
+
entry_px?: number;
|
|
6
|
+
leverage?: number;
|
|
7
|
+
unrealized_pnl?: number;
|
|
8
|
+
};
|
|
9
|
+
export type AdvisorMarketSnapshot = {
|
|
10
|
+
coin: string;
|
|
11
|
+
network: string;
|
|
12
|
+
now_ms: number;
|
|
13
|
+
mid: number | null;
|
|
14
|
+
positions: Record<string, AdvisorPositionRow>;
|
|
15
|
+
kline_5m: JsonValue;
|
|
16
|
+
kline_1h: JsonValue;
|
|
17
|
+
kline_1d: JsonValue;
|
|
18
|
+
user_note?: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function readMidFromAllMids(mids: JsonValue, coin: string): number | null;
|
|
21
|
+
/** Best-effort per-coin row from `clearinghouseState` (wire shapes vary). */
|
|
22
|
+
export declare function extractPositionDetail(chState: JsonValue, coin: string): AdvisorPositionRow | undefined;
|
|
23
|
+
export declare function buildAdvisorMarketSnapshot(params: {
|
|
24
|
+
info: HyperliquidInfoClient;
|
|
25
|
+
coin: string;
|
|
26
|
+
network: string;
|
|
27
|
+
userAddress: `0x${string}`;
|
|
28
|
+
userNote?: string;
|
|
29
|
+
nowMs: number;
|
|
30
|
+
kline5mBars: number;
|
|
31
|
+
kline1hBars: number;
|
|
32
|
+
kline1dBars: number;
|
|
33
|
+
}): Promise<AdvisorMarketSnapshot>;
|
|
34
|
+
//# sourceMappingURL=contextBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextBuilder.d.ts","sourceRoot":"","sources":["../../src/advisor/contextBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAM3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAO9D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9C,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AASF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa/E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,EAClB,IAAI,EAAE,MAAM,GACX,kBAAkB,GAAG,SAAS,CAuDhC;AAED,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,IAAI,EAAE,qBAAqB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAkDjC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { assertPerpKlineCoinInMeta, resolvePerpKlineCoinArg, } from "../core/hyperliquid/klineCoin.js";
|
|
2
|
+
import { inferHlDexFromPrefixedPerpCoin } from "../core/hyperliquid/prefixedPerpCoin.js";
|
|
3
|
+
import { signedPositionSizeForCoin } from "../core/state/snapshot.js";
|
|
4
|
+
const MINUTE_MS = 60_000;
|
|
5
|
+
const HOUR_MS = 60 * MINUTE_MS;
|
|
6
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
7
|
+
function trimCandles(raw, maxBars) {
|
|
8
|
+
if (!Array.isArray(raw)) {
|
|
9
|
+
return raw;
|
|
10
|
+
}
|
|
11
|
+
return raw.length <= maxBars ? raw : raw.slice(-maxBars);
|
|
12
|
+
}
|
|
13
|
+
export function readMidFromAllMids(mids, coin) {
|
|
14
|
+
if (typeof mids !== "object" || mids === null) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const v = mids[coin];
|
|
18
|
+
if (typeof v === "string") {
|
|
19
|
+
const n = Number(v);
|
|
20
|
+
return Number.isFinite(n) ? n : null;
|
|
21
|
+
}
|
|
22
|
+
if (typeof v === "number" && Number.isFinite(v)) {
|
|
23
|
+
return v;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/** Best-effort per-coin row from `clearinghouseState` (wire shapes vary). */
|
|
28
|
+
export function extractPositionDetail(chState, coin) {
|
|
29
|
+
const signed = signedPositionSizeForCoin(chState, coin);
|
|
30
|
+
if (signed === undefined || signed === 0 || !Number.isFinite(signed)) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
if (typeof chState !== "object" || chState === null) {
|
|
34
|
+
return { signed_sz: signed };
|
|
35
|
+
}
|
|
36
|
+
const assetPositions = chState.assetPositions;
|
|
37
|
+
if (!Array.isArray(assetPositions)) {
|
|
38
|
+
return { signed_sz: signed };
|
|
39
|
+
}
|
|
40
|
+
for (const ap of assetPositions) {
|
|
41
|
+
if (typeof ap !== "object" || ap === null) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const position = ap.position;
|
|
45
|
+
if (typeof position !== "object" || position === null) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const p = position;
|
|
49
|
+
if (p.coin !== coin) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const row = { signed_sz: signed };
|
|
53
|
+
const entryPx = p.entryPx;
|
|
54
|
+
if (typeof entryPx === "string") {
|
|
55
|
+
const n = Number(entryPx);
|
|
56
|
+
if (Number.isFinite(n)) {
|
|
57
|
+
row.entry_px = n;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (typeof entryPx === "number" && Number.isFinite(entryPx)) {
|
|
61
|
+
row.entry_px = entryPx;
|
|
62
|
+
}
|
|
63
|
+
const lev = ap.leverage;
|
|
64
|
+
if (typeof lev === "number" && Number.isFinite(lev)) {
|
|
65
|
+
row.leverage = lev;
|
|
66
|
+
}
|
|
67
|
+
else if (typeof lev === "object" && lev !== null) {
|
|
68
|
+
const v = lev.value;
|
|
69
|
+
if (typeof v === "number" && Number.isFinite(v)) {
|
|
70
|
+
row.leverage = v;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const uPnl = ap.unrealizedPnl;
|
|
74
|
+
if (typeof uPnl === "string") {
|
|
75
|
+
const n = Number(uPnl);
|
|
76
|
+
if (Number.isFinite(n)) {
|
|
77
|
+
row.unrealized_pnl = n;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (typeof uPnl === "number" && Number.isFinite(uPnl)) {
|
|
81
|
+
row.unrealized_pnl = uPnl;
|
|
82
|
+
}
|
|
83
|
+
return row;
|
|
84
|
+
}
|
|
85
|
+
return { signed_sz: signed };
|
|
86
|
+
}
|
|
87
|
+
export async function buildAdvisorMarketSnapshot(params) {
|
|
88
|
+
const resolvedCoin = resolvePerpKlineCoinArg(params.coin);
|
|
89
|
+
const dexForMeta = inferHlDexFromPrefixedPerpCoin(resolvedCoin);
|
|
90
|
+
if (dexForMeta) {
|
|
91
|
+
const meta = await params.info.meta(dexForMeta);
|
|
92
|
+
assertPerpKlineCoinInMeta(meta, resolvedCoin);
|
|
93
|
+
}
|
|
94
|
+
const endTime = params.nowMs;
|
|
95
|
+
const s5 = endTime - params.kline5mBars * 5 * MINUTE_MS;
|
|
96
|
+
const s1h = endTime - params.kline1hBars * HOUR_MS;
|
|
97
|
+
const s1d = endTime - params.kline1dBars * DAY_MS;
|
|
98
|
+
const [raw5m, raw1h, raw1d, ch, mids] = await Promise.all([
|
|
99
|
+
params.info.candleSnapshot({
|
|
100
|
+
coin: resolvedCoin,
|
|
101
|
+
interval: "5m",
|
|
102
|
+
startTime: s5,
|
|
103
|
+
endTime,
|
|
104
|
+
}),
|
|
105
|
+
params.info.candleSnapshot({
|
|
106
|
+
coin: resolvedCoin,
|
|
107
|
+
interval: "1h",
|
|
108
|
+
startTime: s1h,
|
|
109
|
+
endTime,
|
|
110
|
+
}),
|
|
111
|
+
params.info.candleSnapshot({
|
|
112
|
+
coin: resolvedCoin,
|
|
113
|
+
interval: "1d",
|
|
114
|
+
startTime: s1d,
|
|
115
|
+
endTime,
|
|
116
|
+
}),
|
|
117
|
+
params.info.clearinghouseState(params.userAddress),
|
|
118
|
+
params.info.allMids(dexForMeta),
|
|
119
|
+
]);
|
|
120
|
+
const pos = extractPositionDetail(ch, resolvedCoin);
|
|
121
|
+
const positions = pos ? { [resolvedCoin]: pos } : {};
|
|
122
|
+
return {
|
|
123
|
+
coin: resolvedCoin,
|
|
124
|
+
network: params.network,
|
|
125
|
+
now_ms: params.nowMs,
|
|
126
|
+
mid: readMidFromAllMids(mids, resolvedCoin),
|
|
127
|
+
positions,
|
|
128
|
+
kline_5m: trimCandles(raw5m, params.kline5mBars),
|
|
129
|
+
kline_1h: trimCandles(raw1h, params.kline1hBars),
|
|
130
|
+
kline_1d: trimCandles(raw1d, params.kline1dBars),
|
|
131
|
+
user_note: params.userNote,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=contextBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextBuilder.js","sourceRoot":"","sources":["../../src/advisor/contextBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Default chat model when `DEEPSEEK_MODEL` is unset (DeepSeek OpenAI-compatible API). */
|
|
2
|
+
export declare const DEFAULT_DEEPSEEK_MODEL = "deepseek-v4-pro";
|
|
3
|
+
/** DeepSeek thinking mode defaults (see api-docs.deepseek.com/guides/thinking_mode). */
|
|
4
|
+
export declare const DEFAULT_DEEPSEEK_REASONING_EFFORT: "high";
|
|
5
|
+
export type DeepseekReasoningEffort = "high" | "max";
|
|
6
|
+
export type ChatTurn = {
|
|
7
|
+
role: "system" | "user" | "assistant";
|
|
8
|
+
content: string;
|
|
9
|
+
/** DeepSeek thinking-mode CoT; only on assistant turns, echoed back on subsequent requests. */
|
|
10
|
+
reasoning_content?: string;
|
|
11
|
+
};
|
|
12
|
+
export type DeepseekChatResult = {
|
|
13
|
+
content: string;
|
|
14
|
+
reasoningContent?: string;
|
|
15
|
+
};
|
|
16
|
+
/** Build an assistant message for the next API round (includes reasoning when present). */
|
|
17
|
+
export declare function assistantChatTurnFromResult(res: DeepseekChatResult): ChatTurn;
|
|
18
|
+
export declare function deepseekChat(params: {
|
|
19
|
+
apiKey: string;
|
|
20
|
+
baseUrl?: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
messages: ChatTurn[];
|
|
23
|
+
reasoningEffort?: DeepseekReasoningEffort;
|
|
24
|
+
fetchImpl?: typeof fetch;
|
|
25
|
+
}): Promise<DeepseekChatResult>;
|
|
26
|
+
//# sourceMappingURL=deepseekClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseekClient.d.ts","sourceRoot":"","sources":["../../src/advisor/deepseekClient.ts"],"names":[],"mappings":"AAIA,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB,oBAAoB,CAAC;AAExD,wFAAwF;AACxF,eAAO,MAAM,iCAAiC,EAAG,MAAe,CAAC;AAEjE,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,kBAAkB,GAAG,QAAQ,CAM7E;AAYD,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoF9B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { ConfigError } from "../core/errors.js";
|
|
2
|
+
import { formatErrorChain } from "../core/hyperliquid/httpRequest.js";
|
|
3
|
+
import { formatHttpResponseBodyForDisplay } from "../core/errorFormat.js";
|
|
4
|
+
/** Default chat model when `DEEPSEEK_MODEL` is unset (DeepSeek OpenAI-compatible API). */
|
|
5
|
+
export const DEFAULT_DEEPSEEK_MODEL = "deepseek-v4-pro";
|
|
6
|
+
/** DeepSeek thinking mode defaults (see api-docs.deepseek.com/guides/thinking_mode). */
|
|
7
|
+
export const DEFAULT_DEEPSEEK_REASONING_EFFORT = "high";
|
|
8
|
+
/** Build an assistant message for the next API round (includes reasoning when present). */
|
|
9
|
+
export function assistantChatTurnFromResult(res) {
|
|
10
|
+
const turn = { role: "assistant", content: res.content };
|
|
11
|
+
if (res.reasoningContent !== undefined) {
|
|
12
|
+
turn.reasoning_content = res.reasoningContent;
|
|
13
|
+
}
|
|
14
|
+
return turn;
|
|
15
|
+
}
|
|
16
|
+
function deepseekHttpError(status, statusText, bodyText) {
|
|
17
|
+
const body = formatHttpResponseBodyForDisplay(bodyText);
|
|
18
|
+
const label = statusText ? `${status} ${statusText}` : String(status);
|
|
19
|
+
return new ConfigError([`DeepSeek API HTTP ${label} POST /v1/chat/completions`, body ? `Response body:\n${body}` : ""]
|
|
20
|
+
.filter(Boolean)
|
|
21
|
+
.join("\n"));
|
|
22
|
+
}
|
|
23
|
+
export async function deepseekChat(params) {
|
|
24
|
+
const base = (params.baseUrl ?? "https://api.deepseek.com").replace(/\/+$/, "");
|
|
25
|
+
const model = params.model ?? (process.env.DEEPSEEK_MODEL?.trim() || DEFAULT_DEEPSEEK_MODEL);
|
|
26
|
+
const reasoningEffort = params.reasoningEffort ??
|
|
27
|
+
process.env.DEEPSEEK_REASONING_EFFORT?.trim() ??
|
|
28
|
+
DEFAULT_DEEPSEEK_REASONING_EFFORT;
|
|
29
|
+
const fetchImpl = params.fetchImpl ?? fetch;
|
|
30
|
+
const url = `${base}/v1/chat/completions`;
|
|
31
|
+
let res;
|
|
32
|
+
try {
|
|
33
|
+
res = await fetchImpl(url, {
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: {
|
|
36
|
+
Authorization: `Bearer ${params.apiKey}`,
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
Accept: "application/json",
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify({
|
|
41
|
+
model,
|
|
42
|
+
messages: params.messages,
|
|
43
|
+
reasoning_effort: reasoningEffort,
|
|
44
|
+
thinking: { type: "enabled" },
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
throw new ConfigError([`DeepSeek API network error POST ${url}`, formatErrorChain(e)].join("\n"));
|
|
50
|
+
}
|
|
51
|
+
const text = await res.text();
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
throw deepseekHttpError(res.status, res.statusText, text);
|
|
54
|
+
}
|
|
55
|
+
let json;
|
|
56
|
+
try {
|
|
57
|
+
json = JSON.parse(text);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new ConfigError([
|
|
61
|
+
"DeepSeek API returned non-JSON body.",
|
|
62
|
+
text ? `Response body:\n${formatHttpResponseBodyForDisplay(text)}` : "",
|
|
63
|
+
]
|
|
64
|
+
.filter(Boolean)
|
|
65
|
+
.join("\n"));
|
|
66
|
+
}
|
|
67
|
+
const root = json;
|
|
68
|
+
const choices = root.choices;
|
|
69
|
+
if (!Array.isArray(choices) || choices.length === 0) {
|
|
70
|
+
throw new ConfigError([
|
|
71
|
+
"DeepSeek API: missing choices[0].",
|
|
72
|
+
`Response body:\n${formatHttpResponseBodyForDisplay(text)}`,
|
|
73
|
+
].join("\n"));
|
|
74
|
+
}
|
|
75
|
+
const msg = choices[0];
|
|
76
|
+
const message = msg.message;
|
|
77
|
+
if (!message) {
|
|
78
|
+
throw new ConfigError([
|
|
79
|
+
"DeepSeek API: missing message.",
|
|
80
|
+
`Response body:\n${formatHttpResponseBodyForDisplay(text)}`,
|
|
81
|
+
].join("\n"));
|
|
82
|
+
}
|
|
83
|
+
const content = message.content;
|
|
84
|
+
if (typeof content !== "string") {
|
|
85
|
+
throw new ConfigError([
|
|
86
|
+
"DeepSeek API: message.content must be a string.",
|
|
87
|
+
`Response body:\n${formatHttpResponseBodyForDisplay(text)}`,
|
|
88
|
+
].join("\n"));
|
|
89
|
+
}
|
|
90
|
+
const reasoningRaw = message.reasoning_content ?? message.reasoningContent;
|
|
91
|
+
return {
|
|
92
|
+
content,
|
|
93
|
+
reasoningContent: typeof reasoningRaw === "string" ? reasoningRaw : undefined,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=deepseekClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseekClient.js","sourceRoot":"","sources":["../../src/advisor/deepseekClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { UserProfile } from "../core/state/schema.js";
|
|
2
|
+
import type { AdvisorAction } from "./actionSchema.js";
|
|
3
|
+
export type AdvisorGuardInputs = {
|
|
4
|
+
coin: string;
|
|
5
|
+
maxSz: number;
|
|
6
|
+
/** CLI override; falls back to profile */
|
|
7
|
+
requireTpsl?: boolean;
|
|
8
|
+
mid: number | null;
|
|
9
|
+
/** Signed position for `coin` (positive = long). */
|
|
10
|
+
positionSignedSz: number | undefined;
|
|
11
|
+
profile: UserProfile | undefined;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Hard execution guards (do not rely on the model). Throws `ConfigError` when blocked.
|
|
15
|
+
*/
|
|
16
|
+
export declare function assertAdvisorActionPassesGuards(action: AdvisorAction, inputs: AdvisorGuardInputs): void;
|
|
17
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/advisor/guards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC,CAAC;AAsBF;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,kBAAkB,GACzB,IAAI,CA0DN"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ConfigError } from "../core/errors.js";
|
|
2
|
+
import { mergeUserProfileDefaults } from "../core/state/profileStore.js";
|
|
3
|
+
function effectiveRequireTpsl(inputs) {
|
|
4
|
+
if (inputs.requireTpsl !== undefined) {
|
|
5
|
+
return inputs.requireTpsl;
|
|
6
|
+
}
|
|
7
|
+
return mergeUserProfileDefaults(inputs.profile).requireTpsl;
|
|
8
|
+
}
|
|
9
|
+
function effectiveDeviationMax(inputs) {
|
|
10
|
+
return mergeUserProfileDefaults(inputs.profile).priceDeviationPctMax;
|
|
11
|
+
}
|
|
12
|
+
function perCoinMaxSz(inputs) {
|
|
13
|
+
const p = mergeUserProfileDefaults(inputs.profile);
|
|
14
|
+
const by = p.maxSzByCoin?.[inputs.coin];
|
|
15
|
+
if (typeof by === "number" && Number.isFinite(by)) {
|
|
16
|
+
return by;
|
|
17
|
+
}
|
|
18
|
+
return p.defaultMaxSz;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Hard execution guards (do not rely on the model). Throws `ConfigError` when blocked.
|
|
22
|
+
*/
|
|
23
|
+
export function assertAdvisorActionPassesGuards(action, inputs) {
|
|
24
|
+
const maxSz = inputs.maxSz;
|
|
25
|
+
if (!Number.isFinite(maxSz) || maxSz <= 0) {
|
|
26
|
+
throw new ConfigError("advise: --max-sz must be a positive finite number.");
|
|
27
|
+
}
|
|
28
|
+
const coinCap = perCoinMaxSz(inputs);
|
|
29
|
+
const szCap = coinCap !== undefined ? Math.min(maxSz, coinCap) : maxSz;
|
|
30
|
+
if (action.action === "open_with_bracket") {
|
|
31
|
+
if (effectiveRequireTpsl(inputs)) {
|
|
32
|
+
if (!Number.isFinite(action.tp_px) || !Number.isFinite(action.sl_px)) {
|
|
33
|
+
throw new ConfigError("advise: bracket action blocked (--require-tpsl): missing tp/sl.");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (action.sz > szCap) {
|
|
37
|
+
throw new ConfigError(`advise: bracket sz ${action.sz} exceeds cap ${szCap} ( --max-sz / profile ).`);
|
|
38
|
+
}
|
|
39
|
+
if (inputs.mid !== null && inputs.mid > 0) {
|
|
40
|
+
const dev = Math.abs(action.limit_px - inputs.mid) / inputs.mid;
|
|
41
|
+
if (dev > effectiveDeviationMax(inputs)) {
|
|
42
|
+
throw new ConfigError(`advise: limit_px ${action.limit_px} deviates ${(dev * 100).toFixed(2)}% from mid ${inputs.mid}; max ${(effectiveDeviationMax(inputs) * 100).toFixed(2)}%.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (action.action === "close_position") {
|
|
47
|
+
const pos = inputs.positionSignedSz;
|
|
48
|
+
if (pos === undefined || !Number.isFinite(pos) || pos === 0) {
|
|
49
|
+
throw new ConfigError("advise: close_position blocked: no open position for this coin.");
|
|
50
|
+
}
|
|
51
|
+
const absz = Math.abs(pos);
|
|
52
|
+
if (absz > szCap) {
|
|
53
|
+
throw new ConfigError(`advise: close_position blocked: position size ${absz} exceeds cap ${szCap}.`);
|
|
54
|
+
}
|
|
55
|
+
if (action.method === "limit") {
|
|
56
|
+
if (action.limit_px === undefined || !Number.isFinite(action.limit_px)) {
|
|
57
|
+
throw new ConfigError("advise: close_position limit method requires limit_px.");
|
|
58
|
+
}
|
|
59
|
+
if (inputs.mid !== null && inputs.mid > 0) {
|
|
60
|
+
const dev = Math.abs(action.limit_px - inputs.mid) / inputs.mid;
|
|
61
|
+
if (dev > effectiveDeviationMax(inputs)) {
|
|
62
|
+
throw new ConfigError(`advise: close limit_px deviates too far from mid (${(dev * 100).toFixed(2)}% > ${(effectiveDeviationMax(inputs) * 100).toFixed(2)}%).`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (action.method === "market" && inputs.mid === null) {
|
|
67
|
+
throw new ConfigError("advise: close_position market needs a valid mid price.");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/advisor/guards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { UserProfile } from "../core/state/schema.js";
|
|
2
|
+
import type { AdvisorMarketSnapshot } from "./contextBuilder.js";
|
|
3
|
+
export declare function buildAdvisorSystemPrompt(profile: UserProfile | undefined): string;
|
|
4
|
+
export declare function formatFirstUserPayload(snapshot: AdvisorMarketSnapshot): string;
|
|
5
|
+
//# sourceMappingURL=promptTemplate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptTemplate.d.ts","sourceRoot":"","sources":["../../src/advisor/promptTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CA+DjF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAgB9E"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { mergeUserProfileDefaults } from "../core/state/profileStore.js";
|
|
2
|
+
export function buildAdvisorSystemPrompt(profile) {
|
|
3
|
+
const p = mergeUserProfileDefaults(profile);
|
|
4
|
+
const perCoin = p.maxSzByCoin && Object.keys(p.maxSzByCoin).length > 0
|
|
5
|
+
? `- per-coin max size: ${JSON.stringify(p.maxSzByCoin)}`
|
|
6
|
+
: "";
|
|
7
|
+
return `你是一位专注于 Hyperliquid 永续合约的风控型量化交易顾问,具备专业的技术分析能力。请只回复一个 JSON 对象(不要 markdown 围栏,不要额外文字)。JSON 必须符合用户消息中的约定,且 reason 等文本字段请使用中文。
|
|
8
|
+
|
|
9
|
+
用户风险偏好:
|
|
10
|
+
- 风格:${p.risk}
|
|
11
|
+
- 当 requireTpsl 为 true(当前:${p.requireTpsl})时,bracket 交易必须包含 TP 和 SL
|
|
12
|
+
- 限价单价格应在当前 mid 的 ±${(p.priceDeviationPctMax * 100).toFixed(2)}% 以内,除非选择等待
|
|
13
|
+
${p.defaultMaxSz !== undefined ? `- 建议最大仓位上限参考:${p.defaultMaxSz}` : ""}
|
|
14
|
+
${perCoin}
|
|
15
|
+
${p.tradingStyleNotes ? `- 备注:${p.tradingStyleNotes}` : ""}
|
|
16
|
+
|
|
17
|
+
## 分析框架(决策前必须先完成以下三维分析,结果写入 analysis 字段)
|
|
18
|
+
|
|
19
|
+
### 1. 常规技术指标(analysis.indicators)
|
|
20
|
+
综合多周期 K 线数据,分析以下指标并给出文字摘要:
|
|
21
|
+
- 趋势:EMA/MA 排列方向,日线/1h/5m 多周期共振程度
|
|
22
|
+
- 动能:MACD 柱高度变化、DIF/DEA 穿越、背离
|
|
23
|
+
- 超买超卖:RSI 数值及是否进入极端区间
|
|
24
|
+
- 波动率:布林带开合程度,价格所处带位
|
|
25
|
+
- 量价关系(如有成交量数据)
|
|
26
|
+
综合判断当前趋势状态:强势上涨 / 强势下跌 / 弱势盘整 / 即将变盘
|
|
27
|
+
|
|
28
|
+
### 2. 波浪理论(analysis.elliott_wave)
|
|
29
|
+
对当前价格走势进行波浪标注:
|
|
30
|
+
- 判断当前所处浪级(推动浪 i~v 或调整浪 A/B/C)
|
|
31
|
+
- 说明前一完整浪形的起止价格,以及当前浪的起点位置
|
|
32
|
+
- 预测下一浪的方向与典型目标位(参考黄金比例 0.618 / 1.0 / 1.618 扩展)
|
|
33
|
+
- 若判断不确定,说明多空两个情景下的浪形路径
|
|
34
|
+
|
|
35
|
+
### 3. 缠论(analysis.chan_theory)
|
|
36
|
+
从缠论角度分析结构:
|
|
37
|
+
- 识别近期的笔(BI)和线段(Duan)方向
|
|
38
|
+
- 判断当前中枢位置(震荡区间上下界)
|
|
39
|
+
- 识别趋势类型:上涨/下跌/盘整
|
|
40
|
+
- 指出当前是否出现买卖点:一买/二买/三买 或 一卖/二卖/三卖,以及对应的信号依据
|
|
41
|
+
|
|
42
|
+
### 4. 价格目标与时间预估(analysis.price_targets)
|
|
43
|
+
基于以上三维分析,列出关键价格目标,每项包含:
|
|
44
|
+
- level: 价格数值
|
|
45
|
+
- label: 目标含义,如"目标位1"、"强阻力"、"关键支撑"、"止损参考"
|
|
46
|
+
- time_est: 预计到达时间,如"2-4小时"、"1-3天"、"本周内"
|
|
47
|
+
- probability: 到达概率 0~1(可选)
|
|
48
|
+
|
|
49
|
+
### 5. 时间维度(analysis.time_horizon)
|
|
50
|
+
基于分析给出本次策略的建议持仓时长,如"4-8小时"、"1-2天"
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 决策规则
|
|
55
|
+
|
|
56
|
+
在完成以上分析后,给出具体的操作动作。允许的 "action" 字符串值:
|
|
57
|
+
- "wait":包含 reason(中文)、confidence
|
|
58
|
+
- "open_with_bracket":side buy|sell,limit_px,sz,tp_px,sl_px,is_market boolean;若 is_market 为 false,需设置 protection_limit_px(TP/SL 触发后的跟随限价);reason(中文)、confidence,risk_flags 可选数组
|
|
59
|
+
- "close_position":method "market"|"limit";若为 limit,需设置 limit_px;reason(中文)、confidence
|
|
60
|
+
- "cancel_all":撤销本地 state 中所有挂单 — 仅需 reason(中文)
|
|
61
|
+
|
|
62
|
+
仓位大小单位为币种单位。置信度低时请保守操作;不确定时优先选择 "wait"。
|
|
63
|
+
tp_px / sl_px 应与 price_targets 中的目标位保持一致,策略须具备时间维度的应对预案。`;
|
|
64
|
+
}
|
|
65
|
+
export function formatFirstUserPayload(snapshot) {
|
|
66
|
+
return JSON.stringify({
|
|
67
|
+
coin: snapshot.coin,
|
|
68
|
+
network: snapshot.network,
|
|
69
|
+
now_ms: snapshot.now_ms,
|
|
70
|
+
mid: snapshot.mid,
|
|
71
|
+
positions: snapshot.positions,
|
|
72
|
+
kline_5m: snapshot.kline_5m,
|
|
73
|
+
kline_1h: snapshot.kline_1h,
|
|
74
|
+
kline_1d: snapshot.kline_1d,
|
|
75
|
+
user_note: snapshot.user_note,
|
|
76
|
+
}, null, 2);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=promptTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptTemplate.js","sourceRoot":"","sources":["../../src/advisor/promptTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAIzE,MAAM,UAAU,wBAAwB,CAAC,OAAgC;IACvE,MAAM,CAAC,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GACX,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;QACpD,CAAC,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE;QACzD,CAAC,CAAC,EAAE,CAAC;IACT,OAAO;;;OAGF,CAAC,CAAC,IAAI;4BACe,CAAC,CAAC,WAAW;qBACpB,CAAC,CAAC,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;EAC5D,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;EACpE,OAAO;EACP,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDAgDD,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA+B;IACpE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { UserProfile } from "../core/state/schema.js";
|
|
2
|
+
import type { AdvisorAction } from "./actionSchema.js";
|
|
3
|
+
import type { AdvisorMarketSnapshot } from "./contextBuilder.js";
|
|
4
|
+
export type AdvisorSessionTurn = {
|
|
5
|
+
role: "system";
|
|
6
|
+
content: string;
|
|
7
|
+
} | {
|
|
8
|
+
role: "user";
|
|
9
|
+
content: string;
|
|
10
|
+
} | {
|
|
11
|
+
role: "assistant";
|
|
12
|
+
content: string;
|
|
13
|
+
reasoning_content?: string;
|
|
14
|
+
action?: AdvisorAction;
|
|
15
|
+
};
|
|
16
|
+
export type AdvisorSessionFile = {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
coin: string;
|
|
19
|
+
createdAtMs: number;
|
|
20
|
+
model: string;
|
|
21
|
+
userProfileSnapshot: UserProfile | null;
|
|
22
|
+
marketSnapshot: {
|
|
23
|
+
coin: string;
|
|
24
|
+
network: string;
|
|
25
|
+
now_ms: number;
|
|
26
|
+
mid: number | null;
|
|
27
|
+
positions: AdvisorMarketSnapshot["positions"];
|
|
28
|
+
kline_5m: AdvisorMarketSnapshot["kline_5m"];
|
|
29
|
+
kline_1h: AdvisorMarketSnapshot["kline_1h"];
|
|
30
|
+
kline_1d: AdvisorMarketSnapshot["kline_1d"];
|
|
31
|
+
};
|
|
32
|
+
turns: AdvisorSessionTurn[];
|
|
33
|
+
executed?: {
|
|
34
|
+
command: string;
|
|
35
|
+
actionSpec: AdvisorAction;
|
|
36
|
+
exchangeResponse: unknown;
|
|
37
|
+
exitCode: number;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export declare function writeAdvisorSessionLog(filePath: string, data: AdvisorSessionFile): Promise<void>;
|
|
41
|
+
//# sourceMappingURL=sessionLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionLog.d.ts","sourceRoot":"","sources":["../../src/advisor/sessionLog.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEN,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,WAAW,GAAG,IAAI,CAAC;IACxC,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC9C,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAC5C,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAC5C,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAC;KAC7C,CAAC;IACF,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,aAAa,CAAC;QAC1B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function writeAdvisorSessionLog(filePath, data) {
|
|
4
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
5
|
+
await writeFile(filePath, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=sessionLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionLog.js","sourceRoot":"","sources":["../../src/advisor/sessionLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AA0C7B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAgB,EAChB,IAAwB;IAExB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisorCli.d.ts","sourceRoot":"","sources":["../../src/cli/advisorCli.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4EzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6VvD"}
|