@senpi/trading-recipe 1.0.42 → 1.0.44
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/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +15 -14
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +63 -62
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/constants/dsl/index.d.ts +11 -7
- package/dist/constants/dsl/index.d.ts.map +1 -1
- package/dist/constants/dsl/index.js +11 -7
- package/dist/constants/dsl/index.js.map +1 -1
- package/dist/dsl/config/exit-block.d.ts +2 -0
- package/dist/dsl/config/exit-block.d.ts.map +1 -1
- package/dist/dsl/config/parse-phase.d.ts +0 -3
- package/dist/dsl/config/parse-phase.d.ts.map +1 -1
- package/dist/dsl/config/parse-phase.js +12 -45
- package/dist/dsl/config/parse-phase.js.map +1 -1
- package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -1
- package/dist/dsl/config/parse-plugin-config.js +28 -4
- package/dist/dsl/config/parse-plugin-config.js.map +1 -1
- package/dist/dsl/config/parse-preset.d.ts.map +1 -1
- package/dist/dsl/config/parse-preset.js +36 -22
- package/dist/dsl/config/parse-preset.js.map +1 -1
- package/dist/dsl/config/parse-tiers.d.ts.map +1 -1
- package/dist/dsl/config/parse-tiers.js +11 -10
- package/dist/dsl/config/parse-tiers.js.map +1 -1
- package/dist/dsl/config/parse-timeouts.d.ts +11 -6
- package/dist/dsl/config/parse-timeouts.d.ts.map +1 -1
- package/dist/dsl/config/parse-timeouts.js +4 -4
- package/dist/dsl/config/parse-timeouts.js.map +1 -1
- package/dist/dsl/config/raw-types.d.ts +14 -18
- package/dist/dsl/config/raw-types.d.ts.map +1 -1
- package/dist/dsl/config/unknown-keys.d.ts +1 -5
- package/dist/dsl/config/unknown-keys.d.ts.map +1 -1
- package/dist/dsl/config/unknown-keys.js +42 -26
- package/dist/dsl/config/unknown-keys.js.map +1 -1
- package/dist/dsl/config/validation.d.ts +1 -1
- package/dist/dsl/config/validation.d.ts.map +1 -1
- package/dist/dsl/config/validation.js.map +1 -1
- package/dist/dsl/engine/exchange-stop.d.ts +2 -3
- package/dist/dsl/engine/exchange-stop.d.ts.map +1 -1
- package/dist/dsl/engine/exchange-stop.js +2 -3
- package/dist/dsl/engine/exchange-stop.js.map +1 -1
- package/dist/dsl/engine/floors.d.ts +3 -5
- package/dist/dsl/engine/floors.d.ts.map +1 -1
- package/dist/dsl/engine/floors.js +14 -31
- package/dist/dsl/engine/floors.js.map +1 -1
- package/dist/dsl/engine/state-updates.d.ts.map +1 -1
- package/dist/dsl/engine/state-updates.js +2 -2
- package/dist/dsl/engine/state-updates.js.map +1 -1
- package/dist/dsl/engine/tick.d.ts.map +1 -1
- package/dist/dsl/engine/tick.js +66 -52
- package/dist/dsl/engine/tick.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts +5 -2
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +117 -9
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/dsl/events/initial-state.d.ts +0 -2
- package/dist/dsl/events/initial-state.d.ts.map +1 -1
- package/dist/dsl/events/initial-state.js +8 -20
- package/dist/dsl/events/initial-state.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +11 -13
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/exchange-sync.js +2 -2
- package/dist/dsl/monitor/exchange-sync.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +20 -10
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts +3 -2
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +45 -128
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/dsl/plugin/options.d.ts +0 -2
- package/dist/dsl/plugin/options.d.ts.map +1 -1
- package/dist/runtime/create-runtime-context.d.ts +1 -1
- package/dist/runtime/create-runtime-context.d.ts.map +1 -1
- package/dist/runtime/load-trading-recipe.js +1 -1
- package/dist/runtime/load-trading-recipe.js.map +1 -1
- package/dist/runtime/map-exit-config.d.ts +2 -2
- package/dist/runtime/map-exit-config.d.ts.map +1 -1
- package/dist/runtime/map-exit-config.js +28 -19
- package/dist/runtime/map-exit-config.js.map +1 -1
- package/dist/runtime/reconcile-state.d.ts.map +1 -1
- package/dist/runtime/reconcile-state.js +36 -33
- package/dist/runtime/reconcile-state.js.map +1 -1
- package/dist/runtime/runtime.js +1 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/trading-recipe-schema.d.ts +5722 -5770
- package/dist/runtime/trading-recipe-schema.d.ts.map +1 -1
- package/dist/runtime/trading-recipe-schema.js +14 -8
- package/dist/runtime/trading-recipe-schema.js.map +1 -1
- package/dist/scanners/__tests__/fixtures/strategy-monitor-scenarios.d.ts.map +1 -1
- package/dist/scanners/__tests__/fixtures/strategy-monitor-scenarios.js +1 -0
- package/dist/scanners/__tests__/fixtures/strategy-monitor-scenarios.js.map +1 -1
- package/dist/scanners/implementations/strategy-monitor.d.ts +2 -0
- package/dist/scanners/implementations/strategy-monitor.d.ts.map +1 -1
- package/dist/scanners/implementations/strategy-monitor.js +8 -0
- package/dist/scanners/implementations/strategy-monitor.js.map +1 -1
- package/dist/scanners/providers/factory.js +9 -5
- package/dist/scanners/providers/factory.js.map +1 -1
- package/dist/scripts/run-dsl-standalone-live.js +10 -17
- package/dist/scripts/run-dsl-standalone-live.js.map +1 -1
- package/dist/scripts/run-dsl-standalone-mock.js +10 -17
- package/dist/scripts/run-dsl-standalone-mock.js.map +1 -1
- package/dist/state/state-manager.d.ts +33 -15
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +196 -99
- package/dist/state/state-manager.js.map +1 -1
- package/dist/strategy/strategy-state.js +8 -5
- package/dist/strategy/strategy-state.js.map +1 -1
- package/dist/types/action.d.ts +1 -1
- package/dist/types/action.d.ts.map +1 -1
- package/dist/types/dsl/index.d.ts +41 -27
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +1 -0
- package/dist/types/strategy.d.ts.map +1 -1
- package/examples/strategies/dsl-showcase.yaml +25 -26
- package/examples/strategies/dsl.yaml +13 -17
- package/examples/strategies/fox-minimal-loosened.yaml +23 -17
- package/examples/strategies/fox-minimal.yaml +13 -17
- package/examples/strategies/minimal.yaml +13 -17
- package/examples/strategies/viper.yaml +13 -17
- package/examples/strategies/wolf.yaml +22 -20
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +15 -19
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position-tracker.action.d.ts","sourceRoot":"","sources":["../../../src/actions/position-tracker/position-tracker.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EAGV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"position-tracker.action.d.ts","sourceRoot":"","sources":["../../../src/actions/position-tracker/position-tracker.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EAGV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AA0J7D,qBAAa,qBAAsB,YAAW,MAAM;IAMhD,OAAO,CAAC,OAAO;IALjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAG,kBAAkB,CAAU;gBAGhD,MAAM,EAAE,YAAY,EACZ,OAAO,EAAE,cAAc;IAK3B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IA+DrD,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,IAAI;CAGb;AAID,eAAO,MAAM,sBAAsB,EAAE,aACO,CAAC;AAE7C,eAAO,MAAM,uBAAuB,EAAE,cAYrC,CAAC"}
|
|
@@ -17,6 +17,18 @@ function dexField(dex) {
|
|
|
17
17
|
const normalized = normalizeDex(dex);
|
|
18
18
|
return normalized != null ? { dex: normalized } : {};
|
|
19
19
|
}
|
|
20
|
+
function currentPositionFields(snapshot) {
|
|
21
|
+
return {
|
|
22
|
+
asset: snapshot.asset,
|
|
23
|
+
direction: snapshot.direction,
|
|
24
|
+
entryPrice: snapshot.entryPrice,
|
|
25
|
+
size: snapshot.size,
|
|
26
|
+
leverage: snapshot.leverage,
|
|
27
|
+
leverageType: snapshot.leverageType,
|
|
28
|
+
margin: snapshot.margin,
|
|
29
|
+
...dexField(snapshot.dex),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
20
32
|
function mapPositionOpened(meta, address) {
|
|
21
33
|
const { current } = meta;
|
|
22
34
|
if (!current)
|
|
@@ -24,13 +36,8 @@ function mapPositionOpened(meta, address) {
|
|
|
24
36
|
return {
|
|
25
37
|
type: HOOK_EVENT.ON_POSITION_OPENED,
|
|
26
38
|
data: {
|
|
27
|
-
asset: current.asset,
|
|
28
|
-
direction: current.direction,
|
|
29
|
-
entryPrice: current.entryPrice,
|
|
30
|
-
size: current.size,
|
|
31
|
-
leverage: current.leverage,
|
|
32
39
|
wallet: address,
|
|
33
|
-
...
|
|
40
|
+
...currentPositionFields(current),
|
|
34
41
|
},
|
|
35
42
|
};
|
|
36
43
|
}
|
|
@@ -61,8 +68,7 @@ function mapPositionFlipped(meta, address) {
|
|
|
61
68
|
szi: signedSize(current),
|
|
62
69
|
entryPx: String(current.entryPrice),
|
|
63
70
|
wallet: address,
|
|
64
|
-
|
|
65
|
-
...dexField(current.dex),
|
|
71
|
+
...currentPositionFields(current),
|
|
66
72
|
},
|
|
67
73
|
};
|
|
68
74
|
}
|
|
@@ -81,13 +87,8 @@ function mapPositionSizeChanged(hookType, meta, address) {
|
|
|
81
87
|
return {
|
|
82
88
|
type: hookType,
|
|
83
89
|
data: {
|
|
84
|
-
asset: current.asset,
|
|
85
|
-
direction: current.direction,
|
|
86
|
-
entryPrice: current.entryPrice,
|
|
87
|
-
size: current.size,
|
|
88
|
-
leverage: current.leverage,
|
|
89
90
|
wallet: address,
|
|
90
|
-
...
|
|
91
|
+
...currentPositionFields(current),
|
|
91
92
|
previousEntryPrice: previous.entryPrice,
|
|
92
93
|
previousSize: previous.size,
|
|
93
94
|
sizeDelta: current.size - previous.size,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position-tracker.action.js","sourceRoot":"","sources":["../../../src/actions/position-tracker/position-tracker.action.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAU3D,gFAAgF;AAEhF,0DAA0D;AAC1D,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iEAAiE;AACjE,SAAS,UAAU,CAAC,QAAyC;IAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAED,8DAA8D;AAC9D,SAAS,QAAQ,CAAC,GAAuB;IACvC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;
|
|
1
|
+
{"version":3,"file":"position-tracker.action.js","sourceRoot":"","sources":["../../../src/actions/position-tracker/position-tracker.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;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"}
|
|
@@ -145,70 +145,74 @@ Decision modes:
|
|
|
145
145
|
No LLM call. Use with tight DSL stops to manage risk.
|
|
146
146
|
`.trim();
|
|
147
147
|
const DSL_TEXT = `
|
|
148
|
-
DSL exit engine — two-phase trailing stop-loss
|
|
148
|
+
DSL exit engine — two-phase trailing stop-loss (DSL v2)
|
|
149
149
|
─────────────────────────────────────────────────────────────────────────────
|
|
150
150
|
|
|
151
151
|
The DSL monitors open positions on a configurable interval and closes them
|
|
152
|
-
when price breaches the computed floor
|
|
153
|
-
|
|
154
|
-
|
|
152
|
+
when price breaches the computed floor or when preset time cuts fire.
|
|
153
|
+
Phase 1: max_loss absolute floor + phase1 retrace from high-water; consecutive
|
|
154
|
+
breach counting applies only in phase 1. Phase 2: tier floors from lock_hw_pct
|
|
155
|
+
(% of current high-water ROE); phase 2 begins when price crosses the first
|
|
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
|
|
158
|
+
applies only in phase 1: entering phase 2 before the interval elapses cancels it;
|
|
159
|
+
same tick as first tier (phase 2) skips hard_timeout in favor of tier advance.
|
|
155
160
|
|
|
156
161
|
exit:
|
|
157
162
|
engine: dsl
|
|
158
|
-
interval_seconds: 30
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
interval_seconds: 30
|
|
164
|
+
|
|
165
|
+
# Recommended: one flat preset (no nested map name).
|
|
166
|
+
dsl_preset:
|
|
167
|
+
hard_timeout: ... # optional; same level as phase1 / phase2
|
|
168
|
+
weak_peak_cut: ...
|
|
169
|
+
dead_weight_cut: ...
|
|
170
|
+
phase1: ...
|
|
171
|
+
phase2: ...
|
|
172
|
+
|
|
173
|
+
# Alternative: multiple named presets (set exit.preset when 2+ keys).
|
|
174
|
+
# dsl_presets:
|
|
175
|
+
# dsl: { phase1: ..., phase2: ... }
|
|
176
|
+
# aggressive: { ... }
|
|
177
|
+
# preset: dsl
|
|
165
178
|
|
|
166
179
|
──────────────────────────────────────────────────────────────────────────────
|
|
167
|
-
Phase 1 — Fixed floor + high-water trailing
|
|
168
|
-
Active from entry until the tier at phase2_trigger_tier is crossed.
|
|
180
|
+
Phase 1 — Fixed floor + high-water trailing
|
|
169
181
|
Floor = max(absolute_floor, trailing_floor). Absolute floor from max_loss_pct
|
|
170
182
|
(entry × (1 − max_loss_pct/100/leverage) for LONG). Trailing uses phase1
|
|
171
|
-
retrace_threshold (ROE %) from high-water
|
|
183
|
+
retrace_threshold (ROE %) from high-water.
|
|
172
184
|
|
|
173
185
|
phase1:
|
|
174
|
-
# enabled: false # optional; default true — false = skip Phase 1
|
|
186
|
+
# enabled: false # optional; default true — false = skip Phase 1 logic; tiers can still advance
|
|
175
187
|
max_loss_pct: 3.0 # e.g. 3% max loss at 1×
|
|
176
188
|
retrace_threshold: 10 # ROE % retrace from HWM in phase 1 (required when enabled)
|
|
177
|
-
consecutive_breaches_required: 3 # ticks below floor before exit (required when enabled)
|
|
178
|
-
# Exchange SL in Phase 1
|
|
179
|
-
# Optional time-based cuts (each: enabled, interval_in_minutes):
|
|
180
|
-
# hard_timeout, weak_peak_cut (min_value ROE %), dead_weight_cut
|
|
189
|
+
consecutive_breaches_required: 3 # ticks below floor before exit in phase 1 only (required when enabled)
|
|
190
|
+
# Exchange SL in Phase 1: max_loss absolute floor only; tighter engine floors use closePosition.
|
|
181
191
|
|
|
182
192
|
──────────────────────────────────────────────────────────────────────────────
|
|
183
|
-
Phase 2 —
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
Exchange SL: full effective floor is kept on the exchange (editPosition syncs tier/phase
|
|
188
|
-
and floor moves). This absolute-only Phase 1 rule does not apply in Phase 2.
|
|
189
|
-
|
|
190
|
-
phase2_trigger_tier: 0
|
|
193
|
+
Phase 2 — Tier floors (no per-tier breaches or retrace YAML)
|
|
194
|
+
Floor = tier floor from lock_hw_pct once the tier is active. Price below
|
|
195
|
+
effective floor closes immediately (no consecutive breach counter in phase 2).
|
|
196
|
+
Exchange SL tracks the full effective floor (editPosition on tier/phase and moves).
|
|
191
197
|
|
|
192
198
|
phase2:
|
|
193
|
-
# enabled: false # optional; default true — false = never
|
|
194
|
-
retrace_threshold: 1.5 # default ROE % retrace from HWM (required when phase 2 used)
|
|
195
|
-
consecutive_breaches_required: 1 # required (per-tier breaches still required on each tier)
|
|
196
|
-
|
|
199
|
+
# enabled: false # optional; default true — false = never enter phase 2
|
|
197
200
|
tiers:
|
|
198
|
-
# trigger_pct = ROE % from entry that activates this tier
|
|
199
|
-
# lock_hw_pct = required; % of current high-water ROE to lock (0–100)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
- { trigger_pct: 50, lock_hw_pct: 80, retrace: 1.0, breaches: 1 }
|
|
201
|
+
# trigger_pct = ROE % from entry that activates this tier (strictly increasing list)
|
|
202
|
+
# lock_hw_pct = required; % of current high-water ROE to lock (0–100)
|
|
203
|
+
- { trigger_pct: 10, lock_hw_pct: 50 }
|
|
204
|
+
- { trigger_pct: 20, lock_hw_pct: 70 }
|
|
205
|
+
|
|
206
|
+
Legacy keys removed: phase2_trigger_tier; phase2.retrace_threshold / consecutive_breaches_required;
|
|
207
|
+
tier breaches / retrace; phase1-nested time cuts (use preset hard_timeout / weak_peak_cut / dead_weight_cut).
|
|
206
208
|
|
|
207
209
|
──────────────────────────────────────────────────────────────────────────────
|
|
208
210
|
State and events
|
|
209
|
-
Per-position state
|
|
210
|
-
|
|
211
|
-
|
|
211
|
+
Per-position state under stateDir; on-disk version must match the runtime.
|
|
212
|
+
Close reasons include exchange_sl_hit, hard_timeout, weak_peak_cut, dead_weight_cut, dsl_breach, etc.
|
|
213
|
+
Close reason is preserved on pendingClose retry. DSL bus events: dsl.created, dsl.tier_advanced,
|
|
214
|
+
dsl.sl_updated, dsl.phase_changed, dsl.closed, dsl.deleted, and hook position.closed /
|
|
215
|
+
position.increased / position.decreased.
|
|
212
216
|
|
|
213
217
|
──────────────────────────────────────────────────────────────────────────────
|
|
214
218
|
Commands
|
|
@@ -266,17 +270,18 @@ actions[]
|
|
|
266
270
|
exit
|
|
267
271
|
engine string No dsl
|
|
268
272
|
interval_seconds number No Default 30; integer 5–3600 (Zod + DSL parse)
|
|
269
|
-
|
|
270
|
-
|
|
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)
|
|
271
276
|
dsl object No Legacy alias for dsl_presets
|
|
272
277
|
sm_flip any No Non-DSL exit hook data (allowed; ignored by DSL parse)
|
|
273
278
|
|
|
274
|
-
Preset:
|
|
275
|
-
|
|
276
|
-
(
|
|
277
|
-
|
|
278
|
-
cannot both be false. Each tier
|
|
279
|
-
|
|
279
|
+
Preset: max_loss_pct (or phase1.max_loss_pct), phase1 (optional enabled;
|
|
280
|
+
max_loss_pct, retrace_threshold ROE %, consecutive_breaches_required),
|
|
281
|
+
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.
|
|
283
|
+
phase1.enabled and phase2.enabled cannot both be false. Each tier row:
|
|
284
|
+
lock_hw_pct [0,100]. Unknown keys under exit / presets / phase1 / phase2 / tiers throw
|
|
280
285
|
DslConfigValidationError (UNKNOWN_DSL_CONFIG_KEY) at load. DSL parse also
|
|
281
286
|
enforces strictly increasing trigger_pct per tier list, bounds on
|
|
282
287
|
interval/max_loss/trigger/lock_hw, and integer breach counts; see dsl-reference
|
|
@@ -317,18 +322,14 @@ actions:
|
|
|
317
322
|
exit:
|
|
318
323
|
engine: dsl
|
|
319
324
|
interval_seconds: 60
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
retrace_threshold: 1.5
|
|
329
|
-
consecutive_breaches_required: 1
|
|
330
|
-
tiers:
|
|
331
|
-
- { trigger_pct: 1, lock_hw_pct: 50, breaches: 1 }
|
|
325
|
+
dsl_preset:
|
|
326
|
+
phase1:
|
|
327
|
+
consecutive_breaches_required: 3
|
|
328
|
+
max_loss_pct: 5.0
|
|
329
|
+
retrace_threshold: 10
|
|
330
|
+
phase2:
|
|
331
|
+
tiers:
|
|
332
|
+
- { trigger_pct: 1, lock_hw_pct: 50 }
|
|
332
333
|
`.trim();
|
|
333
334
|
/**
|
|
334
335
|
* Register `senpi guide [subcommand]` on the senpi Commander subprogram.
|
|
@@ -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;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwErB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCpB,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;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwErB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCpB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEnB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCpB,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"}
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
* Centralized constants for the DSL feature.
|
|
3
3
|
*/
|
|
4
4
|
export declare const COMPONENT_TYPE_EXIT_DSL: "exit/dsl";
|
|
5
|
-
/** DSL subscribes to the same hook event names as the rest of the runtime. */
|
|
5
|
+
/** DSL subscribes to the same hook event names as the rest of the runtime, plus size-change events. */
|
|
6
6
|
export declare const EVENTS: {
|
|
7
7
|
readonly POSITION_OPENED: "on_position_opened";
|
|
8
8
|
readonly POSITION_CLOSED: "on_position_closed";
|
|
9
9
|
readonly POSITION_FLIPPED: "on_position_flipped";
|
|
10
|
+
readonly POSITION_INCREASED: "position.increased";
|
|
11
|
+
readonly POSITION_DECREASED: "position.decreased";
|
|
10
12
|
};
|
|
11
13
|
export declare const DSL_EVENTS: {
|
|
12
14
|
readonly CREATED: "dsl.created";
|
|
@@ -16,23 +18,25 @@ export declare const DSL_EVENTS: {
|
|
|
16
18
|
readonly CLOSED: "dsl.closed";
|
|
17
19
|
readonly CLOSE_PENDING: "dsl.close_pending";
|
|
18
20
|
readonly SETTINGS_UPDATED: "dsl.settings_updated";
|
|
21
|
+
readonly DELETED: "dsl.deleted";
|
|
19
22
|
};
|
|
20
23
|
export declare const DEFAULT_STATE_DIR = ".dsl-state";
|
|
21
|
-
|
|
24
|
+
/** On-disk DSL state schema version (v1 = DSL engine v2; no migration from older files). */
|
|
25
|
+
export declare const DSL_STATE_VERSION = 1;
|
|
22
26
|
/** Close reasons for DSL state (closeReason) and position.closed (reason). */
|
|
23
27
|
export declare const CLOSE_REASON: {
|
|
24
28
|
readonly MANUAL_CLOSE: "manual_close";
|
|
25
29
|
readonly CLOSED_EXTERNALLY: "closed_externally";
|
|
26
|
-
readonly
|
|
30
|
+
readonly EXCHANGE_SL_HIT: "exchange_sl_hit";
|
|
27
31
|
readonly DSL_BREACH: "dsl_breach";
|
|
28
32
|
readonly FLIPPED: "flipped";
|
|
29
33
|
readonly CLOSE_POSITION_FAILED: "close_position_failed";
|
|
30
|
-
|
|
31
|
-
readonly PHASE1_TIMEOUT: "phase1_timeout";
|
|
32
|
-
/** Phase 1 weak peak cut (peak ROE below minValue and current < peak). */
|
|
34
|
+
readonly HARD_TIMEOUT: "hard_timeout";
|
|
33
35
|
readonly WEAK_PEAK_CUT: "weak_peak_cut";
|
|
34
|
-
/** Phase 1 dead weight cut (never gone positive after interval). */
|
|
35
36
|
readonly DEAD_WEIGHT_CUT: "dead_weight_cut";
|
|
37
|
+
readonly POSITION_INCREASED: "position_increased";
|
|
38
|
+
readonly POSITION_DECREASED: "position_decreased";
|
|
39
|
+
readonly DSL_DELETED: "dsl_deleted";
|
|
36
40
|
};
|
|
37
41
|
export type CloseReason = (typeof CLOSE_REASON)[keyof typeof CLOSE_REASON];
|
|
38
42
|
export declare const MIN_INTERVAL_SECONDS = 5;
|
|
@@ -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,
|
|
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"}
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { HOOK_EVENT } from "../../types/hooks.js";
|
|
5
5
|
export const COMPONENT_TYPE_EXIT_DSL = "exit/dsl";
|
|
6
|
-
/** DSL subscribes to the same hook event names as the rest of the runtime. */
|
|
6
|
+
/** DSL subscribes to the same hook event names as the rest of the runtime, plus size-change events. */
|
|
7
7
|
export const EVENTS = {
|
|
8
8
|
POSITION_OPENED: HOOK_EVENT.ON_POSITION_OPENED,
|
|
9
9
|
POSITION_CLOSED: HOOK_EVENT.ON_POSITION_CLOSED,
|
|
10
10
|
POSITION_FLIPPED: HOOK_EVENT.ON_POSITION_FLIPPED,
|
|
11
|
+
POSITION_INCREASED: "position.increased",
|
|
12
|
+
POSITION_DECREASED: "position.decreased",
|
|
11
13
|
};
|
|
12
14
|
export const DSL_EVENTS = {
|
|
13
15
|
CREATED: "dsl.created",
|
|
@@ -17,23 +19,25 @@ export const DSL_EVENTS = {
|
|
|
17
19
|
CLOSED: "dsl.closed",
|
|
18
20
|
CLOSE_PENDING: "dsl.close_pending",
|
|
19
21
|
SETTINGS_UPDATED: "dsl.settings_updated",
|
|
22
|
+
DELETED: "dsl.deleted",
|
|
20
23
|
};
|
|
21
24
|
export const DEFAULT_STATE_DIR = ".dsl-state";
|
|
22
|
-
|
|
25
|
+
/** On-disk DSL state schema version (v1 = DSL engine v2; no migration from older files). */
|
|
26
|
+
export const DSL_STATE_VERSION = 1;
|
|
23
27
|
/** Close reasons for DSL state (closeReason) and position.closed (reason). */
|
|
24
28
|
export const CLOSE_REASON = {
|
|
25
29
|
MANUAL_CLOSE: "manual_close",
|
|
26
30
|
CLOSED_EXTERNALLY: "closed_externally",
|
|
27
|
-
|
|
31
|
+
EXCHANGE_SL_HIT: "exchange_sl_hit",
|
|
28
32
|
DSL_BREACH: "dsl_breach",
|
|
29
33
|
FLIPPED: "flipped",
|
|
30
34
|
CLOSE_POSITION_FAILED: "close_position_failed",
|
|
31
|
-
|
|
32
|
-
PHASE1_TIMEOUT: "phase1_timeout",
|
|
33
|
-
/** Phase 1 weak peak cut (peak ROE below minValue and current < peak). */
|
|
35
|
+
HARD_TIMEOUT: "hard_timeout",
|
|
34
36
|
WEAK_PEAK_CUT: "weak_peak_cut",
|
|
35
|
-
/** Phase 1 dead weight cut (never gone positive after interval). */
|
|
36
37
|
DEAD_WEIGHT_CUT: "dead_weight_cut",
|
|
38
|
+
POSITION_INCREASED: "position_increased",
|
|
39
|
+
POSITION_DECREASED: "position_decreased",
|
|
40
|
+
DSL_DELETED: "dsl_deleted",
|
|
37
41
|
};
|
|
38
42
|
export const MIN_INTERVAL_SECONDS = 5;
|
|
39
43
|
/** Upper bound for `exit.interval_seconds` (validation spec). */
|
|
@@ -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,
|
|
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"}
|
|
@@ -6,6 +6,8 @@ export interface ExitBlockConfig {
|
|
|
6
6
|
engine?: string;
|
|
7
7
|
interval_seconds?: number;
|
|
8
8
|
preset?: string;
|
|
9
|
+
/** Single preset; normalized to dsl_presets.dsl before parse (mutually exclusive with non-empty dsl_presets). */
|
|
10
|
+
dsl_preset?: RawPreset;
|
|
9
11
|
dsl_presets?: Record<string, RawPreset>;
|
|
10
12
|
}
|
|
11
13
|
//# 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,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,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"}
|
|
@@ -9,9 +9,6 @@ export declare function readPhase1(presetName: string, phase1: RawPhase1 | undef
|
|
|
9
9
|
phase1Enabled: boolean;
|
|
10
10
|
};
|
|
11
11
|
export declare function readPhase2Scalars(presetName: string, phase2: RawPhase2 | undefined, requireTiersArray: boolean): {
|
|
12
|
-
phase2Retrace: number;
|
|
13
|
-
phase2Breaches: number;
|
|
14
12
|
phase2Enabled: boolean;
|
|
15
13
|
};
|
|
16
|
-
export declare function readPhase2TriggerTier(presetName: string, raw: number | undefined, tiersLength: number): number;
|
|
17
14
|
//# sourceMappingURL=parse-phase.d.ts.map
|
|
@@ -1 +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,
|
|
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,CA8DlG;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,iBAAiB,EAAE,OAAO,GACzB;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CA2B5B"}
|
|
@@ -50,56 +50,23 @@ export function readPhase2Scalars(presetName, phase2, requireTiersArray) {
|
|
|
50
50
|
throw new Error(`preset "${presetName}": phase2 is required`);
|
|
51
51
|
}
|
|
52
52
|
const phase2Enabled = phase2.enabled !== false;
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
const legacyKeys = [
|
|
54
|
+
"retrace_threshold",
|
|
55
|
+
"retraceThreshold",
|
|
56
|
+
"retrace_from_hw",
|
|
57
|
+
"consecutive_breaches_required",
|
|
58
|
+
"consecutiveBreachesRequired",
|
|
59
|
+
];
|
|
60
|
+
for (const k of legacyKeys) {
|
|
61
|
+
if (phase2[k] != null) {
|
|
60
62
|
throw new DslConfigValidationError([
|
|
61
|
-
dslValidationIssue("
|
|
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}`),
|
|
62
64
|
]);
|
|
63
65
|
}
|
|
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
66
|
}
|
|
77
|
-
|
|
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)) {
|
|
67
|
+
if (requireTiersArray && (!Array.isArray(phase2.tiers) || phase2.tiers.length === 0)) {
|
|
85
68
|
throw new Error(`preset "${presetName}": phase2.tiers must be a non-empty array`);
|
|
86
69
|
}
|
|
87
|
-
return {
|
|
88
|
-
}
|
|
89
|
-
export function readPhase2TriggerTier(presetName, raw, tiersLength) {
|
|
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
|
-
if (tiersLength < 1) {
|
|
96
|
-
throw new Error(`preset "${presetName}": cannot validate phase2_trigger_tier without tiers`);
|
|
97
|
-
}
|
|
98
|
-
if (raw >= tiersLength) {
|
|
99
|
-
throw new DslConfigValidationError([
|
|
100
|
-
dslValidationIssue("INVALID_PHASE2_TRIGGER_TIER", `phase2_trigger_tier must be less than the number of tiers (${tiersLength})`, `dsl_presets.${presetName}.phase2_trigger_tier`),
|
|
101
|
-
]);
|
|
102
|
-
}
|
|
103
|
-
return raw;
|
|
70
|
+
return { phase2Enabled };
|
|
104
71
|
}
|
|
105
72
|
//# sourceMappingURL=parse-phase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-phase.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-phase.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,MAAM,UAAU,UAAU,CACxB,UAAkB,EAClB,MAA6B,EAC7B,gBAAoC;IAEpC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,WAAW,UAAU,2FAA2F,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;IAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,gBAAgB,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YAC1C,MAAM,IAAI,wBAAwB,CAAC;gBACjC,kBAAkB,CAChB,sBAAsB,EACtB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;oBACf,CAAC,CAAC,uDAAuD;oBACzD,CAAC,CAAC,6BAA6B,EACjC,eAAe,UAAU,sBAAsB,CAChD;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,UAAU;YACV,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;YACjB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,gBAAgB,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,wBAAwB,CAAC;YACjC,kBAAkB,CAChB,sBAAsB,EACtB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;gBACf,CAAC,CAAC,8EAA8E;gBAChF,CAAC,CAAC,oCAAoC,EACxC,eAAe,UAAU,sBAAsB,CAChD;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,gBAAgB,GAAG,MAAM,
|
|
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;
|
|
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"}
|
|
@@ -5,13 +5,33 @@ import { MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS, DEFAULT_INTERVAL_MS, } from
|
|
|
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
|
+
}
|
|
8
27
|
export function parseDslPluginConfig(raw) {
|
|
9
|
-
|
|
10
|
-
|
|
28
|
+
const normalized = normalizeExitBlockConfig(raw);
|
|
29
|
+
validateExitBlockConfigUnknownKeys(normalized);
|
|
30
|
+
const intervalSeconds = normalized.interval_seconds ?? 30;
|
|
11
31
|
validateIntervalSeconds(intervalSeconds, MIN_INTERVAL_SECONDS, MAX_INTERVAL_SECONDS);
|
|
12
32
|
const intervalMs = intervalSeconds * 1000;
|
|
13
33
|
const minIntervalMinutes = intervalMs / 60_000;
|
|
14
|
-
const presetsRaw =
|
|
34
|
+
const presetsRaw = normalized.dsl_presets ?? {};
|
|
15
35
|
const presets = {};
|
|
16
36
|
for (const [name, p] of Object.entries(presetsRaw)) {
|
|
17
37
|
if (p && typeof p === "object")
|
|
@@ -21,7 +41,11 @@ export function parseDslPluginConfig(raw) {
|
|
|
21
41
|
if (presetKeys.length === 0) {
|
|
22
42
|
throw new Error("At least one dsl_presets entry is required");
|
|
23
43
|
}
|
|
24
|
-
|
|
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];
|
|
25
49
|
if (!presets[preset]) {
|
|
26
50
|
throw new Error(`Preset "${preset}" not found in dsl_presets`);
|
|
27
51
|
}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"parse-plugin-config.js","sourceRoot":"","sources":["../../../src/dsl/config/parse-plugin-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AAKhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA2ChD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,SAAS,EACd,kBAAkB,GAAE,MAAU,GAC7B,eAAe,CAqCjB"}
|