jcc_hyper_tool 0.1.4 → 0.1.6

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.
Files changed (179) hide show
  1. package/README.md +159 -21
  2. package/dist/advisor/actionRunner.d.ts +35 -0
  3. package/dist/advisor/actionRunner.d.ts.map +1 -0
  4. package/dist/advisor/actionRunner.js +194 -0
  5. package/dist/advisor/actionRunner.js.map +1 -0
  6. package/dist/advisor/actionSchema.d.ts +1551 -0
  7. package/dist/advisor/actionSchema.d.ts.map +1 -0
  8. package/dist/advisor/actionSchema.js +202 -0
  9. package/dist/advisor/actionSchema.js.map +1 -0
  10. package/dist/advisor/adviseDisplay.d.ts +26 -0
  11. package/dist/advisor/adviseDisplay.d.ts.map +1 -0
  12. package/dist/advisor/adviseDisplay.js +174 -0
  13. package/dist/advisor/adviseDisplay.js.map +1 -0
  14. package/dist/advisor/adviseEngine.d.ts +53 -0
  15. package/dist/advisor/adviseEngine.d.ts.map +1 -0
  16. package/dist/advisor/adviseEngine.js +172 -0
  17. package/dist/advisor/adviseEngine.js.map +1 -0
  18. package/dist/advisor/ambushPolicy.d.ts +47 -0
  19. package/dist/advisor/ambushPolicy.d.ts.map +1 -0
  20. package/dist/advisor/ambushPolicy.js +161 -0
  21. package/dist/advisor/ambushPolicy.js.map +1 -0
  22. package/dist/advisor/contextBuilder.d.ts +51 -0
  23. package/dist/advisor/contextBuilder.d.ts.map +1 -0
  24. package/dist/advisor/contextBuilder.js +153 -0
  25. package/dist/advisor/contextBuilder.js.map +1 -0
  26. package/dist/advisor/deepseekClient.d.ts +26 -0
  27. package/dist/advisor/deepseekClient.d.ts.map +1 -0
  28. package/dist/advisor/deepseekClient.js +96 -0
  29. package/dist/advisor/deepseekClient.js.map +1 -0
  30. package/dist/advisor/executionPolicy.d.ts +92 -0
  31. package/dist/advisor/executionPolicy.d.ts.map +1 -0
  32. package/dist/advisor/executionPolicy.js +273 -0
  33. package/dist/advisor/executionPolicy.js.map +1 -0
  34. package/dist/advisor/guards.d.ts +31 -0
  35. package/dist/advisor/guards.d.ts.map +1 -0
  36. package/dist/advisor/guards.js +198 -0
  37. package/dist/advisor/guards.js.map +1 -0
  38. package/dist/advisor/indicatorCompute.d.ts +45 -0
  39. package/dist/advisor/indicatorCompute.d.ts.map +1 -0
  40. package/dist/advisor/indicatorCompute.js +259 -0
  41. package/dist/advisor/indicatorCompute.js.map +1 -0
  42. package/dist/advisor/positionPlan.d.ts +33 -0
  43. package/dist/advisor/positionPlan.d.ts.map +1 -0
  44. package/dist/advisor/positionPlan.js +118 -0
  45. package/dist/advisor/positionPlan.js.map +1 -0
  46. package/dist/advisor/promptTemplate.d.ts +11 -0
  47. package/dist/advisor/promptTemplate.d.ts.map +1 -0
  48. package/dist/advisor/promptTemplate.js +230 -0
  49. package/dist/advisor/promptTemplate.js.map +1 -0
  50. package/dist/advisor/sessionLog.d.ts +41 -0
  51. package/dist/advisor/sessionLog.d.ts.map +1 -0
  52. package/dist/advisor/sessionLog.js +7 -0
  53. package/dist/advisor/sessionLog.js.map +1 -0
  54. package/dist/advisor/touchProbability.d.ts +54 -0
  55. package/dist/advisor/touchProbability.d.ts.map +1 -0
  56. package/dist/advisor/touchProbability.js +215 -0
  57. package/dist/advisor/touchProbability.js.map +1 -0
  58. package/dist/advisor/tpslPolicy.d.ts +22 -0
  59. package/dist/advisor/tpslPolicy.d.ts.map +1 -0
  60. package/dist/advisor/tpslPolicy.js +120 -0
  61. package/dist/advisor/tpslPolicy.js.map +1 -0
  62. package/dist/cli/advisorCli.d.ts +3 -0
  63. package/dist/cli/advisorCli.d.ts.map +1 -0
  64. package/dist/cli/advisorCli.js +706 -0
  65. package/dist/cli/advisorCli.js.map +1 -0
  66. package/dist/cli/index.js +6 -2
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/cli/riskCli.d.ts +3 -0
  69. package/dist/cli/riskCli.d.ts.map +1 -0
  70. package/dist/cli/riskCli.js +120 -0
  71. package/dist/cli/riskCli.js.map +1 -0
  72. package/dist/cli/strategyCli.d.ts.map +1 -1
  73. package/dist/cli/strategyCli.js +4 -2
  74. package/dist/cli/strategyCli.js.map +1 -1
  75. package/dist/cli/tradingCli.d.ts.map +1 -1
  76. package/dist/cli/tradingCli.js +34 -2
  77. package/dist/cli/tradingCli.js.map +1 -1
  78. package/dist/core/cliBin.d.ts +8 -0
  79. package/dist/core/cliBin.d.ts.map +1 -0
  80. package/dist/core/cliBin.js +15 -0
  81. package/dist/core/cliBin.js.map +1 -0
  82. package/dist/core/errorFormat.d.ts +7 -0
  83. package/dist/core/errorFormat.d.ts.map +1 -0
  84. package/dist/core/errorFormat.js +59 -0
  85. package/dist/core/errorFormat.js.map +1 -0
  86. package/dist/core/errors.d.ts +2 -1
  87. package/dist/core/errors.d.ts.map +1 -1
  88. package/dist/core/errors.js +3 -1
  89. package/dist/core/errors.js.map +1 -1
  90. package/dist/core/hyperliquid/asset.d.ts +2 -0
  91. package/dist/core/hyperliquid/asset.d.ts.map +1 -1
  92. package/dist/core/hyperliquid/asset.js +25 -0
  93. package/dist/core/hyperliquid/asset.js.map +1 -1
  94. package/dist/core/hyperliquid/client.d.ts +3 -0
  95. package/dist/core/hyperliquid/client.d.ts.map +1 -1
  96. package/dist/core/hyperliquid/client.js +31 -21
  97. package/dist/core/hyperliquid/client.js.map +1 -1
  98. package/dist/core/hyperliquid/exchange.d.ts +3 -0
  99. package/dist/core/hyperliquid/exchange.d.ts.map +1 -1
  100. package/dist/core/hyperliquid/exchange.js +31 -21
  101. package/dist/core/hyperliquid/exchange.js.map +1 -1
  102. package/dist/core/hyperliquid/exchangeParse.d.ts +3 -0
  103. package/dist/core/hyperliquid/exchangeParse.d.ts.map +1 -1
  104. package/dist/core/hyperliquid/exchangeParse.js +62 -0
  105. package/dist/core/hyperliquid/exchangeParse.js.map +1 -1
  106. package/dist/core/hyperliquid/httpRequest.d.ts +36 -0
  107. package/dist/core/hyperliquid/httpRequest.d.ts.map +1 -0
  108. package/dist/core/hyperliquid/httpRequest.js +171 -0
  109. package/dist/core/hyperliquid/httpRequest.js.map +1 -0
  110. package/dist/core/hyperliquid/orders.d.ts +5 -0
  111. package/dist/core/hyperliquid/orders.d.ts.map +1 -1
  112. package/dist/core/hyperliquid/orders.js +15 -5
  113. package/dist/core/hyperliquid/orders.js.map +1 -1
  114. package/dist/core/hyperliquid/rounding.d.ts +23 -0
  115. package/dist/core/hyperliquid/rounding.d.ts.map +1 -0
  116. package/dist/core/hyperliquid/rounding.js +53 -0
  117. package/dist/core/hyperliquid/rounding.js.map +1 -0
  118. package/dist/core/risk/isolatedTopUp.d.ts +112 -0
  119. package/dist/core/risk/isolatedTopUp.d.ts.map +1 -0
  120. package/dist/core/risk/isolatedTopUp.js +209 -0
  121. package/dist/core/risk/isolatedTopUp.js.map +1 -0
  122. package/dist/core/risk/isolatedTopUpHistory.d.ts +7 -0
  123. package/dist/core/risk/isolatedTopUpHistory.d.ts.map +1 -0
  124. package/dist/core/risk/isolatedTopUpHistory.js +26 -0
  125. package/dist/core/risk/isolatedTopUpHistory.js.map +1 -0
  126. package/dist/core/risk/isolatedTopUpParse.d.ts +16 -0
  127. package/dist/core/risk/isolatedTopUpParse.d.ts.map +1 -0
  128. package/dist/core/risk/isolatedTopUpParse.js +78 -0
  129. package/dist/core/risk/isolatedTopUpParse.js.map +1 -0
  130. package/dist/core/risk/runIsolatedTopUpReconcile.d.ts +28 -0
  131. package/dist/core/risk/runIsolatedTopUpReconcile.d.ts.map +1 -0
  132. package/dist/core/risk/runIsolatedTopUpReconcile.js +184 -0
  133. package/dist/core/risk/runIsolatedTopUpReconcile.js.map +1 -0
  134. package/dist/core/state/gcTradeState.js +1 -1
  135. package/dist/core/state/gcTradeState.js.map +1 -1
  136. package/dist/core/state/gridReconcile.d.ts +2 -0
  137. package/dist/core/state/gridReconcile.d.ts.map +1 -1
  138. package/dist/core/state/gridReconcile.js +42 -2
  139. package/dist/core/state/gridReconcile.js.map +1 -1
  140. package/dist/core/state/intentFactory.d.ts +1 -0
  141. package/dist/core/state/intentFactory.d.ts.map +1 -1
  142. package/dist/core/state/intentFactory.js +1 -0
  143. package/dist/core/state/intentFactory.js.map +1 -1
  144. package/dist/core/state/profileStore.d.ts +6 -0
  145. package/dist/core/state/profileStore.d.ts.map +1 -0
  146. package/dist/core/state/profileStore.js +26 -0
  147. package/dist/core/state/profileStore.js.map +1 -0
  148. package/dist/core/state/runReconcile.d.ts.map +1 -1
  149. package/dist/core/state/runReconcile.js +92 -30
  150. package/dist/core/state/runReconcile.js.map +1 -1
  151. package/dist/core/state/schema.d.ts +565 -124
  152. package/dist/core/state/schema.d.ts.map +1 -1
  153. package/dist/core/state/schema.js +62 -0
  154. package/dist/core/state/schema.js.map +1 -1
  155. package/dist/core/state/snapshot.d.ts +13 -0
  156. package/dist/core/state/snapshot.d.ts.map +1 -1
  157. package/dist/core/state/snapshot.js +36 -0
  158. package/dist/core/state/snapshot.js.map +1 -1
  159. package/dist/core/state/statePaths.d.ts +1 -0
  160. package/dist/core/state/statePaths.d.ts.map +1 -1
  161. package/dist/core/state/statePaths.js +4 -0
  162. package/dist/core/state/statePaths.js.map +1 -1
  163. package/dist/core/state/store.d.ts +21 -3
  164. package/dist/core/state/store.d.ts.map +1 -1
  165. package/dist/core/state/store.js +123 -14
  166. package/dist/core/state/store.js.map +1 -1
  167. package/dist/core/state/types.d.ts +13 -0
  168. package/dist/core/state/types.d.ts.map +1 -1
  169. package/dist/daemon/index.js +50 -5
  170. package/dist/daemon/index.js.map +1 -1
  171. package/dist/daemon/validateChild.d.ts +13 -0
  172. package/dist/daemon/validateChild.d.ts.map +1 -0
  173. package/dist/daemon/validateChild.js +77 -0
  174. package/dist/daemon/validateChild.js.map +1 -0
  175. package/dist/strategies/grid.d.ts +1 -0
  176. package/dist/strategies/grid.d.ts.map +1 -1
  177. package/dist/strategies/grid.js +1 -0
  178. package/dist/strategies/grid.js.map +1 -1
  179. package/package.json +3 -1
@@ -0,0 +1,172 @@
1
+ import { assistantChatTurnFromResult, deepseekChat } from "./deepseekClient.js";
2
+ import { parseDualAdvisorResponse, dualActionsFromResponse } from "./actionSchema.js";
3
+ import { isAdvisorBracketOpenAction } from "./actionSchema.js";
4
+ import { assertAdvisorActionPassesGuards } from "./guards.js";
5
+ import { mergeUserProfileDefaults } from "../core/state/profileStore.js";
6
+ import { readOrCreateTradeStateFile } from "../core/state/store.js";
7
+ import { reconcilePendingAmbushBeforePlace } from "./ambushPolicy.js";
8
+ import { advisorActionToCliArgs, assertAdviseActionNeedsState, buildGlobalPrefix, formatCliInvocation, spawnJccHyperTool, } from "./actionRunner.js";
9
+ import { assertAdvisorConfidenceGate, assertAdviseExecuteCooldown, prepareAdvisorActionForExecution, readAdviseExecuteHistory, recordAdviseExecuteCooldown, resolveAdvisorExecutionPolicy, resolveAdvisorSzCap, } from "./executionPolicy.js";
10
+ /**
11
+ * Calls DeepSeek; validates JSON/Zod; on failure appends repair instructions (bounded retries).
12
+ */
13
+ export async function runAdvisorModelTurnWithRepair(params) {
14
+ const maxRepair = params.maxRepair ?? 2;
15
+ const maxAttempts = maxRepair + 1;
16
+ let msgs = [...params.messages];
17
+ let lastRes = { content: "" };
18
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
19
+ lastRes = await deepseekChat({
20
+ apiKey: params.apiKey,
21
+ messages: msgs,
22
+ fetchImpl: params.fetchImpl,
23
+ });
24
+ try {
25
+ const response = parseDualAdvisorResponse(lastRes.content);
26
+ const actions = dualActionsFromResponse(response);
27
+ msgs = [...msgs, assistantChatTurnFromResult(lastRes)];
28
+ return { messages: msgs, response, actions, lastAssistant: lastRes };
29
+ }
30
+ catch (e) {
31
+ const msg = e instanceof Error ? e.message : String(e);
32
+ if (attempt >= maxAttempts - 1) {
33
+ throw e;
34
+ }
35
+ msgs = [
36
+ ...msgs,
37
+ assistantChatTurnFromResult(lastRes),
38
+ {
39
+ role: "user",
40
+ content: `Your reply failed validation: ${msg}. Output ONE JSON object only, no markdown, matching the schema.`,
41
+ },
42
+ ];
43
+ }
44
+ }
45
+ throw new Error("advisor: model repair loop exhausted");
46
+ }
47
+ export async function executeAdvisorAction(params) {
48
+ if (params.action.action === "wait") {
49
+ return {
50
+ exitCode: 0,
51
+ stdout: "",
52
+ stderr: "",
53
+ command: "(no exchange action)",
54
+ response: { note: "wait" },
55
+ };
56
+ }
57
+ const posRow = params.snapshot.positions[params.snapshot.coin];
58
+ const positionSignedSz = posRow?.signed_sz;
59
+ const nowMs = params.nowMs ?? Date.now();
60
+ let tradeState = params.statePath && !params.noState
61
+ ? await readOrCreateTradeStateFile(params.statePath, nowMs)
62
+ : undefined;
63
+ const guardInputs = {
64
+ coin: params.coin,
65
+ maxSz: params.maxSz,
66
+ requireTpsl: params.requireTpsl,
67
+ mid: params.snapshot.mid,
68
+ positionSignedSz,
69
+ positionEntryPx: posRow?.entry_px,
70
+ profile: params.profile,
71
+ szDecimals: params.snapshot.sz_decimals,
72
+ tradeState,
73
+ nowMs,
74
+ kline1h: params.snapshot.kline_1h,
75
+ skipTouchProb: true,
76
+ };
77
+ const policy = params.executionPolicy ??
78
+ resolveAdvisorExecutionPolicy(params.profile, params.executionPolicyCli ?? {});
79
+ assertAdvisorConfidenceGate(params.action, policy.minConfidence);
80
+ if (policy.executeCooldownSec > 0 && params.statePath && !params.noState) {
81
+ assertAdviseExecuteCooldown({
82
+ history: readAdviseExecuteHistory(tradeState),
83
+ coin: params.coin,
84
+ action: params.action,
85
+ cooldownSec: policy.executeCooldownSec,
86
+ nowMs,
87
+ });
88
+ }
89
+ assertAdvisorActionPassesGuards(params.action, guardInputs);
90
+ const maxDevPct = mergeUserProfileDefaults(params.profile).priceDeviationPctMax;
91
+ const slShift = policy.bracketSlEntryShift;
92
+ const { action: execAction, notes: execNotes } = prepareAdvisorActionForExecution(params.action, {
93
+ slEntryShift: slShift,
94
+ limitJitterPct: policy.limitJitterPct,
95
+ mid: params.snapshot.mid,
96
+ maxDevPct,
97
+ szDecimals: params.snapshot.sz_decimals,
98
+ kline1h: params.snapshot.kline_1h,
99
+ profile: params.profile,
100
+ });
101
+ for (const note of execNotes) {
102
+ process.stderr.write(`advise: ${note}.\n`);
103
+ }
104
+ assertAdvisorActionPassesGuards(execAction, {
105
+ ...guardInputs,
106
+ skipEntryMidDeviation: slShift > 0 && isAdvisorBracketOpenAction(execAction),
107
+ skipTouchProb: false,
108
+ });
109
+ assertAdviseActionNeedsState(execAction, params.noState, params.statePath);
110
+ if (execAction.action === "place_limit_ambush" &&
111
+ params.statePath &&
112
+ !params.noState) {
113
+ const replace = await reconcilePendingAmbushBeforePlace({
114
+ statePath: params.statePath,
115
+ coin: params.coin,
116
+ action: execAction,
117
+ replaceDeviationPct: policy.ambushReplaceDeviationPct,
118
+ nowMs,
119
+ });
120
+ for (const id of replace.cancelledIntentIds) {
121
+ process.stderr.write(`advise: ambush replace — requested cancel of stale intent ${id}.\n`);
122
+ }
123
+ tradeState = await readOrCreateTradeStateFile(params.statePath, nowMs);
124
+ }
125
+ const szCap = resolveAdvisorSzCap(guardInputs);
126
+ const g = buildGlobalPrefix(params.globals);
127
+ const argv = advisorActionToCliArgs(execAction, {
128
+ coin: params.snapshot.coin,
129
+ mid: params.snapshot.mid,
130
+ positionSignedSz,
131
+ globals: g,
132
+ live: params.live,
133
+ assumeYes: params.assumeYes,
134
+ szCap,
135
+ limitJitterPct: policy.limitJitterPct,
136
+ maxDevPct,
137
+ szDecimals: params.snapshot.sz_decimals,
138
+ });
139
+ const command = formatCliInvocation(argv);
140
+ if (params.live && !params.assumeYes && params.confirmLive) {
141
+ await params.confirmLive(`Proposed command:\n${command}\n`);
142
+ }
143
+ const cap = spawnJccHyperTool(argv, { stdio: "pipe" });
144
+ let response = { stdout: cap.stdout, stderr: cap.stderr };
145
+ try {
146
+ response = JSON.parse(cap.stdout);
147
+ }
148
+ catch {
149
+ /* non-JSON stdout */
150
+ }
151
+ const exitCode = cap.status ?? 1;
152
+ if (exitCode === 0 &&
153
+ params.live &&
154
+ params.statePath &&
155
+ !params.noState &&
156
+ policy.executeCooldownSec > 0) {
157
+ await recordAdviseExecuteCooldown({
158
+ statePath: params.statePath,
159
+ coin: params.coin,
160
+ action: params.action,
161
+ nowMs,
162
+ });
163
+ }
164
+ return {
165
+ exitCode,
166
+ stdout: cap.stdout,
167
+ stderr: cap.stderr,
168
+ command,
169
+ response,
170
+ };
171
+ }
172
+ //# sourceMappingURL=adviseEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adviseEngine.js","sourceRoot":"","sources":["../../src/advisor/adviseEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { BracketIntentRecord, TradeStateFile } from "../core/state/schema.js";
2
+ import type { AdvisorAction } from "./actionSchema.js";
3
+ export type PendingAmbushSummary = {
4
+ intentId: string;
5
+ phase: string;
6
+ side: "buy" | "sell";
7
+ limitPx: number;
8
+ sz: number;
9
+ tpPx: number;
10
+ slPx: number;
11
+ expiresAtMs: number;
12
+ expiresInSec: number;
13
+ strategy?: "scalp" | "ambush";
14
+ };
15
+ export declare function isAmbushBracket(intent: BracketIntentRecord): boolean;
16
+ export declare function isActivePendingAmbush(intent: BracketIntentRecord, nowMs: number): boolean;
17
+ export declare function listPendingAmbushIntents(state: TradeStateFile, coin: string, nowMs: number): PendingAmbushSummary[];
18
+ export declare function hasActiveUnexpiredAmbush(state: TradeStateFile, coin: string, nowMs: number): boolean;
19
+ export declare function priceDeviationFraction(oldPx: number, newPx: number): number;
20
+ export declare function shouldReplaceAmbush(existingLimitPx: number, newLimitPx: number, thresholdPct: number): boolean;
21
+ export declare function requestBracketEntryCancel(statePath: string, intentId: string, nowMs: number): Promise<void>;
22
+ export declare function findActiveProtectionBracket(state: TradeStateFile, coin: string): BracketIntentRecord | undefined;
23
+ export declare function resolvePositionOpenAgeSec(params: {
24
+ state: TradeStateFile;
25
+ coin: string;
26
+ nowMs: number;
27
+ }): number | undefined;
28
+ export declare function hasPriceHitTpOrSl(side: "buy" | "sell", mid: number, tp: number, sl: number): boolean;
29
+ export type AmbushReplaceResult = {
30
+ cancelledIntentIds: string[];
31
+ skippedDuplicate: boolean;
32
+ };
33
+ /**
34
+ * Before placing a new ambush: cancel stale pending ambushes when price/side diverges;
35
+ * block duplicate placement when an unexpired ambush already matches the new estimate.
36
+ */
37
+ export declare function reconcilePendingAmbushBeforePlace(params: {
38
+ statePath: string;
39
+ coin: string;
40
+ action: Extract<AdvisorAction, {
41
+ action: "place_limit_ambush";
42
+ }>;
43
+ replaceDeviationPct: number;
44
+ nowMs: number;
45
+ }): Promise<AmbushReplaceResult>;
46
+ export declare function ambushActionSummary(action: AdvisorAction): string | undefined;
47
+ //# sourceMappingURL=ambushPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ambushPolicy.d.ts","sourceRoot":"","sources":["../../src/advisor/ambushPolicy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKvD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC/B,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAGpE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAWzF;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,oBAAoB,EAAE,CAwBxB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAET;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAET;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,GACX,mBAAmB,GAAG,SAAS,CAUjC;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,GAAG,SAAS,CAqCrB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,KAAK,GAAG,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAKT;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,iCAAiC,CAAC,MAAM,EAAE;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,MAAM,EAAE,oBAAoB,CAAA;KAAE,CAAC,CAAC;IACjE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuB/B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAO7E"}
@@ -0,0 +1,161 @@
1
+ import { ConfigError } from "../core/errors.js";
2
+ import { readOrCreateTradeStateFile, updateTradeStateFileAtomic } from "../core/state/store.js";
3
+ import { isAdvisorBracketOpenAction } from "./actionSchema.js";
4
+ const PENDING_ENTRY_PHASES = new Set(["planned", "entry_pending", "entry_partial"]);
5
+ export function isAmbushBracket(intent) {
6
+ // undefined strategy = legacy intent, treated as ambush
7
+ return intent.strategy !== "scalp";
8
+ }
9
+ export function isActivePendingAmbush(intent, nowMs) {
10
+ if (!isAmbushBracket(intent)) {
11
+ return false;
12
+ }
13
+ if (!PENDING_ENTRY_PHASES.has(intent.phase)) {
14
+ return false;
15
+ }
16
+ if (intent.expiresAtMs !== undefined && nowMs > intent.expiresAtMs) {
17
+ return false;
18
+ }
19
+ return intent.phase !== "expired" && intent.phase !== "cancelled";
20
+ }
21
+ export function listPendingAmbushIntents(state, coin, nowMs) {
22
+ const out = [];
23
+ for (const [intentId, intent] of Object.entries(state.intents)) {
24
+ if (intent.kind !== "bracket" || intent.coin !== coin) {
25
+ continue;
26
+ }
27
+ if (!isActivePendingAmbush(intent, nowMs)) {
28
+ continue;
29
+ }
30
+ const expiresAtMs = intent.expiresAtMs ?? nowMs;
31
+ out.push({
32
+ intentId,
33
+ phase: intent.phase,
34
+ side: intent.entrySide,
35
+ limitPx: intent.entryLimitPx,
36
+ sz: intent.entrySz,
37
+ tpPx: intent.tpTriggerPx,
38
+ slPx: intent.slTriggerPx,
39
+ expiresAtMs,
40
+ expiresInSec: Math.max(0, Math.ceil((expiresAtMs - nowMs) / 1000)),
41
+ strategy: intent.strategy,
42
+ });
43
+ }
44
+ return out.sort((a, b) => a.expiresAtMs - b.expiresAtMs);
45
+ }
46
+ export function hasActiveUnexpiredAmbush(state, coin, nowMs) {
47
+ return listPendingAmbushIntents(state, coin, nowMs).length > 0;
48
+ }
49
+ export function priceDeviationFraction(oldPx, newPx) {
50
+ if (!Number.isFinite(oldPx) || oldPx <= 0) {
51
+ return Number.POSITIVE_INFINITY;
52
+ }
53
+ return Math.abs(newPx - oldPx) / oldPx;
54
+ }
55
+ export function shouldReplaceAmbush(existingLimitPx, newLimitPx, thresholdPct) {
56
+ return priceDeviationFraction(existingLimitPx, newLimitPx) > thresholdPct;
57
+ }
58
+ export async function requestBracketEntryCancel(statePath, intentId, nowMs) {
59
+ await updateTradeStateFileAtomic(statePath, (cur) => {
60
+ const row = cur.intents[intentId];
61
+ if (!row || row.kind !== "bracket") {
62
+ throw new ConfigError(`Bracket intent not found: ${intentId}`);
63
+ }
64
+ const nextB = { ...row, cancelRequested: true, updatedAtMs: nowMs };
65
+ return {
66
+ ...cur,
67
+ updatedAtMs: nowMs,
68
+ intents: { ...cur.intents, [intentId]: nextB },
69
+ events: [
70
+ ...cur.events,
71
+ {
72
+ t: nowMs,
73
+ intentId,
74
+ type: "user_cancel_request",
75
+ message: "cancelRequested=true (advise ambush replace)",
76
+ },
77
+ ],
78
+ };
79
+ }, nowMs);
80
+ }
81
+ export function findActiveProtectionBracket(state, coin) {
82
+ for (const intent of Object.values(state.intents)) {
83
+ if (intent.kind !== "bracket" || intent.coin !== coin) {
84
+ continue;
85
+ }
86
+ if (intent.phase === "protection_active" || intent.phase === "entry_filled") {
87
+ return intent;
88
+ }
89
+ }
90
+ return undefined;
91
+ }
92
+ export function resolvePositionOpenAgeSec(params) {
93
+ const bracket = findActiveProtectionBracket(params.state, params.coin);
94
+ if (bracket) {
95
+ for (let i = params.state.events.length - 1; i >= 0; i--) {
96
+ const ev = params.state.events[i];
97
+ if (ev.intentId !== bracket.id) {
98
+ continue;
99
+ }
100
+ if (ev.message?.includes("entry_filled") || ev.type === "phase" && ev.message?.includes("entry_filled")) {
101
+ return Math.max(0, (params.nowMs - ev.t) / 1000);
102
+ }
103
+ }
104
+ return Math.max(0, (params.nowMs - bracket.createdAtMs) / 1000);
105
+ }
106
+ const history = params.state.adviseExecuteHistory;
107
+ if (!history) {
108
+ return undefined;
109
+ }
110
+ let latest;
111
+ for (const [key, rec] of Object.entries(history)) {
112
+ if (!key.startsWith(`${params.coin}:`)) {
113
+ continue;
114
+ }
115
+ if (rec.action !== "place_limit_ambush" &&
116
+ rec.action !== "open_with_bracket") {
117
+ continue;
118
+ }
119
+ if (latest === undefined || rec.atMs > latest) {
120
+ latest = rec.atMs;
121
+ }
122
+ }
123
+ if (latest === undefined) {
124
+ return undefined;
125
+ }
126
+ return Math.max(0, (params.nowMs - latest) / 1000);
127
+ }
128
+ export function hasPriceHitTpOrSl(side, mid, tp, sl) {
129
+ if (side === "buy") {
130
+ return mid >= tp || mid <= sl;
131
+ }
132
+ return mid <= tp || mid >= sl;
133
+ }
134
+ /**
135
+ * Before placing a new ambush: cancel stale pending ambushes when price/side diverges;
136
+ * block duplicate placement when an unexpired ambush already matches the new estimate.
137
+ */
138
+ export async function reconcilePendingAmbushBeforePlace(params) {
139
+ const state = await readOrCreateTradeStateFile(params.statePath, params.nowMs);
140
+ const pending = listPendingAmbushIntents(state, params.coin, params.nowMs);
141
+ const cancelledIntentIds = [];
142
+ for (const p of pending) {
143
+ const sideChanged = p.side !== params.action.side;
144
+ const priceDiverged = shouldReplaceAmbush(p.limitPx, params.action.limit_px, params.replaceDeviationPct);
145
+ if (sideChanged || priceDiverged) {
146
+ await requestBracketEntryCancel(params.statePath, p.intentId, params.nowMs);
147
+ cancelledIntentIds.push(p.intentId);
148
+ continue;
149
+ }
150
+ throw new ConfigError(`advise: pending ambush ${p.intentId} at ${p.limitPx} (${p.side}) matches new estimate within ${(params.replaceDeviationPct * 100).toFixed(2)}%; wait for TTL (${p.expiresInSec}s left) or choose "wait".`);
151
+ }
152
+ return { cancelledIntentIds, skippedDuplicate: false };
153
+ }
154
+ export function ambushActionSummary(action) {
155
+ if (!isAdvisorBracketOpenAction(action)) {
156
+ return undefined;
157
+ }
158
+ const ttl = action.action === "place_limit_ambush" ? ` TTL ${action.expires_in_min}m` : "";
159
+ return `${action.side} @ ${action.limit_px} sz ${action.sz} tp ${action.tp_px} sl ${action.sl_px}${ttl}`;
160
+ }
161
+ //# sourceMappingURL=ambushPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ambushPolicy.js","sourceRoot":"","sources":["../../src/advisor/ambushPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { HyperliquidInfoClient } from "../core/hyperliquid/client.js";
2
+ import type { JsonValue } from "../core/hyperliquid/types.js";
3
+ import type { CompactCandle, IndicatorSummary } from "./indicatorCompute.js";
4
+ import type { ContextVersion } from "./promptTemplate.js";
5
+ export type AdvisorPositionRow = {
6
+ signed_sz: number;
7
+ entry_px?: number;
8
+ leverage?: number;
9
+ unrealized_pnl?: number;
10
+ };
11
+ export type AdvisorMarketSnapshot = {
12
+ coin: string;
13
+ network: string;
14
+ now_ms: number;
15
+ mid: number | null;
16
+ /** Per-asset size decimals from HL meta (drives price rounding: max 6 - szDecimals decimal places). */
17
+ sz_decimals: number;
18
+ /** HL minimum order notional (USD). */
19
+ min_order_notional_usd: number;
20
+ /** Smallest sz at current mid meeting min notional; null when mid unknown. */
21
+ min_order_sz: number | null;
22
+ positions: Record<string, AdvisorPositionRow>;
23
+ kline_5m: JsonValue;
24
+ kline_1h: JsonValue;
25
+ kline_1d: JsonValue;
26
+ user_note?: string;
27
+ /** Prompt context version controlling K-line vs pre-computed indicators. */
28
+ context_version: ContextVersion;
29
+ /** Pre-computed indicator summary (v2 only). */
30
+ indicator_summary?: IndicatorSummary;
31
+ /** Compact h/l/o/c/v candles for wave/Chan theory (v2 only). */
32
+ kline_5m_compact?: CompactCandle[];
33
+ kline_1h_compact?: CompactCandle[];
34
+ kline_1d_compact?: CompactCandle[];
35
+ };
36
+ export declare function readMidFromAllMids(mids: JsonValue, coin: string): number | null;
37
+ /** Best-effort per-coin row from `clearinghouseState` (wire shapes vary). */
38
+ export declare function extractPositionDetail(chState: JsonValue, coin: string): AdvisorPositionRow | undefined;
39
+ export declare function buildAdvisorMarketSnapshot(params: {
40
+ info: HyperliquidInfoClient;
41
+ coin: string;
42
+ network: string;
43
+ userAddress: `0x${string}`;
44
+ userNote?: string;
45
+ nowMs: number;
46
+ kline5mBars: number;
47
+ kline1hBars: number;
48
+ kline1dBars: number;
49
+ contextVersion: ContextVersion;
50
+ }): Promise<AdvisorMarketSnapshot>;
51
+ //# 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;AAW3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAM1D,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,uGAAuG;IACvG,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,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;IACnB,4EAA4E;IAC5E,eAAe,EAAE,cAAc,CAAC;IAChC,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAC;CACpC,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;IACpB,cAAc,EAAE,cAAc,CAAC;CAChC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAqEjC"}
@@ -0,0 +1,153 @@
1
+ import { perpSzDecimalsFromMeta } from "../core/hyperliquid/asset.js";
2
+ import { HL_MIN_ORDER_NOTIONAL_USD, minPerpOrderSzForNotional, } from "../core/hyperliquid/rounding.js";
3
+ import { assertPerpKlineCoinInMeta, resolvePerpKlineCoinArg, } from "../core/hyperliquid/klineCoin.js";
4
+ import { inferHlDexFromPrefixedPerpCoin } from "../core/hyperliquid/prefixedPerpCoin.js";
5
+ import { signedPositionSizeForCoin } from "../core/state/snapshot.js";
6
+ import { buildCompactKlines, computeIndicatorSummary } from "./indicatorCompute.js";
7
+ const MINUTE_MS = 60_000;
8
+ const HOUR_MS = 60 * MINUTE_MS;
9
+ const DAY_MS = 24 * HOUR_MS;
10
+ function trimCandles(raw, maxBars) {
11
+ if (!Array.isArray(raw)) {
12
+ return raw;
13
+ }
14
+ return raw.length <= maxBars ? raw : raw.slice(-maxBars);
15
+ }
16
+ export function readMidFromAllMids(mids, coin) {
17
+ if (typeof mids !== "object" || mids === null) {
18
+ return null;
19
+ }
20
+ const v = mids[coin];
21
+ if (typeof v === "string") {
22
+ const n = Number(v);
23
+ return Number.isFinite(n) ? n : null;
24
+ }
25
+ if (typeof v === "number" && Number.isFinite(v)) {
26
+ return v;
27
+ }
28
+ return null;
29
+ }
30
+ /** Best-effort per-coin row from `clearinghouseState` (wire shapes vary). */
31
+ export function extractPositionDetail(chState, coin) {
32
+ const signed = signedPositionSizeForCoin(chState, coin);
33
+ if (signed === undefined || signed === 0 || !Number.isFinite(signed)) {
34
+ return undefined;
35
+ }
36
+ if (typeof chState !== "object" || chState === null) {
37
+ return { signed_sz: signed };
38
+ }
39
+ const assetPositions = chState.assetPositions;
40
+ if (!Array.isArray(assetPositions)) {
41
+ return { signed_sz: signed };
42
+ }
43
+ for (const ap of assetPositions) {
44
+ if (typeof ap !== "object" || ap === null) {
45
+ continue;
46
+ }
47
+ const position = ap.position;
48
+ if (typeof position !== "object" || position === null) {
49
+ continue;
50
+ }
51
+ const p = position;
52
+ if (p.coin !== coin) {
53
+ continue;
54
+ }
55
+ const row = { signed_sz: signed };
56
+ const entryPx = p.entryPx;
57
+ if (typeof entryPx === "string") {
58
+ const n = Number(entryPx);
59
+ if (Number.isFinite(n)) {
60
+ row.entry_px = n;
61
+ }
62
+ }
63
+ else if (typeof entryPx === "number" && Number.isFinite(entryPx)) {
64
+ row.entry_px = entryPx;
65
+ }
66
+ const lev = ap.leverage;
67
+ if (typeof lev === "number" && Number.isFinite(lev)) {
68
+ row.leverage = lev;
69
+ }
70
+ else if (typeof lev === "object" && lev !== null) {
71
+ const v = lev.value;
72
+ if (typeof v === "number" && Number.isFinite(v)) {
73
+ row.leverage = v;
74
+ }
75
+ }
76
+ const uPnl = ap.unrealizedPnl;
77
+ if (typeof uPnl === "string") {
78
+ const n = Number(uPnl);
79
+ if (Number.isFinite(n)) {
80
+ row.unrealized_pnl = n;
81
+ }
82
+ }
83
+ else if (typeof uPnl === "number" && Number.isFinite(uPnl)) {
84
+ row.unrealized_pnl = uPnl;
85
+ }
86
+ return row;
87
+ }
88
+ return { signed_sz: signed };
89
+ }
90
+ export async function buildAdvisorMarketSnapshot(params) {
91
+ const resolvedCoin = resolvePerpKlineCoinArg(params.coin);
92
+ const dexForMeta = inferHlDexFromPrefixedPerpCoin(resolvedCoin);
93
+ const meta = await params.info.meta(dexForMeta);
94
+ if (dexForMeta) {
95
+ assertPerpKlineCoinInMeta(meta, resolvedCoin);
96
+ }
97
+ const szDecimals = perpSzDecimalsFromMeta(meta, resolvedCoin);
98
+ const endTime = params.nowMs;
99
+ const s5 = endTime - params.kline5mBars * 5 * MINUTE_MS;
100
+ const s1h = endTime - params.kline1hBars * HOUR_MS;
101
+ const s1d = endTime - params.kline1dBars * DAY_MS;
102
+ const [raw5m, raw1h, raw1d, ch, mids] = await Promise.all([
103
+ params.info.candleSnapshot({
104
+ coin: resolvedCoin,
105
+ interval: "5m",
106
+ startTime: s5,
107
+ endTime,
108
+ }),
109
+ params.info.candleSnapshot({
110
+ coin: resolvedCoin,
111
+ interval: "1h",
112
+ startTime: s1h,
113
+ endTime,
114
+ }),
115
+ params.info.candleSnapshot({
116
+ coin: resolvedCoin,
117
+ interval: "1d",
118
+ startTime: s1d,
119
+ endTime,
120
+ }),
121
+ params.info.clearinghouseState(params.userAddress, dexForMeta),
122
+ params.info.allMids(dexForMeta),
123
+ ]);
124
+ const pos = extractPositionDetail(ch, resolvedCoin);
125
+ const positions = pos ? { [resolvedCoin]: pos } : {};
126
+ const mid = readMidFromAllMids(mids, resolvedCoin);
127
+ const trimmed5m = trimCandles(raw5m, params.kline5mBars);
128
+ const trimmed1h = trimCandles(raw1h, params.kline1hBars);
129
+ const trimmed1d = trimCandles(raw1d, params.kline1dBars);
130
+ const isV2 = params.contextVersion === "precomputed_indicators";
131
+ return {
132
+ coin: resolvedCoin,
133
+ network: params.network,
134
+ now_ms: params.nowMs,
135
+ mid,
136
+ sz_decimals: szDecimals,
137
+ min_order_notional_usd: HL_MIN_ORDER_NOTIONAL_USD,
138
+ min_order_sz: mid !== null && mid > 0 ? minPerpOrderSzForNotional(mid, szDecimals) : null,
139
+ positions,
140
+ kline_5m: trimmed5m,
141
+ kline_1h: trimmed1h,
142
+ kline_1d: trimmed1d,
143
+ user_note: params.userNote,
144
+ context_version: params.contextVersion,
145
+ indicator_summary: isV2
146
+ ? computeIndicatorSummary(trimmed5m, trimmed1h, trimmed1d)
147
+ : undefined,
148
+ kline_5m_compact: isV2 ? buildCompactKlines(trimmed5m, params.kline5mBars) : undefined,
149
+ kline_1h_compact: isV2 ? buildCompactKlines(trimmed1h, params.kline1hBars) : undefined,
150
+ kline_1d_compact: isV2 ? buildCompactKlines(trimmed1d, params.kline1dBars) : undefined,
151
+ };
152
+ }
153
+ //# 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