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 @@
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,92 @@
1
+ import type { JsonValue } from "../core/hyperliquid/types.js";
2
+ import type { TradeStateFile, UserProfile } from "../core/state/schema.js";
3
+ import type { AdvisorAction } from "./actionSchema.js";
4
+ import type { AdvisorGuardInputs } from "./guards.js";
5
+ import { type BracketTouchProbabilities } from "./touchProbability.js";
6
+ export type AdvisorExecutionPolicy = {
7
+ minConfidence: number;
8
+ limitJitterPct: number;
9
+ executeCooldownSec: number;
10
+ /** 0=off, 1=place entry at model SL (TP/SL shift by same delta). */
11
+ bracketSlEntryShift: number;
12
+ ambushReplaceDeviationPct: number;
13
+ antiRushCloseMinSec: number;
14
+ defaultAmbushExpiresMin: number;
15
+ };
16
+ export type AdvisorExecutionPolicyCli = {
17
+ minConfidence?: number;
18
+ limitJitterPct?: number;
19
+ executeCooldownSec?: number;
20
+ slEntryShift?: number;
21
+ ambushReplaceDeviationPct?: number;
22
+ antiRushCloseMinSec?: number;
23
+ defaultAmbushExpiresMin?: number;
24
+ auto?: boolean;
25
+ };
26
+ export type AdviseExecuteRecord = {
27
+ action: string;
28
+ atMs: number;
29
+ };
30
+ /** Shared size cap for bracket open and partial close. */
31
+ export declare function resolveAdvisorSzCap(inputs: AdvisorGuardInputs): number;
32
+ /** Profile minimum sz for bracket open (`minSzByCoin` overrides `defaultMinSz`). */
33
+ export declare function resolveAdvisorMinSz(inputs: AdvisorGuardInputs): number | undefined;
34
+ export declare function resolveAdvisorExecutionPolicy(profile: UserProfile | undefined, cli: AdvisorExecutionPolicyCli): AdvisorExecutionPolicy;
35
+ export declare function assertAdvisorConfidenceGate(action: AdvisorAction, minConfidence: number): void;
36
+ export declare function adviseExecuteCooldownKey(coin: string, action: AdvisorAction): string | null;
37
+ export declare function assertAdviseExecuteCooldown(params: {
38
+ history: Record<string, AdviseExecuteRecord> | undefined;
39
+ coin: string;
40
+ action: AdvisorAction;
41
+ cooldownSec: number;
42
+ nowMs: number;
43
+ }): void;
44
+ export declare function recordAdviseExecuteCooldown(params: {
45
+ statePath: string;
46
+ coin: string;
47
+ action: AdvisorAction;
48
+ nowMs: number;
49
+ }): Promise<void>;
50
+ /**
51
+ * Round advisor limit/trigger prices for exchange submission.
52
+ * When `szDecimals` is set, uses Hyperliquid per-asset rules (5 sig figs, 6 - szDecimals decimals).
53
+ */
54
+ export declare function roundAdvisorLimitPx(px: number, szDecimals?: number): number;
55
+ export declare function jitterLimitPrice(px: number, jitterPct: number, rng?: () => number, szDecimals?: number): number;
56
+ export declare function applyLimitJitterWithinBand(px: number, mid: number | null, jitterPct: number, maxDevPct: number, rng?: () => number, szDecimals?: number): {
57
+ px: number;
58
+ applied: boolean;
59
+ };
60
+ /**
61
+ * Shift bracket entry toward the model stop: delta = factor × (sl_px − limit_px).
62
+ * factor=1 → entry at SL; TP/SL and optional protection_limit_px move by the same delta.
63
+ */
64
+ export declare function applyBracketSlEntryShift(action: AdvisorAction, factor: number, szDecimals?: number): {
65
+ action: AdvisorAction;
66
+ notes: string[];
67
+ };
68
+ export declare function prepareAdvisorActionForExecution(action: AdvisorAction, options: {
69
+ slEntryShift: number;
70
+ limitJitterPct: number;
71
+ mid: number | null;
72
+ maxDevPct: number;
73
+ szDecimals?: number;
74
+ rng?: () => number;
75
+ kline1h?: JsonValue;
76
+ profile?: UserProfile;
77
+ }): {
78
+ action: AdvisorAction;
79
+ notes: string[];
80
+ touchProbs?: BracketTouchProbabilities;
81
+ };
82
+ export declare function applyAdvisorExecutionJitter(action: AdvisorAction, mid: number | null, jitterPct: number, maxDevPct: number, rng?: () => number, szDecimals?: number): {
83
+ action: AdvisorAction;
84
+ notes: string[];
85
+ };
86
+ export declare function resolveCloseSz(positionSignedSz: number | undefined, szCap: number): {
87
+ sz: number;
88
+ capped: boolean;
89
+ positionAbs: number;
90
+ };
91
+ export declare function readAdviseExecuteHistory(state: TradeStateFile | undefined): Record<string, AdviseExecuteRecord> | undefined;
92
+ //# sourceMappingURL=executionPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionPolicy.d.ts","sourceRoot":"","sources":["../../src/advisor/executionPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,273 @@
1
+ import { ConfigError } from "../core/errors.js";
2
+ import { roundHyperliquidPerpPrice } from "../core/hyperliquid/rounding.js";
3
+ import { mergeUserProfileDefaults } from "../core/state/profileStore.js";
4
+ import { updateTradeStateFileAtomic } from "../core/state/store.js";
5
+ import { isAdvisorBracketOpenAction } from "./actionSchema.js";
6
+ import { applyAntiSweepSlOffset, computeAtr, computeBracketTouchProbabilities, formatTouchProbNote, parseCandlesFromSnapshot, resolveSlAntiSweepAtrFactor, } from "./touchProbability.js";
7
+ const AUTO_DEFAULT_MIN_CONFIDENCE = 0.55;
8
+ /** Shared size cap for bracket open and partial close. */
9
+ export function resolveAdvisorSzCap(inputs) {
10
+ const maxSz = inputs.maxSz;
11
+ if (!Number.isFinite(maxSz) || maxSz <= 0) {
12
+ throw new ConfigError("advise: --max-sz must be a positive finite number.");
13
+ }
14
+ const p = mergeUserProfileDefaults(inputs.profile);
15
+ const by = p.maxSzByCoin?.[inputs.coin];
16
+ const coinCap = typeof by === "number" && Number.isFinite(by) ? by : p.defaultMaxSz;
17
+ return coinCap !== undefined ? Math.min(maxSz, coinCap) : maxSz;
18
+ }
19
+ /** Profile minimum sz for bracket open (`minSzByCoin` overrides `defaultMinSz`). */
20
+ export function resolveAdvisorMinSz(inputs) {
21
+ const p = mergeUserProfileDefaults(inputs.profile);
22
+ const by = p.minSzByCoin?.[inputs.coin];
23
+ if (typeof by === "number" && Number.isFinite(by) && by > 0) {
24
+ return by;
25
+ }
26
+ if (p.defaultMinSz !== undefined && Number.isFinite(p.defaultMinSz) && p.defaultMinSz > 0) {
27
+ return p.defaultMinSz;
28
+ }
29
+ return undefined;
30
+ }
31
+ export function resolveAdvisorExecutionPolicy(profile, cli) {
32
+ const p = mergeUserProfileDefaults(profile);
33
+ let minConfidence = cli.minConfidence ?? p.minConfidenceToExecute ?? 0;
34
+ if (cli.auto &&
35
+ cli.minConfidence === undefined &&
36
+ p.minConfidenceToExecute === undefined) {
37
+ minConfidence = AUTO_DEFAULT_MIN_CONFIDENCE;
38
+ }
39
+ return {
40
+ minConfidence,
41
+ limitJitterPct: cli.limitJitterPct ?? p.limitPriceJitterPct ?? 0,
42
+ executeCooldownSec: cli.executeCooldownSec ?? p.executeCooldownSec ?? 0,
43
+ bracketSlEntryShift: cli.slEntryShift ?? p.bracketSlEntryShift ?? 0,
44
+ ambushReplaceDeviationPct: cli.ambushReplaceDeviationPct ??
45
+ p.ambushReplaceDeviationPct ??
46
+ p.priceDeviationPctMax,
47
+ antiRushCloseMinSec: cli.antiRushCloseMinSec ?? p.antiRushCloseMinSec ?? 0,
48
+ defaultAmbushExpiresMin: cli.defaultAmbushExpiresMin ?? p.defaultAmbushExpiresMin ?? 20,
49
+ };
50
+ }
51
+ export function assertAdvisorConfidenceGate(action, minConfidence) {
52
+ if (minConfidence <= 0 || action.action === "cancel_all") {
53
+ return;
54
+ }
55
+ if (action.confidence < minConfidence) {
56
+ throw new ConfigError(`advise: confidence ${(action.confidence * 100).toFixed(0)}% below min ${(minConfidence * 100).toFixed(0)}%.`);
57
+ }
58
+ }
59
+ export function adviseExecuteCooldownKey(coin, action) {
60
+ if (action.action === "wait") {
61
+ return null;
62
+ }
63
+ if (action.action === "open_with_bracket") {
64
+ return `${coin}:${action.action}:${action.side}`;
65
+ }
66
+ if (action.action === "place_limit_ambush") {
67
+ return `${coin}:${action.action}:${action.side}`;
68
+ }
69
+ return `${coin}:${action.action}`;
70
+ }
71
+ export function assertAdviseExecuteCooldown(params) {
72
+ const { history, coin, action, cooldownSec, nowMs } = params;
73
+ if (cooldownSec <= 0) {
74
+ return;
75
+ }
76
+ const key = adviseExecuteCooldownKey(coin, action);
77
+ if (!key) {
78
+ return;
79
+ }
80
+ const prev = history?.[key];
81
+ if (!prev) {
82
+ return;
83
+ }
84
+ const elapsedSec = (nowMs - prev.atMs) / 1000;
85
+ if (elapsedSec < cooldownSec) {
86
+ const remain = Math.ceil(cooldownSec - elapsedSec);
87
+ const sideHint = action.action === "open_with_bracket" || action.action === "place_limit_ambush"
88
+ ? ` (${action.side})`
89
+ : "";
90
+ throw new ConfigError(`advise: execute cooldown: ${action.action}${sideHint} on ${coin} ran ${Math.floor(elapsedSec)}s ago; wait ${remain}s more.`);
91
+ }
92
+ }
93
+ export async function recordAdviseExecuteCooldown(params) {
94
+ const key = adviseExecuteCooldownKey(params.coin, params.action);
95
+ if (!key) {
96
+ return;
97
+ }
98
+ await updateTradeStateFileAtomic(params.statePath, (cur) => {
99
+ const history = {
100
+ ...(cur.adviseExecuteHistory ?? {}),
101
+ [key]: { action: params.action.action, atMs: params.nowMs },
102
+ };
103
+ return {
104
+ ...cur,
105
+ updatedAtMs: params.nowMs,
106
+ adviseExecuteHistory: history,
107
+ };
108
+ }, params.nowMs);
109
+ }
110
+ /**
111
+ * Round advisor limit/trigger prices for exchange submission.
112
+ * When `szDecimals` is set, uses Hyperliquid per-asset rules (5 sig figs, 6 - szDecimals decimals).
113
+ */
114
+ export function roundAdvisorLimitPx(px, szDecimals) {
115
+ if (!Number.isFinite(px) || px <= 0) {
116
+ return px;
117
+ }
118
+ if (szDecimals !== undefined) {
119
+ return roundHyperliquidPerpPrice(px, szDecimals);
120
+ }
121
+ if (px >= 10_000) {
122
+ return Math.round(px * 10) / 10;
123
+ }
124
+ if (px >= 1_000) {
125
+ return Math.round(px * 100) / 100;
126
+ }
127
+ if (px >= 10) {
128
+ return Math.round(px * 1_000) / 1_000;
129
+ }
130
+ return Math.round(px * 1_000_000) / 1_000_000;
131
+ }
132
+ export function jitterLimitPrice(px, jitterPct, rng = Math.random, szDecimals) {
133
+ if (!Number.isFinite(jitterPct) || jitterPct <= 0) {
134
+ return px;
135
+ }
136
+ const sign = rng() < 0.5 ? -1 : 1;
137
+ const magnitude = jitterPct * (0.5 + rng() * 0.5);
138
+ return roundAdvisorLimitPx(px * (1 + sign * magnitude), szDecimals);
139
+ }
140
+ export function applyLimitJitterWithinBand(px, mid, jitterPct, maxDevPct, rng = Math.random, szDecimals) {
141
+ if (!Number.isFinite(jitterPct) || jitterPct <= 0) {
142
+ return { px, applied: false };
143
+ }
144
+ if (mid === null || mid <= 0) {
145
+ const jittered = jitterLimitPrice(px, jitterPct, rng, szDecimals);
146
+ return { px: jittered, applied: jittered !== px };
147
+ }
148
+ for (let attempt = 0; attempt < 6; attempt++) {
149
+ const candidate = jitterLimitPrice(px, jitterPct, rng, szDecimals);
150
+ const dev = Math.abs(candidate - mid) / mid;
151
+ if (dev <= maxDevPct) {
152
+ return { px: candidate, applied: candidate !== px };
153
+ }
154
+ }
155
+ return { px, applied: false };
156
+ }
157
+ /**
158
+ * Shift bracket entry toward the model stop: delta = factor × (sl_px − limit_px).
159
+ * factor=1 → entry at SL; TP/SL and optional protection_limit_px move by the same delta.
160
+ */
161
+ export function applyBracketSlEntryShift(action, factor, szDecimals) {
162
+ if (!Number.isFinite(factor) || factor <= 0 || !isAdvisorBracketOpenAction(action)) {
163
+ return { action, notes: [] };
164
+ }
165
+ const f = Math.min(1, Math.max(0, factor));
166
+ if (!Number.isFinite(action.tp_px) || !Number.isFinite(action.sl_px)) {
167
+ return { action, notes: [] };
168
+ }
169
+ const fullDelta = action.sl_px - action.limit_px;
170
+ if (fullDelta === 0) {
171
+ return { action, notes: [] };
172
+ }
173
+ const delta = fullDelta * f;
174
+ const newLimit = roundAdvisorLimitPx(action.limit_px + delta, szDecimals);
175
+ const newTp = roundAdvisorLimitPx(action.tp_px + delta, szDecimals);
176
+ const newSl = roundAdvisorLimitPx(action.sl_px + delta, szDecimals);
177
+ let protection_limit_px = action.protection_limit_px;
178
+ if (protection_limit_px !== undefined) {
179
+ protection_limit_px = roundAdvisorLimitPx(protection_limit_px + delta, szDecimals);
180
+ }
181
+ if (action.side === "buy") {
182
+ if (!(newSl < newLimit && newLimit < newTp)) {
183
+ throw new ConfigError(`advise: sl-entry-shift produced invalid buy bracket (sl ${newSl}, entry ${newLimit}, tp ${newTp}).`);
184
+ }
185
+ }
186
+ else if (!(newTp < newLimit && newLimit < newSl)) {
187
+ throw new ConfigError(`advise: sl-entry-shift produced invalid sell bracket (tp ${newTp}, entry ${newLimit}, sl ${newSl}).`);
188
+ }
189
+ const notes = [
190
+ `sl-entry-shift ×${f}: limit ${action.limit_px}→${newLimit}, tp ${action.tp_px}→${newTp}, sl ${action.sl_px}→${newSl}`,
191
+ ];
192
+ return {
193
+ action: {
194
+ ...action,
195
+ limit_px: newLimit,
196
+ tp_px: newTp,
197
+ sl_px: newSl,
198
+ protection_limit_px,
199
+ },
200
+ notes,
201
+ };
202
+ }
203
+ export function prepareAdvisorActionForExecution(action, options) {
204
+ const notes = [];
205
+ let working = action;
206
+ if (isAdvisorBracketOpenAction(working) && options.kline1h !== undefined) {
207
+ const atr1h = computeAtr(parseCandlesFromSnapshot(options.kline1h));
208
+ const antiSweep = applyAntiSweepSlOffset(working, atr1h, resolveSlAntiSweepAtrFactor(options.profile), options.szDecimals);
209
+ notes.push(...antiSweep.notes);
210
+ working = antiSweep.action;
211
+ }
212
+ const shifted = applyBracketSlEntryShift(working, options.slEntryShift, options.szDecimals);
213
+ notes.push(...shifted.notes);
214
+ const jittered = applyAdvisorExecutionJitter(shifted.action, options.mid, options.limitJitterPct, options.maxDevPct, options.rng, options.szDecimals);
215
+ notes.push(...jittered.notes);
216
+ let touchProbs;
217
+ if (isAdvisorBracketOpenAction(jittered.action) && options.kline1h !== undefined) {
218
+ touchProbs = computeBracketTouchProbabilities({
219
+ action: jittered.action,
220
+ spot: options.mid,
221
+ kline1h: options.kline1h,
222
+ analysis: jittered.action.analysis,
223
+ profile: options.profile,
224
+ });
225
+ notes.push(formatTouchProbNote(touchProbs));
226
+ }
227
+ return { action: jittered.action, notes, touchProbs };
228
+ }
229
+ export function applyAdvisorExecutionJitter(action, mid, jitterPct, maxDevPct, rng = Math.random, szDecimals) {
230
+ if (jitterPct <= 0 || action.action === "wait" || action.action === "cancel_all") {
231
+ return { action, notes: [] };
232
+ }
233
+ const notes = [];
234
+ if (isAdvisorBracketOpenAction(action)) {
235
+ const lim = applyLimitJitterWithinBand(action.limit_px, mid, jitterPct, maxDevPct, rng, szDecimals);
236
+ if (lim.applied) {
237
+ notes.push(`limit_px ${action.limit_px} → ${lim.px}`);
238
+ }
239
+ let protection_limit_px = action.protection_limit_px;
240
+ if (protection_limit_px !== undefined) {
241
+ const prot = applyLimitJitterWithinBand(protection_limit_px, mid, jitterPct, maxDevPct, rng, szDecimals);
242
+ protection_limit_px = prot.px;
243
+ if (prot.applied) {
244
+ notes.push(`protection_limit_px ${action.protection_limit_px} → ${prot.px}`);
245
+ }
246
+ }
247
+ return {
248
+ action: { ...action, limit_px: lim.px, protection_limit_px },
249
+ notes,
250
+ };
251
+ }
252
+ if (action.action === "close_position" && action.method === "limit" && action.limit_px !== undefined) {
253
+ const lim = applyLimitJitterWithinBand(action.limit_px, mid, jitterPct, maxDevPct, rng, szDecimals);
254
+ if (lim.applied) {
255
+ notes.push(`close limit_px ${action.limit_px} → ${lim.px}`);
256
+ }
257
+ return { action: { ...action, limit_px: lim.px }, notes };
258
+ }
259
+ return { action, notes };
260
+ }
261
+ export function resolveCloseSz(positionSignedSz, szCap) {
262
+ const pos = positionSignedSz;
263
+ if (pos === undefined || !Number.isFinite(pos) || pos === 0) {
264
+ throw new ConfigError("close_position: no open position for this coin.");
265
+ }
266
+ const positionAbs = Math.abs(pos);
267
+ const sz = Math.min(positionAbs, szCap);
268
+ return { sz, capped: positionAbs > szCap, positionAbs };
269
+ }
270
+ export function readAdviseExecuteHistory(state) {
271
+ return state?.adviseExecuteHistory;
272
+ }
273
+ //# sourceMappingURL=executionPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionPolicy.js","sourceRoot":"","sources":["../../src/advisor/executionPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { UserProfile } from "../core/state/schema.js";
2
+ import type { JsonValue } from "../core/hyperliquid/types.js";
3
+ import type { AdvisorAction } from "./actionSchema.js";
4
+ export type AdvisorGuardInputs = {
5
+ coin: string;
6
+ maxSz: number;
7
+ /** CLI override; falls back to profile */
8
+ requireTpsl?: boolean;
9
+ mid: number | null;
10
+ /** Signed position for `coin` (positive = long). */
11
+ positionSignedSz: number | undefined;
12
+ profile: UserProfile | undefined;
13
+ /** Per-asset size decimals from HL meta (enables min $10 notional check). */
14
+ szDecimals?: number;
15
+ /** When true, skip limit_px vs mid deviation (e.g. sl-entry-shift places entry at former SL). */
16
+ skipEntryMidDeviation?: boolean;
17
+ /** When true, skip SL touch/sweep probability guard (first pass before anti-sweep / shift). */
18
+ skipTouchProb?: boolean;
19
+ /** 1h candles for ATR-based touch probability (from market snapshot). */
20
+ kline1h?: JsonValue;
21
+ /** Trade state for ambush / anti-rush guards (optional when --no-state). */
22
+ tradeState?: import("../core/state/schema.js").TradeStateFile;
23
+ nowMs?: number;
24
+ /** Exchange-reported entry px for `coin` (from clearinghouse snapshot). */
25
+ positionEntryPx?: number;
26
+ };
27
+ /**
28
+ * Hard execution guards (do not rely on the model). Throws `ConfigError` when blocked.
29
+ */
30
+ export declare function assertAdvisorActionPassesGuards(action: AdvisorAction, inputs: AdvisorGuardInputs): void;
31
+ //# 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;AAI3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAgBvD,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;IACjC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iGAAiG;IACjG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,+FAA+F;IAC/F,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yEAAyE;IACzE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,yBAAyB,EAAE,cAAc,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AA8HF;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,kBAAkB,GACzB,IAAI,CA2HN"}