@senpi/trading-recipe 1.0.28 → 1.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +3 -0
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/dsl/config/exit-block.d.ts +11 -0
- package/dist/dsl/config/exit-block.d.ts.map +1 -0
- package/dist/dsl/config/exit-block.js +5 -0
- package/dist/dsl/config/exit-block.js.map +1 -0
- package/dist/dsl/config/index.d.ts +4 -56
- package/dist/dsl/config/index.d.ts.map +1 -1
- package/dist/dsl/config/index.js +3 -244
- package/dist/dsl/config/index.js.map +1 -1
- package/dist/dsl/config/parse-phase.d.ts +17 -0
- package/dist/dsl/config/parse-phase.d.ts.map +1 -0
- package/dist/dsl/config/parse-phase.js +97 -0
- package/dist/dsl/config/parse-phase.js.map +1 -0
- package/dist/dsl/config/parse-plugin-config.d.ts +8 -0
- package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -0
- package/dist/dsl/config/parse-plugin-config.js +31 -0
- package/dist/dsl/config/parse-plugin-config.js.map +1 -0
- package/dist/dsl/config/parse-preset.d.ts +7 -0
- package/dist/dsl/config/parse-preset.d.ts.map +1 -0
- package/dist/dsl/config/parse-preset.js +77 -0
- package/dist/dsl/config/parse-preset.js.map +1 -0
- package/dist/dsl/config/parse-tiers.d.ts +7 -0
- package/dist/dsl/config/parse-tiers.d.ts.map +1 -0
- package/dist/dsl/config/parse-tiers.js +30 -0
- package/dist/dsl/config/parse-tiers.js.map +1 -0
- package/dist/dsl/config/parse-timeouts.d.ts +11 -0
- package/dist/dsl/config/parse-timeouts.d.ts.map +1 -0
- package/dist/dsl/config/parse-timeouts.js +33 -0
- package/dist/dsl/config/parse-timeouts.js.map +1 -0
- package/dist/dsl/config/raw-types.d.ts +49 -0
- package/dist/dsl/config/raw-types.d.ts.map +1 -0
- package/dist/dsl/config/raw-types.js +5 -0
- package/dist/dsl/config/raw-types.js.map +1 -0
- package/dist/dsl/engine/exchange-stop.d.ts +17 -0
- package/dist/dsl/engine/exchange-stop.d.ts.map +1 -0
- package/dist/dsl/engine/exchange-stop.js +21 -0
- package/dist/dsl/engine/exchange-stop.js.map +1 -0
- package/dist/dsl/engine/floors.d.ts +26 -0
- package/dist/dsl/engine/floors.d.ts.map +1 -0
- package/dist/dsl/engine/floors.js +114 -0
- package/dist/dsl/engine/floors.js.map +1 -0
- package/dist/dsl/engine/index.d.ts +4 -4
- package/dist/dsl/engine/index.d.ts.map +1 -1
- package/dist/dsl/engine/index.js +4 -298
- package/dist/dsl/engine/index.js.map +1 -1
- package/dist/dsl/engine/round.d.ts +5 -0
- package/dist/dsl/engine/round.d.ts.map +1 -0
- package/dist/dsl/engine/round.js +9 -0
- package/dist/dsl/engine/round.js.map +1 -0
- package/dist/dsl/engine/state-updates.d.ts +8 -0
- package/dist/dsl/engine/state-updates.d.ts.map +1 -0
- package/dist/dsl/engine/state-updates.js +55 -0
- package/dist/dsl/engine/state-updates.js.map +1 -0
- package/dist/dsl/engine/tick.d.ts +6 -0
- package/dist/dsl/engine/tick.d.ts.map +1 -0
- package/dist/dsl/engine/tick.js +140 -0
- package/dist/dsl/engine/tick.js.map +1 -0
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +2 -99
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/dsl/events/initial-state.d.ts +9 -0
- package/dist/dsl/events/initial-state.d.ts.map +1 -0
- package/dist/dsl/events/initial-state.js +106 -0
- package/dist/dsl/events/initial-state.js.map +1 -0
- package/dist/dsl/monitor/create-monitor.d.ts +16 -0
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -0
- package/dist/dsl/monitor/create-monitor.js +129 -0
- package/dist/dsl/monitor/create-monitor.js.map +1 -0
- package/dist/dsl/monitor/effective-dex.d.ts +7 -0
- package/dist/dsl/monitor/effective-dex.d.ts.map +1 -0
- package/dist/dsl/monitor/effective-dex.js +11 -0
- package/dist/dsl/monitor/effective-dex.js.map +1 -0
- package/dist/dsl/monitor/exchange-sync.d.ts +12 -0
- package/dist/dsl/monitor/exchange-sync.d.ts.map +1 -0
- package/dist/dsl/monitor/exchange-sync.js +25 -0
- package/dist/dsl/monitor/exchange-sync.js.map +1 -0
- package/dist/dsl/monitor/index.d.ts +3 -15
- package/dist/dsl/monitor/index.d.ts.map +1 -1
- package/dist/dsl/monitor/index.js +2 -448
- package/dist/dsl/monitor/index.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts +17 -0
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -0
- package/dist/dsl/monitor/process-one-position.js +331 -0
- package/dist/dsl/monitor/process-one-position.js.map +1 -0
- package/dist/dsl/plugin/index.d.ts +2 -13
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/dsl/plugin/options.d.ts +17 -0
- package/dist/dsl/plugin/options.d.ts.map +1 -0
- package/dist/dsl/plugin/options.js +5 -0
- package/dist/dsl/plugin/options.js.map +1 -0
- package/dist/senpi/client.d.ts +2 -1
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +7 -9
- package/dist/senpi/client.js.map +1 -1
- package/examples/strategies/fox-minimal-loosened.yaml +1 -1
- package/openclaw.plugin.json +1 -1
- 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;
|
|
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"}
|
|
@@ -167,6 +167,7 @@ Phase 1 — Fixed floor + high-water trailing (separate from phase 2)
|
|
|
167
167
|
max_loss_pct: 3.0 # e.g. 3% max loss at 1×
|
|
168
168
|
retrace_threshold: 10 # ROE % retrace from HWM in phase 1 (required when enabled)
|
|
169
169
|
consecutive_breaches_required: 3 # ticks below floor before exit (required when enabled)
|
|
170
|
+
# Exchange SL in Phase 1 only: max_loss absolute floor; retrace/tier-tight exits use closePosition.
|
|
170
171
|
# Optional time-based cuts (each: enabled, interval_in_minutes):
|
|
171
172
|
# hard_timeout, weak_peak_cut (min_value ROE %), dead_weight_cut
|
|
172
173
|
|
|
@@ -175,6 +176,8 @@ Phase 2 — Tiers + trailing floor (high-water retrace)
|
|
|
175
176
|
Starts when price reaches the tier at phase2_trigger_tier (0 = first tier).
|
|
176
177
|
Floor = max(tier_floor, trailing_floor). Retrace values are ROE %; the
|
|
177
178
|
engine divides by leverage for price (e.g. 1.5% ROE at 10× = 0.15% below HW).
|
|
179
|
+
Exchange SL: full effective floor is kept on the exchange (editPosition syncs tier/phase
|
|
180
|
+
and floor moves). This absolute-only Phase 1 rule does not apply in Phase 2.
|
|
178
181
|
|
|
179
182
|
phase2_trigger_tier: 0
|
|
180
183
|
|
|
@@ -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
|
|
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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level exit block shape from skills YAML (before parseDslPluginConfig).
|
|
3
|
+
*/
|
|
4
|
+
import type { RawPreset } from "./raw-types.js";
|
|
5
|
+
export interface ExitBlockConfig {
|
|
6
|
+
engine?: string;
|
|
7
|
+
interval_seconds?: number;
|
|
8
|
+
preset?: string;
|
|
9
|
+
dsl_presets?: Record<string, RawPreset>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=exit-block.d.ts.map
|
|
@@ -0,0 +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,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-block.js","sourceRoot":"","sources":["../../../src/dsl/config/exit-block.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,60 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Exit DSL config: YAML shapes, validation, and parseDslPluginConfig.
|
|
3
3
|
*/
|
|
4
|
-
|
|
4
|
+
export type { ExitBlockConfig } from "./exit-block.js";
|
|
5
5
|
export type { DslValidationIssue, DslValidationIssueCode } from "./validation.js";
|
|
6
|
-
export { DslConfigValidationError, dslValidationIssue } from "./validation.js";
|
|
7
|
-
export
|
|
8
|
-
engine?: string;
|
|
9
|
-
interval_seconds?: number;
|
|
10
|
-
preset?: string;
|
|
11
|
-
dsl_presets?: Record<string, RawPreset>;
|
|
12
|
-
}
|
|
13
|
-
interface RawPreset {
|
|
14
|
-
tiers?: RawTier[];
|
|
15
|
-
max_loss_pct?: number;
|
|
16
|
-
phase1?: RawPhase1;
|
|
17
|
-
phase2_trigger_tier?: number;
|
|
18
|
-
phase2?: RawPhase2;
|
|
19
|
-
}
|
|
20
|
-
interface RawTier {
|
|
21
|
-
trigger_pct?: number;
|
|
22
|
-
triggerPct?: number;
|
|
23
|
-
lock_hw_pct?: number;
|
|
24
|
-
lockHwPct?: number;
|
|
25
|
-
breaches?: number;
|
|
26
|
-
retrace?: number;
|
|
27
|
-
}
|
|
28
|
-
interface RawPhase1 {
|
|
29
|
-
enabled?: boolean;
|
|
30
|
-
consecutiveBreachesRequired?: number;
|
|
31
|
-
consecutive_breaches_required?: number;
|
|
32
|
-
max_loss_pct?: number;
|
|
33
|
-
retraceThreshold?: number;
|
|
34
|
-
retrace_threshold?: number;
|
|
35
|
-
hard_timeout?: {
|
|
36
|
-
enabled?: boolean;
|
|
37
|
-
interval_in_minutes?: number;
|
|
38
|
-
};
|
|
39
|
-
weak_peak_cut?: {
|
|
40
|
-
enabled?: boolean;
|
|
41
|
-
interval_in_minutes?: number;
|
|
42
|
-
min_value?: number;
|
|
43
|
-
};
|
|
44
|
-
dead_weight_cut?: {
|
|
45
|
-
enabled?: boolean;
|
|
46
|
-
interval_in_minutes?: number;
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
interface RawPhase2 {
|
|
50
|
-
enabled?: boolean;
|
|
51
|
-
retraceThreshold?: number;
|
|
52
|
-
retrace_threshold?: number;
|
|
53
|
-
retrace_from_hw?: number;
|
|
54
|
-
consecutiveBreachesRequired?: number;
|
|
55
|
-
consecutive_breaches_required?: number;
|
|
56
|
-
tiers?: RawTier[];
|
|
57
|
-
}
|
|
58
|
-
export declare function parseDslPluginConfig(raw: ExitBlockConfig): DslPluginConfig;
|
|
59
|
-
export declare function getDefaultIntervalMs(): number;
|
|
6
|
+
export { DslConfigValidationError, dslValidationIssue, validateIntervalSeconds } from "./validation.js";
|
|
7
|
+
export { parseDslPluginConfig, getDefaultIntervalMs } from "./parse-plugin-config.js";
|
|
60
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/dsl/config/index.js
CHANGED
|
@@ -1,247 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Exit DSL config: YAML shapes, validation, and parseDslPluginConfig.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export { DslConfigValidationError, dslValidationIssue } from "./validation.js";
|
|
7
|
-
/** Clamp interval to at least minIntervalMinutes (cron run interval). */
|
|
8
|
-
function clampInterval(intervalInMinutes, minIntervalMinutes) {
|
|
9
|
-
return Math.max(intervalInMinutes, minIntervalMinutes);
|
|
10
|
-
}
|
|
11
|
-
function parsePhase1HardTimeout(raw, minIntervalMinutes) {
|
|
12
|
-
if (!raw?.enabled)
|
|
13
|
-
return undefined;
|
|
14
|
-
const intervalInMinutes = clampInterval(Number(raw.interval_in_minutes), minIntervalMinutes);
|
|
15
|
-
if (!(intervalInMinutes > 0))
|
|
16
|
-
return undefined;
|
|
17
|
-
return { enabled: true, intervalInMinutes };
|
|
18
|
-
}
|
|
19
|
-
function parsePhase1WeakPeakCut(raw, minIntervalMinutes) {
|
|
20
|
-
if (!raw?.enabled)
|
|
21
|
-
return undefined;
|
|
22
|
-
const intervalInMinutes = clampInterval(Number(raw.interval_in_minutes), minIntervalMinutes);
|
|
23
|
-
if (!(intervalInMinutes > 0))
|
|
24
|
-
return undefined;
|
|
25
|
-
const minValue = typeof raw.min_value === "number" ? raw.min_value : 3.0;
|
|
26
|
-
return { enabled: true, intervalInMinutes, minValue };
|
|
27
|
-
}
|
|
28
|
-
function parsePhase1DeadWeightCut(raw, minIntervalMinutes) {
|
|
29
|
-
if (!raw?.enabled)
|
|
30
|
-
return undefined;
|
|
31
|
-
const intervalInMinutes = clampInterval(Number(raw.interval_in_minutes), minIntervalMinutes);
|
|
32
|
-
if (!(intervalInMinutes > 0))
|
|
33
|
-
return undefined;
|
|
34
|
-
return { enabled: true, intervalInMinutes };
|
|
35
|
-
}
|
|
36
|
-
function readPhase1(presetName, phase1, presetMaxLossPct) {
|
|
37
|
-
if (!phase1 || typeof phase1 !== "object") {
|
|
38
|
-
throw new Error(`preset "${presetName}": phase1 is required with max_loss_pct, retrace_threshold, consecutive_breaches_required`);
|
|
39
|
-
}
|
|
40
|
-
const phase1Enabled = phase1.enabled !== false;
|
|
41
|
-
if (!phase1Enabled) {
|
|
42
|
-
const maxLossPct = Number(phase1.max_loss_pct ?? presetMaxLossPct ?? 1);
|
|
43
|
-
if (!(maxLossPct > 0) || maxLossPct > 100) {
|
|
44
|
-
throw new DslConfigValidationError([
|
|
45
|
-
dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
|
|
46
|
-
? "max_loss_pct must be > 0 when phase1.enabled is false"
|
|
47
|
-
: "max_loss_pct must be <= 100", `dsl_presets.${presetName}.phase1.max_loss_pct`),
|
|
48
|
-
]);
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
maxLossPct,
|
|
52
|
-
retraceThreshold: 1,
|
|
53
|
-
phase1Breaches: 1,
|
|
54
|
-
phase1Enabled: false,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
const maxLossPct = Number(phase1.max_loss_pct ?? presetMaxLossPct);
|
|
58
|
-
if (!(maxLossPct > 0) || maxLossPct > 100) {
|
|
59
|
-
throw new DslConfigValidationError([
|
|
60
|
-
dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
|
|
61
|
-
? "phase1.max_loss_pct is required and must be > 0 (or set preset max_loss_pct)"
|
|
62
|
-
: "phase1.max_loss_pct must be <= 100", `dsl_presets.${presetName}.phase1.max_loss_pct`),
|
|
63
|
-
]);
|
|
64
|
-
}
|
|
65
|
-
const retraceThreshold = Number(phase1.retrace_threshold ?? phase1.retraceThreshold);
|
|
66
|
-
if (!(retraceThreshold > 0)) {
|
|
67
|
-
throw new DslConfigValidationError([
|
|
68
|
-
dslValidationIssue("INVALID_RETRACE_THRESHOLD", "phase1.retrace_threshold is required and must be > 0 (ROE %)", `dsl_presets.${presetName}.phase1.retrace_threshold`),
|
|
69
|
-
]);
|
|
70
|
-
}
|
|
71
|
-
const phase1Breaches = Number(phase1.consecutive_breaches_required ?? phase1.consecutiveBreachesRequired);
|
|
72
|
-
if (!Number.isFinite(phase1Breaches) || phase1Breaches < 1 || !Number.isInteger(phase1Breaches)) {
|
|
73
|
-
throw new DslConfigValidationError([
|
|
74
|
-
dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase1.consecutive_breaches_required must be an integer >= 1", `dsl_presets.${presetName}.phase1.consecutive_breaches_required`),
|
|
75
|
-
]);
|
|
76
|
-
}
|
|
77
|
-
return { maxLossPct, retraceThreshold, phase1Breaches, phase1Enabled: true };
|
|
78
|
-
}
|
|
79
|
-
function readPhase2Scalars(presetName, phase2, requireTiersArray) {
|
|
80
|
-
if (!phase2 || typeof phase2 !== "object") {
|
|
81
|
-
throw new Error(`preset "${presetName}": phase2 is required`);
|
|
82
|
-
}
|
|
83
|
-
const phase2Enabled = phase2.enabled !== false;
|
|
84
|
-
const phase2RetraceRaw = Number(phase2.retrace_threshold ?? phase2.retraceThreshold ?? phase2.retrace_from_hw);
|
|
85
|
-
const phase2BreachesRaw = Number(phase2.consecutive_breaches_required ?? phase2.consecutiveBreachesRequired);
|
|
86
|
-
if (!phase2Enabled) {
|
|
87
|
-
const phase2Retrace = phase2RetraceRaw > 0 ? phase2RetraceRaw : 1;
|
|
88
|
-
if (Number.isFinite(phase2BreachesRaw) &&
|
|
89
|
-
phase2BreachesRaw >= 1 &&
|
|
90
|
-
!Number.isInteger(phase2BreachesRaw)) {
|
|
91
|
-
throw new DslConfigValidationError([
|
|
92
|
-
dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase2.consecutive_breaches_required must be an integer >= 1", `dsl_presets.${presetName}.phase2.consecutive_breaches_required`),
|
|
93
|
-
]);
|
|
94
|
-
}
|
|
95
|
-
const phase2Breaches = Number.isFinite(phase2BreachesRaw) && phase2BreachesRaw >= 1 ? phase2BreachesRaw : 1;
|
|
96
|
-
if (requireTiersArray &&
|
|
97
|
-
(!Array.isArray(phase2.tiers) || phase2.tiers.length === 0)) {
|
|
98
|
-
throw new Error(`preset "${presetName}": phase2.tiers must be a non-empty array`);
|
|
99
|
-
}
|
|
100
|
-
return { phase2Retrace, phase2Breaches, phase2Enabled: false };
|
|
101
|
-
}
|
|
102
|
-
const phase2Retrace = phase2RetraceRaw;
|
|
103
|
-
if (!(phase2Retrace > 0)) {
|
|
104
|
-
throw new DslConfigValidationError([
|
|
105
|
-
dslValidationIssue("INVALID_RETRACE_THRESHOLD", "phase2.retrace_threshold is required and must be > 0 (ROE %)", `dsl_presets.${presetName}.phase2.retrace_threshold`),
|
|
106
|
-
]);
|
|
107
|
-
}
|
|
108
|
-
const phase2Breaches = phase2BreachesRaw;
|
|
109
|
-
if (!Number.isFinite(phase2Breaches) || phase2Breaches < 1 || !Number.isInteger(phase2Breaches)) {
|
|
110
|
-
throw new DslConfigValidationError([
|
|
111
|
-
dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase2.consecutive_breaches_required must be an integer >= 1", `dsl_presets.${presetName}.phase2.consecutive_breaches_required`),
|
|
112
|
-
]);
|
|
113
|
-
}
|
|
114
|
-
if (requireTiersArray &&
|
|
115
|
-
(!Array.isArray(phase2.tiers) || phase2.tiers.length === 0)) {
|
|
116
|
-
throw new Error(`preset "${presetName}": phase2.tiers must be a non-empty array`);
|
|
117
|
-
}
|
|
118
|
-
return { phase2Retrace, phase2Breaches, phase2Enabled: true };
|
|
119
|
-
}
|
|
120
|
-
function readPhase2TriggerTier(presetName, raw) {
|
|
121
|
-
if (typeof raw !== "number" || !Number.isInteger(raw) || raw < 0) {
|
|
122
|
-
throw new DslConfigValidationError([
|
|
123
|
-
dslValidationIssue("INVALID_PHASE2_TRIGGER_TIER", "phase2_trigger_tier is required and must be an integer >= 0", `dsl_presets.${presetName}.phase2_trigger_tier`),
|
|
124
|
-
]);
|
|
125
|
-
}
|
|
126
|
-
return raw;
|
|
127
|
-
}
|
|
128
|
-
function parseTier(presetName, raw, tierIndex, tiersPathForErrors) {
|
|
129
|
-
const path = (field) => `dsl_presets.${presetName}.${tiersPathForErrors}[${tierIndex}].${field}`;
|
|
130
|
-
const triggerPct = Number(raw.trigger_pct ?? raw.triggerPct);
|
|
131
|
-
const lockHwPct = Number(raw.lock_hw_pct ?? raw.lockHwPct);
|
|
132
|
-
const breaches = Number(raw.breaches);
|
|
133
|
-
if (!(triggerPct > 0) || triggerPct > 100) {
|
|
134
|
-
throw new DslConfigValidationError([
|
|
135
|
-
dslValidationIssue("INVALID_TRIGGER_PCT", "trigger_pct must be > 0 and <= 100", path("trigger_pct")),
|
|
136
|
-
]);
|
|
137
|
-
}
|
|
138
|
-
if (!Number.isFinite(lockHwPct) || lockHwPct < 0 || lockHwPct > 100) {
|
|
139
|
-
throw new DslConfigValidationError([
|
|
140
|
-
dslValidationIssue("INVALID_LOCK_HW_PCT", "lock_hw_pct is required and must be in [0, 100]", path("lock_hw_pct")),
|
|
141
|
-
]);
|
|
142
|
-
}
|
|
143
|
-
if (!Number.isFinite(breaches) || breaches < 1 || !Number.isInteger(breaches)) {
|
|
144
|
-
throw new DslConfigValidationError([
|
|
145
|
-
dslValidationIssue("INVALID_BREACHES", "breaches must be an integer >= 1", path("breaches")),
|
|
146
|
-
]);
|
|
147
|
-
}
|
|
148
|
-
const retraceRaw = raw.retrace ?? raw.retraceFromHW;
|
|
149
|
-
const retraceFromHW = typeof retraceRaw === "number" && retraceRaw > 0 ? retraceRaw : undefined;
|
|
150
|
-
const tier = { triggerPct, lockHwPct, breaches, ...(retraceFromHW != null && { retraceFromHW }) };
|
|
151
|
-
return tier;
|
|
152
|
-
}
|
|
153
|
-
function parsePreset(name, raw, minIntervalMinutes = 0) {
|
|
154
|
-
const hasPhase2Tiers = raw.phase2?.tiers && Array.isArray(raw.phase2.tiers) && raw.phase2.tiers.length > 0;
|
|
155
|
-
if (hasPhase2Tiers) {
|
|
156
|
-
return parsePresetPhaseFormat(name, raw, minIntervalMinutes);
|
|
157
|
-
}
|
|
158
|
-
const tiersRaw = raw.tiers;
|
|
159
|
-
if (!Array.isArray(tiersRaw) || tiersRaw.length === 0) {
|
|
160
|
-
throw new Error(`preset "${name}" must have tiers or phase2.tiers`);
|
|
161
|
-
}
|
|
162
|
-
const tiers = tiersRaw.map((t, i) => parseTier(name, t, i, "tiers"));
|
|
163
|
-
for (let i = 1; i < tiers.length; i++) {
|
|
164
|
-
if (tiers[i].triggerPct <= tiers[i - 1].triggerPct) {
|
|
165
|
-
throw new Error(`preset "${name}": tiers must be sorted ascending by trigger_pct`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
const p1 = readPhase1(name, raw.phase1, raw.max_loss_pct);
|
|
169
|
-
const p2 = readPhase2Scalars(name, raw.phase2, false);
|
|
170
|
-
if (!p1.phase1Enabled && !p2.phase2Enabled) {
|
|
171
|
-
throw new Error(`preset "${name}": phase1.enabled and phase2.enabled cannot both be false (at least one phase must be active)`);
|
|
172
|
-
}
|
|
173
|
-
const phase2TriggerTier = readPhase2TriggerTier(name, raw.phase2_trigger_tier);
|
|
174
|
-
const phase1HardTimeout = parsePhase1HardTimeout(raw.phase1?.hard_timeout, minIntervalMinutes);
|
|
175
|
-
const phase1WeakPeakCut = parsePhase1WeakPeakCut(raw.phase1?.weak_peak_cut, minIntervalMinutes);
|
|
176
|
-
const phase1DeadWeightCut = parsePhase1DeadWeightCut(raw.phase1?.dead_weight_cut, minIntervalMinutes);
|
|
177
|
-
return {
|
|
178
|
-
tiers,
|
|
179
|
-
maxLossPct: p1.maxLossPct,
|
|
180
|
-
phase1Enabled: p1.phase1Enabled,
|
|
181
|
-
phase2Enabled: p2.phase2Enabled,
|
|
182
|
-
phase1RetraceThreshold: p1.retraceThreshold,
|
|
183
|
-
phase1BreachesRequired: p1.phase1Breaches,
|
|
184
|
-
phase2RetraceFromHW: p2.phase2Retrace,
|
|
185
|
-
phase2BreachesRequired: p2.phase2Breaches,
|
|
186
|
-
phase2TriggerTier,
|
|
187
|
-
...(phase1HardTimeout && { phase1HardTimeout }),
|
|
188
|
-
...(phase1WeakPeakCut && { phase1WeakPeakCut }),
|
|
189
|
-
...(phase1DeadWeightCut && { phase1DeadWeightCut }),
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
function parsePresetPhaseFormat(name, raw, minIntervalMinutes = 0) {
|
|
193
|
-
const p1 = readPhase1(name, raw.phase1, raw.max_loss_pct);
|
|
194
|
-
const p2 = readPhase2Scalars(name, raw.phase2, true);
|
|
195
|
-
if (!p1.phase1Enabled && !p2.phase2Enabled) {
|
|
196
|
-
throw new Error(`preset "${name}": phase1.enabled and phase2.enabled cannot both be false (at least one phase must be active)`);
|
|
197
|
-
}
|
|
198
|
-
const phase2TriggerTier = readPhase2TriggerTier(name, raw.phase2_trigger_tier);
|
|
199
|
-
const tiers = raw.phase2.tiers.map((t, i) => parseTier(name, t, i, "phase2.tiers"));
|
|
200
|
-
for (let i = 1; i < tiers.length; i++) {
|
|
201
|
-
if (tiers[i].triggerPct <= tiers[i - 1].triggerPct) {
|
|
202
|
-
throw new Error(`preset "${name}": phase2.tiers must be sorted ascending by trigger_pct`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
const phase1HardTimeout = parsePhase1HardTimeout(raw.phase1?.hard_timeout, minIntervalMinutes);
|
|
206
|
-
const phase1WeakPeakCut = parsePhase1WeakPeakCut(raw.phase1?.weak_peak_cut, minIntervalMinutes);
|
|
207
|
-
const phase1DeadWeightCut = parsePhase1DeadWeightCut(raw.phase1?.dead_weight_cut, minIntervalMinutes);
|
|
208
|
-
return {
|
|
209
|
-
tiers,
|
|
210
|
-
maxLossPct: p1.maxLossPct,
|
|
211
|
-
phase1Enabled: p1.phase1Enabled,
|
|
212
|
-
phase2Enabled: p2.phase2Enabled,
|
|
213
|
-
phase1RetraceThreshold: p1.retraceThreshold,
|
|
214
|
-
phase1BreachesRequired: p1.phase1Breaches,
|
|
215
|
-
phase2RetraceFromHW: p2.phase2Retrace,
|
|
216
|
-
phase2BreachesRequired: p2.phase2Breaches,
|
|
217
|
-
phase2TriggerTier,
|
|
218
|
-
...(phase1HardTimeout && { phase1HardTimeout }),
|
|
219
|
-
...(phase1WeakPeakCut && { phase1WeakPeakCut }),
|
|
220
|
-
...(phase1DeadWeightCut && { phase1DeadWeightCut }),
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
export function parseDslPluginConfig(raw) {
|
|
224
|
-
const intervalSeconds = raw.interval_seconds ?? 30;
|
|
225
|
-
validateIntervalSeconds(intervalSeconds, MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS);
|
|
226
|
-
const intervalMs = intervalSeconds * 1000;
|
|
227
|
-
const minIntervalMinutes = intervalMs / 60_000;
|
|
228
|
-
const presetsRaw = raw.dsl_presets ?? {};
|
|
229
|
-
const presets = {};
|
|
230
|
-
for (const [name, p] of Object.entries(presetsRaw)) {
|
|
231
|
-
if (p && typeof p === "object")
|
|
232
|
-
presets[name] = parsePreset(name, p, minIntervalMinutes);
|
|
233
|
-
}
|
|
234
|
-
const presetKeys = Object.keys(presets);
|
|
235
|
-
if (presetKeys.length === 0) {
|
|
236
|
-
throw new Error("At least one dsl_presets entry is required");
|
|
237
|
-
}
|
|
238
|
-
const preset = typeof raw.preset === "string" ? raw.preset : presetKeys[0];
|
|
239
|
-
if (!presets[preset]) {
|
|
240
|
-
throw new Error(`Preset "${preset}" not found in dsl_presets`);
|
|
241
|
-
}
|
|
242
|
-
return { intervalMs, preset, presets };
|
|
243
|
-
}
|
|
244
|
-
export function getDefaultIntervalMs() {
|
|
245
|
-
return DEFAULT_INTERVAL_MS;
|
|
246
|
-
}
|
|
4
|
+
export { DslConfigValidationError, dslValidationIssue, validateIntervalSeconds } from "./validation.js";
|
|
5
|
+
export { parseDslPluginConfig, getDefaultIntervalMs } from "./parse-plugin-config.js";
|
|
247
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/config/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 1 / phase 2 scalar parsing and validation from raw preset YAML.
|
|
3
|
+
*/
|
|
4
|
+
import type { RawPhase1, RawPhase2 } from "./raw-types.js";
|
|
5
|
+
export declare function readPhase1(presetName: string, phase1: RawPhase1 | undefined, presetMaxLossPct: number | undefined): {
|
|
6
|
+
maxLossPct: number;
|
|
7
|
+
retraceThreshold: number;
|
|
8
|
+
phase1Breaches: number;
|
|
9
|
+
phase1Enabled: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function readPhase2Scalars(presetName: string, phase2: RawPhase2 | undefined, requireTiersArray: boolean): {
|
|
12
|
+
phase2Retrace: number;
|
|
13
|
+
phase2Breaches: number;
|
|
14
|
+
phase2Enabled: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare function readPhase2TriggerTier(presetName: string, raw: number | undefined): number;
|
|
17
|
+
//# sourceMappingURL=parse-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-phase.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-phase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAgElG;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,iBAAiB,EAAE,OAAO,GACzB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAiE3E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAWzF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 1 / phase 2 scalar parsing and validation from raw preset YAML.
|
|
3
|
+
*/
|
|
4
|
+
import { DslConfigValidationError, dslValidationIssue } from "./validation.js";
|
|
5
|
+
export function readPhase1(presetName, phase1, presetMaxLossPct) {
|
|
6
|
+
if (!phase1 || typeof phase1 !== "object") {
|
|
7
|
+
throw new Error(`preset "${presetName}": phase1 is required with max_loss_pct, retrace_threshold, consecutive_breaches_required`);
|
|
8
|
+
}
|
|
9
|
+
const phase1Enabled = phase1.enabled !== false;
|
|
10
|
+
if (!phase1Enabled) {
|
|
11
|
+
const maxLossPct = Number(phase1.max_loss_pct ?? presetMaxLossPct ?? 1);
|
|
12
|
+
if (!(maxLossPct > 0) || maxLossPct > 100) {
|
|
13
|
+
throw new DslConfigValidationError([
|
|
14
|
+
dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
|
|
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`),
|
|
17
|
+
]);
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
maxLossPct,
|
|
21
|
+
retraceThreshold: 1,
|
|
22
|
+
phase1Breaches: 1,
|
|
23
|
+
phase1Enabled: false,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const maxLossPct = Number(phase1.max_loss_pct ?? presetMaxLossPct);
|
|
27
|
+
if (!(maxLossPct > 0) || maxLossPct > 100) {
|
|
28
|
+
throw new DslConfigValidationError([
|
|
29
|
+
dslValidationIssue("INVALID_MAX_LOSS_PCT", !(maxLossPct > 0)
|
|
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`),
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
const retraceThreshold = Number(phase1.retrace_threshold ?? phase1.retraceThreshold);
|
|
35
|
+
if (!(retraceThreshold > 0)) {
|
|
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`),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
const phase1Breaches = Number(phase1.consecutive_breaches_required ?? phase1.consecutiveBreachesRequired);
|
|
41
|
+
if (!Number.isFinite(phase1Breaches) || phase1Breaches < 1 || !Number.isInteger(phase1Breaches)) {
|
|
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`),
|
|
44
|
+
]);
|
|
45
|
+
}
|
|
46
|
+
return { maxLossPct, retraceThreshold, phase1Breaches, phase1Enabled: true };
|
|
47
|
+
}
|
|
48
|
+
export function readPhase2Scalars(presetName, phase2, requireTiersArray) {
|
|
49
|
+
if (!phase2 || typeof phase2 !== "object") {
|
|
50
|
+
throw new Error(`preset "${presetName}": phase2 is required`);
|
|
51
|
+
}
|
|
52
|
+
const phase2Enabled = phase2.enabled !== false;
|
|
53
|
+
const phase2RetraceRaw = Number(phase2.retrace_threshold ?? phase2.retraceThreshold ?? phase2.retrace_from_hw);
|
|
54
|
+
const phase2BreachesRaw = Number(phase2.consecutive_breaches_required ?? phase2.consecutiveBreachesRequired);
|
|
55
|
+
if (!phase2Enabled) {
|
|
56
|
+
const phase2Retrace = phase2RetraceRaw > 0 ? phase2RetraceRaw : 1;
|
|
57
|
+
if (Number.isFinite(phase2BreachesRaw) &&
|
|
58
|
+
phase2BreachesRaw >= 1 &&
|
|
59
|
+
!Number.isInteger(phase2BreachesRaw)) {
|
|
60
|
+
throw new DslConfigValidationError([
|
|
61
|
+
dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase2.consecutive_breaches_required must be an integer >= 1", `dsl_presets.${presetName}.phase2.consecutive_breaches_required`),
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
const phase2Breaches = Number.isFinite(phase2BreachesRaw) && phase2BreachesRaw >= 1 ? phase2BreachesRaw : 1;
|
|
65
|
+
if (requireTiersArray &&
|
|
66
|
+
(!Array.isArray(phase2.tiers) || phase2.tiers.length === 0)) {
|
|
67
|
+
throw new Error(`preset "${presetName}": phase2.tiers must be a non-empty array`);
|
|
68
|
+
}
|
|
69
|
+
return { phase2Retrace, phase2Breaches, phase2Enabled: false };
|
|
70
|
+
}
|
|
71
|
+
const phase2Retrace = phase2RetraceRaw;
|
|
72
|
+
if (!(phase2Retrace > 0)) {
|
|
73
|
+
throw new DslConfigValidationError([
|
|
74
|
+
dslValidationIssue("INVALID_RETRACE_THRESHOLD", "phase2.retrace_threshold is required and must be > 0 (ROE %)", `dsl_presets.${presetName}.phase2.retrace_threshold`),
|
|
75
|
+
]);
|
|
76
|
+
}
|
|
77
|
+
const phase2Breaches = phase2BreachesRaw;
|
|
78
|
+
if (!Number.isFinite(phase2Breaches) || phase2Breaches < 1 || !Number.isInteger(phase2Breaches)) {
|
|
79
|
+
throw new DslConfigValidationError([
|
|
80
|
+
dslValidationIssue("INVALID_CONSECUTIVE_BREACHES", "phase2.consecutive_breaches_required must be an integer >= 1", `dsl_presets.${presetName}.phase2.consecutive_breaches_required`),
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
if (requireTiersArray &&
|
|
84
|
+
(!Array.isArray(phase2.tiers) || phase2.tiers.length === 0)) {
|
|
85
|
+
throw new Error(`preset "${presetName}": phase2.tiers must be a non-empty array`);
|
|
86
|
+
}
|
|
87
|
+
return { phase2Retrace, phase2Breaches, phase2Enabled: true };
|
|
88
|
+
}
|
|
89
|
+
export function readPhase2TriggerTier(presetName, raw) {
|
|
90
|
+
if (typeof raw !== "number" || !Number.isInteger(raw) || raw < 0) {
|
|
91
|
+
throw new DslConfigValidationError([
|
|
92
|
+
dslValidationIssue("INVALID_PHASE2_TRIGGER_TIER", "phase2_trigger_tier is required and must be an integer >= 0", `dsl_presets.${presetName}.phase2_trigger_tier`),
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
return raw;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=parse-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-phase.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse full exit block into runtime DslPluginConfig.
|
|
3
|
+
*/
|
|
4
|
+
import type { DslPluginConfig } from "../../types/dsl/index.js";
|
|
5
|
+
import type { ExitBlockConfig } from "./exit-block.js";
|
|
6
|
+
export declare function parseDslPluginConfig(raw: ExitBlockConfig): DslPluginConfig;
|
|
7
|
+
export declare function getDefaultIntervalMs(): number;
|
|
8
|
+
//# sourceMappingURL=parse-plugin-config.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse full exit block into runtime DslPluginConfig.
|
|
3
|
+
*/
|
|
4
|
+
import { MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS, DEFAULT_INTERVAL_MS, } from "../../constants/dsl/index.js";
|
|
5
|
+
import { validateIntervalSeconds } from "./validation.js";
|
|
6
|
+
import { parsePreset } from "./parse-preset.js";
|
|
7
|
+
export function parseDslPluginConfig(raw) {
|
|
8
|
+
const intervalSeconds = raw.interval_seconds ?? 30;
|
|
9
|
+
validateIntervalSeconds(intervalSeconds, MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS);
|
|
10
|
+
const intervalMs = intervalSeconds * 1000;
|
|
11
|
+
const minIntervalMinutes = intervalMs / 60_000;
|
|
12
|
+
const presetsRaw = raw.dsl_presets ?? {};
|
|
13
|
+
const presets = {};
|
|
14
|
+
for (const [name, p] of Object.entries(presetsRaw)) {
|
|
15
|
+
if (p && typeof p === "object")
|
|
16
|
+
presets[name] = parsePreset(name, p, minIntervalMinutes);
|
|
17
|
+
}
|
|
18
|
+
const presetKeys = Object.keys(presets);
|
|
19
|
+
if (presetKeys.length === 0) {
|
|
20
|
+
throw new Error("At least one dsl_presets entry is required");
|
|
21
|
+
}
|
|
22
|
+
const preset = typeof raw.preset === "string" ? raw.preset : presetKeys[0];
|
|
23
|
+
if (!presets[preset]) {
|
|
24
|
+
throw new Error(`Preset "${preset}" not found in dsl_presets`);
|
|
25
|
+
}
|
|
26
|
+
return { intervalMs, preset, presets };
|
|
27
|
+
}
|
|
28
|
+
export function getDefaultIntervalMs() {
|
|
29
|
+
return DEFAULT_INTERVAL_MS;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=parse-plugin-config.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full preset parsing: tiers + phase1/phase2 (legacy tiers vs phase2.tiers layouts).
|
|
3
|
+
*/
|
|
4
|
+
import type { DslPresetConfig } from "../../types/dsl/index.js";
|
|
5
|
+
import type { RawPreset } from "./raw-types.js";
|
|
6
|
+
export declare function parsePreset(name: string, raw: RawPreset, minIntervalMinutes?: number): DslPresetConfig;
|
|
7
|
+
//# sourceMappingURL=parse-preset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-preset.d.ts","sourceRoot":"","sources":["../../../src/dsl/config/parse-preset.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAQhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,SAAS,EACd,kBAAkB,GAAE,MAAU,GAC7B,eAAe,CA+CjB"}
|