@senpi/trading-recipe 1.0.68 → 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 (57) 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/events/handlers.d.ts +2 -2
  5. package/dist/dsl/events/handlers.d.ts.map +1 -1
  6. package/dist/dsl/events/handlers.js +35 -27
  7. package/dist/dsl/events/handlers.js.map +1 -1
  8. package/dist/dsl/notifications/formatter.d.ts.map +1 -1
  9. package/dist/dsl/notifications/formatter.js +20 -1
  10. package/dist/dsl/notifications/formatter.js.map +1 -1
  11. package/dist/dsl/notifications/index.d.ts +5 -0
  12. package/dist/dsl/notifications/index.d.ts.map +1 -1
  13. package/dist/dsl/notifications/index.js +11 -7
  14. package/dist/dsl/notifications/index.js.map +1 -1
  15. package/dist/dsl/plugin/index.d.ts +23 -1
  16. package/dist/dsl/plugin/index.d.ts.map +1 -1
  17. package/dist/dsl/plugin/index.js +191 -59
  18. package/dist/dsl/plugin/index.js.map +1 -1
  19. package/dist/dsl/plugin/options.d.ts +2 -0
  20. package/dist/dsl/plugin/options.d.ts.map +1 -1
  21. package/dist/health/index.d.ts +22 -2
  22. package/dist/health/index.d.ts.map +1 -1
  23. package/dist/health/index.js +186 -4
  24. package/dist/health/index.js.map +1 -1
  25. package/dist/health/types.d.ts +114 -0
  26. package/dist/health/types.d.ts.map +1 -0
  27. package/dist/health/types.js +2 -0
  28. package/dist/health/types.js.map +1 -0
  29. package/dist/index.d.ts +2 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +148 -3
  32. package/dist/index.js.map +1 -1
  33. package/dist/runtime/run.d.ts +5 -0
  34. package/dist/runtime/run.d.ts.map +1 -1
  35. package/dist/runtime/run.js +9 -0
  36. package/dist/runtime/run.js.map +1 -1
  37. package/dist/runtime/runtime.d.ts +12 -0
  38. package/dist/runtime/runtime.d.ts.map +1 -1
  39. package/dist/runtime/runtime.js +80 -2
  40. package/dist/runtime/runtime.js.map +1 -1
  41. package/dist/scanners/engine/engine.d.ts +7 -0
  42. package/dist/scanners/engine/engine.d.ts.map +1 -1
  43. package/dist/scanners/engine/engine.js +20 -5
  44. package/dist/scanners/engine/engine.js.map +1 -1
  45. package/dist/scanners/engine/strategy-registry.d.ts +3 -0
  46. package/dist/scanners/engine/strategy-registry.d.ts.map +1 -1
  47. package/dist/scanners/engine/strategy-registry.js +10 -0
  48. package/dist/scanners/engine/strategy-registry.js.map +1 -1
  49. package/dist/scanners/runtime-module.d.ts +5 -0
  50. package/dist/scanners/runtime-module.d.ts.map +1 -1
  51. package/dist/scanners/runtime-module.js +247 -2
  52. package/dist/scanners/runtime-module.js.map +1 -1
  53. package/dist/types/dsl/index.d.ts +9 -0
  54. package/dist/types/dsl/index.d.ts.map +1 -1
  55. package/examples/strategies/dsl-showcase.yaml +4 -6
  56. package/openclaw.plugin.json +1 -1
  57. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * DslPlugin: lifecycle, event wiring, price monitor (DSL feature of senpi core).
3
3
  */
4
+ import type { DslComponentHealthStatus, DslSystemState } from "../../health/types.js";
4
5
  import type { DslArchivedClose, DslPositionSummary, DslState } from "../../types/dsl/index.js";
5
6
  import type { DslPluginOptions } from "./options.js";
6
7
  export type { DslPluginOptions } from "./options.js";
@@ -15,11 +16,25 @@ export declare class DslPlugin {
15
16
  private priceMonitorHandle;
16
17
  private priceMonitorStopped;
17
18
  private notificationSubscriber;
19
+ private monitorRunning;
20
+ private tickInFlight;
21
+ private lastTickStartedAt;
22
+ private lastTickFinishedAt;
23
+ private lastTickError;
24
+ private nextTickAt;
25
+ private tickAttemptCount;
26
+ private tickSuccessCount;
27
+ private tickErrorCount;
18
28
  private constructor();
29
+ private static resolveStateManager;
30
+ private static resolveSenpiClient;
31
+ private static resolveStrategyStates;
32
+ private static wirePositionEventHandlers;
33
+ private static wrapEventHandler;
19
34
  private static dslStateToPositionSummary;
20
35
  private static dslStateToArchivedClose;
21
36
  static create(options: DslPluginOptions): Promise<DslPlugin>;
22
- /** Cancel exchange SLs, archive all DSL state for the strategy, and rename the strategy directory. */
37
+ /** Cancel exchange SLs and archive all DSL state for the strategy (live files removed; strategy dir kept). */
23
38
  deleteDslsForStrategy(address: string): Promise<void>;
24
39
  /** Active DSL positions for this recipe state dir (no recipeId). */
25
40
  listActivePositions(): DslPositionSummary[];
@@ -38,6 +53,13 @@ export declare class DslPlugin {
38
53
  address?: string;
39
54
  limit?: number;
40
55
  }): Promise<DslArchivedClose[]>;
56
+ getHealthStatus(): Promise<DslComponentHealthStatus>;
57
+ getSystemState(): Promise<DslSystemState>;
41
58
  stop(): void;
59
+ private listActiveStates;
60
+ private startMonitorLoop;
61
+ private finishMonitorTick;
62
+ private deriveHealth;
63
+ private buildHealthSummary;
42
64
  }
43
65
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dsl/plugin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EACV,gBAAgB,EAEhB,kBAAkB,EAClB,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAQlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAoBrD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqC;IAC/E,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,sBAAsB,CAA0C;IAExE,OAAO;IAoBP,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAoBxC,OAAO,CAAC,MAAM,CAAC,uBAAuB;WAoBzB,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAyFlE,sGAAsG;IACtG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,oEAAoE;IACpE,mBAAmB,IAAI,kBAAkB,EAAE;IAU3C,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAItE;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,GAAG,SAAS;IAIpF;;OAEG;IACG,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAmDrG,IAAI,IAAI,IAAI;CAgBb"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dsl/plugin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAEV,wBAAwB,EACxB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EACV,gBAAgB,EAEhB,kBAAkB,EAClB,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAQlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAoBrD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqC;IAC/E,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,sBAAsB,CAA0C;IACxE,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO;IAoBP,OAAO,CAAC,MAAM,CAAC,mBAAmB;mBAOb,kBAAkB;mBAkBlB,qBAAqB;IAmB1C,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAWxC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAS/B,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAoBxC,OAAO,CAAC,MAAM,CAAC,uBAAuB;WAoBzB,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAwClE,8GAA8G;IAC9G,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,oEAAoE;IACpE,mBAAmB,IAAI,kBAAkB,EAAE;IAU3C,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAItE;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,GAAG,SAAS;IAIpF;;OAEG;IACG,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAmD/F,eAAe,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAapD,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC;IA4B/C,IAAI,IAAI,IAAI;IAoBZ,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,kBAAkB;CAe3B"}
@@ -41,6 +41,15 @@ export class DslPlugin {
41
41
  priceMonitorHandle = null;
42
42
  priceMonitorStopped = false;
43
43
  notificationSubscriber = null;
44
+ monitorRunning = false;
45
+ tickInFlight = false;
46
+ lastTickStartedAt = null;
47
+ lastTickFinishedAt = null;
48
+ lastTickError = null;
49
+ nextTickAt = null;
50
+ tickAttemptCount = 0;
51
+ tickSuccessCount = 0;
52
+ tickErrorCount = 0;
44
53
  constructor(config, bus, stateManager, senpiClient, ownSenpiClient, baseDir, deleteDslsForStrategyImpl, notificationSubscriber) {
45
54
  this.config = config;
46
55
  this.bus = bus;
@@ -51,6 +60,46 @@ export class DslPlugin {
51
60
  this.deleteDslsForStrategyImpl = deleteDslsForStrategyImpl;
52
61
  this.notificationSubscriber = notificationSubscriber;
53
62
  }
63
+ static resolveStateManager(providedStateManager, baseDir) {
64
+ return providedStateManager ?? new StateManager(baseDir);
65
+ }
66
+ static async resolveSenpiClient(providedClient) {
67
+ if (providedClient) {
68
+ return {
69
+ senpiClient: providedClient,
70
+ ownSenpiClient: false,
71
+ };
72
+ }
73
+ const senpiClient = new SenpiClient({ apiKey: process.env.SENPI_API_KEY ?? "" });
74
+ await senpiClient.connect();
75
+ return {
76
+ senpiClient,
77
+ ownSenpiClient: true,
78
+ };
79
+ }
80
+ static async resolveStrategyStates(stateManager, senpiClient, strategyStates) {
81
+ if (strategyStates) {
82
+ return strategyStates;
83
+ }
84
+ const addresses = await stateManager.listStrategyIds();
85
+ const placeholderConfigs = new Map(addresses.map((addr) => [
86
+ addr,
87
+ { address: addr, budget: 0, slots: 99, tradingRisk: "moderate" },
88
+ ]));
89
+ return createStrategyStatesMap(placeholderConfigs, stateManager, senpiClient);
90
+ }
91
+ static wirePositionEventHandlers(bus, handlers) {
92
+ bus.on(EVENTS.POSITION_OPENED, DslPlugin.wrapEventHandler(handlers.handlePositionOpened, "position.opened"));
93
+ bus.on(EVENTS.POSITION_CLOSED, DslPlugin.wrapEventHandler(handlers.handlePositionClosed, "position.closed"));
94
+ bus.on(EVENTS.POSITION_FLIPPED, DslPlugin.wrapEventHandler(handlers.handlePositionFlipped, "position.flipped"));
95
+ bus.on(EVENTS.POSITION_INCREASED, DslPlugin.wrapEventHandler(handlers.handlePositionIncreased, "on_position_increased"));
96
+ bus.on(EVENTS.POSITION_DECREASED, DslPlugin.wrapEventHandler(handlers.handlePositionDecreased, "on_position_decreased"));
97
+ }
98
+ static wrapEventHandler(handler, eventName) {
99
+ return (payload) => {
100
+ handler(payload).catch((err) => logger.warn(`[dsl] ${eventName} handler error`, { err }));
101
+ };
102
+ }
54
103
  static dslStateToPositionSummary(s) {
55
104
  return {
56
105
  address: s.address,
@@ -92,77 +141,25 @@ export class DslPlugin {
92
141
  static async create(options) {
93
142
  const config = parseDslPluginConfig(options.config);
94
143
  const baseDir = options.stateDir ?? process.env.DSL_STATE_DIR ?? DEFAULT_STATE_DIR;
95
- let stateManager;
96
- if (options.stateManager) {
97
- stateManager = options.stateManager;
98
- }
99
- else {
100
- stateManager = new StateManager(baseDir);
101
- }
102
- let senpiClient = options.senpiClient;
103
- let ownSenpiClient = false;
104
- if (!senpiClient) {
105
- senpiClient = new SenpiClient({ apiKey: process.env.SENPI_API_KEY ?? "" });
106
- await senpiClient.connect();
107
- ownSenpiClient = true;
108
- }
109
- let strategyStates = options.strategyStates;
110
- if (!strategyStates) {
111
- const addresses = await stateManager.listStrategyIds();
112
- const placeholderConfigs = new Map(addresses.map((addr) => [
113
- addr,
114
- { address: addr, budget: 0, slots: 99, tradingRisk: "moderate" },
115
- ]));
116
- strategyStates = createStrategyStatesMap(placeholderConfigs, stateManager, senpiClient);
117
- }
144
+ const stateManager = DslPlugin.resolveStateManager(options.stateManager, baseDir);
145
+ const { senpiClient, ownSenpiClient } = await DslPlugin.resolveSenpiClient(options.senpiClient);
146
+ const strategyStates = await DslPlugin.resolveStrategyStates(stateManager, senpiClient, options.strategyStates);
118
147
  const handlers = createEventHandlers(config, stateManager, strategyStates, options.bus, baseDir);
119
- const wrap = (fn, eventName) => (p) => {
120
- logger.info(`[dsl] event received: ${eventName}`, {
121
- hasPayload: p != null,
122
- payloadType: typeof p,
123
- });
124
- fn(p).catch((err) => logger.warn(`[dsl] ${eventName} handler error`, { err }));
125
- };
126
- options.bus.on(EVENTS.POSITION_OPENED, wrap(handlers.handlePositionOpened, "position.opened"));
127
- options.bus.on(EVENTS.POSITION_CLOSED, wrap(handlers.handlePositionClosed, "position.closed"));
128
- options.bus.on(EVENTS.POSITION_FLIPPED, wrap(handlers.handlePositionFlipped, "position.flipped"));
129
- options.bus.on(EVENTS.POSITION_INCREASED, wrap(handlers.handlePositionIncreased, "on_position_increased"));
130
- options.bus.on(EVENTS.POSITION_DECREASED, wrap(handlers.handlePositionDecreased, "on_position_decreased"));
148
+ DslPlugin.wirePositionEventHandlers(options.bus, handlers);
131
149
  const notificationSubscriber = options.notifications != null
132
150
  ? createDslNotificationSubscriber(options.bus, options.notifications, {
133
151
  notifySlUpdates: options.notifySlUpdates ?? false,
152
+ strategyName: options.strategyName,
134
153
  })
135
154
  : null;
136
155
  const plugin = new DslPlugin(config, options.bus, stateManager, senpiClient, ownSenpiClient, baseDir, handlers.deleteDslsForStrategy, notificationSubscriber);
137
- const monitor = createPriceMonitor({
138
- stateManager,
139
- senpiClient,
140
- bus: options.bus,
141
- baseDir,
142
- strategyStates,
143
- });
144
- function scheduleNextTick() {
145
- if (plugin.priceMonitorStopped)
146
- return;
147
- const tickStart = Date.now();
148
- monitor
149
- .tick()
150
- .catch((e) => logger.warn("price tick error", e))
151
- .finally(() => {
152
- if (plugin.priceMonitorStopped)
153
- return;
154
- const elapsed = Date.now() - tickStart;
155
- const delay = Math.max(0, config.intervalMs - elapsed);
156
- plugin.priceMonitorHandle = setTimeout(scheduleNextTick, delay);
157
- });
158
- }
159
- scheduleNextTick();
156
+ plugin.startMonitorLoop(strategyStates);
160
157
  registeredShutdownPlugin = plugin;
161
158
  hookDslPluginProcessSignals();
162
159
  logger.info("DSL plugin started", { intervalMs: config.intervalMs, preset: config.preset });
163
160
  return plugin;
164
161
  }
165
- /** Cancel exchange SLs, archive all DSL state for the strategy, and rename the strategy directory. */
162
+ /** Cancel exchange SLs and archive all DSL state for the strategy (live files removed; strategy dir kept). */
166
163
  deleteDslsForStrategy(address) {
167
164
  return this.deleteDslsForStrategyImpl(address);
168
165
  }
@@ -244,10 +241,52 @@ export class DslPlugin {
244
241
  }
245
242
  return closes;
246
243
  }
244
+ async getHealthStatus() {
245
+ const activePositions = this.listActivePositions();
246
+ const health = this.deriveHealth();
247
+ return {
248
+ component: "dsl",
249
+ health,
250
+ updatedAt: new Date(Date.now()).toISOString(),
251
+ summary: this.buildHealthSummary(health, activePositions.length),
252
+ enabled: true,
253
+ activePositions: activePositions.length,
254
+ };
255
+ }
256
+ async getSystemState() {
257
+ const activePositions = this.listActivePositions();
258
+ const positions = this.listActiveStates();
259
+ return {
260
+ component: "dsl",
261
+ health: this.deriveHealth(),
262
+ updatedAt: new Date(Date.now()).toISOString(),
263
+ state: {
264
+ enabled: true,
265
+ intervalMs: this.config.intervalMs,
266
+ preset: this.config.preset,
267
+ monitor: {
268
+ running: this.monitorRunning && !this.priceMonitorStopped,
269
+ inFlight: this.tickInFlight,
270
+ lastTickStartedAt: this.lastTickStartedAt,
271
+ lastTickFinishedAt: this.lastTickFinishedAt,
272
+ lastTickError: this.lastTickError,
273
+ nextTickAt: this.nextTickAt,
274
+ tickAttemptCount: this.tickAttemptCount,
275
+ tickSuccessCount: this.tickSuccessCount,
276
+ tickErrorCount: this.tickErrorCount,
277
+ },
278
+ activePositions,
279
+ positions,
280
+ },
281
+ };
282
+ }
247
283
  stop() {
248
284
  this.notificationSubscriber?.dispose();
249
285
  this.notificationSubscriber = null;
250
286
  this.priceMonitorStopped = true;
287
+ this.monitorRunning = false;
288
+ this.tickInFlight = false;
289
+ this.nextTickAt = null;
251
290
  if (this.priceMonitorHandle) {
252
291
  clearTimeout(this.priceMonitorHandle);
253
292
  this.priceMonitorHandle = null;
@@ -260,5 +299,98 @@ export class DslPlugin {
260
299
  }
261
300
  logger.info("DSL plugin stopped");
262
301
  }
302
+ listActiveStates() {
303
+ const states = [];
304
+ for (const address of this.stateManager.listStrategyIdsWithDslSync()) {
305
+ states.push(...this.stateManager.listActiveDslStatesSync(address));
306
+ }
307
+ return states;
308
+ }
309
+ startMonitorLoop(strategyStates) {
310
+ const monitor = createPriceMonitor({
311
+ stateManager: this.stateManager,
312
+ senpiClient: this.senpiClient,
313
+ bus: this.bus,
314
+ baseDir: this.baseDir,
315
+ strategyStates,
316
+ });
317
+ const scheduleNextTick = () => {
318
+ if (this.priceMonitorStopped)
319
+ return;
320
+ const tickStart = Date.now();
321
+ this.monitorRunning = true;
322
+ this.tickInFlight = true;
323
+ this.lastTickStartedAt = tickStart;
324
+ this.nextTickAt = null;
325
+ this.tickAttemptCount += 1;
326
+ monitor
327
+ .tick()
328
+ .then(() => {
329
+ this.lastTickError = null;
330
+ this.tickSuccessCount += 1;
331
+ })
332
+ .catch((error) => {
333
+ this.lastTickError = error instanceof Error ? error.message : String(error);
334
+ this.tickErrorCount += 1;
335
+ logger.warn("price tick error", error);
336
+ })
337
+ .finally(() => {
338
+ this.finishMonitorTick(tickStart, scheduleNextTick);
339
+ });
340
+ };
341
+ this.nextTickAt = Date.now();
342
+ scheduleNextTick();
343
+ }
344
+ finishMonitorTick(tickStart, scheduleNextTick) {
345
+ this.tickInFlight = false;
346
+ this.lastTickFinishedAt = Date.now();
347
+ if (this.priceMonitorStopped)
348
+ return;
349
+ const elapsed = Date.now() - tickStart;
350
+ const delay = Math.max(0, this.config.intervalMs - elapsed);
351
+ this.nextTickAt = Date.now() + delay;
352
+ this.priceMonitorHandle = setTimeout(scheduleNextTick, delay);
353
+ }
354
+ deriveHealth() {
355
+ if (this.priceMonitorStopped) {
356
+ return "disabled";
357
+ }
358
+ if (this.tickInFlight) {
359
+ if (this.lastTickStartedAt == null) {
360
+ return "unknown";
361
+ }
362
+ const runningMs = Date.now() - this.lastTickStartedAt;
363
+ if (runningMs > this.config.intervalMs * 4) {
364
+ return "unhealthy";
365
+ }
366
+ if (runningMs > this.config.intervalMs * 2) {
367
+ return "degraded";
368
+ }
369
+ return "healthy";
370
+ }
371
+ if (this.lastTickFinishedAt == null) {
372
+ return "unknown";
373
+ }
374
+ const overdueMs = Date.now() - this.lastTickFinishedAt;
375
+ if (this.lastTickError && overdueMs > this.config.intervalMs * 4) {
376
+ return "unhealthy";
377
+ }
378
+ if (this.lastTickError || overdueMs > this.config.intervalMs * 2) {
379
+ return "degraded";
380
+ }
381
+ return "healthy";
382
+ }
383
+ buildHealthSummary(health, activePositions) {
384
+ if (health === "healthy") {
385
+ return `DSL monitor healthy with ${activePositions} active position(s).`;
386
+ }
387
+ if (health === "disabled") {
388
+ return "DSL monitor disabled.";
389
+ }
390
+ if (health === "unknown") {
391
+ return "DSL monitor has not completed a tick yet.";
392
+ }
393
+ return `DSL monitor ${health}; ${activePositions} active position(s).`;
394
+ }
263
395
  }
264
396
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/plugin/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/plugin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAO1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAK5E,qFAAqF;AACrF,IAAI,wBAAwB,GAAqB,IAAI,CAAC;AACtD,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC,SAAS,2BAA2B;IAClC,IAAI,qBAAqB;QAAE,OAAO;IAClC,qBAAqB,GAAG,IAAI,CAAC;IAC7B,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,CAAC;YACH,wBAAwB,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,SAAS;IACH,MAAM,CAAkB;IACxB,GAAG,CAAgB;IACnB,YAAY,CAAe;IAC3B,WAAW,CAAc;IACzB,cAAc,CAAU;IACxB,OAAO,CAAS;IAChB,yBAAyB,CAAqC;IACvE,kBAAkB,GAAyC,IAAI,CAAC;IAChE,mBAAmB,GAAG,KAAK,CAAC;IAC5B,sBAAsB,GAAqC,IAAI,CAAC;IAChE,cAAc,GAAG,KAAK,CAAC;IACvB,YAAY,GAAG,KAAK,CAAC;IACrB,iBAAiB,GAAkB,IAAI,CAAC;IACxC,kBAAkB,GAAkB,IAAI,CAAC;IACzC,aAAa,GAAkB,IAAI,CAAC;IACpC,UAAU,GAAkB,IAAI,CAAC;IACjC,gBAAgB,GAAG,CAAC,CAAC;IACrB,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAG,CAAC,CAAC;IAE3B,YACE,MAAuB,EACvB,GAAkB,EAClB,YAA0B,EAC1B,WAAwB,EACxB,cAAuB,EACvB,OAAe,EACf,yBAA6D,EAC7D,sBAAwD;QAExD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;QAC3D,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACvD,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAChC,oBAA8C,EAC9C,OAAe;QAEf,OAAO,oBAAoB,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,kBAAkB,CACrC,cAAuC;QAEvC,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO;gBACL,WAAW,EAAE,cAAc;gBAC3B,cAAc,EAAE,KAAK;aACtB,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC;QACjF,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO;YACL,WAAW;YACX,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,qBAAqB,CACxC,YAA0B,EAC1B,WAAwB,EACxB,cAAkD;QAElD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;QACvD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAChC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,IAAI;YACJ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;SACjE,CAAC,CACH,CAAC;QACF,OAAO,uBAAuB,CAAC,kBAAkB,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAChF,CAAC;IAEO,MAAM,CAAC,yBAAyB,CACtC,GAAkB,EAClB,QAAgD;QAEhD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC7G,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC7G,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAChH,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,CAAC;QACzH,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC3H,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAC7B,OAA4C,EAC5C,SAAiB;QAEjB,OAAO,CAAC,OAAgB,EAAE,EAAE;YAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,SAAS,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,yBAAyB,CAAC,CAAW;QAClD,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,YAAY,EAAE,CAAC,CAAC,YAAY;SAC7B,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,uBAAuB,CAAC,CAAW;QAChD,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;SACrC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAyB;QAC3C,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,iBAAiB,CAAC;QACnF,MAAM,YAAY,GAAG,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClF,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChG,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAC1D,YAAY,EACZ,WAAW,EACX,OAAO,CAAC,cAAc,CACvB,CAAC;QAEF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACjG,SAAS,CAAC,yBAAyB,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,sBAAsB,GAC1B,OAAO,CAAC,aAAa,IAAI,IAAI;YAC3B,CAAC,CAAC,+BAA+B,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE;gBAClE,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,KAAK;gBACjD,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC;QAEX,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,MAAM,EACN,OAAO,CAAC,GAAG,EACX,YAAY,EACZ,WAAW,EACX,cAAc,EACd,OAAO,EACP,QAAQ,CAAC,qBAAqB,EAC9B,sBAAsB,CACvB,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAExC,wBAAwB,GAAG,MAAM,CAAC;QAClC,2BAA2B,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8GAA8G;IAC9G,qBAAqB,CAAC,OAAe;QACnC,OAAO,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,oEAAoE;IACpE,mBAAmB;QACjB,MAAM,GAAG,GAAyB,EAAE,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,0BAA0B,EAAE,EAAE,CAAC;YACrE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,gBAAgB,CAAC,OAAe,EAAE,KAAa;QAC7C,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAA8C;QACrE,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7F,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;gBAAE,SAAS;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,OAAO;gBAAE,SAAS;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,KAAe,CAAC;YACpB,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAAE,SAAS;gBACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;oBAC1D,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;wBACzC,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE;4BAChE,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,MAAM,CAAC,OAAO;yBACxB,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBACD,MAAM,KAAK,GAAG,MAA6B,CAAC;oBAC5C,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACzE,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;wBAClF,SAAS;oBACX,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1E,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;YAC7C,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;YAChE,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,eAAe,CAAC,MAAM;SACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1C,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE;YAC3B,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;YAC7C,KAAK,EAAE;gBACL,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;gBAClC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,OAAO,EAAE;oBACP,OAAO,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,mBAAmB;oBACzD,QAAQ,EAAE,IAAI,CAAC,YAAY;oBAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;oBACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;oBAC3C,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;oBACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;oBACvC,cAAc,EAAE,IAAI,CAAC,cAAc;iBACpC;gBACD,eAAe;gBACf,SAAS;aACV;SACF,CAAC;IACJ,CAAC;IAED,IAAI;QACF,IAAI,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACtC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,wBAAwB,KAAK,IAAI,EAAE,CAAC;YACtC,wBAAwB,GAAG,IAAI,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAEO,gBAAgB;QACtB,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,0BAA0B,EAAE,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,cAA0D;QACjF,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,cAAc;SACf,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,GAAS,EAAE;YAClC,IAAI,IAAI,CAAC,mBAAmB;gBAAE,OAAO;YAErC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAE3B,OAAO;iBACJ,IAAI,EAAE;iBACN,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,IAAI,CAAC,aAAa,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,gBAAgB,EAAE,CAAC;IACrB,CAAC;IAEO,iBAAiB,CACvB,SAAiB,EACjB,gBAA4B;QAE5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO;QAErC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC;gBACnC,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACtD,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC3C,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC3C,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC;YACpC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACvD,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CACxB,MAAuB,EACvB,eAAuB;QAEvB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,4BAA4B,eAAe,sBAAsB,CAAC;QAC3E,CAAC;QACD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,OAAO,uBAAuB,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,2CAA2C,CAAC;QACrD,CAAC;QACD,OAAO,eAAe,MAAM,KAAK,eAAe,sBAAsB,CAAC;IACzE,CAAC;CACF"}
@@ -34,5 +34,7 @@ export interface DslPluginOptions {
34
34
  * `notifications.dsl_notify_sl_updates: true` in recipe YAML.
35
35
  */
36
36
  notifySlUpdates?: boolean;
37
+ /** Recipe name used to prefix DSL notifications (e.g. "my-recipe"). */
38
+ strategyName?: string;
37
39
  }
38
40
  //# sourceMappingURL=options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/dsl/plugin/options.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2GAA2G;IAC3G,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC5C;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/dsl/plugin/options.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2GAA2G;IAC3G,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC5C;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -1,6 +1,26 @@
1
+ import type { ComponentHealth, DslComponentHealthStatus, DslSystemState, RuntimeHealthStatus, RuntimeSystemState, ScannerComponentHealthStatus, ScannerSystemState, StateStatusProvider } from "./types.js";
2
+ export type { ComponentHealth, ComponentHealthStatus, ComponentSystemState, DslComponentHealthStatus, DslSystemState, RuntimeHealthStatus, RuntimeSystemState, ScannerComponentHealthStatus, ScannerRegistrationSystemState, ScannerSystemState, StateStatusProvider, } from "./types.js";
3
+ type HealthProviderMap = {
4
+ scanners: StateStatusProvider<ScannerComponentHealthStatus, ScannerSystemState>;
5
+ dsl?: StateStatusProvider<DslComponentHealthStatus, DslSystemState>;
6
+ };
7
+ export interface CreateHealthStateModuleOptions {
8
+ recipeId?: string;
9
+ recipeName: string;
10
+ stateDir: string;
11
+ startedAt?: number;
12
+ providers: HealthProviderMap;
13
+ }
14
+ export interface HealthStateModule {
15
+ getHealthStatus(): Promise<RuntimeHealthStatus>;
16
+ getSystemState(): Promise<RuntimeSystemState>;
17
+ registerProvider<Name extends keyof HealthProviderMap>(name: Name, provider: HealthProviderMap[Name]): void;
18
+ }
19
+ export declare function createHealthStateModule(options: CreateHealthStateModuleOptions): HealthStateModule;
20
+ export declare function deriveRuntimeHealth(healths: Array<ComponentHealth | undefined>): ComponentHealth;
1
21
  /**
2
- * Health feature of Senpi core trading plugin.
3
- * Placeholder for health checks, liveness, and diagnostics.
22
+ * Legacy hook-based health initializer retained for compatibility.
23
+ * Runtime health/state aggregation is now handled by createHealthStateModule().
4
24
  */
5
25
  export declare function initHealth(_bus: {
6
26
  emit: (e: string, p?: unknown) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAA;CAAE,GAAG,IAAI,CAEpI"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAE5B,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,8BAA8B,EAC9B,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,mBAAmB,CAAC,4BAA4B,EAAE,kBAAkB,CAAC,CAAC;IAChF,GAAG,CAAC,EAAE,mBAAmB,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChD,cAAc,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9C,gBAAgB,CAAC,IAAI,SAAS,MAAM,iBAAiB,EACnD,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAChC,IAAI,CAAC;CACT;AAUD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,8BAA8B,GACtC,iBAAiB,CAmEnB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC,GAC1C,eAAe,CAgBjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;CACnD,GAAG,IAAI,CAEP"}
@@ -1,9 +1,191 @@
1
+ const HEALTH_ORDER = {
2
+ healthy: 0,
3
+ disabled: 0,
4
+ unknown: 1,
5
+ degraded: 2,
6
+ unhealthy: 3,
7
+ };
8
+ export function createHealthStateModule(options) {
9
+ const startedAtMs = options.startedAt ?? Date.now();
10
+ const providers = { ...options.providers };
11
+ return {
12
+ async getHealthStatus() {
13
+ const [scanners, dsl] = await Promise.all([
14
+ readProviderHealth({
15
+ component: "scanners",
16
+ provider: providers.scanners,
17
+ fallback: buildScannerHealthFallback("Scanners provider is not registered."),
18
+ }),
19
+ readProviderHealth({
20
+ component: "dsl",
21
+ provider: providers.dsl,
22
+ fallback: buildDslHealthFallback("DSL provider is not registered."),
23
+ }),
24
+ ]);
25
+ return {
26
+ ...(options.recipeId ? { recipeId: options.recipeId } : {}),
27
+ recipeName: options.recipeName,
28
+ startedAt: new Date(startedAtMs).toISOString(),
29
+ generatedAt: new Date().toISOString(),
30
+ health: deriveRuntimeHealth([scanners.health, providers.dsl ? dsl.health : undefined]),
31
+ components: {
32
+ scanners,
33
+ ...(providers.dsl ? { dsl } : {}),
34
+ },
35
+ };
36
+ },
37
+ async getSystemState() {
38
+ const [scanners, dsl] = await Promise.all([
39
+ readProviderState({
40
+ component: "scanners",
41
+ provider: providers.scanners,
42
+ fallback: buildScannerStateFallback("Scanners provider is not registered."),
43
+ }),
44
+ readProviderState({
45
+ component: "dsl",
46
+ provider: providers.dsl,
47
+ fallback: buildDslStateFallback("DSL provider is not registered."),
48
+ }),
49
+ ]);
50
+ return {
51
+ ...(options.recipeId ? { recipeId: options.recipeId } : {}),
52
+ recipeName: options.recipeName,
53
+ stateDir: options.stateDir,
54
+ startedAt: new Date(startedAtMs).toISOString(),
55
+ generatedAt: new Date().toISOString(),
56
+ health: deriveRuntimeHealth([scanners.health, providers.dsl ? dsl.health : undefined]),
57
+ components: {
58
+ scanners,
59
+ ...(providers.dsl ? { dsl } : {}),
60
+ },
61
+ };
62
+ },
63
+ registerProvider(name, provider) {
64
+ providers[name] = provider;
65
+ },
66
+ };
67
+ }
68
+ export function deriveRuntimeHealth(healths) {
69
+ const values = healths.filter((value) => value !== undefined);
70
+ if (values.length === 0) {
71
+ return "unknown";
72
+ }
73
+ const active = values.filter((value) => value !== "disabled");
74
+ const source = active.length > 0 ? active : values;
75
+ let worst = source[0] ?? "unknown";
76
+ for (const value of source) {
77
+ if (HEALTH_ORDER[value] > HEALTH_ORDER[worst]) {
78
+ worst = value;
79
+ }
80
+ }
81
+ return worst;
82
+ }
1
83
  /**
2
- * Health feature of Senpi core trading plugin.
3
- * Placeholder for health checks, liveness, and diagnostics.
84
+ * Legacy hook-based health initializer retained for compatibility.
85
+ * Runtime health/state aggregation is now handled by createHealthStateModule().
4
86
  */
5
- // TODO: implement health module (liveness, readiness, metrics, etc.)
6
87
  export function initHealth(_bus) {
7
- // no-op until implemented
88
+ // no-op
89
+ }
90
+ async function readProviderHealth(options) {
91
+ if (!options.provider) {
92
+ return options.fallback;
93
+ }
94
+ try {
95
+ return await options.provider.getHealthStatus();
96
+ }
97
+ catch (error) {
98
+ return {
99
+ ...options.fallback,
100
+ summary: `Failed to query ${options.component} health.`,
101
+ updatedAt: new Date().toISOString(),
102
+ error: formatProviderError(error),
103
+ };
104
+ }
105
+ }
106
+ async function readProviderState(options) {
107
+ if (!options.provider) {
108
+ return options.fallback;
109
+ }
110
+ try {
111
+ return await options.provider.getSystemState();
112
+ }
113
+ catch (error) {
114
+ return {
115
+ ...options.fallback,
116
+ updatedAt: new Date().toISOString(),
117
+ error: formatProviderError(error),
118
+ };
119
+ }
120
+ }
121
+ function buildScannerHealthFallback(error) {
122
+ return {
123
+ component: "scanners",
124
+ health: "unhealthy",
125
+ updatedAt: new Date().toISOString(),
126
+ summary: "Failed to query scanners health.",
127
+ error,
128
+ totals: {
129
+ registered: 0,
130
+ enabled: 0,
131
+ inFlight: 0,
132
+ degraded: 0,
133
+ unhealthy: 1,
134
+ },
135
+ scanners: [],
136
+ };
137
+ }
138
+ function buildDslHealthFallback(error) {
139
+ return {
140
+ component: "dsl",
141
+ health: "unhealthy",
142
+ updatedAt: new Date().toISOString(),
143
+ summary: "Failed to query DSL health.",
144
+ error,
145
+ enabled: false,
146
+ activePositions: 0,
147
+ };
148
+ }
149
+ function buildScannerStateFallback(error) {
150
+ return {
151
+ component: "scanners",
152
+ health: "unhealthy",
153
+ updatedAt: new Date().toISOString(),
154
+ error,
155
+ state: {
156
+ totalRegistered: 0,
157
+ totalEnabled: 0,
158
+ scanners: [],
159
+ },
160
+ };
161
+ }
162
+ function buildDslStateFallback(error) {
163
+ return {
164
+ component: "dsl",
165
+ health: "unhealthy",
166
+ updatedAt: new Date().toISOString(),
167
+ error,
168
+ state: {
169
+ enabled: false,
170
+ intervalMs: 0,
171
+ preset: "unknown",
172
+ monitor: {
173
+ running: false,
174
+ inFlight: false,
175
+ lastTickStartedAt: null,
176
+ lastTickFinishedAt: null,
177
+ lastTickError: null,
178
+ nextTickAt: null,
179
+ tickAttemptCount: 0,
180
+ tickSuccessCount: 0,
181
+ tickErrorCount: 0,
182
+ },
183
+ activePositions: [],
184
+ positions: [],
185
+ },
186
+ };
187
+ }
188
+ function formatProviderError(error) {
189
+ return error instanceof Error ? error.message : String(error);
8
190
  }
9
191
  //# sourceMappingURL=index.js.map