@senpi/trading-recipe 1.0.45 → 1.0.47

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 (47) hide show
  1. package/dist/cli/guide-commands.d.ts.map +1 -1
  2. package/dist/cli/guide-commands.js +6 -13
  3. package/dist/cli/guide-commands.js.map +1 -1
  4. package/dist/constants/dsl/index.d.ts +7 -0
  5. package/dist/constants/dsl/index.d.ts.map +1 -1
  6. package/dist/constants/dsl/index.js +7 -0
  7. package/dist/constants/dsl/index.js.map +1 -1
  8. package/dist/dsl/config/exit-block.d.ts +1 -3
  9. package/dist/dsl/config/exit-block.d.ts.map +1 -1
  10. package/dist/dsl/config/parse-phase.js +5 -5
  11. package/dist/dsl/config/parse-phase.js.map +1 -1
  12. package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -1
  13. package/dist/dsl/config/parse-plugin-config.js +11 -41
  14. package/dist/dsl/config/parse-plugin-config.js.map +1 -1
  15. package/dist/dsl/config/parse-preset.js +5 -5
  16. package/dist/dsl/config/parse-preset.js.map +1 -1
  17. package/dist/dsl/config/parse-tiers.js +1 -1
  18. package/dist/dsl/config/parse-tiers.js.map +1 -1
  19. package/dist/dsl/config/parse-timeouts.d.ts +3 -3
  20. package/dist/dsl/config/parse-timeouts.d.ts.map +1 -1
  21. package/dist/dsl/config/parse-timeouts.js +55 -13
  22. package/dist/dsl/config/parse-timeouts.js.map +1 -1
  23. package/dist/dsl/config/unknown-keys.d.ts +1 -1
  24. package/dist/dsl/config/unknown-keys.d.ts.map +1 -1
  25. package/dist/dsl/config/unknown-keys.js +5 -58
  26. package/dist/dsl/config/unknown-keys.js.map +1 -1
  27. package/dist/dsl/config/validation.d.ts +1 -1
  28. package/dist/dsl/config/validation.d.ts.map +1 -1
  29. package/dist/dsl/config/validation.js.map +1 -1
  30. package/dist/runtime/load-trading-recipe.d.ts.map +1 -1
  31. package/dist/runtime/load-trading-recipe.js +25 -3
  32. package/dist/runtime/load-trading-recipe.js.map +1 -1
  33. package/dist/runtime/map-exit-config.d.ts +2 -3
  34. package/dist/runtime/map-exit-config.d.ts.map +1 -1
  35. package/dist/runtime/map-exit-config.js +6 -28
  36. package/dist/runtime/map-exit-config.js.map +1 -1
  37. package/dist/runtime/runtime.d.ts.map +1 -1
  38. package/dist/runtime/runtime.js +3 -1
  39. package/dist/runtime/runtime.js.map +1 -1
  40. package/dist/runtime/trading-recipe-schema.d.ts +24 -19416
  41. package/dist/runtime/trading-recipe-schema.d.ts.map +1 -1
  42. package/dist/runtime/trading-recipe-schema.js +1 -39
  43. package/dist/runtime/trading-recipe-schema.js.map +1 -1
  44. package/examples/strategies/dsl-showcase.yaml +1 -1
  45. package/examples/strategies/wolf.yaml +1 -0
  46. package/openclaw.plugin.json +1 -1
  47. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA+UH,kFAAkF;AAClF,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,IAAI,CA2CN"}
1
+ {"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwUH,kFAAkF;AAClF,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,IAAI,CA2CN"}
@@ -154,7 +154,9 @@ Phase 1: max_loss absolute floor + phase1 retrace from high-water; consecutive
154
154
  breach counting applies only in phase 1. Phase 2: tier floors from lock_hw_pct
155
155
  (% of current high-water ROE); phase 2 begins when price crosses the first
156
156
  tier (no phase2_trigger_tier). Optional hard_timeout, weak_peak_cut, and
157
- dead_weight_cut live on the preset (not nested under phase1). hard_timeout
157
+ dead_weight_cut live on the preset (not nested under phase1). When any of these
158
+ has enabled: true, interval_in_minutes is required (finite number > 0);
159
+ weak_peak_cut also requires min_value (finite ROE % > 0). hard_timeout
158
160
  applies only in phase 1: entering phase 2 before the interval elapses cancels it;
159
161
  same tick as first tier (phase 2) skips hard_timeout in favor of tier advance.
160
162
 
@@ -162,7 +164,6 @@ exit:
162
164
  engine: dsl
163
165
  interval_seconds: 30
164
166
 
165
- # Recommended: one flat preset (no nested map name).
166
167
  dsl_preset:
167
168
  hard_timeout: ... # optional; same level as phase1 / phase2
168
169
  weak_peak_cut: ...
@@ -170,12 +171,6 @@ exit:
170
171
  phase1: ...
171
172
  phase2: ...
172
173
 
173
- # Alternative: multiple named presets (set exit.preset when 2+ keys).
174
- # dsl_presets:
175
- # dsl: { phase1: ..., phase2: ... }
176
- # aggressive: { ... }
177
- # preset: dsl
178
-
179
174
  ──────────────────────────────────────────────────────────────────────────────
180
175
  Phase 1 — Fixed floor + high-water trailing
181
176
  Floor = max(absolute_floor, trailing_floor). Absolute floor from max_loss_pct
@@ -270,16 +265,14 @@ actions[]
270
265
  exit
271
266
  engine string No dsl
272
267
  interval_seconds number No Default 30; integer 5–3600 (Zod + DSL parse)
273
- dsl_preset object No Single exit profile (preferred). Mutually exclusive with dsl_presets / dsl
274
- preset string No Required when dsl_presets has 2+ keys; with dsl_preset defaults to dsl
275
- dsl_presets object No Named preset map (advanced; use exit.preset to choose)
276
- dsl object No Legacy alias for dsl_presets
268
+ dsl_preset object No Single exit profile (required to start DslPlugin)
277
269
  sm_flip any No Non-DSL exit hook data (allowed; ignored by DSL parse)
278
270
 
279
271
  Preset: max_loss_pct (or phase1.max_loss_pct), phase1 (optional enabled;
280
272
  max_loss_pct, retrace_threshold ROE %, consecutive_breaches_required),
281
273
  phase2 (optional enabled; tiers only — trigger_pct, lock_hw_pct per row),
282
- optional hard_timeout / weak_peak_cut / dead_weight_cut at preset root.
274
+ optional hard_timeout / weak_peak_cut / dead_weight_cut at preset root
275
+ (when enabled: true, require interval_in_minutes; weak_peak_cut also min_value).
283
276
  phase1.enabled and phase2.enabled cannot both be false. Each tier row:
284
277
  lock_hw_pct [0,100]. Unknown keys under exit / presets / phase1 / phase2 / tiers throw
285
278
  DslConfigValidationError (UNKNOWN_DSL_CONFIG_KEY) at load. DSL parse also
@@ -1 +1 @@
1
- {"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,13 @@ export declare const DSL_EVENTS: {
23
23
  export declare const DEFAULT_STATE_DIR = ".dsl-state";
24
24
  /** On-disk DSL state schema version (v1 = DSL engine v2; no migration from older files). */
25
25
  export declare const DSL_STATE_VERSION = 1;
26
+ /**
27
+ * Recipe YAML uses a single `exit.dsl_preset` object; after parse it becomes this key in
28
+ * DslPluginConfig.presets. position.opened may set preset to override (must match this name).
29
+ */
30
+ export declare const CANONICAL_DSL_PRESET_NAME = "default";
31
+ /** Validation / parse error paths for the lone recipe preset. */
32
+ export declare const EXIT_DSL_PRESET_PATH = "exit.dsl_preset";
26
33
  /** Close reasons for DSL state (closeReason) and position.closed (reason). */
27
34
  export declare const CLOSE_REASON: {
28
35
  readonly MANUAL_CLOSE: "manual_close";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,uBAAuB,EAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,8EAA8E;AAC9E,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAaf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC3E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,mFAAmF;AACnF,eAAO,MAAM,sCAAsC,IAAI,CAAC;AACxD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,6DAA6D;AAC7D,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,cAAc,IAAI,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,uBAAuB,EAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,yBAAyB,YAAY,CAAC;AAEnD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,8EAA8E;AAC9E,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAaf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC3E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,mFAAmF;AACnF,eAAO,MAAM,sCAAsC,IAAI,CAAC;AACxD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,6DAA6D;AAC7D,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,cAAc,IAAI,CAAC"}
@@ -24,6 +24,13 @@ export const DSL_EVENTS = {
24
24
  export const DEFAULT_STATE_DIR = ".dsl-state";
25
25
  /** On-disk DSL state schema version (v1 = DSL engine v2; no migration from older files). */
26
26
  export const DSL_STATE_VERSION = 1;
27
+ /**
28
+ * Recipe YAML uses a single `exit.dsl_preset` object; after parse it becomes this key in
29
+ * DslPluginConfig.presets. position.opened may set preset to override (must match this name).
30
+ */
31
+ export const CANONICAL_DSL_PRESET_NAME = "default";
32
+ /** Validation / parse error paths for the lone recipe preset. */
33
+ export const EXIT_DSL_PRESET_PATH = "exit.dsl_preset";
27
34
  /** Close reasons for DSL state (closeReason) and position.closed (reason). */
28
35
  export const CLOSE_REASON = {
29
36
  MANUAL_CLOSE: "manual_close",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,gBAAgB,EAAE,UAAU,CAAC,mBAAmB;IAChD,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;IAClC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,aAAa,EAAE,mBAAmB;IAClC,gBAAgB,EAAE,sBAAsB;IACxC,OAAO,EAAE,aAAa;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,uBAAuB;IAC9C,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,WAAW,EAAE,aAAa;CAClB,CAAC;AAGX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,mFAAmF;AACnF,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AACxD,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAmB,CAAC;AAE3D,uGAAuG;AACvG,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,gBAAgB,EAAE,UAAU,CAAC,mBAAmB;IAChD,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;IAClC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,aAAa,EAAE,mBAAmB;IAClC,gBAAgB,EAAE,sBAAsB;IACxC,OAAO,EAAE,aAAa;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAEnD,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,uBAAuB;IAC9C,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,WAAW,EAAE,aAAa;CAClB,CAAC;AAGX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,mFAAmF;AACnF,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AACxD,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC"}
@@ -5,9 +5,7 @@ import type { RawPreset } from "./raw-types.js";
5
5
  export interface ExitBlockConfig {
6
6
  engine?: string;
7
7
  interval_seconds?: number;
8
- preset?: string;
9
- /** Single preset; normalized to dsl_presets.dsl before parse (mutually exclusive with non-empty dsl_presets). */
8
+ /** Single DSL exit profile (required when starting DslPlugin). */
10
9
  dsl_preset?: RawPreset;
11
- dsl_presets?: Record<string, RawPreset>;
12
10
  }
13
11
  //# sourceMappingURL=exit-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exit-block.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/exit-block.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iHAAiH;IACjH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACzC"}
1
+ {"version":3,"file":"exit-block.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/exit-block.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB"}
@@ -13,7 +13,7 @@ export function readPhase1(presetName, phase1, presetMaxLossPct) {
13
13
  throw new DslConfigValidationError([
14
14
  dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
15
15
  ? "max_loss_pct must be > 0 when phase1.enabled is false"
16
- : "max_loss_pct must be <= 100", `dsl_presets.${presetName}.phase1.max_loss_pct`),
16
+ : "max_loss_pct must be <= 100", `${presetName}.phase1.max_loss_pct`),
17
17
  ]);
18
18
  }
19
19
  return {
@@ -28,19 +28,19 @@ export function readPhase1(presetName, phase1, presetMaxLossPct) {
28
28
  throw new DslConfigValidationError([
29
29
  dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
30
30
  ? "phase1.max_loss_pct is required and must be > 0 (or set preset max_loss_pct)"
31
- : "phase1.max_loss_pct must be <= 100", `dsl_presets.${presetName}.phase1.max_loss_pct`),
31
+ : "phase1.max_loss_pct must be <= 100", `${presetName}.phase1.max_loss_pct`),
32
32
  ]);
33
33
  }
34
34
  const retraceThreshold = Number(phase1.retrace_threshold ?? phase1.retraceThreshold);
35
35
  if (!(retraceThreshold > 0)) {
36
36
  throw new DslConfigValidationError([
37
- dslValidationIssue("INVALID_RETRACE_THRESHOLD", "phase1.retrace_threshold is required and must be > 0 (ROE %)", `dsl_presets.${presetName}.phase1.retrace_threshold`),
37
+ dslValidationIssue("INVALID_RETRACE_THRESHOLD", "phase1.retrace_threshold is required and must be > 0 (ROE %)", `${presetName}.phase1.retrace_threshold`),
38
38
  ]);
39
39
  }
40
40
  const phase1Breaches = Number(phase1.consecutive_breaches_required ?? phase1.consecutiveBreachesRequired);
41
41
  if (!Number.isFinite(phase1Breaches) || phase1Breaches < 1 || !Number.isInteger(phase1Breaches)) {
42
42
  throw new DslConfigValidationError([
43
- dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase1.consecutive_breaches_required must be an integer >= 1", `dsl_presets.${presetName}.phase1.consecutive_breaches_required`),
43
+ dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase1.consecutive_breaches_required must be an integer >= 1", `${presetName}.phase1.consecutive_breaches_required`),
44
44
  ]);
45
45
  }
46
46
  return { maxLossPct, retraceThreshold, phase1Breaches, phase1Enabled: true };
@@ -60,7 +60,7 @@ export function readPhase2Scalars(presetName, phase2, requireTiersArray) {
60
60
  for (const k of legacyKeys) {
61
61
  if (phase2[k] != null) {
62
62
  throw new DslConfigValidationError([
63
- dslValidationIssue("LEGACY_PHASE2_FIELD", `phase2.${k} is no longer supported (phase 2 is exchange-SL driven; remove retrace and breach fields)`, `dsl_presets.${presetName}.phase2.${k}`),
63
+ dslValidationIssue("LEGACY_PHASE2_FIELD", `phase2.${k} is no longer supported (phase 2 is exchange-SL driven; remove retrace and breach fields)`, `${presetName}.phase2.${k}`),
64
64
  ]);
65
65
  }
66
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parse-phase.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-phase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse-phase.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-phase.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse-plugin-config.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AAOjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AA2BvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,CA2B1E;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
1
+ {"version":3,"file":"parse-plugin-config.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AASjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,CAiB1E;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -1,55 +1,25 @@
1
1
  /**
2
2
  * Parse full exit block into runtime DslPluginConfig.
3
3
  */
4
- import { MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS, DEFAULT_INTERVAL_MS, } from "../../constants/dsl/index.js";
4
+ import { MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS, DEFAULT_INTERVAL_MS, CANONICAL_DSL_PRESET_NAME, EXIT_DSL_PRESET_PATH, } from "../../constants/dsl/index.js";
5
5
  import { validateIntervalSeconds } from "./validation.js";
6
6
  import { parsePreset } from "./parse-preset.js";
7
7
  import { validateExitBlockConfigUnknownKeys } from "./unknown-keys.js";
8
- function normalizeExitBlockConfig(raw) {
9
- const r = raw;
10
- const single = r.dsl_preset;
11
- const map = r.dsl_presets;
12
- if (single != null && typeof single === "object" && !Array.isArray(single)) {
13
- if (map != null && typeof map === "object" && Object.keys(map).length > 0) {
14
- throw new Error("exit.dsl_preset and exit.dsl_presets cannot both be set; use one or the other");
15
- }
16
- const presetName = typeof raw.preset === "string" && raw.preset.length > 0 ? raw.preset : "dsl";
17
- const out = {
18
- ...raw,
19
- dsl_presets: { [presetName]: single },
20
- preset: presetName,
21
- };
22
- delete out.dsl_preset;
23
- return out;
24
- }
25
- return raw;
26
- }
27
8
  export function parseDslPluginConfig(raw) {
28
- const normalized = normalizeExitBlockConfig(raw);
29
- validateExitBlockConfigUnknownKeys(normalized);
30
- const intervalSeconds = normalized.interval_seconds ?? 30;
9
+ validateExitBlockConfigUnknownKeys(raw);
10
+ const intervalSeconds = raw.interval_seconds ?? 30;
31
11
  validateIntervalSeconds(intervalSeconds, MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS);
32
12
  const intervalMs = intervalSeconds * 1000;
33
13
  const minIntervalMinutes = intervalMs / 60_000;
34
- const presetsRaw = normalized.dsl_presets ?? {};
35
- const presets = {};
36
- for (const [name, p] of Object.entries(presetsRaw)) {
37
- if (p && typeof p === "object")
38
- presets[name] = parsePreset(name, p, minIntervalMinutes);
39
- }
40
- const presetKeys = Object.keys(presets);
41
- if (presetKeys.length === 0) {
42
- throw new Error("At least one dsl_presets entry is required");
43
- }
44
- if (presetKeys.length > 1 && typeof normalized.preset !== "string") {
45
- throw new Error(`exit.preset is required when dsl_presets has more than one entry (keys: ${presetKeys.join(", ")}). ` +
46
- `Set preset: "<name>" to select one, or use a single canonical preset key (recommended: dsl).`);
47
- }
48
- const preset = typeof normalized.preset === "string" ? normalized.preset : presetKeys[0];
49
- if (!presets[preset]) {
50
- throw new Error(`Preset "${preset}" not found in dsl_presets`);
14
+ const single = raw.dsl_preset;
15
+ if (single == null || typeof single !== "object" || Array.isArray(single)) {
16
+ throw new Error("exit.dsl_preset is required and must be an object when configuring DSL");
51
17
  }
52
- return { intervalMs, preset, presets };
18
+ const parsed = parsePreset(EXIT_DSL_PRESET_PATH, single, minIntervalMinutes);
19
+ const presets = {
20
+ [CANONICAL_DSL_PRESET_NAME]: parsed,
21
+ };
22
+ return { intervalMs, preset: CANONICAL_DSL_PRESET_NAME, presets };
53
23
  }
54
24
  export function getDefaultIntervalMs() {
55
25
  return DEFAULT_INTERVAL_MS;
@@ -1 +1 @@
1
- {"version":3,"file":"parse-plugin-config.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse-plugin-config.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,UAAU,oBAAoB,CAAC,GAAoB;IACvD,kCAAkC,CAAC,GAA8B,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACnD,uBAAuB,CAAC,eAAe,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,eAAe,GAAG,IAAI,CAAC;IAC1C,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,CAAC;IAE/C,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAoC;QAC/C,CAAC,yBAAyB,CAAC,EAAE,MAAM;KACpC,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
@@ -8,7 +8,7 @@ import { parseTier } from "./parse-tiers.js";
8
8
  function assertNoLegacyPresetKeys(presetName, raw) {
9
9
  if (raw.phase2_trigger_tier != null) {
10
10
  throw new DslConfigValidationError([
11
- dslValidationIssue("LEGACY_PRESET_FIELD", "phase2_trigger_tier was removed; phase 2 starts at tier 0 (first tier)", `dsl_presets.${presetName}.phase2_trigger_tier`),
11
+ dslValidationIssue("LEGACY_PRESET_FIELD", "phase2_trigger_tier was removed; phase 2 starts at tier 0 (first tier)", `${presetName}.phase2_trigger_tier`),
12
12
  ]);
13
13
  }
14
14
  const p1 = raw.phase1;
@@ -16,16 +16,16 @@ function assertNoLegacyPresetKeys(presetName, raw) {
16
16
  for (const k of ["hard_timeout", "weak_peak_cut", "dead_weight_cut"]) {
17
17
  if (p1[k] != null) {
18
18
  throw new DslConfigValidationError([
19
- dslValidationIssue("LEGACY_PHASE1_FIELD", `phase1.${k} was removed; define ${k} at the preset root (same shape)`, `dsl_presets.${presetName}.phase1.${k}`),
19
+ dslValidationIssue("LEGACY_PHASE1_FIELD", `phase1.${k} was removed; define ${k} at the preset root (same shape)`, `${presetName}.phase1.${k}`),
20
20
  ]);
21
21
  }
22
22
  }
23
23
  }
24
24
  }
25
25
  function parseGlobalCuts(presetName, raw, minIntervalMinutes) {
26
- const hardTimeout = parseHardTimeout(raw.hard_timeout, minIntervalMinutes);
27
- const weakPeakCut = parseWeakPeakCut(raw.weak_peak_cut, minIntervalMinutes);
28
- const deadWeightCut = parseDeadWeightCut(raw.dead_weight_cut, minIntervalMinutes);
26
+ const hardTimeout = parseHardTimeout(presetName, raw.hard_timeout, minIntervalMinutes);
27
+ const weakPeakCut = parseWeakPeakCut(presetName, raw.weak_peak_cut, minIntervalMinutes);
28
+ const deadWeightCut = parseDeadWeightCut(presetName, raw.dead_weight_cut, minIntervalMinutes);
29
29
  return {
30
30
  ...(hardTimeout && { hardTimeout }),
31
31
  ...(weakPeakCut && { weakPeakCut }),
@@ -1 +1 @@
1
- {"version":3,"file":"parse-preset.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-preset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse-preset.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-preset.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { DslConfigValidationError, dslValidationIssue } from "./validation.js";
5
5
  export function parseTier(presetName, raw, tierIndex, tiersPathForErrors) {
6
- const path = (field) => `dsl_presets.${presetName}.${tiersPathForErrors}[${tierIndex}].${field}`;
6
+ const path = (field) => `${presetName}.${tiersPathForErrors}[${tierIndex}].${field}`;
7
7
  if (raw.breaches != null) {
8
8
  throw new DslConfigValidationError([
9
9
  dslValidationIssue("LEGACY_TIER_FIELD", 'tier.breaches is no longer supported (phase 2 breach counting removed)', path("breaches")),
@@ -1 +1 @@
1
- {"version":3,"file":"parse-tiers.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-tiers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,GAAY,EACZ,SAAiB,EACjB,kBAA0B;IAE1B,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAC7B,eAAe,UAAU,IAAI,kBAAkB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;IAC3E,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,mBAAmB,EACnB,wEAAwE,EACxE,IAAI,CAAC,UAAU,CAAC,CACjB;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,IAAK,GAA+B,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QAClF,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,mBAAmB,EACnB,qCAAqC,EACrC,IAAI,CAAC,SAAS,CAAC,CAChB;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,qBAAqB,EACrB,oCAAoC,EACpC,IAAI,CAAC,aAAa,CAAC,CACpB;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;QACpE,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,qBAAqB,EACrB,iDAAiD,EACjD,IAAI,CAAC,aAAa,CAAC,CACpB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"parse-tiers.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-tiers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,GAAY,EACZ,SAAiB,EACjB,kBAA0B;IAE1B,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAC7B,GAAG,UAAU,IAAI,kBAAkB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;IAC/D,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,mBAAmB,EACnB,wEAAwE,EACxE,IAAI,CAAC,UAAU,CAAC,CACjB;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,IAAK,GAA+B,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QAClF,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,mBAAmB,EACnB,qCAAqC,EACrC,IAAI,CAAC,SAAS,CAAC,CAChB;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,qBAAqB,EACrB,oCAAoC,EACpC,IAAI,CAAC,aAAa,CAAC,CACpB;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;QACpE,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,qBAAqB,EACrB,iDAAiD,EACjD,IAAI,CAAC,aAAa,CAAC,CACpB;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC"}
@@ -9,8 +9,8 @@ type RawTimeoutBlock = {
9
9
  } | undefined;
10
10
  /** Clamp interval to at least minIntervalMinutes (cron run interval). */
11
11
  export declare function clampInterval(intervalInMinutes: number, minIntervalMinutes: number): number;
12
- export declare function parseHardTimeout(raw: RawTimeoutBlock, minIntervalMinutes: number): HardTimeout | undefined;
13
- export declare function parseWeakPeakCut(raw: RawTimeoutBlock, minIntervalMinutes: number): WeakPeakCut | undefined;
14
- export declare function parseDeadWeightCut(raw: RawTimeoutBlock, minIntervalMinutes: number): DeadWeightCut | undefined;
12
+ export declare function parseHardTimeout(presetPath: string, raw: RawTimeoutBlock, minIntervalMinutes: number): HardTimeout | undefined;
13
+ export declare function parseWeakPeakCut(presetPath: string, raw: RawTimeoutBlock, minIntervalMinutes: number): WeakPeakCut | undefined;
14
+ export declare function parseDeadWeightCut(presetPath: string, raw: RawTimeoutBlock, minIntervalMinutes: number): DeadWeightCut | undefined;
15
15
  export {};
16
16
  //# sourceMappingURL=parse-timeouts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-timeouts.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAExF,KAAK,eAAe,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AAE3G,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,WAAW,GAAG,SAAS,CAKzB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,WAAW,GAAG,SAAS,CAMzB;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,aAAa,GAAG,SAAS,CAK3B"}
1
+ {"version":3,"file":"parse-timeouts.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGxF,KAAK,eAAe,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AAE3G,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAE3F;AAkDD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,WAAW,GAAG,SAAS,CAezB;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,WAAW,GAAG,SAAS,CAgBzB;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EACpB,kBAAkB,EAAE,MAAM,GACzB,aAAa,GAAG,SAAS,CAe3B"}
@@ -1,33 +1,75 @@
1
1
  /**
2
2
  * Time-based cut fields: parse raw YAML into normalized preset fields.
3
3
  */
4
+ import { DslConfigValidationError, dslValidationIssue } from "./validation.js";
4
5
  /** Clamp interval to at least minIntervalMinutes (cron run interval). */
5
6
  export function clampInterval(intervalInMinutes, minIntervalMinutes) {
6
7
  return Math.max(intervalInMinutes, minIntervalMinutes);
7
8
  }
8
- export function parseHardTimeout(raw, minIntervalMinutes) {
9
+ function requirePositiveInterval(basePath, cutLabel, rawInterval) {
10
+ if (rawInterval === undefined || rawInterval === null) {
11
+ throw new DslConfigValidationError([
12
+ dslValidationIssue("INVALID_TIME_CUT_INTERVAL", `${cutLabel}: when enabled is true, interval_in_minutes is required`, `${basePath}.interval_in_minutes`),
13
+ ]);
14
+ }
15
+ if (typeof rawInterval !== "number" || !Number.isFinite(rawInterval) || rawInterval <= 0) {
16
+ throw new DslConfigValidationError([
17
+ dslValidationIssue("INVALID_TIME_CUT_INTERVAL", `${cutLabel}: interval_in_minutes must be a finite number > 0`, `${basePath}.interval_in_minutes`),
18
+ ]);
19
+ }
20
+ return rawInterval;
21
+ }
22
+ function requireWeakPeakMinValue(basePath, rawMin) {
23
+ if (rawMin === undefined || rawMin === null) {
24
+ throw new DslConfigValidationError([
25
+ dslValidationIssue("INVALID_WEAK_PEAK_MIN_VALUE", "weak_peak_cut: when enabled is true, min_value is required (ROE % threshold)", `${basePath}.min_value`),
26
+ ]);
27
+ }
28
+ if (typeof rawMin !== "number" || !Number.isFinite(rawMin) || rawMin <= 0) {
29
+ throw new DslConfigValidationError([
30
+ dslValidationIssue("INVALID_WEAK_PEAK_MIN_VALUE", "weak_peak_cut: min_value must be a finite number > 0", `${basePath}.min_value`),
31
+ ]);
32
+ }
33
+ return rawMin;
34
+ }
35
+ export function parseHardTimeout(presetPath, raw, minIntervalMinutes) {
9
36
  if (!raw?.enabled)
10
37
  return undefined;
11
- const intervalInMinutes = clampInterval(Number(raw.interval_in_minutes), minIntervalMinutes);
12
- if (!(intervalInMinutes > 0))
13
- return undefined;
38
+ const basePath = `${presetPath}.hard_timeout`;
39
+ const iv = requirePositiveInterval(basePath, "hard_timeout", raw.interval_in_minutes);
40
+ const intervalInMinutes = clampInterval(iv, minIntervalMinutes);
41
+ if (!(intervalInMinutes > 0)) {
42
+ throw new DslConfigValidationError([
43
+ dslValidationIssue("INVALID_TIME_CUT_INTERVAL", "hard_timeout: effective interval_in_minutes must be > 0 after clamping to exit poll interval", `${basePath}.interval_in_minutes`),
44
+ ]);
45
+ }
14
46
  return { enabled: true, intervalInMinutes };
15
47
  }
16
- export function parseWeakPeakCut(raw, minIntervalMinutes) {
48
+ export function parseWeakPeakCut(presetPath, raw, minIntervalMinutes) {
17
49
  if (!raw?.enabled)
18
50
  return undefined;
19
- const intervalInMinutes = clampInterval(Number(raw.interval_in_minutes), minIntervalMinutes);
20
- if (!(intervalInMinutes > 0))
21
- return undefined;
22
- const minValue = typeof raw.min_value === "number" ? raw.min_value : 3.0;
51
+ const basePath = `${presetPath}.weak_peak_cut`;
52
+ const iv = requirePositiveInterval(basePath, "weak_peak_cut", raw.interval_in_minutes);
53
+ const minValue = requireWeakPeakMinValue(basePath, raw.min_value);
54
+ const intervalInMinutes = clampInterval(iv, minIntervalMinutes);
55
+ if (!(intervalInMinutes > 0)) {
56
+ throw new DslConfigValidationError([
57
+ dslValidationIssue("INVALID_TIME_CUT_INTERVAL", "weak_peak_cut: effective interval_in_minutes must be > 0 after clamping to exit poll interval", `${basePath}.interval_in_minutes`),
58
+ ]);
59
+ }
23
60
  return { enabled: true, intervalInMinutes, minValue };
24
61
  }
25
- export function parseDeadWeightCut(raw, minIntervalMinutes) {
62
+ export function parseDeadWeightCut(presetPath, raw, minIntervalMinutes) {
26
63
  if (!raw?.enabled)
27
64
  return undefined;
28
- const intervalInMinutes = clampInterval(Number(raw.interval_in_minutes), minIntervalMinutes);
29
- if (!(intervalInMinutes > 0))
30
- return undefined;
65
+ const basePath = `${presetPath}.dead_weight_cut`;
66
+ const iv = requirePositiveInterval(basePath, "dead_weight_cut", raw.interval_in_minutes);
67
+ const intervalInMinutes = clampInterval(iv, minIntervalMinutes);
68
+ if (!(intervalInMinutes > 0)) {
69
+ throw new DslConfigValidationError([
70
+ dslValidationIssue("INVALID_TIME_CUT_INTERVAL", "dead_weight_cut: effective interval_in_minutes must be > 0 after clamping to exit poll interval", `${basePath}.interval_in_minutes`),
71
+ ]);
72
+ }
31
73
  return { enabled: true, intervalInMinutes };
32
74
  }
33
75
  //# sourceMappingURL=parse-timeouts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-timeouts.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,iBAAyB,EAAE,kBAA0B;IACjF,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAoB,EACpB,kBAA0B;IAE1B,IAAI,CAAC,GAAG,EAAE,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7F,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAoB,EACpB,kBAA0B;IAE1B,IAAI,CAAC,GAAG,EAAE,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7F,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAoB,EACpB,kBAA0B;IAE1B,IAAI,CAAC,GAAG,EAAE,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7F,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"parse-timeouts.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-timeouts.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,6 @@
2
2
  * Reject unknown keys in exit / DSL YAML so typos are not silently ignored.
3
3
  */
4
4
  export declare function validateRawExitBlockAndPresetsUnknownKeys(exit: Record<string, unknown>): void;
5
- /** Validate ExitBlockConfig for parseDslPluginConfig (may include dsl_preset before normalization). */
5
+ /** Validate ExitBlockConfig for parseDslPluginConfig. */
6
6
  export declare function validateExitBlockConfigUnknownKeys(raw: Record<string, unknown>): void;
7
7
  //# sourceMappingURL=unknown-keys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unknown-keys.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/unknown-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyJH,wBAAgB,yCAAyC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAqC7F;AAED,uGAAuG;AACvG,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA8BrF"}
1
+ {"version":3,"file":"unknown-keys.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/unknown-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuIH,wBAAgB,yCAAyC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAW7F;AAED,yDAAyD;AACzD,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWrF"}
@@ -6,21 +6,11 @@ import { DslConfigValidationError, dslValidationIssue, } from "./validation.js";
6
6
  const EXIT_RECIPE_KEYS = new Set([
7
7
  "engine",
8
8
  "interval_seconds",
9
- "preset",
10
- /** Single preset object (sugar for dsl_presets.dsl + preset dsl). */
11
9
  "dsl_preset",
12
- "dsl_presets",
13
- "dsl",
14
10
  "sm_flip",
15
11
  ]);
16
- /** Keys allowed on ExitBlockConfig passed to parseDslPluginConfig (post-map). */
17
- const EXIT_BLOCK_CONFIG_KEYS = new Set([
18
- "engine",
19
- "interval_seconds",
20
- "preset",
21
- "dsl_preset",
22
- "dsl_presets",
23
- ]);
12
+ /** Keys allowed on ExitBlockConfig passed to parseDslPluginConfig. */
13
+ const EXIT_BLOCK_CONFIG_KEYS = new Set(["engine", "interval_seconds", "dsl_preset"]);
24
14
  const PRESET_KEYS = new Set([
25
15
  "tiers",
26
16
  "max_loss_pct",
@@ -105,66 +95,23 @@ function validatePresetObject(presetPath, raw, issues) {
105
95
  });
106
96
  }
107
97
  }
108
- /**
109
- * Validate raw `exit:` from the trading recipe (before map strips keys).
110
- * Validates every preset map present (`dsl_presets` and/or `dsl`) so typos are caught even when one block is shadowed by the other at runtime.
111
- */
112
- function presetMapNonEmpty(v) {
113
- return isPlainObject(v) && Object.keys(v).length > 0;
114
- }
115
98
  export function validateRawExitBlockAndPresetsUnknownKeys(exit) {
116
99
  const issues = [];
117
100
  addUnknownKeyIssues(issues, unknownKeyList(exit, EXIT_RECIPE_KEYS), "exit");
118
- const hasDslPreset = exit.dsl_preset != null && isPlainObject(exit.dsl_preset);
119
- const hasPresetsMap = presetMapNonEmpty(exit.dsl_presets);
120
- const hasDslAliasMap = presetMapNonEmpty(exit.dsl);
121
- if (hasDslPreset && (hasPresetsMap || hasDslAliasMap)) {
122
- issues.push(dslValidationIssue("DSL_PRESET_SOURCE_CONFLICT", "use only one of exit.dsl_preset (single preset) or exit.dsl_presets / exit.dsl (named map), not both", "exit"));
123
- }
124
- if (hasDslPreset && !hasPresetsMap && !hasDslAliasMap) {
101
+ if (exit.dsl_preset != null && isPlainObject(exit.dsl_preset)) {
125
102
  validatePresetObject("exit.dsl_preset", exit.dsl_preset, issues);
126
103
  }
127
- if (exit.dsl_presets != null && isPlainObject(exit.dsl_presets)) {
128
- for (const name of Object.keys(exit.dsl_presets)) {
129
- const p = exit.dsl_presets[name];
130
- if (!isPlainObject(p))
131
- continue;
132
- validatePresetObject(`exit.dsl_presets.${name}`, p, issues);
133
- }
134
- }
135
- if (exit.dsl != null && isPlainObject(exit.dsl)) {
136
- for (const name of Object.keys(exit.dsl)) {
137
- const p = exit.dsl[name];
138
- if (!isPlainObject(p))
139
- continue;
140
- validatePresetObject(`exit.dsl.${name}`, p, issues);
141
- }
142
- }
143
104
  if (issues.length > 0) {
144
105
  throw new DslConfigValidationError(issues);
145
106
  }
146
107
  }
147
- /** Validate ExitBlockConfig for parseDslPluginConfig (may include dsl_preset before normalization). */
108
+ /** Validate ExitBlockConfig for parseDslPluginConfig. */
148
109
  export function validateExitBlockConfigUnknownKeys(raw) {
149
110
  const issues = [];
150
111
  addUnknownKeyIssues(issues, unknownKeyList(raw, EXIT_BLOCK_CONFIG_KEYS), "exit");
151
- const hasDslPreset = raw.dsl_preset != null && isPlainObject(raw.dsl_preset);
152
- const hasPresetsMap = presetMapNonEmpty(raw.dsl_presets);
153
- if (hasDslPreset && hasPresetsMap) {
154
- issues.push(dslValidationIssue("DSL_PRESET_SOURCE_CONFLICT", "use only one of exit.dsl_preset or exit.dsl_presets, not both", "exit"));
155
- }
156
- if (hasDslPreset && !hasPresetsMap) {
112
+ if (raw.dsl_preset != null && isPlainObject(raw.dsl_preset)) {
157
113
  validatePresetObject("exit.dsl_preset", raw.dsl_preset, issues);
158
114
  }
159
- const presets = raw.dsl_presets;
160
- if (presets != null && isPlainObject(presets)) {
161
- for (const name of Object.keys(presets)) {
162
- const p = presets[name];
163
- if (!isPlainObject(p))
164
- continue;
165
- validatePresetObject(`exit.dsl_presets.${name}`, p, issues);
166
- }
167
- }
168
115
  if (issues.length > 0) {
169
116
  throw new DslConfigValidationError(issues);
170
117
  }