@senpi/trading-recipe 1.0.69 → 1.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/cli/senpi-commands.d.ts.map +1 -1
  2. package/dist/cli/senpi-commands.js +135 -0
  3. package/dist/cli/senpi-commands.js.map +1 -1
  4. package/dist/dsl/plugin/index.d.ts +22 -0
  5. package/dist/dsl/plugin/index.d.ts.map +1 -1
  6. package/dist/dsl/plugin/index.js +189 -58
  7. package/dist/dsl/plugin/index.js.map +1 -1
  8. package/dist/health/index.d.ts +22 -2
  9. package/dist/health/index.d.ts.map +1 -1
  10. package/dist/health/index.js +186 -4
  11. package/dist/health/index.js.map +1 -1
  12. package/dist/health/types.d.ts +114 -0
  13. package/dist/health/types.d.ts.map +1 -0
  14. package/dist/health/types.js +2 -0
  15. package/dist/health/types.js.map +1 -0
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +147 -3
  19. package/dist/index.js.map +1 -1
  20. package/dist/runtime/run.d.ts +3 -0
  21. package/dist/runtime/run.d.ts.map +1 -1
  22. package/dist/runtime/run.js +6 -0
  23. package/dist/runtime/run.js.map +1 -1
  24. package/dist/runtime/runtime.d.ts +5 -0
  25. package/dist/runtime/runtime.d.ts.map +1 -1
  26. package/dist/runtime/runtime.js +59 -2
  27. package/dist/runtime/runtime.js.map +1 -1
  28. package/dist/scanners/engine/engine.d.ts +7 -0
  29. package/dist/scanners/engine/engine.d.ts.map +1 -1
  30. package/dist/scanners/engine/engine.js +20 -5
  31. package/dist/scanners/engine/engine.js.map +1 -1
  32. package/dist/scanners/engine/strategy-registry.d.ts +3 -0
  33. package/dist/scanners/engine/strategy-registry.d.ts.map +1 -1
  34. package/dist/scanners/engine/strategy-registry.js +10 -0
  35. package/dist/scanners/engine/strategy-registry.js.map +1 -1
  36. package/dist/scanners/runtime-module.d.ts +5 -0
  37. package/dist/scanners/runtime-module.d.ts.map +1 -1
  38. package/dist/scanners/runtime-module.js +247 -2
  39. package/dist/scanners/runtime-module.js.map +1 -1
  40. package/openclaw.plugin.json +1 -1
  41. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-module.d.ts","sourceRoot":"","sources":["../../src/scanners/runtime-module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-module.d.ts","sourceRoot":"","sources":["../../src/scanners/runtime-module.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import { createLogger } from "../utils/logger.js";
3
- import { ScannerEngine } from "./engine/engine.js";
3
+ import { ScannerEngine, } from "./engine/engine.js";
4
4
  import { buildScannerComposition } from "../runtime/scanner-composition.js";
5
5
  const logger = createLogger("[senpi-core][scanner-module]");
6
6
  import { emitTerminalScannerRunEvent, } from "./events.js";
@@ -18,17 +18,22 @@ export function createScannerRuntimeModule(options) {
18
18
  }
19
19
  class DefaultScannerRuntimeModule {
20
20
  signalStore;
21
+ runtimeStore;
21
22
  engine;
22
23
  events = new EventEmitter();
24
+ now;
25
+ telemetry = new Map();
23
26
  constructor(options) {
24
27
  const now = options.now ?? Date.now;
28
+ this.now = now;
25
29
  this.signalStore = new SignalStore(options.stateDir);
30
+ this.runtimeStore = new RuntimeStore(options.stateDir, now);
26
31
  this.engine = new ScannerEngine({
27
32
  now,
28
33
  logger: options.logger ?? logger,
29
34
  providers: options.providers,
30
35
  stores: {
31
- runtimeStore: new RuntimeStore(options.stateDir, now),
36
+ runtimeStore: this.runtimeStore,
32
37
  signalStore: this.signalStore,
33
38
  sharedArtifactStore: new SharedArtifactStore(options.stateDir, now),
34
39
  },
@@ -44,6 +49,7 @@ class DefaultScannerRuntimeModule {
44
49
  },
45
50
  }, options.composition);
46
51
  registerAll(options.strategies, options.scanners, this.engine);
52
+ this.wireTelemetryListeners();
47
53
  }
48
54
  async start() {
49
55
  logger.info("scanner module start() entered");
@@ -80,12 +86,217 @@ class DefaultScannerRuntimeModule {
80
86
  async querySignals(filter) {
81
87
  return this.signalStore.readSignals(filter);
82
88
  }
89
+ async getHealthStatus() {
90
+ const registrations = this.engine.describeRegistrations();
91
+ const scannerStates = this.buildScannerHealthRows(registrations);
92
+ const enabled = registrations.filter((registration) => registration.enabled);
93
+ const counts = countScannerHealthRows(scannerStates);
94
+ const componentHealth = deriveWorstHealth(scannerStates
95
+ .filter((scanner) => scanner.enabled)
96
+ .map((scanner) => scanner.health), registrations.length);
97
+ return {
98
+ component: "scanners",
99
+ health: componentHealth,
100
+ updatedAt: new Date(this.now()).toISOString(),
101
+ summary: buildScannerSummary(componentHealth, registrations.length, enabled.length, counts.degraded, counts.unhealthy),
102
+ totals: {
103
+ registered: registrations.length,
104
+ enabled: enabled.length,
105
+ inFlight: counts.inFlight,
106
+ degraded: counts.degraded,
107
+ unhealthy: counts.unhealthy,
108
+ },
109
+ scanners: scannerStates.map(({ enabled: _enabled, inFlight: _inFlight, ...scanner }) => scanner),
110
+ };
111
+ }
112
+ async getSystemState() {
113
+ const registrations = this.engine.describeRegistrations();
114
+ const scanners = await Promise.all(registrations.map(async (registration) => {
115
+ const telemetry = this.ensureTelemetry(registration.address, registration.scannerId);
116
+ const runtime = await this.runtimeStore.read(registration.address, registration.scannerId);
117
+ const health = this.deriveScannerHealth(registration, telemetry);
118
+ return {
119
+ address: registration.address,
120
+ scannerId: registration.scannerId,
121
+ health,
122
+ enabled: registration.enabled,
123
+ initialized: registration.initialized,
124
+ intervalSeconds: registration.intervalSeconds,
125
+ inFlight: registration.inFlight || telemetry.inFlight,
126
+ lastRunStartedAt: telemetry.lastRunStartedAt,
127
+ lastRunFinishedAt: telemetry.lastRunFinishedAt,
128
+ lastRunStatus: telemetry.lastRunStatus,
129
+ lastRunReason: telemetry.lastRunReason,
130
+ lastError: telemetry.lastError,
131
+ lastErrorAt: telemetry.lastErrorAt,
132
+ nextRunAt: registration.nextRunAt,
133
+ runCount: telemetry.runCount,
134
+ errorCount: telemetry.errorCount,
135
+ consecutiveErrorCount: telemetry.consecutiveErrorCount,
136
+ configVersion: runtime?.configVersion ?? null,
137
+ runtimeUpdatedAt: runtime?.updatedAt ?? null,
138
+ config: runtime?.config ?? null,
139
+ state: runtime?.state ?? null,
140
+ };
141
+ }));
142
+ return {
143
+ component: "scanners",
144
+ health: deriveWorstHealth(scanners.map((scanner) => scanner.health), registrations.length),
145
+ updatedAt: new Date(this.now()).toISOString(),
146
+ state: {
147
+ totalRegistered: registrations.length,
148
+ totalEnabled: registrations.filter((registration) => registration.enabled).length,
149
+ scanners,
150
+ },
151
+ };
152
+ }
83
153
  on(eventName, listener) {
84
154
  this.events.on(eventName, listener);
85
155
  }
86
156
  off(eventName, listener) {
87
157
  this.events.off(eventName, listener);
88
158
  }
159
+ ensureTelemetry(address, scannerId) {
160
+ const key = telemetryKey(address, scannerId);
161
+ let telemetry = this.telemetry.get(key);
162
+ if (!telemetry) {
163
+ telemetry = {
164
+ inFlight: false,
165
+ lastRunStartedAt: null,
166
+ lastRunFinishedAt: null,
167
+ lastRunStatus: null,
168
+ lastRunReason: null,
169
+ lastError: null,
170
+ lastErrorAt: null,
171
+ runCount: 0,
172
+ errorCount: 0,
173
+ consecutiveErrorCount: 0,
174
+ };
175
+ this.telemetry.set(key, telemetry);
176
+ }
177
+ return telemetry;
178
+ }
179
+ wireTelemetryListeners() {
180
+ this.events.on("scanner:run:start", (event) => {
181
+ this.recordRunStart(event);
182
+ });
183
+ this.events.on("scanner:run:complete", (event) => {
184
+ this.recordRunComplete(event);
185
+ });
186
+ this.events.on("scanner:run:skip", (event) => {
187
+ this.recordRunSkip(event);
188
+ });
189
+ this.events.on("scanner:run:error", (event) => {
190
+ this.recordRunError(event);
191
+ });
192
+ }
193
+ recordRunStart(event) {
194
+ const telemetry = this.ensureTelemetry(event.address, event.scannerId);
195
+ telemetry.inFlight = true;
196
+ telemetry.lastRunStartedAt = event.timestamp;
197
+ }
198
+ recordRunComplete(event) {
199
+ const telemetry = this.ensureTelemetry(event.address, event.scannerId);
200
+ telemetry.inFlight = false;
201
+ telemetry.lastRunFinishedAt = this.now();
202
+ telemetry.lastRunStatus = event.result.status;
203
+ telemetry.lastRunReason = event.result.reason ?? null;
204
+ telemetry.runCount += 1;
205
+ telemetry.consecutiveErrorCount = 0;
206
+ }
207
+ recordRunSkip(event) {
208
+ const telemetry = this.ensureTelemetry(event.address, event.scannerId);
209
+ telemetry.inFlight = false;
210
+ // HALTED = overlap guard: no scan was attempted, so preserve existing error
211
+ // state. Only genuine completions (ok/heartbeat) should reset error counters.
212
+ if (event.status === "halted") {
213
+ return;
214
+ }
215
+ telemetry.lastRunFinishedAt = this.now();
216
+ telemetry.lastRunStatus = event.status;
217
+ telemetry.lastRunReason = event.reason;
218
+ telemetry.runCount += 1;
219
+ telemetry.consecutiveErrorCount = 0;
220
+ }
221
+ recordRunError(event) {
222
+ const telemetry = this.ensureTelemetry(event.address, event.scannerId);
223
+ telemetry.inFlight = false;
224
+ telemetry.lastRunFinishedAt = this.now();
225
+ telemetry.lastRunStatus = "error";
226
+ telemetry.lastRunReason = String(event.error);
227
+ telemetry.lastError = String(event.error);
228
+ telemetry.lastErrorAt = event.timestamp;
229
+ telemetry.runCount += 1;
230
+ telemetry.errorCount += 1;
231
+ telemetry.consecutiveErrorCount += 1;
232
+ }
233
+ buildScannerHealthRows(registrations) {
234
+ return registrations.map((registration) => {
235
+ const telemetry = this.ensureTelemetry(registration.address, registration.scannerId);
236
+ return {
237
+ address: registration.address,
238
+ scannerId: registration.scannerId,
239
+ enabled: registration.enabled,
240
+ inFlight: registration.inFlight || telemetry.inFlight,
241
+ health: this.deriveScannerHealth(registration, telemetry),
242
+ };
243
+ });
244
+ }
245
+ deriveScannerHealth(registration, telemetry) {
246
+ const intervalMs = Math.max(registration.intervalSeconds, 1) * 1000;
247
+ if (!registration.enabled) {
248
+ return "disabled";
249
+ }
250
+ if (telemetry.inFlight) {
251
+ if (telemetry.lastRunStartedAt == null) {
252
+ return "unknown";
253
+ }
254
+ const runningMs = this.now() - telemetry.lastRunStartedAt;
255
+ if (runningMs > intervalMs * 4) {
256
+ return "unhealthy";
257
+ }
258
+ if (runningMs > intervalMs * 2) {
259
+ return "degraded";
260
+ }
261
+ return "healthy";
262
+ }
263
+ const now = this.now();
264
+ const baseline = registration.nextRunAt ??
265
+ (telemetry.lastRunStartedAt != null
266
+ ? telemetry.lastRunStartedAt + intervalMs
267
+ : telemetry.lastRunFinishedAt);
268
+ if (baseline == null) {
269
+ return "unknown";
270
+ }
271
+ const overdueMs = now - baseline;
272
+ if (telemetry.lastRunStatus === "error" && telemetry.consecutiveErrorCount >= 2) {
273
+ return "unhealthy";
274
+ }
275
+ if (overdueMs > intervalMs * 4) {
276
+ return "unhealthy";
277
+ }
278
+ if (telemetry.lastRunStatus === "error" || overdueMs > intervalMs * 2) {
279
+ return "degraded";
280
+ }
281
+ return "healthy";
282
+ }
283
+ }
284
+ function countScannerHealthRows(rows) {
285
+ let inFlight = 0;
286
+ let degraded = 0;
287
+ let unhealthy = 0;
288
+ for (const row of rows) {
289
+ if (row.inFlight) {
290
+ inFlight += 1;
291
+ }
292
+ if (row.health === "degraded") {
293
+ degraded += 1;
294
+ }
295
+ if (row.health === "unhealthy") {
296
+ unhealthy += 1;
297
+ }
298
+ }
299
+ return { inFlight, degraded, unhealthy };
89
300
  }
90
301
  /**
91
302
  * Builds a scanner composition from scanner factories.
@@ -117,4 +328,38 @@ function registerAll(strategies, scanners, engine) {
117
328
  }
118
329
  }
119
330
  }
331
+ function telemetryKey(address, scannerId) {
332
+ return `${address}::${scannerId}`;
333
+ }
334
+ function deriveWorstHealth(healths, totalRegistrations) {
335
+ if (totalRegistrations === 0) {
336
+ return "disabled";
337
+ }
338
+ const active = healths.filter((health) => health !== "disabled");
339
+ if (active.length === 0) {
340
+ return "disabled";
341
+ }
342
+ if (active.includes("unhealthy")) {
343
+ return "unhealthy";
344
+ }
345
+ if (active.includes("degraded")) {
346
+ return "degraded";
347
+ }
348
+ if (active.includes("unknown")) {
349
+ return "unknown";
350
+ }
351
+ return "healthy";
352
+ }
353
+ function buildScannerSummary(health, total, enabled, degraded, unhealthy) {
354
+ if (total === 0) {
355
+ return "No scanners registered.";
356
+ }
357
+ if (enabled === 0) {
358
+ return "All scanners are disabled.";
359
+ }
360
+ if (health === "healthy") {
361
+ return `${enabled}/${total} scanners enabled and healthy.`;
362
+ }
363
+ return `${enabled}/${total} scanners enabled (${degraded} degraded, ${unhealthy} unhealthy).`;
364
+ }
120
365
  //# sourceMappingURL=runtime-module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-module.js","sourceRoot":"","sources":["../../src/scanners/runtime-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAmC,MAAM,oBAAoB,CAAC;AAEpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAG5E,MAAM,MAAM,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AAC5D,OAAO,EACL,2BAA2B,GAG5B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EACL,oBAAoB,GAErB,MAAM,6BAA6B,CAAC;AAkFrC;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAoC;IAEpC,OAAO,IAAI,2BAA2B,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,2BAA2B;IACd,WAAW,CAAc;IACzB,MAAM,CAAgB;IACtB,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAE7C,YAAY,OAAoC;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC9B,GAAG;YACH,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE;gBACN,YAAY,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;gBACrD,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,mBAAmB,EAAE,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACpE;YACD,SAAS,EAAE;gBACT,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;oBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;gBAC/C,CAAC;gBACD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE;oBACtB,2BAA2B,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;wBAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;oBACrC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACb,CAAC;aACF;SACF,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAExB,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,SAAoB;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,SAAoB;QAClD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAgB;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,SAAoB;QACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,SAAoB;QACxD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,SAAoB;QAEpB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,SAAoB,EACpB,MAAe;QAEf,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,OAAe,EACf,SAAoB;QAEpB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,EAAE,CACA,SAAe,EACf,QAAuD;QAEvD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,QAAoC,CAAC,CAAC;IAClE,CAAC;IAED,GAAG,CACD,SAAe,EACf,QAAuD;QAEvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,QAAoC,CAAC,CAAC;IACnE,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAwB;IAExB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,uBAAuB,CACzC;QACE,IAAI,EAAE,wBAAwB;QAC9B,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,EAAE;KACW,EACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAClC,CAAC;IACF,OAAO;QACL,WAAW;QACX,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,0GAA0G;AAC1G,SAAS,WAAW,CAClB,UAAkC,EAClC,QAAwB,EACxB,MAAqB;IAErB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,KAAK,MAAM,cAAc,IAAI,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"runtime-module.js","sourceRoot":"","sources":["../../src/scanners/runtime-module.ts"],"names":[],"mappings":"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"}
@@ -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.69",
5
+ "version": "1.0.70",
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.69",
3
+ "version": "1.0.70",
4
4
  "description": "Trading recipe plugin for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",