@senpi/trading-recipe 1.0.29 → 1.0.30

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.
@@ -1 +1 @@
1
- {"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyTH,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;AA6TH,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"}
@@ -249,17 +249,21 @@ actions[]
249
249
  exit
250
250
  engine string No dsl
251
251
  interval_seconds number No Default 30; integer 5–3600 (Zod + DSL parse)
252
+ preset string No Default preset name (first dsl_presets key if omitted)
252
253
  dsl_presets object No Presets keyed by name (preferred)
253
254
  dsl object No Legacy alias for dsl_presets
255
+ sm_flip any No Non-DSL exit hook data (allowed; ignored by DSL parse)
254
256
 
255
257
  Preset: phase1 (optional enabled; max_loss_pct, retrace_threshold ROE %,
256
258
  consecutive_breaches_required; optional time cuts), phase2_trigger_tier
257
259
  (required int ≥ 0), phase2 (optional enabled; retrace_threshold ROE %,
258
260
  consecutive_breaches_required, tiers). phase1.enabled and phase2.enabled
259
261
  cannot both be false. Each tier must include lock_hw_pct [0,100] and breaches
260
- (≥ 1). DSL parse enforces strictly increasing trigger_pct per tier list,
261
- bounds on interval/max_loss/trigger/lock_hw, and integer breach counts; see
262
- dsl-reference Config validation. See: senpi guide dsl
262
+ (≥ 1). Unknown keys under exit / presets / phase1 / phase2 / tiers throw
263
+ DslConfigValidationError (UNKNOWN_DSL_CONFIG_KEY) at load. DSL parse also
264
+ enforces strictly increasing trigger_pct per tier list, bounds on
265
+ interval/max_loss/trigger/lock_hw, and integer breach counts; see dsl-reference
266
+ Config validation. See: senpi guide dsl
263
267
 
264
268
  Environment substitution: \${VAR} and \${VAR:-default} resolved at load time.
265
269
  `.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,aAAa,GACjB,0EAA0E,CAAC;AAE7E,+EAA+E;AAE/E,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC;yBAClB,OAAO;;;;;;;;;;;;;;;;CAgB/B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwErB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCpB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DnB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CpB,CAAC,IAAI,EAAE,CAAC;AAYT;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAuB,EACvB,OAAe;IAEf,MAAM,KAAK,GAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAsB;SACvD,WAAW,CAAC,8CAA8C,CAAC,CAAC;IAE/D,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAsB;SACvC,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAsB;SAC1C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,aAAa,GACjB,0EAA0E,CAAC;AAE7E,+EAA+E;AAE/E,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC;yBAClB,OAAO;;;;;;;;;;;;;;;;CAgB/B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwErB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCpB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEnB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CpB,CAAC,IAAI,EAAE,CAAC;AAYT;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAuB,EACvB,OAAe;IAEf,MAAM,KAAK,GAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAsB;SACvD,WAAW,CAAC,8CAA8C,CAAC,CAAC;IAE/D,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAsB;SACvC,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAsB;SAC1C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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;AAGvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,CAmB1E;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;AAOjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,CAoB1E;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -4,7 +4,9 @@
4
4
  import { MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS, DEFAULT_INTERVAL_MS, } from "../../constants/dsl/index.js";
5
5
  import { validateIntervalSeconds } from "./validation.js";
6
6
  import { parsePreset } from "./parse-preset.js";
7
+ import { validateExitBlockConfigUnknownKeys } from "./unknown-keys.js";
7
8
  export function parseDslPluginConfig(raw) {
9
+ validateExitBlockConfigUnknownKeys(raw);
8
10
  const intervalSeconds = raw.interval_seconds ?? 30;
9
11
  validateIntervalSeconds(intervalSeconds, MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS);
10
12
  const intervalMs = intervalSeconds * 1000;
@@ -1 +1 @@
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,GACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,oBAAoB,CAAC,GAAoB;IACvD,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;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,4BAA4B,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
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,GACpB,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;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,4BAA4B,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Reject unknown keys in exit / DSL YAML so typos are not silently ignored.
3
+ */
4
+ /**
5
+ * Validate raw `exit:` from the trading recipe (before map strips keys).
6
+ * 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.
7
+ */
8
+ export declare function validateRawExitBlockAndPresetsUnknownKeys(exit: Record<string, unknown>): void;
9
+ /** Validate ExitBlockConfig for parseDslPluginConfig (normalized dsl_presets only). */
10
+ export declare function validateExitBlockConfigUnknownKeys(raw: Record<string, unknown>): void;
11
+ //# sourceMappingURL=unknown-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown-keys.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/unknown-keys.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoJH;;;GAGG;AACH,wBAAgB,yCAAyC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAoB7F;AAED,uFAAuF;AACvF,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAcrF"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Reject unknown keys in exit / DSL YAML so typos are not silently ignored.
3
+ */
4
+ import { DslConfigValidationError, dslValidationIssue, } from "./validation.js";
5
+ /** Keys allowed on the trading recipe `exit:` object (YAML). */
6
+ const EXIT_RECIPE_KEYS = new Set([
7
+ "engine",
8
+ "interval_seconds",
9
+ "preset",
10
+ "dsl_presets",
11
+ "dsl",
12
+ "sm_flip",
13
+ ]);
14
+ /** Keys allowed on ExitBlockConfig passed to parseDslPluginConfig (post-map). */
15
+ const EXIT_BLOCK_CONFIG_KEYS = new Set([
16
+ "engine",
17
+ "interval_seconds",
18
+ "preset",
19
+ "dsl_presets",
20
+ ]);
21
+ const PRESET_KEYS = new Set([
22
+ "tiers",
23
+ "max_loss_pct",
24
+ "phase1",
25
+ "phase2_trigger_tier",
26
+ "phase2",
27
+ ]);
28
+ const PHASE1_KEYS = new Set([
29
+ "enabled",
30
+ "consecutive_breaches_required",
31
+ "consecutiveBreachesRequired",
32
+ "max_loss_pct",
33
+ "retrace_threshold",
34
+ "retraceThreshold",
35
+ "hard_timeout",
36
+ "weak_peak_cut",
37
+ "dead_weight_cut",
38
+ ]);
39
+ const PHASE2_KEYS = new Set([
40
+ "enabled",
41
+ "retrace_threshold",
42
+ "retraceThreshold",
43
+ "retrace_from_hw",
44
+ "consecutive_breaches_required",
45
+ "consecutiveBreachesRequired",
46
+ "tiers",
47
+ ]);
48
+ const TIER_KEYS = new Set([
49
+ "trigger_pct",
50
+ "triggerPct",
51
+ "lock_hw_pct",
52
+ "lockHwPct",
53
+ "breaches",
54
+ "retrace",
55
+ "retraceFromHW",
56
+ ]);
57
+ const HARD_TIMEOUT_KEYS = new Set(["enabled", "interval_in_minutes"]);
58
+ const WEAK_PEAK_KEYS = new Set(["enabled", "interval_in_minutes", "min_value"]);
59
+ const DEAD_WEIGHT_KEYS = new Set(["enabled", "interval_in_minutes"]);
60
+ function isPlainObject(v) {
61
+ return v != null && typeof v === "object" && !Array.isArray(v);
62
+ }
63
+ function unknownKeyList(obj, allowed) {
64
+ return Object.keys(obj).filter((k) => !allowed.has(k));
65
+ }
66
+ function addUnknownKeyIssues(issues, unknownKeys, pathPrefix) {
67
+ for (const key of unknownKeys) {
68
+ issues.push(dslValidationIssue("UNKNOWN_DSL_CONFIG_KEY", `unknown key "${key}" (check spelling; DSL ignores unrecognized fields)`, pathPrefix ? `${pathPrefix}.${key}` : key));
69
+ }
70
+ }
71
+ function validateTierAtPath(basePath, row, issues) {
72
+ if (!isPlainObject(row))
73
+ return;
74
+ addUnknownKeyIssues(issues, unknownKeyList(row, TIER_KEYS), basePath);
75
+ }
76
+ function validatePhase1AtPath(basePath, phase1, issues) {
77
+ if (!isPlainObject(phase1))
78
+ return;
79
+ addUnknownKeyIssues(issues, unknownKeyList(phase1, PHASE1_KEYS), basePath);
80
+ if (isPlainObject(phase1.hard_timeout)) {
81
+ addUnknownKeyIssues(issues, unknownKeyList(phase1.hard_timeout, HARD_TIMEOUT_KEYS), `${basePath}.hard_timeout`);
82
+ }
83
+ if (isPlainObject(phase1.weak_peak_cut)) {
84
+ addUnknownKeyIssues(issues, unknownKeyList(phase1.weak_peak_cut, WEAK_PEAK_KEYS), `${basePath}.weak_peak_cut`);
85
+ }
86
+ if (isPlainObject(phase1.dead_weight_cut)) {
87
+ addUnknownKeyIssues(issues, unknownKeyList(phase1.dead_weight_cut, DEAD_WEIGHT_KEYS), `${basePath}.dead_weight_cut`);
88
+ }
89
+ }
90
+ function validatePhase2AtPath(basePath, phase2, issues) {
91
+ if (!isPlainObject(phase2))
92
+ return;
93
+ addUnknownKeyIssues(issues, unknownKeyList(phase2, PHASE2_KEYS), basePath);
94
+ const tiers = phase2.tiers;
95
+ if (Array.isArray(tiers)) {
96
+ tiers.forEach((row, i) => {
97
+ validateTierAtPath(`${basePath}.tiers[${i}]`, row, issues);
98
+ });
99
+ }
100
+ }
101
+ function validatePresetObject(presetPath, raw, issues) {
102
+ addUnknownKeyIssues(issues, unknownKeyList(raw, PRESET_KEYS), presetPath);
103
+ validatePhase1AtPath(`${presetPath}.phase1`, raw.phase1, issues);
104
+ validatePhase2AtPath(`${presetPath}.phase2`, raw.phase2, issues);
105
+ const tiers = raw.tiers;
106
+ if (Array.isArray(tiers)) {
107
+ tiers.forEach((row, i) => {
108
+ validateTierAtPath(`${presetPath}.tiers[${i}]`, row, issues);
109
+ });
110
+ }
111
+ }
112
+ /**
113
+ * Validate raw `exit:` from the trading recipe (before map strips keys).
114
+ * 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.
115
+ */
116
+ export function validateRawExitBlockAndPresetsUnknownKeys(exit) {
117
+ const issues = [];
118
+ addUnknownKeyIssues(issues, unknownKeyList(exit, EXIT_RECIPE_KEYS), "exit");
119
+ if (exit.dsl_presets != null && isPlainObject(exit.dsl_presets)) {
120
+ for (const name of Object.keys(exit.dsl_presets)) {
121
+ const p = exit.dsl_presets[name];
122
+ if (!isPlainObject(p))
123
+ continue;
124
+ validatePresetObject(`exit.dsl_presets.${name}`, p, issues);
125
+ }
126
+ }
127
+ if (exit.dsl != null && isPlainObject(exit.dsl)) {
128
+ for (const name of Object.keys(exit.dsl)) {
129
+ const p = exit.dsl[name];
130
+ if (!isPlainObject(p))
131
+ continue;
132
+ validatePresetObject(`exit.dsl.${name}`, p, issues);
133
+ }
134
+ }
135
+ if (issues.length > 0) {
136
+ throw new DslConfigValidationError(issues);
137
+ }
138
+ }
139
+ /** Validate ExitBlockConfig for parseDslPluginConfig (normalized dsl_presets only). */
140
+ export function validateExitBlockConfigUnknownKeys(raw) {
141
+ const issues = [];
142
+ addUnknownKeyIssues(issues, unknownKeyList(raw, EXIT_BLOCK_CONFIG_KEYS), "exit");
143
+ const presets = raw.dsl_presets;
144
+ if (presets != null && isPlainObject(presets)) {
145
+ for (const name of Object.keys(presets)) {
146
+ const p = presets[name];
147
+ if (!isPlainObject(p))
148
+ continue;
149
+ validatePresetObject(`exit.dsl_presets.${name}`, p, issues);
150
+ }
151
+ }
152
+ if (issues.length > 0) {
153
+ throw new DslConfigValidationError(issues);
154
+ }
155
+ }
156
+ //# sourceMappingURL=unknown-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknown-keys.js","sourceRoot":"","sources":["../../../src/dsl/config/unknown-keys.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Exit DSL validation: interval bounds and structured errors for primitive field checks.
3
3
  */
4
- export type DslValidationIssueCode = "INVALID_INTERVAL_SECONDS" | "INVALID_MAX_LOSS_PCT" | "INVALID_RETRACE_THRESHOLD" | "INVALID_TRIGGER_PCT" | "INVALID_LOCK_HW_PCT" | "INVALID_BREACHES" | "INVALID_CONSECUTIVE_BREACHES" | "INVALID_PHASE2_TRIGGER_TIER";
4
+ export type DslValidationIssueCode = "INVALID_INTERVAL_SECONDS" | "INVALID_MAX_LOSS_PCT" | "INVALID_RETRACE_THRESHOLD" | "INVALID_TRIGGER_PCT" | "INVALID_LOCK_HW_PCT" | "INVALID_BREACHES" | "INVALID_CONSECUTIVE_BREACHES" | "INVALID_PHASE2_TRIGGER_TIER" | "UNKNOWN_DSL_CONFIG_KEY";
5
5
  export interface DslValidationIssue {
6
6
  code: DslValidationIssueCode;
7
7
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,sBAAsB,GAC9B,0BAA0B,GAC1B,sBAAsB,GACtB,2BAA2B,GAC3B,qBAAqB,GACrB,qBAAqB,GACrB,kBAAkB,GAClB,8BAA8B,GAC9B,6BAA6B,CAAC;AAElC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBAE1B,MAAM,EAAE,kBAAkB,EAAE;IAWxC,MAAM,IAAI;QAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;KAAE;CAG3C;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,sBAAsB,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,kBAAkB,CAEpB;AAgBD,6DAA6D;AAC7D,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAyBN"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,sBAAsB,GAC9B,0BAA0B,GAC1B,sBAAsB,GACtB,2BAA2B,GAC3B,qBAAqB,GACrB,qBAAqB,GACrB,kBAAkB,GAClB,8BAA8B,GAC9B,6BAA6B,GAC7B,wBAAwB,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBAE1B,MAAM,EAAE,kBAAkB,EAAE;IAWxC,MAAM,IAAI;QAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;KAAE;CAG3C;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,sBAAsB,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,kBAAkB,CAEpB;AAgBD,6DAA6D;AAC7D,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAyBN"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/dsl/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,MAAM,CAAuB;IAEtC,YAAY,MAA4B;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK;YAC1B,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,GAAG;YACnD,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAChC,IAA4B,EAC5B,OAAe,EACf,IAAY;IAEZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,KAAK,CACZ,IAA4B,EAC5B,OAAe,EACf,IAAY;IAEZ,OAAO,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,MAA4B;IACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CACrC,eAAuB,EACvB,UAAkB,EAClB,UAAkB;IAElB,MAAM,IAAI,GAAG,uBAAuB,CAAC;IACrC,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,IACE,OAAO,eAAe,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;QAClC,eAAe,GAAG,UAAU,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,KAAK,CACH,0BAA0B,EAC1B,yBAAyB,UAAU,EAAE,EACrC,IAAI,CACL,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,eAAe,GAAG,UAAU,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CACT,KAAK,CACH,0BAA0B,EAC1B,cAAc,UAAU,EAAE,EAC1B,IAAI,CACL,CACF,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/dsl/config/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,MAAM,CAAuB;IAEtC,YAAY,MAA4B;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK;YAC1B,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,GAAG;YACnD,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAChC,IAA4B,EAC5B,OAAe,EACf,IAAY;IAEZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,KAAK,CACZ,IAA4B,EAC5B,OAAe,EACf,IAAY;IAEZ,OAAO,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,MAA4B;IACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CACrC,eAAuB,EACvB,UAAkB,EAClB,UAAkB;IAElB,MAAM,IAAI,GAAG,uBAAuB,CAAC;IACrC,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,IACE,OAAO,eAAe,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;QAClC,eAAe,GAAG,UAAU,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,KAAK,CACH,0BAA0B,EAC1B,yBAAyB,UAAU,EAAE,EACrC,IAAI,CACL,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,eAAe,GAAG,UAAU,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CACT,KAAK,CACH,0BAA0B,EAC1B,cAAc,UAAU,EAAE,EAC1B,IAAI,CACL,CACF,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"map-exit-config.d.ts","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AA2GpE;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,eAAe,CAoBpG"}
1
+ {"version":3,"file":"map-exit-config.d.ts","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AA2GpE;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,eAAe,CAuBpG"}
@@ -2,6 +2,7 @@
2
2
  * Map trading recipe exit (dsl_presets or dsl) to DSL plugin ExitBlockConfig.
3
3
  * Prefers exit.dsl_presets; falls back to exit.dsl. Passes engine and interval_seconds.
4
4
  */
5
+ import { validateRawExitBlockAndPresetsUnknownKeys } from "../dsl/config/unknown-keys.js";
5
6
  function deriveMaxLossPct(preset) {
6
7
  const n = preset.max_loss_pct;
7
8
  if (typeof n === "number" && n > 0)
@@ -71,6 +72,9 @@ function buildPreset(name, rawObj, source) {
71
72
  * Uses exit.dsl_presets if present, else exit.dsl. Passes exit.interval_seconds and exit.engine.
72
73
  */
73
74
  export function mapTradingRecipeExitToDslConfig(exit) {
75
+ if (exit != null && typeof exit === "object") {
76
+ validateRawExitBlockAndPresetsUnknownKeys(exit);
77
+ }
74
78
  const presetsSource = exit?.dsl_presets ?? exit?.dsl;
75
79
  const sourceKey = exit?.dsl_presets != null ? "dsl_presets" : "dsl";
76
80
  if (!presetsSource || typeof presetsSource !== "object") {
@@ -1 +1 @@
1
- {"version":3,"file":"map-exit-config.js","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"map-exit-config.js","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"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"}