@senpi/runtime 1.1.0-dev.runtime-phase-2.20260609132603 → 1.1.0-dev.runtime-phase-2.20260610130051
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/actions/close-position/close-position.action.d.ts +0 -16
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +38 -299
- package/dist/actions/close-position/close-position.action.js.map +1 -1
- package/dist/actions/decision-engine.d.ts +0 -2
- package/dist/actions/decision-engine.d.ts.map +1 -1
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/llm-decision/factory.d.ts +0 -3
- package/dist/actions/llm-decision/factory.d.ts.map +1 -1
- package/dist/actions/llm-decision/factory.js +0 -1
- package/dist/actions/llm-decision/factory.js.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +0 -13
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.js +68 -195
- package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts +0 -12
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +123 -346
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.d.ts +0 -6
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +0 -48
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +4 -0
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/recording/emitter.d.ts +21 -0
- package/dist/recording/emitter.d.ts.map +1 -0
- package/dist/recording/emitter.js +2 -0
- package/dist/recording/emitter.js.map +1 -0
- package/dist/recording/identity.d.ts +34 -0
- package/dist/recording/identity.d.ts.map +1 -0
- package/dist/recording/identity.js +2 -0
- package/dist/recording/identity.js.map +1 -0
- package/dist/recording/index.d.ts +11 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +2 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/noop-emitter.d.ts +17 -0
- package/dist/recording/noop-emitter.d.ts.map +1 -0
- package/dist/recording/noop-emitter.js +16 -0
- package/dist/recording/noop-emitter.js.map +1 -0
- package/dist/recording/otel/attributes.d.ts +35 -0
- package/dist/recording/otel/attributes.d.ts.map +1 -0
- package/dist/recording/otel/attributes.js +131 -0
- package/dist/recording/otel/attributes.js.map +1 -0
- package/dist/recording/otel/constants.d.ts +81 -0
- package/dist/recording/otel/constants.d.ts.map +1 -0
- package/dist/recording/otel/constants.js +96 -0
- package/dist/recording/otel/constants.js.map +1 -0
- package/dist/recording/otel/ids.d.ts +14 -0
- package/dist/recording/otel/ids.d.ts.map +1 -0
- package/dist/recording/otel/ids.js +12 -0
- package/dist/recording/otel/ids.js.map +1 -0
- package/dist/recording/otel/index.d.ts +13 -0
- package/dist/recording/otel/index.d.ts.map +1 -0
- package/dist/recording/otel/index.js +9 -0
- package/dist/recording/otel/index.js.map +1 -0
- package/dist/recording/otel/mappers.d.ts +42 -0
- package/dist/recording/otel/mappers.d.ts.map +1 -0
- package/dist/recording/otel/mappers.js +337 -0
- package/dist/recording/otel/mappers.js.map +1 -0
- package/dist/recording/otel/otel-emitter.d.ts +37 -0
- package/dist/recording/otel/otel-emitter.d.ts.map +1 -0
- package/dist/recording/otel/otel-emitter.js +75 -0
- package/dist/recording/otel/otel-emitter.js.map +1 -0
- package/dist/recording/otel/redaction.d.ts +31 -0
- package/dist/recording/otel/redaction.d.ts.map +1 -0
- package/dist/recording/otel/redaction.js +40 -0
- package/dist/recording/otel/redaction.js.map +1 -0
- package/dist/recording/records.d.ts +327 -0
- package/dist/recording/records.d.ts.map +1 -0
- package/dist/recording/records.js +14 -0
- package/dist/recording/records.js.map +1 -0
- package/dist/recording/transport/batcher.d.ts +59 -0
- package/dist/recording/transport/batcher.d.ts.map +1 -0
- package/dist/recording/transport/batcher.js +234 -0
- package/dist/recording/transport/batcher.js.map +1 -0
- package/dist/recording/transport/client.d.ts +41 -0
- package/dist/recording/transport/client.d.ts.map +1 -0
- package/dist/recording/transport/client.js +69 -0
- package/dist/recording/transport/client.js.map +1 -0
- package/dist/recording/transport/config.d.ts +53 -0
- package/dist/recording/transport/config.d.ts.map +1 -0
- package/dist/recording/transport/config.js +41 -0
- package/dist/recording/transport/config.js.map +1 -0
- package/dist/recording/transport/index.d.ts +16 -0
- package/dist/recording/transport/index.d.ts.map +1 -0
- package/dist/recording/transport/index.js +12 -0
- package/dist/recording/transport/index.js.map +1 -0
- package/dist/recording/transport/rows.d.ts +88 -0
- package/dist/recording/transport/rows.d.ts.map +1 -0
- package/dist/recording/transport/rows.js +15 -0
- package/dist/recording/transport/rows.js.map +1 -0
- package/dist/recording/wiring/emitter-factory.d.ts +39 -0
- package/dist/recording/wiring/emitter-factory.d.ts.map +1 -0
- package/dist/recording/wiring/emitter-factory.js +62 -0
- package/dist/recording/wiring/emitter-factory.js.map +1 -0
- package/dist/recording/wiring/identity.d.ts +27 -0
- package/dist/recording/wiring/identity.d.ts.map +1 -0
- package/dist/recording/wiring/identity.js +51 -0
- package/dist/recording/wiring/identity.js.map +1 -0
- package/dist/recording/wiring/index.d.ts +12 -0
- package/dist/recording/wiring/index.d.ts.map +1 -0
- package/dist/recording/wiring/index.js +9 -0
- package/dist/recording/wiring/index.js.map +1 -0
- package/dist/recording/wiring/record-builders.d.ts +68 -0
- package/dist/recording/wiring/record-builders.d.ts.map +1 -0
- package/dist/recording/wiring/record-builders.js +441 -0
- package/dist/recording/wiring/record-builders.js.map +1 -0
- package/dist/recording/wiring/subscriber.d.ts +21 -0
- package/dist/recording/wiring/subscriber.d.ts.map +1 -0
- package/dist/recording/wiring/subscriber.js +171 -0
- package/dist/recording/wiring/subscriber.js.map +1 -0
- package/dist/recording/wiring/values.d.ts +19 -0
- package/dist/recording/wiring/values.d.ts.map +1 -0
- package/dist/recording/wiring/values.js +49 -0
- package/dist/recording/wiring/values.js.map +1 -0
- package/dist/runtime/create-actions.d.ts.map +1 -1
- package/dist/runtime/create-actions.js +0 -2
- package/dist/runtime/create-actions.js.map +1 -1
- package/dist/runtime/create-runtime-context.d.ts +0 -2
- package/dist/runtime/create-runtime-context.d.ts.map +1 -1
- package/dist/runtime/create-runtime-context.js +0 -1
- package/dist/runtime/create-runtime-context.js.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +1 -1
- package/dist/runtime/create-scanner-module.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.js +1 -2
- package/dist/runtime/create-scanner-module.js.map +1 -1
- package/dist/runtime/load-runtime-config.d.ts +9 -0
- package/dist/runtime/load-runtime-config.d.ts.map +1 -1
- package/dist/runtime/load-runtime-config.js +41 -1
- package/dist/runtime/load-runtime-config.js.map +1 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -2
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +182 -24
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +17 -1
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +15 -5
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +248 -273
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/scanners/engine/data-providers.d.ts +0 -2
- package/dist/scanners/engine/data-providers.d.ts.map +1 -1
- package/dist/scanners/engine/data-providers.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +9 -68
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/events.d.ts +6 -0
- package/dist/scanners/events.d.ts.map +1 -1
- package/dist/scanners/events.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts +0 -2
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +9 -2
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/senpi/client.d.ts +2 -2
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +20 -120
- package/dist/senpi/client.js.map +1 -1
- package/dist/senpi/types.d.ts +1 -68
- package/dist/senpi/types.d.ts.map +1 -1
- package/dist/strategy/strategy-state.d.ts +1 -1
- package/dist/strategy/strategy-state.d.ts.map +1 -1
- package/dist/tracking/spans/plugin-span-tracker.d.ts.map +1 -1
- package/dist/tracking/spans/plugin-span-tracker.js +24 -4
- package/dist/tracking/spans/plugin-span-tracker.js.map +1 -1
- package/dist/tracking/spans/redact-pii.d.ts +0 -10
- package/dist/tracking/spans/redact-pii.d.ts.map +1 -1
- package/dist/tracking/spans/redact-pii.js +2 -80
- package/dist/tracking/spans/redact-pii.js.map +1 -1
- package/dist/types/runtime.d.ts +0 -3
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +2 -2
- package/dist/types/strategy.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/actions/otel-helpers.d.ts +0 -65
- package/dist/actions/otel-helpers.d.ts.map +0 -1
- package/dist/actions/otel-helpers.js +0 -122
- package/dist/actions/otel-helpers.js.map +0 -1
- package/dist/otel/context.d.ts +0 -24
- package/dist/otel/context.d.ts.map +0 -1
- package/dist/otel/context.js +0 -29
- package/dist/otel/context.js.map +0 -1
- package/dist/otel/emitter.d.ts +0 -73
- package/dist/otel/emitter.d.ts.map +0 -1
- package/dist/otel/emitter.js +0 -248
- package/dist/otel/emitter.js.map +0 -1
- package/dist/otel/encode.d.ts +0 -48
- package/dist/otel/encode.d.ts.map +0 -1
- package/dist/otel/encode.js +0 -100
- package/dist/otel/encode.js.map +0 -1
- package/dist/otel/index.d.ts +0 -13
- package/dist/otel/index.d.ts.map +0 -1
- package/dist/otel/index.js +0 -10
- package/dist/otel/index.js.map +0 -1
- package/dist/otel/transport.d.ts +0 -57
- package/dist/otel/transport.d.ts.map +0 -1
- package/dist/otel/transport.js +0 -208
- package/dist/otel/transport.js.map +0 -1
- package/dist/otel/types.d.ts +0 -62
- package/dist/otel/types.d.ts.map +0 -1
- package/dist/otel/types.js +0 -2
- package/dist/otel/types.js.map +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure builders: bus-event payloads → recording records. No I/O, no emitter — each function reads a
|
|
3
|
+
* loosely-typed payload defensively and returns a fully-populated record (or `null` when the event
|
|
4
|
+
* cannot yield one). Redaction is NOT done here — records are populated faithfully; the mapper is the
|
|
5
|
+
* single redaction seam.
|
|
6
|
+
*
|
|
7
|
+
* Timestamps: the bus carries ISO strings (and, for a scan result, an epoch-ms number); every record
|
|
8
|
+
* stores epoch ms, converted once here.
|
|
9
|
+
*/
|
|
10
|
+
import type { DslTransitionKind, DslTransitionRecord, PositionLifecycleEvent, PositionLifecycleRecord, RuntimeErrorRecord, RuntimeLifecycleRecord, RuntimeStateRecord, ScannerRunRecord, SignalDecision, SignalEvaluatedRecord, SignalSummary } from "../records.js";
|
|
11
|
+
/** From a `tracking.scanner_run` / `tracking.scanner_run_skipped` / `tracking.scanner_run_error`
|
|
12
|
+
* event (complete runs carry the whole `ScanResult`; skip/error carry status + reason). */
|
|
13
|
+
export declare function buildScannerRun(payload: unknown, nowMs: number): ScannerRunRecord | null;
|
|
14
|
+
/** Pass-level decision state held between `tracking.decision` and its `tracking.action_result`. */
|
|
15
|
+
export interface PendingDecision {
|
|
16
|
+
readonly scannerId?: string;
|
|
17
|
+
readonly startedAtMs: number;
|
|
18
|
+
readonly decision: SignalDecision;
|
|
19
|
+
readonly signals: readonly SignalSummary[];
|
|
20
|
+
}
|
|
21
|
+
/** Build the pending decision from a `tracking.decision` payload. */
|
|
22
|
+
export declare function buildPendingDecision(payload: unknown, nowMs: number): PendingDecision | null;
|
|
23
|
+
/**
|
|
24
|
+
* Pair a held {@link PendingDecision} with its `tracking.action_result` payload into one record.
|
|
25
|
+
* `evaluations` is one entry per per-signal result, each enriched with the matching input signal.
|
|
26
|
+
* The pass span runs decision-ts → action_result-ts; on clock skew (`endedAt < startedAt`) the start
|
|
27
|
+
* is pulled up to `endedAt`, yielding a zero (never negative) duration.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildSignalEvaluated(pending: PendingDecision, actionResultPayload: unknown, nowMs: number): SignalEvaluatedRecord;
|
|
30
|
+
/**
|
|
31
|
+
* A `tracking.action_result` with no held decision — a producer that never emits `tracking.decision`
|
|
32
|
+
* for the pass (e.g. close-position's static-params path, `decision_mode: 'none'` + `params.asset`).
|
|
33
|
+
* The record carries the per-signal outcomes with signals synthesized from the result entries and no
|
|
34
|
+
* `decision` (the contract allows a decision-less pass); zero duration (`startedAt = endedAt` = the
|
|
35
|
+
* action_result timestamp).
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildResultOnlyEvaluated(actionResultPayload: unknown, nowMs: number): SignalEvaluatedRecord | null;
|
|
38
|
+
/**
|
|
39
|
+
* A decision that never received its action_result (the action threw or returned before emitting
|
|
40
|
+
* one). Flushed when the same action's next decision arrives, so a decided-but-unresulted pass is
|
|
41
|
+
* visible on the signal axis rather than silently dropped: no evaluations, zero duration
|
|
42
|
+
* (`startedAt = endedAt =` the decision timestamp).
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildDecisionOnlyEvaluated(pending: PendingDecision): SignalEvaluatedRecord;
|
|
45
|
+
/**
|
|
46
|
+
* From an `on_position_*` event. Action-driven events arrive as HookEvents (fields under a `data`
|
|
47
|
+
* envelope); the DSL monitor / reconcile paths emit `on_position_closed` flat (fields at the root,
|
|
48
|
+
* always with an `asset`), so a flat payload carrying an `asset` is read as-is. The DSL archive
|
|
49
|
+
* handler's re-broadcast of a close is marked `source: "dsl_archive"` and skipped — the close it
|
|
50
|
+
* mirrors was already recorded from the original emit. (`on_open_order_submitted` is deliberately
|
|
51
|
+
* not recorded — its submit fact is already on the signal-evaluation view, avoiding a double count.)
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildPositionLifecycle(event: PositionLifecycleEvent, payload: unknown, nowMs: number): PositionLifecycleRecord | null;
|
|
54
|
+
/** From a `dsl.*` event (fields live at the payload root, with an ISO `timestamp`). */
|
|
55
|
+
export declare function buildDslTransition(transition: DslTransitionKind, payload: unknown, nowMs: number): DslTransitionRecord | null;
|
|
56
|
+
/** From `signal_processing_error` — a bucket-2 error with no specific domain record home. */
|
|
57
|
+
export declare function buildRuntimeError(payload: unknown, nowMs: number): RuntimeErrorRecord | null;
|
|
58
|
+
/**
|
|
59
|
+
* From `tracking.runtime_started`. The `config` blob is the injected **unresolved** config (not the
|
|
60
|
+
* resolved `data.config` on the bus): resolving inlines secrets, and the unresolved form is what the
|
|
61
|
+
* `configHash` is computed over, so blob and hash agree.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildRuntimeStarted(payload: unknown, unresolvedConfig: Record<string, unknown> | undefined, nowMs: number): RuntimeLifecycleRecord | null;
|
|
64
|
+
/** From `tracking.runtime_stopped`. */
|
|
65
|
+
export declare function buildRuntimeStopped(payload: unknown, nowMs: number): RuntimeLifecycleRecord | null;
|
|
66
|
+
/** From the self-pause HookEvents (`on_strategy_self_paused`/`on_daily_limit_hit`/`on_drawdown_cap_hit`). */
|
|
67
|
+
export declare function buildRuntimePaused(payload: unknown, fallbackGateId: string, nowMs: number): RuntimeStateRecord | null;
|
|
68
|
+
//# sourceMappingURL=record-builders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-builders.d.ts","sourceRoot":"","sources":["../../../src/recording/wiring/record-builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAElB,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EAIrB,aAAa,EAEd,MAAM,eAAe,CAAC;AAoDvB;2FAC2F;AAC3F,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CA4BxF;AAID,mGAAmG;AACnG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAwB5F;AAsFD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAqBjI;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAWlH;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,eAAe,GAAG,qBAAqB,CAS1F;AAUD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAoCrI;AAID,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CA+C7H;AAID,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA0B5F;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAczJ;AAED,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAWlG;AAID,6GAA6G;AAC7G,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAcrH"}
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure builders: bus-event payloads → recording records. No I/O, no emitter — each function reads a
|
|
3
|
+
* loosely-typed payload defensively and returns a fully-populated record (or `null` when the event
|
|
4
|
+
* cannot yield one). Redaction is NOT done here — records are populated faithfully; the mapper is the
|
|
5
|
+
* single redaction seam.
|
|
6
|
+
*
|
|
7
|
+
* Timestamps: the bus carries ISO strings (and, for a scan result, an epoch-ms number); every record
|
|
8
|
+
* stores epoch ms, converted once here.
|
|
9
|
+
*/
|
|
10
|
+
import { asObject, bool, num, str, toEpochMs } from "./values.js";
|
|
11
|
+
/** `"LONG"`/`"SHORT"` → {@link TradeDirection}, else `null` (non-directional). */
|
|
12
|
+
function direction(value) {
|
|
13
|
+
return value === "LONG" || value === "SHORT" ? value : null;
|
|
14
|
+
}
|
|
15
|
+
/** Strict direction (no null) for records that never carry a non-directional value (DSL). */
|
|
16
|
+
function strictDirection(value) {
|
|
17
|
+
return direction(value) ?? undefined;
|
|
18
|
+
}
|
|
19
|
+
/** A boolean, or `null` when explicitly null (preserves the "unfilled" signal), else `undefined`. */
|
|
20
|
+
function boolOrNull(value) {
|
|
21
|
+
if (typeof value === "boolean")
|
|
22
|
+
return value;
|
|
23
|
+
return value === null ? null : undefined;
|
|
24
|
+
}
|
|
25
|
+
function numOrNull(value) {
|
|
26
|
+
if (value === null)
|
|
27
|
+
return null;
|
|
28
|
+
return num(value);
|
|
29
|
+
}
|
|
30
|
+
// ─── Scanner run ─────────────────────────────────────────────────────────────
|
|
31
|
+
function scannerOutcome(status) {
|
|
32
|
+
switch (status) {
|
|
33
|
+
case "error":
|
|
34
|
+
return "error";
|
|
35
|
+
case "skipped":
|
|
36
|
+
case "disabled":
|
|
37
|
+
case "halted":
|
|
38
|
+
return "skipped";
|
|
39
|
+
default:
|
|
40
|
+
return "complete";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function buildSignalSummary(raw, fallbackTs) {
|
|
44
|
+
const s = asObject(raw) ?? {};
|
|
45
|
+
return {
|
|
46
|
+
signalType: str(s.signalType) ?? "",
|
|
47
|
+
asset: str(s.asset) ?? "",
|
|
48
|
+
direction: direction(s.direction),
|
|
49
|
+
score: num(s.score) ?? 0,
|
|
50
|
+
timestamp: num(s.timestamp) ?? fallbackTs,
|
|
51
|
+
factors: asObject(s.factors),
|
|
52
|
+
meta: asObject(s.meta),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** From a `tracking.scanner_run` / `tracking.scanner_run_skipped` / `tracking.scanner_run_error`
|
|
56
|
+
* event (complete runs carry the whole `ScanResult`; skip/error carry status + reason). */
|
|
57
|
+
export function buildScannerRun(payload, nowMs) {
|
|
58
|
+
const p = asObject(payload);
|
|
59
|
+
const data = asObject(p?.data);
|
|
60
|
+
if (!data)
|
|
61
|
+
return null;
|
|
62
|
+
const ts = toEpochMs(data.timestamp, toEpochMs(p?.timestamp, nowMs));
|
|
63
|
+
// The runtime surfaces the run start additively on the event; when absent (older payloads),
|
|
64
|
+
// startedAt = endedAt. Clamped so endedAt ≥ startedAt always holds for the mapper.
|
|
65
|
+
const startedAt = Math.min(toEpochMs(data.startedAt, ts), ts);
|
|
66
|
+
const status = str(data.status);
|
|
67
|
+
const outcome = scannerOutcome(status);
|
|
68
|
+
const signals = Array.isArray(data.signals)
|
|
69
|
+
? data.signals.map((s) => buildSignalSummary(s, ts))
|
|
70
|
+
: undefined;
|
|
71
|
+
return {
|
|
72
|
+
type: "scanner_run",
|
|
73
|
+
scannerId: str(data.scannerId) ?? "",
|
|
74
|
+
outcome,
|
|
75
|
+
statusDetail: status,
|
|
76
|
+
startedAt,
|
|
77
|
+
endedAt: ts,
|
|
78
|
+
scannedCount: num(data.scannedCount),
|
|
79
|
+
actionableCount: num(data.actionableCount),
|
|
80
|
+
signalCount: signals?.length,
|
|
81
|
+
signals,
|
|
82
|
+
summary: asObject(data.summary),
|
|
83
|
+
reason: str(data.reason),
|
|
84
|
+
error: outcome === "error" ? str(data.reason) : undefined,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** Build the pending decision from a `tracking.decision` payload. */
|
|
88
|
+
export function buildPendingDecision(payload, nowMs) {
|
|
89
|
+
const p = asObject(payload);
|
|
90
|
+
const data = asObject(p?.data);
|
|
91
|
+
if (!data)
|
|
92
|
+
return null;
|
|
93
|
+
const startedAtMs = toEpochMs(p?.timestamp, nowMs);
|
|
94
|
+
const d = asObject(data.decision) ?? {};
|
|
95
|
+
const tel = asObject(d.decisionTelemetry);
|
|
96
|
+
const decision = {
|
|
97
|
+
execute: bool(d.execute) ?? false,
|
|
98
|
+
actionType: str(data.actionType) ?? str(d.actionType) ?? "",
|
|
99
|
+
actionName: str(data.actionName),
|
|
100
|
+
mode: str(data.decisionMode),
|
|
101
|
+
confidence: num(d.confidence) ?? 0,
|
|
102
|
+
confidenceThreshold: num(data.minConfidence),
|
|
103
|
+
reasoning: str(d.reasoning) ?? "",
|
|
104
|
+
model: str(data.decisionModel) ?? str(tel?.model),
|
|
105
|
+
tokensUsed: numOrNull(tel?.tokensUsed),
|
|
106
|
+
durationMs: num(tel?.durationMs),
|
|
107
|
+
payload: asObject(d.payload),
|
|
108
|
+
};
|
|
109
|
+
const signals = Array.isArray(data.scannerSignals)
|
|
110
|
+
? data.scannerSignals.map((s) => buildSignalSummary(s, startedAtMs))
|
|
111
|
+
: [];
|
|
112
|
+
return { scannerId: str(data.scannerId), startedAtMs, decision, signals };
|
|
113
|
+
}
|
|
114
|
+
/** Reason codes where the system evaluated a trade and actively blocked it (see {@link classifyOutcome}). */
|
|
115
|
+
const REJECTED_REASONS = new Set(["insufficient_margin", "invalid_direction", "no_margin_configured", "below_min_notional"]);
|
|
116
|
+
/** Reason codes where no trade was applicable / attempted. */
|
|
117
|
+
const SKIPPED_REASONS = new Set(["no_slots", "position_already_exists", "no_open_position"]);
|
|
118
|
+
/**
|
|
119
|
+
* Coarse per-signal classification from the action's per-signal result entry. Semantic, not
|
|
120
|
+
* success-flag-driven: the coarse axis answers "actively blocked vs. not attempted", and the
|
|
121
|
+
* producer's `success` flag encodes "handled without error" — flag-driven mapping would bury
|
|
122
|
+
* risk-gate trips among benign skips like `position_already_exists`.
|
|
123
|
+
* - `executed` — an order was placed (open: `reason:"submitted"`; close: success with a `closeReason`)
|
|
124
|
+
* - `error` — `reason:"exception"` or a carried error message (e.g. `position_open_failed`)
|
|
125
|
+
* - `rejected` — evaluated and actively blocked: `risk_gate_*`, `insufficient_margin`,
|
|
126
|
+
* `invalid_direction`, `no_margin_configured`, `below_min_notional`
|
|
127
|
+
* - `skipped` — not applicable / no capacity: `no_slots`, `position_already_exists`, `no_open_position`
|
|
128
|
+
* Unknown reason codes fall back to the success flag (`false` → rejected, else skipped).
|
|
129
|
+
*/
|
|
130
|
+
function classifyOutcome(reason, success, error, closeReason) {
|
|
131
|
+
if (reason === "submitted" || (success === true && closeReason !== undefined))
|
|
132
|
+
return "executed";
|
|
133
|
+
if (reason === "exception" || error !== undefined)
|
|
134
|
+
return "error";
|
|
135
|
+
if (reason !== undefined) {
|
|
136
|
+
if (reason.startsWith("risk_gate_") || REJECTED_REASONS.has(reason))
|
|
137
|
+
return "rejected";
|
|
138
|
+
if (SKIPPED_REASONS.has(reason))
|
|
139
|
+
return "skipped";
|
|
140
|
+
}
|
|
141
|
+
return success === false ? "rejected" : "skipped";
|
|
142
|
+
}
|
|
143
|
+
function buildOutcome(raw) {
|
|
144
|
+
const r = asObject(raw) ?? {};
|
|
145
|
+
const reason = str(r.reason);
|
|
146
|
+
const success = bool(r.success);
|
|
147
|
+
const error = str(r.error);
|
|
148
|
+
const closeReason = str(r.closeReason);
|
|
149
|
+
return {
|
|
150
|
+
result: classifyOutcome(reason, success, error, closeReason),
|
|
151
|
+
reasonCode: reason,
|
|
152
|
+
reason: closeReason,
|
|
153
|
+
error,
|
|
154
|
+
leverage: num(r.leverage),
|
|
155
|
+
marginAmount: num(r.marginAmount),
|
|
156
|
+
notionalValue: num(r.notionalValue),
|
|
157
|
+
orderId: str(r.orderId),
|
|
158
|
+
entryPrice: num(r.entryPrice),
|
|
159
|
+
size: num(r.size),
|
|
160
|
+
filled: boolOrNull(r.filled),
|
|
161
|
+
executionAsMaker: boolOrNull(r.executionAsMaker),
|
|
162
|
+
requiredMarginAmount: num(r.requiredMarginAmount),
|
|
163
|
+
availableMarginAmount: num(r.availableMarginAmount),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** The per-signal `results[]` entries from a `tracking.action_result` payload. */
|
|
167
|
+
function actionResults(actionResultPayload) {
|
|
168
|
+
const p = asObject(actionResultPayload);
|
|
169
|
+
const data = asObject(p?.data);
|
|
170
|
+
const result = asObject(data?.result);
|
|
171
|
+
const resultData = asObject(result?.data);
|
|
172
|
+
return { data, results: Array.isArray(resultData?.results) ? resultData.results : [] };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* One {@link SignalEvaluation} per per-signal result entry, each enriched with the matching input
|
|
176
|
+
* signal (via `findSignal`) or a synthesized summary from the result entry itself when none matches.
|
|
177
|
+
*/
|
|
178
|
+
function buildEvaluations(results, findSignal, fallbackTs) {
|
|
179
|
+
return results.map((raw) => {
|
|
180
|
+
const r = asObject(raw) ?? {};
|
|
181
|
+
const asset = str(r.asset);
|
|
182
|
+
const signal = (asset !== undefined ? findSignal(asset) : undefined) ?? {
|
|
183
|
+
signalType: "",
|
|
184
|
+
asset: asset ?? "",
|
|
185
|
+
direction: direction(r.direction),
|
|
186
|
+
score: num(r.score) ?? 0,
|
|
187
|
+
timestamp: fallbackTs,
|
|
188
|
+
};
|
|
189
|
+
return { signal, outcome: buildOutcome(r) };
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Pair a held {@link PendingDecision} with its `tracking.action_result` payload into one record.
|
|
194
|
+
* `evaluations` is one entry per per-signal result, each enriched with the matching input signal.
|
|
195
|
+
* The pass span runs decision-ts → action_result-ts; on clock skew (`endedAt < startedAt`) the start
|
|
196
|
+
* is pulled up to `endedAt`, yielding a zero (never negative) duration.
|
|
197
|
+
*/
|
|
198
|
+
export function buildSignalEvaluated(pending, actionResultPayload, nowMs) {
|
|
199
|
+
const p = asObject(actionResultPayload);
|
|
200
|
+
const { results } = actionResults(actionResultPayload);
|
|
201
|
+
const evaluations = buildEvaluations(results, (asset) => pending.signals.find((s) => s.asset === asset), pending.startedAtMs);
|
|
202
|
+
let startedAt = pending.startedAtMs;
|
|
203
|
+
let endedAt = toEpochMs(p?.timestamp, nowMs);
|
|
204
|
+
if (endedAt < startedAt)
|
|
205
|
+
startedAt = endedAt;
|
|
206
|
+
return {
|
|
207
|
+
type: "signal_evaluated",
|
|
208
|
+
scannerId: pending.scannerId,
|
|
209
|
+
startedAt,
|
|
210
|
+
endedAt,
|
|
211
|
+
decision: pending.decision,
|
|
212
|
+
evaluations,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* A `tracking.action_result` with no held decision — a producer that never emits `tracking.decision`
|
|
217
|
+
* for the pass (e.g. close-position's static-params path, `decision_mode: 'none'` + `params.asset`).
|
|
218
|
+
* The record carries the per-signal outcomes with signals synthesized from the result entries and no
|
|
219
|
+
* `decision` (the contract allows a decision-less pass); zero duration (`startedAt = endedAt` = the
|
|
220
|
+
* action_result timestamp).
|
|
221
|
+
*/
|
|
222
|
+
export function buildResultOnlyEvaluated(actionResultPayload, nowMs) {
|
|
223
|
+
const { data, results } = actionResults(actionResultPayload);
|
|
224
|
+
if (!data)
|
|
225
|
+
return null;
|
|
226
|
+
const endedAt = toEpochMs(asObject(actionResultPayload)?.timestamp, nowMs);
|
|
227
|
+
return {
|
|
228
|
+
type: "signal_evaluated",
|
|
229
|
+
scannerId: str(data.scannerId),
|
|
230
|
+
startedAt: endedAt,
|
|
231
|
+
endedAt,
|
|
232
|
+
evaluations: buildEvaluations(results, () => undefined, endedAt),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* A decision that never received its action_result (the action threw or returned before emitting
|
|
237
|
+
* one). Flushed when the same action's next decision arrives, so a decided-but-unresulted pass is
|
|
238
|
+
* visible on the signal axis rather than silently dropped: no evaluations, zero duration
|
|
239
|
+
* (`startedAt = endedAt =` the decision timestamp).
|
|
240
|
+
*/
|
|
241
|
+
export function buildDecisionOnlyEvaluated(pending) {
|
|
242
|
+
return {
|
|
243
|
+
type: "signal_evaluated",
|
|
244
|
+
scannerId: pending.scannerId,
|
|
245
|
+
startedAt: pending.startedAtMs,
|
|
246
|
+
endedAt: pending.startedAtMs,
|
|
247
|
+
decision: pending.decision,
|
|
248
|
+
evaluations: [],
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// ─── Position lifecycle ──────────────────────────────────────────────────────
|
|
252
|
+
/** Absolute size from a signed-size string/number (`szi`). */
|
|
253
|
+
function absSize(value) {
|
|
254
|
+
const n = num(value);
|
|
255
|
+
return n === undefined ? undefined : Math.abs(n);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* From an `on_position_*` event. Action-driven events arrive as HookEvents (fields under a `data`
|
|
259
|
+
* envelope); the DSL monitor / reconcile paths emit `on_position_closed` flat (fields at the root,
|
|
260
|
+
* always with an `asset`), so a flat payload carrying an `asset` is read as-is. The DSL archive
|
|
261
|
+
* handler's re-broadcast of a close is marked `source: "dsl_archive"` and skipped — the close it
|
|
262
|
+
* mirrors was already recorded from the original emit. (`on_open_order_submitted` is deliberately
|
|
263
|
+
* not recorded — its submit fact is already on the signal-evaluation view, avoiding a double count.)
|
|
264
|
+
*/
|
|
265
|
+
export function buildPositionLifecycle(event, payload, nowMs) {
|
|
266
|
+
const p = asObject(payload);
|
|
267
|
+
if (!p)
|
|
268
|
+
return null;
|
|
269
|
+
if (str(p.source) === "dsl_archive")
|
|
270
|
+
return null;
|
|
271
|
+
const data = asObject(p.data) ?? (str(p.asset) !== undefined ? p : undefined);
|
|
272
|
+
if (!data)
|
|
273
|
+
return null;
|
|
274
|
+
return {
|
|
275
|
+
type: "position_lifecycle",
|
|
276
|
+
event,
|
|
277
|
+
occurredAt: toEpochMs(p?.timestamp, nowMs),
|
|
278
|
+
asset: str(data.asset) ?? "",
|
|
279
|
+
dex: str(data.dex),
|
|
280
|
+
direction: direction(data.direction),
|
|
281
|
+
entryPrice: num(data.entryPrice) ?? num(data.entryPx),
|
|
282
|
+
size: num(data.size) ?? absSize(data.szi),
|
|
283
|
+
leverage: num(data.leverage),
|
|
284
|
+
leverageType: str(data.leverageType),
|
|
285
|
+
margin: num(data.margin),
|
|
286
|
+
unrealizedPnl: num(data.unrealizedPnl),
|
|
287
|
+
roe: num(data.roe),
|
|
288
|
+
liquidationPrice: numOrNull(data.liquidationPrice),
|
|
289
|
+
reason: str(data.reason),
|
|
290
|
+
closeReason: str(data.closeReason),
|
|
291
|
+
closedPrice: num(data.closedPrice),
|
|
292
|
+
closedSize: num(data.closedSize),
|
|
293
|
+
executionAsMaker: boolOrNull(data.executionAsMaker),
|
|
294
|
+
previousEntryPrice: num(data.previousEntryPrice),
|
|
295
|
+
previousSize: num(data.previousSize),
|
|
296
|
+
sizeDelta: num(data.sizeDelta),
|
|
297
|
+
newAsset: str(data.newAsset) ?? str(data.coin),
|
|
298
|
+
orderId: str(data.orderId),
|
|
299
|
+
orderType: str(data.orderType),
|
|
300
|
+
marginAmount: num(data.marginAmount),
|
|
301
|
+
filled: boolOrNull(data.filled),
|
|
302
|
+
reasoning: str(data.reasoning),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
// ─── DSL transitions ─────────────────────────────────────────────────────────
|
|
306
|
+
/** From a `dsl.*` event (fields live at the payload root, with an ISO `timestamp`). */
|
|
307
|
+
export function buildDslTransition(transition, payload, nowMs) {
|
|
308
|
+
const p = asObject(payload);
|
|
309
|
+
if (!p)
|
|
310
|
+
return null;
|
|
311
|
+
const occurredAt = toEpochMs(p.timestamp, nowMs);
|
|
312
|
+
const tiers = Array.isArray(p.tiers)
|
|
313
|
+
? p.tiers.map((t) => {
|
|
314
|
+
const tier = asObject(t) ?? {};
|
|
315
|
+
return { triggerPct: num(tier.triggerPct) ?? 0, lockHwPct: num(tier.lockHwPct) ?? 0 };
|
|
316
|
+
})
|
|
317
|
+
: undefined;
|
|
318
|
+
const phaseRaw = num(p.phase);
|
|
319
|
+
const phase = phaseRaw === 1 || phaseRaw === 2 ? phaseRaw : undefined;
|
|
320
|
+
return {
|
|
321
|
+
type: "dsl_transition",
|
|
322
|
+
transition,
|
|
323
|
+
occurredAt,
|
|
324
|
+
asset: str(p.asset) ?? "",
|
|
325
|
+
dex: str(p.dex),
|
|
326
|
+
triggerReason: str(p.triggerReason),
|
|
327
|
+
preset: str(p.preset),
|
|
328
|
+
tiers,
|
|
329
|
+
direction: strictDirection(p.direction),
|
|
330
|
+
entryPrice: num(p.entryPrice),
|
|
331
|
+
leverage: num(p.leverage),
|
|
332
|
+
margin: num(p.margin),
|
|
333
|
+
size: num(p.size),
|
|
334
|
+
floorPrice: num(p.floorPrice),
|
|
335
|
+
newFloorPrice: num(p.newFloorPrice),
|
|
336
|
+
phase,
|
|
337
|
+
tierIndex: num(p.tierIndex) ?? num(p.tier) ?? numOrNull(p.currentTierIndex),
|
|
338
|
+
lockHwPct: num(p.lockHwPct),
|
|
339
|
+
triggerPct: num(p.triggerPct),
|
|
340
|
+
lockedProfitPct: num(p.lockedProfitPct),
|
|
341
|
+
newSLPrice: num(p.newSLPrice),
|
|
342
|
+
slOrderId: num(p.slOrderId),
|
|
343
|
+
reason: str(p.reason),
|
|
344
|
+
closeReason: str(p.closeReason),
|
|
345
|
+
createdAt: p.createdAt !== undefined ? toEpochMs(p.createdAt, occurredAt) : undefined,
|
|
346
|
+
currentROE: num(p.currentROE),
|
|
347
|
+
highWaterRoe: num(p.highWaterRoe),
|
|
348
|
+
highWaterPrice: num(p.highWaterPrice),
|
|
349
|
+
peakROE: num(p.peakROE),
|
|
350
|
+
lastPrice: num(p.lastPrice),
|
|
351
|
+
attempt: num(p.attempt),
|
|
352
|
+
updated: Array.isArray(p.updated) ? p.updated.filter((x) => typeof x === "string") : undefined,
|
|
353
|
+
backendDslPositionId: typeof p.backendDslPositionId === "string" ? p.backendDslPositionId : p.backendDslPositionId === null ? null : undefined,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
// ─── Runtime error ───────────────────────────────────────────────────────────
|
|
357
|
+
/** From `signal_processing_error` — a bucket-2 error with no specific domain record home. */
|
|
358
|
+
export function buildRuntimeError(payload, nowMs) {
|
|
359
|
+
const p = asObject(payload);
|
|
360
|
+
if (!p)
|
|
361
|
+
return null;
|
|
362
|
+
const err = p.error;
|
|
363
|
+
let message;
|
|
364
|
+
let errorName;
|
|
365
|
+
let stack;
|
|
366
|
+
if (err instanceof Error) {
|
|
367
|
+
message = err.message;
|
|
368
|
+
errorName = err.name;
|
|
369
|
+
stack = err.stack;
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
const e = asObject(err);
|
|
373
|
+
message = str(e?.message) ?? String(err);
|
|
374
|
+
errorName = str(e?.name);
|
|
375
|
+
stack = str(e?.stack);
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
type: "runtime_error",
|
|
379
|
+
occurredAt: toEpochMs(p.timestamp, nowMs),
|
|
380
|
+
phase: "signal_processing",
|
|
381
|
+
message,
|
|
382
|
+
errorName,
|
|
383
|
+
scannerId: str(p.scannerId),
|
|
384
|
+
stack,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
// ─── Runtime lifecycle ───────────────────────────────────────────────────────
|
|
388
|
+
/**
|
|
389
|
+
* From `tracking.runtime_started`. The `config` blob is the injected **unresolved** config (not the
|
|
390
|
+
* resolved `data.config` on the bus): resolving inlines secrets, and the unresolved form is what the
|
|
391
|
+
* `configHash` is computed over, so blob and hash agree.
|
|
392
|
+
*/
|
|
393
|
+
export function buildRuntimeStarted(payload, unresolvedConfig, nowMs) {
|
|
394
|
+
const p = asObject(payload);
|
|
395
|
+
const data = asObject(p?.data);
|
|
396
|
+
if (!data)
|
|
397
|
+
return null;
|
|
398
|
+
return {
|
|
399
|
+
type: "runtime_lifecycle",
|
|
400
|
+
phase: "started",
|
|
401
|
+
occurredAt: toEpochMs(p?.timestamp, nowMs),
|
|
402
|
+
runtimeVersion: str(data.runtimeVersion),
|
|
403
|
+
hasDsl: bool(data.hasDsl),
|
|
404
|
+
scannerCount: num(data.scannerCount),
|
|
405
|
+
actionCount: num(data.actionCount),
|
|
406
|
+
config: unresolvedConfig,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
/** From `tracking.runtime_stopped`. */
|
|
410
|
+
export function buildRuntimeStopped(payload, nowMs) {
|
|
411
|
+
const p = asObject(payload);
|
|
412
|
+
const data = asObject(p?.data);
|
|
413
|
+
if (!data)
|
|
414
|
+
return null;
|
|
415
|
+
return {
|
|
416
|
+
type: "runtime_lifecycle",
|
|
417
|
+
phase: "stopped",
|
|
418
|
+
occurredAt: toEpochMs(p?.timestamp, nowMs),
|
|
419
|
+
runtimeVersion: str(data.runtimeVersion),
|
|
420
|
+
uptimeMs: num(data.uptimeMs),
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
// ─── Runtime state (self-pause) ──────────────────────────────────────────────
|
|
424
|
+
/** From the self-pause HookEvents (`on_strategy_self_paused`/`on_daily_limit_hit`/`on_drawdown_cap_hit`). */
|
|
425
|
+
export function buildRuntimePaused(payload, fallbackGateId, nowMs) {
|
|
426
|
+
const p = asObject(payload);
|
|
427
|
+
const data = asObject(p?.data);
|
|
428
|
+
if (!data)
|
|
429
|
+
return null;
|
|
430
|
+
return {
|
|
431
|
+
type: "runtime_state",
|
|
432
|
+
phase: "paused",
|
|
433
|
+
occurredAt: toEpochMs(p?.timestamp, nowMs),
|
|
434
|
+
gateId: str(data.gateId) ?? fallbackGateId,
|
|
435
|
+
gateName: str(data.gateName),
|
|
436
|
+
source: str(data.source),
|
|
437
|
+
reason: str(data.reason),
|
|
438
|
+
metrics: asObject(data.metrics) ?? null,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=record-builders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-builders.js","sourceRoot":"","sources":["../../../src/recording/wiring/record-builders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recording subscriber — the integration seam: subscribes to the `SenpiEventBus`, builds records
|
|
3
|
+
* from events, and forwards them to a {@link RecordingEmitter}. Pure consumer: it changes no trading
|
|
4
|
+
* behavior and emits no new bus events.
|
|
5
|
+
*
|
|
6
|
+
* Rule 3 (load-bearing): a throw inside a bus `on()` handler propagates synchronously back through
|
|
7
|
+
* `bus.emit` into the producer, so every handler wraps record assembly in try/catch and swallows.
|
|
8
|
+
* The emitter is already fire-and-forget; this guards the *assembly* boundary.
|
|
9
|
+
*/
|
|
10
|
+
import type { SenpiEventBus } from "../../types/event-bus.js";
|
|
11
|
+
import type { RecordingEmitter } from "../emitter.js";
|
|
12
|
+
export interface RecordingSubscriber {
|
|
13
|
+
/** Unsubscribe every handler. Idempotent. */
|
|
14
|
+
dispose(): void;
|
|
15
|
+
}
|
|
16
|
+
export interface RecordingSubscriberDeps {
|
|
17
|
+
/** Unresolved config stamped onto the runtime-started lifecycle record (never the resolved form). */
|
|
18
|
+
readonly unresolvedConfig?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createRecordingSubscriber(bus: SenpiEventBus, emitter: RecordingEmitter, deps?: RecordingSubscriberDeps): RecordingSubscriber;
|
|
21
|
+
//# sourceMappingURL=subscriber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../../src/recording/wiring/subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAqBtD,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,qGAAqG;IACrG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrD;AA4CD,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,gBAAgB,EACzB,IAAI,GAAE,uBAA4B,GACjC,mBAAmB,CAoHrB"}
|