@senpi/trading-recipe 1.0.50 → 1.0.52

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;AAwUH,kFAAkF;AAClF,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,IAAI,CA2CN"}
1
+ {"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyVH,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"}
@@ -104,6 +104,23 @@ oi_tracker
104
104
  Config fields:
105
105
  minDayVolume number 1e6 Min 24h volume; instruments below are skipped
106
106
  maxHistory number 60 Max OI snapshots retained per instrument
107
+
108
+ ──────────────────────────────────────────────────────────────────────────────
109
+
110
+ strategy_monitor
111
+ Wallet position monitor: compares clearing-house snapshots and emits lifecycle deltas.
112
+ Use with action POSITION_TRACKER to feed the DSL exit engine.
113
+ Typical interval: 10s–60s
114
+
115
+ Type aliases (same scanner): strategy-monitor, position_tracker, position-tracker
116
+
117
+ Scanner signal types (signalType per result — not YAML action_type values):
118
+ POSITION_OPENED, POSITION_CLOSED, POSITION_INCREASED,
119
+ POSITION_DECREASED, POSITION_FLIPPED
120
+ Use action_type: POSITION_TRACKER with scanners: […] to handle these for DSL/hooks.
121
+
122
+ Config fields:
123
+ sizeChangeEpsilon number 1e-9 Treat abs(size diff) below this as unchanged (float noise)
107
124
  `.trim();
108
125
  const ACTIONS_TEXT = `
109
126
  Action types
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DnB,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"}
1
+ {"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"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"}
package/dist/debug.js CHANGED
@@ -1,39 +1,591 @@
1
- // Example: Run DSL config validation via the real parser
2
- import { parseDslPluginConfig, DslConfigValidationError } from "./dsl/config/index.js";
3
- const config = {
4
- interval_seconds: 30,
5
- dsl_preset: {
6
- phase1: {
7
- enabled: true,
8
- max_loss_pct: 2.0,
9
- retrace_threshold: 7,
10
- consecutive_breaches_required: 3
11
- },
12
- phase2: {
13
- // enabled: true,
14
- tiers: [
15
- { trigger_pct: 5, lock_hw_pct: 40 },
16
- { trigger_pct: 12, lock_hw_pct: 55 },
17
- { trigger_pct: 15, lock_hw_pct: 75 },
18
- { trigger_pct: 20, lock_hw_pct: 85 }
19
- ]
20
- }
21
- }
22
- };
23
- try {
24
- const parsed = parseDslPluginConfig(config);
25
- console.log("Validation result: OK");
26
- console.log("Parsed DSL config:", parsed);
27
- }
28
- catch (e) {
29
- if (e instanceof DslConfigValidationError) {
30
- console.error("Validation failed:");
31
- for (const issue of e.issues) {
32
- console.error(` [${issue.code}] ${issue.message} at ${issue.path}`);
33
- }
34
- }
35
- else {
36
- console.error(e);
37
- }
38
- }
1
+ // /**
2
+ // * DSL-only tick simulation — does NOT start Runtime, OpenClaw, scanners, actions, or the price monitor.
3
+ // * It runs the same pure engine the plugin uses: preset from `exitBlock` below → synthetic `position.opened`
4
+ // * payloads → `buildInitialState` + repeated `dslTick(price, time)` over `DSL_DEBUG_PRICES` (or a scaled default path).
5
+ // *
6
+ // * Run: `npm run debug` or `npm run debug:dsl`
7
+ // *
8
+ // * How it lines up with production:
9
+ // * - Full runtime would bus.emit `position.opened` then the DSL plugin polls prices and calls `dslTick` each interval.
10
+ // * - One-shot mode: hand-feed prices from DSL_DEBUG_PRICES (or a short default path).
11
+ // * - Continuous mode: see DSL_DEBUG_CONTINUOUS below (live MCP prices or repeating synth path).
12
+ // *
13
+ // * Steps in this script:
14
+ // * 1. Read DSL_POSITION_WALLET + DSL_POSITION_ASSETS (or DSL_POSITION_COIN).
15
+ // * 2. Optional clearing-house fetch: getClearingHouseState + openPositionsFromClearingHouseState (or offline SZI/entry env).
16
+ // * 3. Match interest tickers to open rows via normalizeDslCoinDex; build PositionOpenedEvent per match.
17
+ // * 4. Run dslTick demo per event (filter with DSL_DEBUG_INTEREST).
18
+ // *
19
+ // * Edit `exitBlock` to mirror your skills YAML `exit` / `dsl_preset` (or keep this minimal preset for quick checks).
20
+ // *
21
+ // * Required:
22
+ // * DSL_POSITION_WALLET
23
+ // * DSL_POSITION_ASSETS (e.g. BTC,SOL,xyz:CL) or DSL_POSITION_COIN
24
+ // * SENPI_API_KEY (for clearing house)
25
+ // *
26
+ // * Optional:
27
+ // * DSL_POSITION_ADDRESS (defaults to wallet)
28
+ // * DSL_POSITION_DEX — applied when normalizing plain tickers from the interest list (e.g. all on xyz)
29
+ // * DSL_POSITION_LEVERAGE overrides clearing leverage on emitted events when set
30
+ // * DSL_PRESET, DSL_STATE_DIR (logged only)
31
+ // * DSL_DEBUG_PRICES comma-separated absolute prices for the tick path
32
+ // * DSL_DEBUG_INTEREST when multiple matches, raw substring to pick one interest label for tick demo only
33
+ // *
34
+ // * Continuous (no full Runtime; still DSL-only):
35
+ // * DSL_DEBUG_CONTINUOUS=live — poll market_get_prices on interval (needs SENPI_API_KEY + connect); same idea as the
36
+ // * DSL price monitor. Stops when all demo positions hit dslTick close or on SIGINT/SIGTERM.
37
+ // * DSL_DEBUG_CONTINUOUS=synth|loop — repeat the synthetic price path forever (offline OK); pause between ticks
38
+ // * DSL_DEBUG_SYNTH_TICK_MS (default 1000), pause between cycles DSL_DEBUG_LOOP_PAUSE_MS (default uses preset interval).
39
+ // * DSL_DEBUG_INTERVAL_MS — override poll interval for live mode (ms, min 500); default exitBlock interval_seconds.
40
+ // *
41
+ // * Offline / CI: single interest + DSL_POSITION_SZI + DSL_POSITION_ENTRY_PX (no API). Use DSL_DEBUG_CONTINUOUS=synth
42
+ // * for a non-ending synth loop.
43
+ // */
44
+ export {};
45
+ // import "dotenv/config";
46
+ // import { parseDslPluginConfig, DslConfigValidationError } from "./dsl/config/index.js";
47
+ // import { dslTick } from "./dsl/engine/index.js";
48
+ // import { buildInitialState, phase1FloorFromPreset } from "./dsl/events/initial-state.js";
49
+ // import { marketPriceForAsset } from "./dsl/monitor/market-price.js";
50
+ // import {
51
+ // SenpiClient,
52
+ // } from "./senpi/client.js";
53
+ // import type { OpenPosition } from "./senpi/types.js";
54
+ // import { normalizeDslCoinDex } from "./utils/perp-coin.js";
55
+ // import type { DslPluginConfig, DslState, PositionOpenedEvent } from "./types/dsl/index.js";
56
+ // /** Exit block passed to parseDslPluginConfig — drives phase1/phase2 for dslTick only. */
57
+ // const exitBlock = {
58
+ // interval_seconds: 30,
59
+ // dsl_preset: {
60
+ // phase1: {
61
+ // enabled: true,
62
+ // max_loss_pct: 5,
63
+ // retrace_threshold: 7,
64
+ // consecutive_breaches_required: 3,
65
+ // },
66
+ // phase2: {
67
+ // enabled: true,
68
+ // tiers: [
69
+ // { trigger_pct: 5, lock_hw_pct: 40 },
70
+ // { trigger_pct: 12, lock_hw_pct: 55 },
71
+ // { trigger_pct: 15, lock_hw_pct: 75 },
72
+ // { trigger_pct: 20, lock_hw_pct: 85 },
73
+ // ],
74
+ // },
75
+ // },
76
+ // };
77
+ // /** Relative price path for a notional entry of 100 (scaled to real entry when DSL_DEBUG_PRICES unset). */
78
+ // const DEFAULT_TICKS: Array<{ price: number; now: string }> = [
79
+ // { price: 100, now: "2025-01-15T12:00:00.000Z" },
80
+ // { price: 105, now: "2025-01-15T12:01:00.000Z" },
81
+ // { price: 110, now: "2025-01-15T12:02:00.000Z" },
82
+ // { price: 103, now: "2025-01-15T12:03:00.000Z" },
83
+ // { price: 100, now: "2025-01-15T12:04:00.000Z" },
84
+ // ];
85
+ // function parseAssetsFromEnv(): string[] {
86
+ // const multi = process.env.DSL_POSITION_ASSETS?.trim();
87
+ // if (multi) {
88
+ // return multi
89
+ // .split(/[,;\s]+/)
90
+ // .map((s) => s.trim())
91
+ // .filter((s) => s.length > 0);
92
+ // }
93
+ // const single = process.env.DSL_POSITION_COIN?.trim();
94
+ // return single ? [single] : [];
95
+ // }
96
+ // /** Dedupe interest list by normalized (coin, dex) bucket. */
97
+ // function dedupeInterestSlots(raw: string[], globalDex: string): Array<{ coin: string; dex: string; label: string }> {
98
+ // const seen = new Set<string>();
99
+ // const out: Array<{ coin: string; dex: string; label: string }> = [];
100
+ // for (const label of raw) {
101
+ // const n = normalizeDslCoinDex(label, globalDex);
102
+ // const key = `${n.coin.toUpperCase()}|${n.dex}`;
103
+ // if (seen.has(key)) continue;
104
+ // seen.add(key);
105
+ // out.push({ coin: n.coin, dex: n.dex, label });
106
+ // }
107
+ // return out;
108
+ // }
109
+ // function slotKey(coin: string, dex: string): string {
110
+ // const n = normalizeDslCoinDex(coin, dex);
111
+ // return `${n.coin.toUpperCase()}|${n.dex}`;
112
+ // }
113
+ // function sleep(ms: number): Promise<void> {
114
+ // return new Promise((resolve) => setTimeout(resolve, ms));
115
+ // }
116
+ // /** off | live (MCP prices) | synth (repeat DSL_DEBUG_PRICES / default path) */
117
+ // function parseContinuousMode(): "off" | "live" | "synth" {
118
+ // const v = process.env.DSL_DEBUG_CONTINUOUS?.trim().toLowerCase();
119
+ // if (!v || v === "0" || v === "false" || v === "off") return "off";
120
+ // if (v === "synth" || v === "loop") return "synth";
121
+ // if (v === "1" || v === "true" || v === "live") return "live";
122
+ // console.warn(`[debug] Unknown DSL_DEBUG_CONTINUOUS="${process.env.DSL_DEBUG_CONTINUOUS}"; treating as live`);
123
+ // return "live";
124
+ // }
125
+ // function parsePositiveIntEnv(name: string, defaultMs: number): number {
126
+ // const raw = process.env[name]?.trim();
127
+ // if (raw == null || raw === "") return defaultMs;
128
+ // const n = Number(raw);
129
+ // if (!Number.isFinite(n) || n < 0) return defaultMs;
130
+ // return Math.floor(n);
131
+ // }
132
+ // function resolveTickSequence(entryPx: number): Array<{ price: number; now: string }> {
133
+ // const raw = process.env.DSL_DEBUG_PRICES?.trim();
134
+ // if (raw) {
135
+ // const prices = raw
136
+ // .split(/[,;\s]+/)
137
+ // .map((s) => Number(s.trim()))
138
+ // .filter((n) => Number.isFinite(n));
139
+ // if (prices.length === 0) {
140
+ // console.warn("[debug] DSL_DEBUG_PRICES empty or invalid; scaling default profile to entry");
141
+ // } else {
142
+ // const base = Date.parse("2025-01-15T12:00:00.000Z");
143
+ // return prices.map((price, i) => ({
144
+ // price,
145
+ // now: new Date(base + i * 60_000).toISOString(),
146
+ // }));
147
+ // }
148
+ // }
149
+ // const ref = 100;
150
+ // if (!Number.isFinite(entryPx) || entryPx <= 0) return DEFAULT_TICKS;
151
+ // return DEFAULT_TICKS.map((t) => ({
152
+ // price: (entryPx * t.price) / ref,
153
+ // now: t.now,
154
+ // }));
155
+ // }
156
+ // /** Shape the same event DSL handlers expect; dex/coin match on-disk state keys. */
157
+ // function positionOpenedFromOpenRow(
158
+ // pluginConfig: DslPluginConfig,
159
+ // address: string,
160
+ // wallet: string,
161
+ // row: OpenPosition
162
+ // ): PositionOpenedEvent | null {
163
+ // if (row.szi == null || row.entryPx == null) return null;
164
+ // const leverageStr = process.env.DSL_POSITION_LEVERAGE?.trim();
165
+ // let leverage: number;
166
+ // if (leverageStr && Number.isFinite(Number(leverageStr))) {
167
+ // leverage = Number(leverageStr);
168
+ // } else if (row.leverage != null && Number.isFinite(row.leverage)) {
169
+ // leverage = row.leverage;
170
+ // } else {
171
+ // leverage = 1;
172
+ // }
173
+ // const presetName = process.env.DSL_PRESET?.trim() || pluginConfig.preset;
174
+ // const { coin, dex } = normalizeDslCoinDex(row.coin, row.dex ?? "");
175
+ // return {
176
+ // address,
177
+ // wallet,
178
+ // dex,
179
+ // preset: presetName,
180
+ // coin,
181
+ // szi: String(row.szi),
182
+ // entryPx: String(row.entryPx),
183
+ // leverage,
184
+ // };
185
+ // }
186
+ // /**
187
+ // * Match interest list to clearing-house opens (one MCP read). Warns on interest with no position.
188
+ // */
189
+ // function matchInterestToOpens(
190
+ // interest: Array<{ coin: string; dex: string; label: string }>,
191
+ // opens: OpenPosition[]
192
+ // ): { matched: Array<{ slot: (typeof interest)[0]; row: OpenPosition }>; unusedOpens: OpenPosition[] } {
193
+ // const openByKey = new Map<string, OpenPosition[]>();
194
+ // for (const row of opens) {
195
+ // const k = slotKey(row.coin, row.dex ?? "");
196
+ // const list = openByKey.get(k);
197
+ // if (list) list.push(row);
198
+ // else openByKey.set(k, [row]);
199
+ // }
200
+ // const matched: Array<{ slot: (typeof interest)[0]; row: OpenPosition }> = [];
201
+ // for (const slot of interest) {
202
+ // const k = slotKey(slot.coin, slot.dex);
203
+ // const bucket = openByKey.get(k);
204
+ // const row = bucket?.shift();
205
+ // if (!row) {
206
+ // console.warn(
207
+ // `[debug] No open position for interest "${slot.label}" (${slot.coin}, dex="${slot.dex || ""}")`
208
+ // );
209
+ // continue;
210
+ // }
211
+ // matched.push({ slot, row });
212
+ // }
213
+ // const matchedSet = new Set(matched.map((m) => m.row));
214
+ // const unusedOpens = opens.filter((o) => !matchedSet.has(o));
215
+ // return { matched, unusedOpens };
216
+ // }
217
+ // async function buildOpenedEventsFromClearing(
218
+ // pluginConfig: DslPluginConfig,
219
+ // address: string,
220
+ // wallet: string,
221
+ // interest: Array<{ coin: string; dex: string; label: string }>,
222
+ // senpi: SenpiClient
223
+ // ): Promise<PositionOpenedEvent[]> {
224
+ // const state = await senpi.getClearingHouseState(wallet);
225
+ // if (state == null) {
226
+ // console.error("[debug] Clearing house state null; no open positions.");
227
+ // process.exit(1);
228
+ // }
229
+ // if (!clearingHouseStateLooksParsable(state)) {
230
+ // console.error(
231
+ // "[debug] Clearing house response shape not recognized (expected main/xyz assetPositions or a positions array). Keys:",
232
+ // Object.keys(state)
233
+ // );
234
+ // process.exit(1);
235
+ // }
236
+ // const opens = openPositionsFromClearingHouseState(state);
237
+ // const { matched, unusedOpens } = matchInterestToOpens(interest, opens);
238
+ // if (unusedOpens.length > 0 && interest.length <= 3) {
239
+ // console.log(
240
+ // "[debug] Other open positions (not in interest list):",
241
+ // unusedOpens.map((o) => ({
242
+ // coin: o.coin,
243
+ // dex: o.dex ?? "",
244
+ // szi: o.szi,
245
+ // entryPx: o.entryPx,
246
+ // }))
247
+ // );
248
+ // } else if (unusedOpens.length > 0) {
249
+ // console.log(`[debug] ${unusedOpens.length} open position(s) not listed in DSL_POSITION_ASSETS (omit detail)`);
250
+ // }
251
+ // const events: PositionOpenedEvent[] = [];
252
+ // for (const { row } of matched) {
253
+ // const ev = positionOpenedFromOpenRow(pluginConfig, address, wallet, row);
254
+ // if (ev) events.push(ev);
255
+ // }
256
+ // if (events.length === 0) {
257
+ // console.error(
258
+ // "[debug] No position.opened payloads: nothing in clearing house matched DSL_POSITION_ASSETS."
259
+ // );
260
+ // process.exit(1);
261
+ // }
262
+ // return events;
263
+ // }
264
+ // function manualOpenedEvent(
265
+ // pluginConfig: DslPluginConfig,
266
+ // address: string,
267
+ // wallet: string,
268
+ // slot: { coin: string; dex: string; label: string },
269
+ // szi: string,
270
+ // entryPx: string
271
+ // ): PositionOpenedEvent {
272
+ // const leverageStr = process.env.DSL_POSITION_LEVERAGE?.trim();
273
+ // const leverage =
274
+ // leverageStr && Number.isFinite(Number(leverageStr)) ? Number(leverageStr) : 1;
275
+ // const presetName = process.env.DSL_PRESET?.trim() || pluginConfig.preset;
276
+ // return {
277
+ // address,
278
+ // wallet,
279
+ // dex: slot.dex,
280
+ // preset: presetName,
281
+ // coin: slot.coin,
282
+ // szi,
283
+ // entryPx,
284
+ // leverage,
285
+ // };
286
+ // }
287
+ // async function resolveOpenedEvents(
288
+ // pluginConfig: DslPluginConfig
289
+ // ): Promise<{ events: PositionOpenedEvent[]; senpi: SenpiClient | null }> {
290
+ // const wallet = process.env.DSL_POSITION_WALLET?.trim();
291
+ // const globalDex = process.env.DSL_POSITION_DEX?.trim() ?? "";
292
+ // const rawList = parseAssetsFromEnv();
293
+ // const interest = dedupeInterestSlots(rawList, globalDex);
294
+ // if (!wallet || interest.length === 0) {
295
+ // console.error("[debug] Set DSL_POSITION_WALLET and DSL_POSITION_ASSETS (or DSL_POSITION_COIN).");
296
+ // process.exit(1);
297
+ // }
298
+ // const address = process.env.DSL_POSITION_ADDRESS?.trim() || wallet;
299
+ // const sziEnv = process.env.DSL_POSITION_SZI?.trim();
300
+ // const entryPxEnv = process.env.DSL_POSITION_ENTRY_PX?.trim();
301
+ // const hasManual =
302
+ // sziEnv != null && sziEnv !== "" && entryPxEnv != null && entryPxEnv !== "";
303
+ // if (interest.length > 1 && hasManual) {
304
+ // console.error(
305
+ // "[debug] DSL_POSITION_SZI / DSL_POSITION_ENTRY_PX only allowed with a single interest ticker."
306
+ // );
307
+ // process.exit(1);
308
+ // }
309
+ // if (hasManual) {
310
+ // return {
311
+ // events: [manualOpenedEvent(pluginConfig, address, wallet, interest[0]!, sziEnv, entryPxEnv)],
312
+ // senpi: null,
313
+ // };
314
+ // }
315
+ // const apiKey = process.env.SENPI_API_KEY?.trim();
316
+ // if (!apiKey) {
317
+ // console.error(
318
+ // "[debug] Set SENPI_API_KEY to load positions from clearing house, or use DSL_POSITION_SZI + DSL_POSITION_ENTRY_PX (single ticker)."
319
+ // );
320
+ // process.exit(1);
321
+ // }
322
+ // const senpi = new SenpiClient({ apiKey });
323
+ // await senpi.connect();
324
+ // const events = await buildOpenedEventsFromClearing(pluginConfig, address, wallet, interest, senpi);
325
+ // return { events, senpi };
326
+ // }
327
+ // function canonicalLabel(e: PositionOpenedEvent): string {
328
+ // return e.dex === "xyz" ? `xyz:${e.coin}` : e.coin;
329
+ // }
330
+ // function pickEventsForTickDemo(events: PositionOpenedEvent[]): PositionOpenedEvent[] {
331
+ // const filter = process.env.DSL_DEBUG_INTEREST?.trim();
332
+ // if (!filter || events.length <= 1) return events;
333
+ // const hit = events.filter(
334
+ // (e) =>
335
+ // e.coin.includes(filter) ||
336
+ // `${e.coin}|${e.dex}`.includes(filter) ||
337
+ // canonicalLabel(e).includes(filter)
338
+ // );
339
+ // if (hit.length === 0) {
340
+ // console.warn(`[debug] DSL_DEBUG_INTEREST="${filter}" matched nothing; running all ${events.length} event(s).`);
341
+ // return events;
342
+ // }
343
+ // if (hit.length === 1) return hit;
344
+ // console.warn(`[debug] DSL_DEBUG_INTEREST="${filter}" matched multiple; using first match.`);
345
+ // return [hit[0]!];
346
+ // }
347
+ // function logTick(i: number, price: number, result: ReturnType<typeof dslTick>): void {
348
+ // const s = result.state;
349
+ // console.log(
350
+ // [
351
+ // `[${i}] price=${price}`,
352
+ // `action=${result.action}`,
353
+ // `phase=${s.phase}`,
354
+ // `tierIndex=${s.currentTierIndex ?? "null"}`,
355
+ // `floor=${s.floorPrice}`,
356
+ // `hw=${s.highWaterPrice}`,
357
+ // `roe%=${s.currentROE.toFixed(4)}`,
358
+ // `retrace%=${s.retracePct.toFixed(4)}`,
359
+ // result.phaseChanged ? "phaseChanged" : "",
360
+ // result.tierChanged ? "tierChanged" : "",
361
+ // result.closeReason ? `closeReason=${result.closeReason}` : "",
362
+ // ]
363
+ // .filter(Boolean)
364
+ // .join(" | ")
365
+ // );
366
+ // }
367
+ // function createDslStateFromOpened(
368
+ // opened: PositionOpenedEvent,
369
+ // preset: DslPluginConfig["presets"][string]
370
+ // ): DslState {
371
+ // const entryPrice = parseFloat(String(opened.entryPx));
372
+ // const direction = parseFloat(String(opened.szi)) > 0 ? "LONG" : "SHORT";
373
+ // const lev = opened.leverage ?? 1;
374
+ // const phase1Floor = phase1FloorFromPreset(entryPrice, direction, preset.maxLossPct, lev);
375
+ // return buildInitialState(opened, preset, phase1Floor);
376
+ // }
377
+ // async function runContinuousLiveDemo(
378
+ // pluginConfig: DslPluginConfig,
379
+ // sessions: Array<{ opened: PositionOpenedEvent; preset: DslPluginConfig["presets"][string] }>,
380
+ // senpi: SenpiClient
381
+ // ): Promise<void> {
382
+ // const intervalRaw = process.env.DSL_DEBUG_INTERVAL_MS?.trim();
383
+ // const parsedInterval =
384
+ // intervalRaw && Number.isFinite(Number(intervalRaw)) ? Number(intervalRaw) : pluginConfig.intervalMs;
385
+ // const intervalMs = Math.max(500, Math.floor(parsedInterval));
386
+ // const runners = sessions.map((s) => ({
387
+ // ...s,
388
+ // state: createDslStateFromOpened(s.opened, s.preset),
389
+ // stopped: false,
390
+ // tickIndex: 0,
391
+ // }));
392
+ // let running = true;
393
+ // const stop = (): void => {
394
+ // running = false;
395
+ // console.log("\n[debug] Continuous live: stopping (signal)…");
396
+ // };
397
+ // process.on("SIGINT", stop);
398
+ // process.on("SIGTERM", stop);
399
+ // console.log(
400
+ // `[debug] Continuous LIVE: market_get_prices every ${intervalMs}ms, ${runners.length} position(s). Ctrl+C to stop.`
401
+ // );
402
+ // while (running) {
403
+ // const ts = new Date().toISOString();
404
+ // const pricesByDex = new Map<string, Record<string, number>>();
405
+ // for (const dex of ["", "xyz"] as const) {
406
+ // try {
407
+ // const p = await senpi.getMarketPrices({ dex });
408
+ // if (p && Object.keys(p).length > 0) pricesByDex.set(dex, p);
409
+ // } catch (err) {
410
+ // console.warn(`[debug] getMarketPrices dex=${dex === "" ? "main" : dex} failed`, err);
411
+ // }
412
+ // }
413
+ // for (const r of runners) {
414
+ // if (r.stopped || !running) continue;
415
+ // const dexKey = r.opened.dex ?? "";
416
+ // const prices = pricesByDex.get(dexKey);
417
+ // const price = marketPriceForAsset(prices, r.opened.coin);
418
+ // if (price == null) {
419
+ // console.warn(
420
+ // `[debug] #${r.tickIndex} no price for ${canonicalLabel(r.opened)} (dex=${dexKey === "" ? "main" : dexKey})`
421
+ // );
422
+ // continue;
423
+ // }
424
+ // const result = dslTick(r.state, price, ts);
425
+ // logTick(r.tickIndex, price, result);
426
+ // r.tickIndex += 1;
427
+ // r.state = result.state;
428
+ // if (result.action === "close") {
429
+ // console.log(
430
+ // `[debug] dsl close ${canonicalLabel(r.opened)} closeReason=${result.closeReason ?? "(none)"}`
431
+ // );
432
+ // r.stopped = true;
433
+ // }
434
+ // }
435
+ // if (runners.every((r) => r.stopped)) {
436
+ // console.log("[debug] Continuous live: all positions closed.");
437
+ // break;
438
+ // }
439
+ // await sleep(intervalMs);
440
+ // }
441
+ // process.off("SIGINT", stop);
442
+ // process.off("SIGTERM", stop);
443
+ // }
444
+ // async function runContinuousSynthDemo(
445
+ // opened: PositionOpenedEvent,
446
+ // preset: DslPluginConfig["presets"][string],
447
+ // pluginConfig: DslPluginConfig
448
+ // ): Promise<void> {
449
+ // const tickGapMs = Math.max(0, parsePositiveIntEnv("DSL_DEBUG_SYNTH_TICK_MS", 1000));
450
+ // const pauseBetweenCyclesMs = Math.max(
451
+ // 0,
452
+ // parsePositiveIntEnv("DSL_DEBUG_LOOP_PAUSE_MS", pluginConfig.intervalMs)
453
+ // );
454
+ // const entryPrice = parseFloat(String(opened.entryPx));
455
+ // const TICKS = resolveTickSequence(entryPrice);
456
+ // let running = true;
457
+ // const stop = (): void => {
458
+ // running = false;
459
+ // console.log("\n[debug] Continuous synth: stopping (signal)…");
460
+ // };
461
+ // process.on("SIGINT", stop);
462
+ // process.on("SIGTERM", stop);
463
+ // console.log(
464
+ // `[debug] Continuous SYNTH: ${TICKS.length} step(s) per cycle, ${tickGapMs}ms between steps, ${pauseBetweenCyclesMs}ms between cycles. Ctrl+C to stop.`
465
+ // );
466
+ // console.log("[debug] dslTick synth for:", canonicalLabel(opened), {
467
+ // dex: opened.dex || "(empty)",
468
+ // entryPx: opened.entryPx,
469
+ // szi: opened.szi,
470
+ // });
471
+ // let cycle = 0;
472
+ // while (running) {
473
+ // cycle += 1;
474
+ // console.log(`--- synth cycle ${cycle} ---`);
475
+ // let state = createDslStateFromOpened(opened, preset);
476
+ // for (let i = 0; i < TICKS.length && running; i++) {
477
+ // const step = TICKS[i];
478
+ // if (!step) break;
479
+ // const { price, now } = step;
480
+ // const result = dslTick(state, price, now);
481
+ // logTick(i, price, result);
482
+ // state = result.state;
483
+ // if (result.action === "close") {
484
+ // console.log("[debug] synth cycle: closed mid-sequence; starting next cycle after pause.");
485
+ // break;
486
+ // }
487
+ // if (tickGapMs > 0) await sleep(tickGapMs);
488
+ // }
489
+ // if (!running) break;
490
+ // if (pauseBetweenCyclesMs > 0) await sleep(pauseBetweenCyclesMs);
491
+ // }
492
+ // process.off("SIGINT", stop);
493
+ // process.off("SIGTERM", stop);
494
+ // }
495
+ // function runTickDemo(
496
+ // opened: PositionOpenedEvent,
497
+ // preset: DslPluginConfig["presets"][string]
498
+ // ): void {
499
+ // let state: DslState = createDslStateFromOpened(opened, preset);
500
+ // const entryPrice = parseFloat(String(opened.entryPx));
501
+ // const direction = parseFloat(String(opened.szi)) > 0 ? "LONG" : "SHORT";
502
+ // const TICKS = resolveTickSequence(entryPrice);
503
+ // console.log("[debug] dslTick demo for:", canonicalLabel(opened), {
504
+ // dex: opened.dex || "(empty)",
505
+ // entryPx: opened.entryPx,
506
+ // szi: opened.szi,
507
+ // leverage: opened.leverage,
508
+ // direction,
509
+ // initialFloor: state.floorPrice,
510
+ // });
511
+ // console.log("--- ticks ---");
512
+ // for (let i = 0; i < TICKS.length; i++) {
513
+ // const step = TICKS[i];
514
+ // if (!step) break;
515
+ // const { price, now } = step;
516
+ // const result = dslTick(state, price, now);
517
+ // logTick(i, price, result);
518
+ // state = result.state;
519
+ // if (result.action === "close") {
520
+ // console.log("Stopped after close.");
521
+ // break;
522
+ // }
523
+ // }
524
+ // console.log("--- final snapshot ---", {
525
+ // coin: opened.coin,
526
+ // phase: state.phase,
527
+ // currentTierIndex: state.currentTierIndex,
528
+ // floorPrice: state.floorPrice,
529
+ // highWaterPrice: state.highWaterPrice,
530
+ // });
531
+ // }
532
+ // async function main(): Promise<void> {
533
+ // let senpi: SenpiClient | null = null;
534
+ // try {
535
+ // const continuous = parseContinuousMode();
536
+ // console.log(
537
+ // `[debug] DSL-only: dslTick (no full Runtime). Preset from exitBlock. Continuous=${continuous} (set DSL_DEBUG_CONTINUOUS=live|synth to poll/repeat).`
538
+ // );
539
+ // const pluginConfig = parseDslPluginConfig(exitBlock);
540
+ // const { events, senpi: client } = await resolveOpenedEvents(pluginConfig);
541
+ // senpi = client;
542
+ // const presetKey = process.env.DSL_PRESET?.trim() || pluginConfig.preset;
543
+ // const preset = pluginConfig.presets[presetKey];
544
+ // if (!preset) {
545
+ // console.error(
546
+ // `[debug] Unknown preset "${presetKey}". Keys: ${Object.keys(pluginConfig.presets).join(", ")}`
547
+ // );
548
+ // process.exit(1);
549
+ // }
550
+ // const stateDir = process.env.DSL_STATE_DIR?.trim();
551
+ // if (stateDir) {
552
+ // console.log("[debug] DSL_STATE_DIR (not written in this script):", stateDir);
553
+ // }
554
+ // console.log("[debug] Clearing → position.opened payloads (emit these to start DSL tracking):");
555
+ // for (const ev of events) {
556
+ // console.log(JSON.stringify({ event: "position.opened", payload: ev }));
557
+ // }
558
+ // const forDemo = pickEventsForTickDemo(events);
559
+ // console.log(
560
+ // "[debug] Parsed plugin config:",
561
+ // { intervalMs: pluginConfig.intervalMs, preset: pluginConfig.preset },
562
+ // forDemo.length < events.length ? `(tick demo: ${forDemo.length} of ${events.length})` : ""
563
+ // );
564
+ // for (const opened of forDemo) {
565
+ // const pk = opened.preset ?? pluginConfig.preset;
566
+ // const pr = pluginConfig.presets[pk];
567
+ // if (!pr) {
568
+ // console.error(`[debug] Unknown preset on event: ${pk}`);
569
+ // process.exit(1);
570
+ // }
571
+ // console.log("");
572
+ // runTickDemo(opened, pr);
573
+ // }
574
+ // } catch (e) {
575
+ // if (e instanceof DslConfigValidationError) {
576
+ // console.error("Validation failed:");
577
+ // for (const issue of e.issues) {
578
+ // console.error(` [${issue.code}] ${issue.message} at ${issue.path}`);
579
+ // }
580
+ // } else {
581
+ // console.error(e);
582
+ // }
583
+ // process.exitCode = 1;
584
+ // } finally {
585
+ // if (senpi) {
586
+ // await senpi.disconnect().catch(() => {});
587
+ // }
588
+ // }
589
+ // }
590
+ // void main();
39
591
  //# sourceMappingURL=debug.js.map
package/dist/debug.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,MAAM,MAAM,GAAG;IACb,gBAAgB,EAAE,EAAE;IACpB,UAAU,EAAE;QACV,MAAM,EAAE;YACN,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,GAAG;YACjB,iBAAiB,EAAE,CAAC;YACpB,6BAA6B,EAAE,CAAC;SACjC;QACD,MAAM,EAAE;YACR,mBAAmB;YACjB,KAAK,EAAE;gBACL,EAAE,WAAW,EAAE,CAAC,EAAG,WAAW,EAAE,EAAE,EAAE;gBACpC,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;gBACpC,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;gBACpC,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;aACrC;SACF;KACF;CACF,CAAC;AAEF,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,YAAY,wBAAwB,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scanner-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/scanner-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAc/D,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAIrD,gEAAgE;AAChE,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAE7D;AAED,oFAAoF;AACpF,iBAAS,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAErD;AAED;;;;GAIG;AACH,iBAAS,aAAa,CACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,OAAO,EACzB,SAAS,CAAC,EAAE,KAAK,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC,GACD,cAAc,CAqBhB;AAoFD,eAAO,MAAM,eAAe;;;;CAI3B,CAAC"}
1
+ {"version":3,"file":"scanner-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/scanner-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAc/D,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAIrD,gEAAgE;AAChE,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAE7D;AAED,oFAAoF;AACpF,iBAAS,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAErD;AAED;;;;GAIG;AACH,iBAAS,aAAa,CACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,OAAO,EACzB,SAAS,CAAC,EAAE,KAAK,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC,GACD,cAAc,CAqBhB;AAuFD,eAAO,MAAM,eAAe;;;;CAI3B,CAAC"}
@@ -106,6 +106,9 @@ register("sm-flip", smFlipScanner);
106
106
  register("opportunity", opportunityScanner);
107
107
  register("strategy_monitor", strategyMonitorScanner);
108
108
  register("strategy-monitor", strategyMonitorScanner);
109
+ /** Aliases documented for POSITION_TRACKER recipes — same implementation as strategy_monitor. */
110
+ register("position_tracker", strategyMonitorScanner);
111
+ register("position-tracker", strategyMonitorScanner);
109
112
  export const ScannerRegistry = {
110
113
  register,
111
114
  get,
@@ -1 +1 @@
1
- {"version":3,"file":"scanner-registry.js","sourceRoot":"","sources":["../../src/runtime/scanner-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner-registry.js","sourceRoot":"","sources":["../../src/runtime/scanner-registry.ts"],"names":[],"mappings":"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"}
@@ -11,9 +11,9 @@ description: >
11
11
  strategies:
12
12
  ref:
13
13
  wallet: "${WALLET_ADDRESS}"
14
- budget: 500
14
+ budget: 100
15
15
  slots: 2
16
- margin_per_slot: 200
16
+ margin_per_slot: 50
17
17
  trading_risk: conservative
18
18
  enabled: true
19
19
 
@@ -2,7 +2,7 @@
2
2
  "id": "trading-recipe",
3
3
  "name": "Senpi Trading Recipe",
4
4
  "description": "Senpi trading recipe plugin for OpenClaw",
5
- "version": "1.0.50",
5
+ "version": "1.0.52",
6
6
  "configSchema": {
7
7
  "type": "object",
8
8
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@senpi/trading-recipe",
3
- "version": "1.0.50",
3
+ "version": "1.0.52",
4
4
  "description": "Trading recipe plugin for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",