@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.
- package/dist/constants/telemetry.d.ts +15 -0
- package/dist/constants/telemetry.d.ts.map +1 -0
- package/dist/constants/telemetry.js +28 -0
- package/dist/constants/telemetry.js.map +1 -0
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +2 -12
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/events-telemetry.d.ts +96 -0
- package/dist/runtime/events-telemetry.d.ts.map +1 -0
- package/dist/runtime/events-telemetry.js +232 -0
- package/dist/runtime/events-telemetry.js.map +1 -0
- package/dist/runtime/run.d.ts +7 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +7 -0
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime.d.ts +19 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +45 -3
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/strategies-store.d.ts +26 -0
- package/dist/runtime/strategies-store.d.ts.map +1 -0
- package/dist/runtime/strategies-store.js +47 -0
- package/dist/runtime/strategies-store.js.map +1 -0
- package/dist/runtime/strategies-telemetry.d.ts +91 -0
- package/dist/runtime/strategies-telemetry.d.ts.map +1 -0
- package/dist/runtime/strategies-telemetry.js +128 -0
- package/dist/runtime/strategies-telemetry.js.map +1 -0
- package/dist/runtime-api/intake/intake-mount.d.ts +2 -0
- package/dist/runtime-api/intake/intake-mount.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-mount.js +6 -3
- package/dist/runtime-api/intake/intake-mount.js.map +1 -1
- package/dist/runtime-api/routes/signals.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.js +10 -0
- package/dist/runtime-api/routes/signals.js.map +1 -1
- package/dist/state/state-manager.d.ts +2 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +8 -0
- package/dist/state/state-manager.js.map +1 -1
- package/dist/telemetry/event-store.d.ts +6 -0
- package/dist/telemetry/event-store.d.ts.map +1 -1
- package/dist/telemetry/event-store.js +6 -6
- package/dist/telemetry/event-store.js.map +1 -1
- package/dist/telemetry/spans/redact-pii.d.ts.map +1 -1
- package/dist/telemetry/spans/redact-pii.js +13 -2
- package/dist/telemetry/spans/redact-pii.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- 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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"}
|
package/dist/runtime/run.d.ts
CHANGED
|
@@ -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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/run.js
CHANGED
|
@@ -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
|
},
|
package/dist/runtime/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI/E,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/runtime.js
CHANGED
|
@@ -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
|
-
|
|
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 });
|