@senpi/runtime 3.0.138 → 3.0.140

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 (51) hide show
  1. package/dist/constants/telemetry.d.ts +15 -0
  2. package/dist/constants/telemetry.d.ts.map +1 -0
  3. package/dist/constants/telemetry.js +28 -0
  4. package/dist/constants/telemetry.js.map +1 -0
  5. package/dist/dsl/plugin/index.d.ts.map +1 -1
  6. package/dist/dsl/plugin/index.js +2 -12
  7. package/dist/dsl/plugin/index.js.map +1 -1
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +64 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/runtime/events-telemetry.d.ts +96 -0
  13. package/dist/runtime/events-telemetry.d.ts.map +1 -0
  14. package/dist/runtime/events-telemetry.js +232 -0
  15. package/dist/runtime/events-telemetry.js.map +1 -0
  16. package/dist/runtime/run.d.ts +7 -0
  17. package/dist/runtime/run.d.ts.map +1 -1
  18. package/dist/runtime/run.js +7 -0
  19. package/dist/runtime/run.js.map +1 -1
  20. package/dist/runtime/runtime.d.ts +19 -0
  21. package/dist/runtime/runtime.d.ts.map +1 -1
  22. package/dist/runtime/runtime.js +45 -3
  23. package/dist/runtime/runtime.js.map +1 -1
  24. package/dist/runtime/strategies-store.d.ts +26 -0
  25. package/dist/runtime/strategies-store.d.ts.map +1 -0
  26. package/dist/runtime/strategies-store.js +47 -0
  27. package/dist/runtime/strategies-store.js.map +1 -0
  28. package/dist/runtime/strategies-telemetry.d.ts +91 -0
  29. package/dist/runtime/strategies-telemetry.d.ts.map +1 -0
  30. package/dist/runtime/strategies-telemetry.js +128 -0
  31. package/dist/runtime/strategies-telemetry.js.map +1 -0
  32. package/dist/runtime-api/intake/intake-mount.d.ts +2 -0
  33. package/dist/runtime-api/intake/intake-mount.d.ts.map +1 -1
  34. package/dist/runtime-api/intake/intake-mount.js +6 -3
  35. package/dist/runtime-api/intake/intake-mount.js.map +1 -1
  36. package/dist/runtime-api/routes/signals.d.ts.map +1 -1
  37. package/dist/runtime-api/routes/signals.js +10 -0
  38. package/dist/runtime-api/routes/signals.js.map +1 -1
  39. package/dist/state/state-manager.d.ts +2 -0
  40. package/dist/state/state-manager.d.ts.map +1 -1
  41. package/dist/state/state-manager.js +8 -0
  42. package/dist/state/state-manager.js.map +1 -1
  43. package/dist/telemetry/event-store.d.ts +6 -0
  44. package/dist/telemetry/event-store.d.ts.map +1 -1
  45. package/dist/telemetry/event-store.js +6 -6
  46. package/dist/telemetry/event-store.js.map +1 -1
  47. package/dist/telemetry/spans/redact-pii.d.ts.map +1 -1
  48. package/dist/telemetry/spans/redact-pii.js +13 -2
  49. package/dist/telemetry/spans/redact-pii.js.map +1 -1
  50. package/openclaw.plugin.json +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Events telemetry: the in-memory buffer of runtime event records, the tap that fills it from the
3
+ * per-wallet event sink, and the loop that broadcasts new records as `plugin.senpi.events`.
4
+ */
5
+ import { EVENTS_BROADCAST_NAMES, EVENTS_EVENT_NAME, EVENTS_MAX_FRAME_BYTES, EVENTS_PER_STRATEGY, EVENTS_SEND_INTERVAL_MS, } from "../constants/telemetry.js";
6
+ import { normalizeStrategyAddress } from "../telemetry/event-store.js";
7
+ import { getDefaultPiiRedactor } from "../telemetry/spans/redact-pii.js";
8
+ import { PROCESS_EPOCH } from "./strategies-telemetry.js";
9
+ const BROADCAST_NAMES = new Set(EVENTS_BROADCAST_NAMES);
10
+ /** One ring of `capacity` records per address. `seq` starts at 1 and counts across every address. */
11
+ export function createEventsBuffer(capacity = EVENTS_PER_STRATEGY) {
12
+ const rings = new Map();
13
+ let seq = 0;
14
+ let maxEvicted = 0;
15
+ return {
16
+ add(address, event) {
17
+ const key = normalizeStrategyAddress(address);
18
+ const attrs = {};
19
+ for (const [k, v] of Object.entries(event.attrs)) {
20
+ if (typeof v === "string" || typeof v === "number" || typeof v === "boolean")
21
+ attrs[k] = v;
22
+ }
23
+ let ring = rings.get(key);
24
+ if (ring === undefined) {
25
+ ring = [];
26
+ rings.set(key, ring);
27
+ }
28
+ ring.push({ seq: ++seq, ts: event.ts, name: event.name, level: event.level, address: key, body: event.body, attrs });
29
+ if (ring.length > capacity)
30
+ maxEvicted = Math.max(maxEvicted, ring.shift().seq);
31
+ },
32
+ after(after) {
33
+ const out = [];
34
+ for (const ring of rings.values()) {
35
+ let i = ring.length;
36
+ while (i > 0 && ring[i - 1].seq > after)
37
+ i--;
38
+ for (; i < ring.length; i++)
39
+ out.push(ring[i]);
40
+ }
41
+ return out.sort((a, b) => a.seq - b.seq);
42
+ },
43
+ maxEvictedSeq: () => maxEvicted,
44
+ };
45
+ }
46
+ /** The process buffer. Its `seq` run belongs to `PROCESS_EPOCH`. */
47
+ export const eventsBuffer = createEventsBuffer();
48
+ /**
49
+ * Adds a record to `buffer` under `address` for a case that is not a runtime event. It does not go
50
+ * through `logger.event`, so no event sink, disk ring or OTel record receives it. A blank `address`
51
+ * adds nothing. Never throws.
52
+ */
53
+ export function addEventRecord(address, event, buffer = eventsBuffer) {
54
+ try {
55
+ if (normalizeStrategyAddress(address) !== "")
56
+ buffer.add(address, event);
57
+ }
58
+ catch {
59
+ // Callers are request handlers; a buffer failure must not fail the request.
60
+ }
61
+ }
62
+ /**
63
+ * Wraps a wallet's event sink. Every event goes to `sink`. An event whose name is in
64
+ * `EVENTS_BROADCAST_NAMES` is also added to `buffer` under `address`.
65
+ */
66
+ export function withEventsTap(address, sink, buffer = eventsBuffer) {
67
+ return {
68
+ append(event) {
69
+ sink.append(event);
70
+ try {
71
+ if (BROADCAST_NAMES.has(event.name))
72
+ buffer.add(address, event);
73
+ }
74
+ catch {
75
+ // The tap runs inside `logger.event` and must not throw into it.
76
+ }
77
+ },
78
+ flush: () => sink.flush(),
79
+ };
80
+ }
81
+ /** The redacted value, or `undefined` when there is no redactor or it throws. `""` is kept as is. */
82
+ async function scrubString(value, redactor) {
83
+ if (value === "")
84
+ return value;
85
+ if (redactor === null)
86
+ return undefined;
87
+ try {
88
+ const out = await redactor.redact(value);
89
+ return typeof out === "string" ? out : undefined;
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ }
95
+ /**
96
+ * A copy of the record with every string in `body` and `attrs` run through the redactor. A string
97
+ * attr the redactor cannot produce is left out; such a `body` becomes `""`.
98
+ */
99
+ export async function scrubEventRecord(record, redactor) {
100
+ const attrs = {};
101
+ for (const [key, value] of Object.entries(record.attrs)) {
102
+ if (typeof value !== "string") {
103
+ attrs[key] = value;
104
+ continue;
105
+ }
106
+ const scrubbed = await scrubString(value, redactor);
107
+ if (scrubbed !== undefined)
108
+ attrs[key] = scrubbed;
109
+ }
110
+ return { ...record, body: (await scrubString(record.body, redactor)) ?? "", attrs };
111
+ }
112
+ const bytes = (value) => Buffer.byteLength(JSON.stringify(value), "utf8");
113
+ /**
114
+ * The events part of the subscribe reply. A cursor whose `afterEpoch` is `epoch` selects the held
115
+ * records after `afterSeq`; any other cursor, or none, selects every held record. The newest
116
+ * selected records that fit `maxBytes` are served, scrubbed. `truncated` is `true` when a record
117
+ * after the cursor was evicted, or a selected record was not served.
118
+ */
119
+ export async function buildEventsReplay(input) {
120
+ const buffer = input.buffer ?? eventsBuffer;
121
+ const epoch = input.epoch ?? PROCESS_EPOCH;
122
+ const maxBytes = input.maxBytes ?? EVENTS_MAX_FRAME_BYTES;
123
+ const afterSeq = input.cursor?.afterEpoch === epoch ? input.cursor.afterSeq : undefined;
124
+ const selected = buffer.after(afterSeq ?? 0);
125
+ let truncated = afterSeq !== undefined && buffer.maxEvictedSeq() > afterSeq;
126
+ const envelopeBytes = bytes({ epoch, events: [], truncated: false });
127
+ let used = envelopeBytes;
128
+ const served = [];
129
+ for (let i = selected.length - 1; i >= 0; i--) {
130
+ const record = await scrubEventRecord(selected[i], input.redactor);
131
+ const size = bytes(record);
132
+ // A record that does not fit an empty reply is skipped; the older records are still served.
133
+ if (envelopeBytes + size > maxBytes) {
134
+ truncated = true;
135
+ continue;
136
+ }
137
+ const added = size + (served.length > 0 ? 1 : 0);
138
+ if (used + added > maxBytes) {
139
+ truncated = true;
140
+ break;
141
+ }
142
+ used += added;
143
+ served.push(record);
144
+ }
145
+ return { epoch, events: served.reverse(), truncated };
146
+ }
147
+ /**
148
+ * Each tick takes the records added since the previous tick. With a broadcast function, it scrubs
149
+ * them and broadcasts them as one or more messages of at most `maxFrameBytes` serialized bytes. A
150
+ * record that does not fit an empty message is dropped and passed to `warn`. Without a broadcast
151
+ * function, the records are not sent.
152
+ */
153
+ export function createEventsPublisher(deps) {
154
+ const buffer = deps.buffer ?? eventsBuffer;
155
+ const getRedactor = deps.getRedactor ?? getDefaultPiiRedactor;
156
+ const epoch = deps.epoch ?? PROCESS_EPOCH;
157
+ const maxFrameBytes = deps.maxFrameBytes ?? EVENTS_MAX_FRAME_BYTES;
158
+ // Upper bound of the message without its records.
159
+ const envelopeBytes = bytes({ v: 1, epoch, batchSeq: Number.MAX_SAFE_INTEGER, events: [] });
160
+ let lastSeq = 0;
161
+ let batchSeq = 0;
162
+ let timer;
163
+ let inFlight = false;
164
+ const send = (broadcast, events) => {
165
+ const message = { v: 1, epoch, batchSeq: ++batchSeq, events };
166
+ broadcast(EVENTS_EVENT_NAME, message, { dropIfSlow: true });
167
+ };
168
+ const tick = async () => {
169
+ if (inFlight)
170
+ return;
171
+ inFlight = true;
172
+ try {
173
+ const records = buffer.after(lastSeq);
174
+ if (records.length === 0)
175
+ return;
176
+ lastSeq = records[records.length - 1].seq;
177
+ if (deps.getBroadcast() === undefined)
178
+ return;
179
+ const redactor = getRedactor();
180
+ const scrubbed = await Promise.all(records.map((record) => scrubEventRecord(record, redactor)));
181
+ const broadcast = deps.getBroadcast();
182
+ if (broadcast === undefined || timer === undefined)
183
+ return;
184
+ let batch = [];
185
+ let used = envelopeBytes;
186
+ for (const record of scrubbed) {
187
+ const size = bytes(record);
188
+ if (envelopeBytes + size > maxFrameBytes) {
189
+ deps.warn?.("[senpi-runtime] event record exceeds the events frame size; dropped", {
190
+ seq: record.seq,
191
+ name: record.name,
192
+ address: record.address,
193
+ bytes: size,
194
+ });
195
+ continue;
196
+ }
197
+ const added = size + (batch.length > 0 ? 1 : 0);
198
+ if (used + added > maxFrameBytes) {
199
+ send(broadcast, batch);
200
+ batch = [];
201
+ used = envelopeBytes + size;
202
+ }
203
+ else {
204
+ used += added;
205
+ }
206
+ batch.push(record);
207
+ }
208
+ if (batch.length > 0)
209
+ send(broadcast, batch);
210
+ }
211
+ catch (err) {
212
+ deps.onError?.(err);
213
+ }
214
+ finally {
215
+ inFlight = false;
216
+ }
217
+ };
218
+ return {
219
+ start() {
220
+ if (timer !== undefined)
221
+ return;
222
+ timer = setInterval(() => void tick(), EVENTS_SEND_INTERVAL_MS);
223
+ timer.unref?.();
224
+ },
225
+ stop() {
226
+ if (timer !== undefined)
227
+ clearInterval(timer);
228
+ timer = undefined;
229
+ },
230
+ };
231
+ }
232
+ //# sourceMappingURL=events-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-telemetry.js","sourceRoot":"","sources":["../../src/runtime/events-telemetry.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import type { ScannerDataProviders } from "../scanners/engine/data-providers.js"
7
7
  import type { ExternalScannerIngestRequest, ExternalScannerIngestResult } from "../scanners/external-scanner-receiver.js";
8
8
  import type { ScannerSupervisionSource } from "../scanners/supervision.js";
9
9
  import type { DslPlugin } from "../dsl/plugin/index.js";
10
+ import type { DslState } from "../types/dsl/index.js";
10
11
  import type { ActionExecutionRecord, ActionFilter, ActionLatestState, ReadActionHistoryOptions } from "../actions/store/index.js";
11
12
  import type { AuditQueryArgs, AuditQueryResult } from "./audit-query.types.js";
12
13
  import type { RuntimeConfig } from "./runtime-schema.js";
@@ -31,6 +32,12 @@ export interface RunOptions {
31
32
  export interface RuntimeHandle {
32
33
  stop(): Promise<void>;
33
34
  dsl: DslPlugin | null;
35
+ /**
36
+ * Active DSL states from the runtime's state manager memory. Empty when the runtime is not
37
+ * started or its committed recipe has no DSL. Unlike `dsl`, it keeps returning the states while
38
+ * an in-place update has no DSL plugin installed.
39
+ */
40
+ listActiveDslStates(): DslState[];
34
41
  /**
35
42
  * Swap this runtime onto a new recipe in place, without restarting it.
36
43
  *
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  import { getDefaultStateDir } from "./default-state-dir.js";
5
5
  import { loadRuntimeConfigWithRaw } from "./load-runtime-config.js";
6
6
  import { Runtime } from "./runtime.js";
7
+ import { strategiesStore, strategyRecordFromConfig } from "./strategies-store.js";
7
8
  /**
8
9
  * Load trading recipe from path or content, create Runtime, start it, and return a handle with stop().
9
10
  * Programmatic API used by the OpenClaw adapter and standalone CLI.
@@ -29,6 +30,9 @@ export async function run(recipePathOrContent, options) {
29
30
  unresolvedConfig,
30
31
  });
31
32
  await runtime.start();
33
+ if (options?.runtimeId) {
34
+ strategiesStore.set(options.runtimeId, strategyRecordFromConfig(config));
35
+ }
32
36
  return {
33
37
  async stop() {
34
38
  await runtime.stop();
@@ -43,6 +47,9 @@ export async function run(recipePathOrContent, options) {
43
47
  get dsl() {
44
48
  return runtime.dsl;
45
49
  },
50
+ listActiveDslStates() {
51
+ return runtime.listActiveDslStates();
52
+ },
46
53
  applyUpdatedConfig(next) {
47
54
  return runtime.rebuildComponents(next);
48
55
  },
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import type { ScannerSupervisionSource } from "../scanners/supervision.js";
8
8
  import type { McpTransport } from "../senpi/types.js";
9
9
  import type { ScannerDataProviders } from "../scanners/engine/data-providers.js";
10
10
  import { DslPlugin as DslPluginClass } from "../dsl/plugin/index.js";
11
+ import type { DslState } from "../types/dsl/index.js";
11
12
  import type { RuntimeHealthStatus, RuntimeSystemState } from "../health/types.js";
12
13
  import type { ActionExecutionRecord, ActionFilter, ActionLatestState, ReadActionHistoryOptions } from "../actions/store/types.js";
13
14
  export interface RuntimeOptions {
@@ -36,6 +37,14 @@ export declare class Runtime {
36
37
  private positionIdRegistry;
37
38
  private scannerModule;
38
39
  private dslPlugin;
40
+ /**
41
+ * Whether the committed recipe runs DSL. Set where `commitComponents` installs the DSL plugin or
42
+ * installs none, so it tracks the plugin once committed. Teardown leaves it as it is: while a
43
+ * rebuild has stopped the old plugin and not yet committed the next one, it still describes the
44
+ * recipe whose positions are open. A rollback's own commit sets it from the restored recipe. It
45
+ * is cleared when the rollback also fails, because no plugin manages the book then.
46
+ */
47
+ private dslCommitted;
39
48
  private senpi;
40
49
  private healthStateModule;
41
50
  private domainEventSubscriber;
@@ -114,6 +123,16 @@ export declare class Runtime {
114
123
  private readonly runtimeBootId;
115
124
  constructor(config: RuntimeConfig, options: RuntimeOptions);
116
125
  get dsl(): DslPluginClass | null;
126
+ /**
127
+ * Active DSL states, read from the state manager's memory (no disk read). Empty when the runtime
128
+ * is not started or the committed recipe has no DSL.
129
+ *
130
+ * Reads the state manager rather than the DSL plugin because the state manager lives for the
131
+ * whole runtime, while a rebuild stops the plugin and sets it to null before the next one is
132
+ * created. Reading through the plugin would return nothing in that window for positions that
133
+ * are still open and protected.
134
+ */
135
+ listActiveDslStates(): DslState[];
117
136
  getHealthStatus(): Promise<RuntimeHealthStatus | null>;
118
137
  getSystemState(): Promise<RuntimeSystemState | null>;
119
138
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import { createStrategyLifecycle } from "./strategy-lifecycle.js";
13
13
  // RiskGuardianService removed — gate decisions are now real-time in checkGate
14
14
  import { createRiskAuditLog } from "../risk/risk-audit-log.js";
15
15
  import { createEventStore, registerEventSink, unregisterEventSink, flushEventSink } from "../telemetry/event-store.js";
16
+ import { withEventsTap } from "./events-telemetry.js";
16
17
  import { createNotificationService } from "./notifications.js";
17
18
  import { resolveStrategyConfig } from "./map-strategies.js";
18
19
  import { mapRuntimeExitToDslConfig } from "./map-exit-config.js";
@@ -69,6 +70,14 @@ export class Runtime {
69
70
  positionIdRegistry;
70
71
  scannerModule;
71
72
  dslPlugin = null;
73
+ /**
74
+ * Whether the committed recipe runs DSL. Set where `commitComponents` installs the DSL plugin or
75
+ * installs none, so it tracks the plugin once committed. Teardown leaves it as it is: while a
76
+ * rebuild has stopped the old plugin and not yet committed the next one, it still describes the
77
+ * recipe whose positions are open. A rollback's own commit sets it from the restored recipe. It
78
+ * is cleared when the rollback also fails, because no plugin manages the book then.
79
+ */
80
+ dslCommitted = false;
72
81
  // riskGuardian removed — gate decisions are now real-time in checkGate
73
82
  senpi = null;
74
83
  healthStateModule = null;
@@ -163,6 +172,20 @@ export class Runtime {
163
172
  get dsl() {
164
173
  return this.dslPlugin;
165
174
  }
175
+ /**
176
+ * Active DSL states, read from the state manager's memory (no disk read). Empty when the runtime
177
+ * is not started or the committed recipe has no DSL.
178
+ *
179
+ * Reads the state manager rather than the DSL plugin because the state manager lives for the
180
+ * whole runtime, while a rebuild stops the plugin and sets it to null before the next one is
181
+ * created. Reading through the plugin would return nothing in that window for positions that
182
+ * are still open and protected.
183
+ */
184
+ listActiveDslStates() {
185
+ if (!this.started || !this.dslCommitted)
186
+ return [];
187
+ return this.stateManager.listAllActiveDslStatesSync();
188
+ }
166
189
  async getHealthStatus() {
167
190
  return this.healthStateModule?.getHealthStatus() ?? null;
168
191
  }
@@ -447,7 +470,8 @@ export class Runtime {
447
470
  const strategyAddress = this.strategyConfig.address;
448
471
  // Local domain-event ring. Always on (independent of the OTLP collector) so the agent can query
449
472
  // the trade narrative locally; the singleton logger taps it by wallet via this registration.
450
- registerEventSink(strategyAddress, createEventStore(stateDir, strategyAddress));
473
+ // The tap also copies the `plugin.senpi.events` names into the process events buffer.
474
+ registerEventSink(strategyAddress, withEventsTap(strategyAddress, createEventStore(stateDir, strategyAddress)));
451
475
  this.eventSinkAddress = strategyAddress;
452
476
  // Strategy-lifecycle tracker: owns the self-pause state that RiskGuard used to hold and
453
477
  // fires the hook + notification on a running→paused transition. RiskGuard stays stateless
@@ -834,9 +858,11 @@ export class Runtime {
834
858
  reconcileGateResolve: () => this.resolveReconcileGate(),
835
859
  identity: buildIdentityEnvelope,
836
860
  });
861
+ this.dslCommitted = true;
837
862
  }
838
863
  else {
839
864
  this.dslPlugin = null;
865
+ this.dslCommitted = false;
840
866
  }
841
867
  this.healthStateModule = createHealthStateModule({
842
868
  runtimeName: config.name,
@@ -1012,6 +1038,7 @@ export class Runtime {
1012
1038
  rebuildError: err,
1013
1039
  rollbackError: rollbackErr,
1014
1040
  });
1041
+ this.dslCommitted = false;
1015
1042
  throw new RuntimeRebuildRollbackFailedError(this.strategyConfig.address, err, rollbackErr);
1016
1043
  }
1017
1044
  // The runtime is healthy again on its previous recipe; the update itself did not apply.
@@ -1263,13 +1290,28 @@ export class Runtime {
1263
1290
  this.resolveReconcileGate();
1264
1291
  return;
1265
1292
  }
1293
+ // The reconcile runs inside the runtime's tracking context, like the signal consumer and the
1294
+ // DSL monitor tick. When the runtime identity resolves, the events it causes on the bus (e.g.
1295
+ // `position.closed` for an archived state) carry it and route to this wallet's event sink.
1296
+ const identity = this.resolveTraceIdentity();
1297
+ const reconcileContext = {
1298
+ runId: "",
1299
+ address,
1300
+ recipeName: this.config.name,
1301
+ runtimeId: this.options.runtimeId ?? "",
1302
+ runtimeVersion: VERSION,
1303
+ runtimeBootId: this.runtimeBootId,
1304
+ identityAttributes: identity
1305
+ ? identityTraceAttributes(identity)
1306
+ : undefined,
1307
+ };
1266
1308
  let attempt = 0;
1267
1309
  while (!this.reconcileStopped) {
1268
1310
  attempt++;
1269
1311
  const t0 = Date.now();
1270
1312
  let result;
1271
1313
  try {
1272
- result = await runReconcile({
1314
+ result = await trackingContext.run(reconcileContext, () => runReconcile({
1273
1315
  address,
1274
1316
  strategyState,
1275
1317
  senpi: this.senpi,
@@ -1277,7 +1319,7 @@ export class Runtime {
1277
1319
  adopter: this.dslPlugin,
1278
1320
  bus: this.bus,
1279
1321
  serialize,
1280
- });
1322
+ }));
1281
1323
  }
1282
1324
  catch (err) {
1283
1325
  logger.warn("[runtime][reconcile] runReconcile threw unexpectedly", { address, attempt, err });