@senpi/runtime 3.0.6-dev.runtime-phase-2.20260630134145 → 3.0.6-dev.runtime-phase-2.20260630134327

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 (140) hide show
  1. package/dist/actions/close-position/close-position.action.d.ts +1 -1
  2. package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
  3. package/dist/actions/close-position/close-position.action.js +109 -78
  4. package/dist/actions/close-position/close-position.action.js.map +1 -1
  5. package/dist/actions/decision-engine.d.ts.map +1 -1
  6. package/dist/actions/decision-engine.js +40 -28
  7. package/dist/actions/decision-engine.js.map +1 -1
  8. package/dist/actions/event-derivation.d.ts +60 -0
  9. package/dist/actions/event-derivation.d.ts.map +1 -0
  10. package/dist/actions/event-derivation.js +179 -0
  11. package/dist/actions/event-derivation.js.map +1 -0
  12. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -1
  13. package/dist/actions/llm-decision/anthropic-llm-decision.js +1 -2
  14. package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -1
  15. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
  16. package/dist/actions/llm-decision/openclaw-llm-decision.js +1 -2
  17. package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
  18. package/dist/actions/open-position/open-position.action.d.ts +1 -1
  19. package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
  20. package/dist/actions/open-position/open-position.action.js +283 -217
  21. package/dist/actions/open-position/open-position.action.js.map +1 -1
  22. package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
  23. package/dist/actions/position-tracker/position-tracker.action.js +2 -4
  24. package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
  25. package/dist/actions/tracking-helpers.d.ts +41 -3
  26. package/dist/actions/tracking-helpers.d.ts.map +1 -1
  27. package/dist/actions/tracking-helpers.js +100 -11
  28. package/dist/actions/tracking-helpers.js.map +1 -1
  29. package/dist/dsl/monitor/create-monitor.d.ts +3 -0
  30. package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
  31. package/dist/dsl/monitor/create-monitor.js +76 -28
  32. package/dist/dsl/monitor/create-monitor.js.map +1 -1
  33. package/dist/dsl/monitor/process-one-position.d.ts +2 -1
  34. package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
  35. package/dist/dsl/monitor/process-one-position.js +84 -38
  36. package/dist/dsl/monitor/process-one-position.js.map +1 -1
  37. package/dist/dsl/plugin/index.d.ts +10 -0
  38. package/dist/dsl/plugin/index.d.ts.map +1 -1
  39. package/dist/dsl/plugin/index.js +42 -4
  40. package/dist/dsl/plugin/index.js.map +1 -1
  41. package/dist/dsl/plugin/options.d.ts +3 -0
  42. package/dist/dsl/plugin/options.d.ts.map +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +5 -2
  45. package/dist/index.js.map +1 -1
  46. package/dist/recording/otel/attributes.d.ts +2 -0
  47. package/dist/recording/otel/attributes.d.ts.map +1 -1
  48. package/dist/recording/otel/attributes.js +1 -1
  49. package/dist/recording/otel/attributes.js.map +1 -1
  50. package/dist/recording/otel/mappers.d.ts.map +1 -1
  51. package/dist/recording/otel/mappers.js +1 -0
  52. package/dist/recording/otel/mappers.js.map +1 -1
  53. package/dist/recording/records.d.ts +7 -1
  54. package/dist/recording/records.d.ts.map +1 -1
  55. package/dist/recording/wiring/record-builders.d.ts.map +1 -1
  56. package/dist/recording/wiring/record-builders.js +5 -2
  57. package/dist/recording/wiring/record-builders.js.map +1 -1
  58. package/dist/runtime/auto-update/coordinator.js +2 -2
  59. package/dist/runtime/auto-update/coordinator.js.map +1 -1
  60. package/dist/runtime/create-actions.d.ts.map +1 -1
  61. package/dist/runtime/create-actions.js +40 -15
  62. package/dist/runtime/create-actions.js.map +1 -1
  63. package/dist/runtime/create-scanner-module.d.ts +2 -1
  64. package/dist/runtime/create-scanner-module.d.ts.map +1 -1
  65. package/dist/runtime/create-scanner-module.js +2 -1
  66. package/dist/runtime/create-scanner-module.js.map +1 -1
  67. package/dist/runtime/domain-events.d.ts +43 -0
  68. package/dist/runtime/domain-events.d.ts.map +1 -0
  69. package/dist/runtime/domain-events.js +181 -0
  70. package/dist/runtime/domain-events.js.map +1 -0
  71. package/dist/runtime/lifecycle-events.d.ts +43 -0
  72. package/dist/runtime/lifecycle-events.d.ts.map +1 -0
  73. package/dist/runtime/lifecycle-events.js +139 -0
  74. package/dist/runtime/lifecycle-events.js.map +1 -0
  75. package/dist/runtime/notifications.js +2 -2
  76. package/dist/runtime/notifications.js.map +1 -1
  77. package/dist/runtime/runtime-schema.d.ts +120 -120
  78. package/dist/runtime/runtime.d.ts +11 -0
  79. package/dist/runtime/runtime.d.ts.map +1 -1
  80. package/dist/runtime/runtime.js +159 -88
  81. package/dist/runtime/runtime.js.map +1 -1
  82. package/dist/runtime/strategy-lifecycle.d.ts.map +1 -1
  83. package/dist/runtime/strategy-lifecycle.js +13 -1
  84. package/dist/runtime/strategy-lifecycle.js.map +1 -1
  85. package/dist/runtime-api/routes/signals.d.ts +1 -1
  86. package/dist/runtime-api/routes/signals.d.ts.map +1 -1
  87. package/dist/runtime-api/routes/signals.js +2 -8
  88. package/dist/runtime-api/routes/signals.js.map +1 -1
  89. package/dist/scanners/engine/data-providers.d.ts +3 -0
  90. package/dist/scanners/engine/data-providers.d.ts.map +1 -1
  91. package/dist/scanners/engine/data-providers.js.map +1 -1
  92. package/dist/scanners/engine/engine.d.ts +18 -0
  93. package/dist/scanners/engine/engine.d.ts.map +1 -1
  94. package/dist/scanners/engine/engine.js +93 -2
  95. package/dist/scanners/engine/engine.js.map +1 -1
  96. package/dist/scanners/engine/input-resolver.d.ts.map +1 -1
  97. package/dist/scanners/engine/input-resolver.js +9 -7
  98. package/dist/scanners/engine/input-resolver.js.map +1 -1
  99. package/dist/scanners/runtime-module.d.ts +3 -0
  100. package/dist/scanners/runtime-module.d.ts.map +1 -1
  101. package/dist/scanners/runtime-module.js +1 -0
  102. package/dist/scanners/runtime-module.js.map +1 -1
  103. package/dist/senpi/client.d.ts.map +1 -1
  104. package/dist/senpi/client.js +7 -5
  105. package/dist/senpi/client.js.map +1 -1
  106. package/dist/skills-manager/coordinator.js +3 -3
  107. package/dist/skills-manager/coordinator.js.map +1 -1
  108. package/dist/telemetry/otel-sdk.d.ts +8 -2
  109. package/dist/telemetry/otel-sdk.d.ts.map +1 -1
  110. package/dist/telemetry/otel-sdk.js +17 -4
  111. package/dist/telemetry/otel-sdk.js.map +1 -1
  112. package/dist/telemetry/trace-identity.d.ts +32 -0
  113. package/dist/telemetry/trace-identity.d.ts.map +1 -0
  114. package/dist/telemetry/trace-identity.js +59 -0
  115. package/dist/telemetry/trace-identity.js.map +1 -0
  116. package/dist/telemetry/tracing.d.ts +32 -0
  117. package/dist/telemetry/tracing.d.ts.map +1 -0
  118. package/dist/telemetry/tracing.js +70 -0
  119. package/dist/telemetry/tracing.js.map +1 -0
  120. package/dist/tracking/context.d.ts +6 -0
  121. package/dist/tracking/context.d.ts.map +1 -1
  122. package/dist/tracking/context.js.map +1 -1
  123. package/dist/tracking/spans/plugin-span-tracker.d.ts.map +1 -1
  124. package/dist/tracking/spans/plugin-span-tracker.js +12 -12
  125. package/dist/tracking/spans/plugin-span-tracker.js.map +1 -1
  126. package/dist/tracking/spans/redact-pii.d.ts +3 -3
  127. package/dist/tracking/spans/redact-pii.d.ts.map +1 -1
  128. package/dist/tracking/spans/redact-pii.js +6 -7
  129. package/dist/tracking/spans/redact-pii.js.map +1 -1
  130. package/dist/types/scanner.d.ts +2 -0
  131. package/dist/types/scanner.d.ts.map +1 -1
  132. package/dist/utils/event-catalog.d.ts +269 -0
  133. package/dist/utils/event-catalog.d.ts.map +1 -0
  134. package/dist/utils/event-catalog.js +91 -0
  135. package/dist/utils/event-catalog.js.map +1 -0
  136. package/dist/utils/logger.d.ts +58 -5
  137. package/dist/utils/logger.d.ts.map +1 -1
  138. package/dist/utils/logger.js +359 -27
  139. package/dist/utils/logger.js.map +1 -1
  140. package/package.json +5 -1
@@ -1,6 +1,19 @@
1
1
  /**
2
2
  * Shared structured logger factory. Components create a logger with a namespace.
3
+ *
4
+ * Dual sink, one shape: every record renders to the TTY via `console.*` and is emitted
5
+ * as a real OTel LogRecord via the global Logs API. When the SDK is not initialised (off,
6
+ * or under test) the API resolves a no-op logger, so the emit is a near-zero no-op — no
7
+ * `enabled` gate needed. trace_id/span_id are stamped natively from the active span; the
8
+ * per-runtime `senpi.*` identity rides in via the async-context bag (see `trackingContext`).
3
9
  */
10
+ import { logs, SeverityNumber } from "@opentelemetry/api-logs";
11
+ import { context, trace, SpanStatusCode } from "@opentelemetry/api";
12
+ import { getTrackingContext } from "../tracking/context.js";
13
+ import { capValue } from "../recording/otel/attributes.js";
14
+ import { MAX_ATTR_VALUE_CHARS, MAX_BAG_KEYS, MAX_TOTAL_ATTR_CHARS, } from "../recording/otel/constants.js";
15
+ import { getDefaultPiiRedactor } from "../tracking/spans/redact-pii.js";
16
+ import { canonicalSeverity, } from "./event-catalog.js";
4
17
  const levelOrder = {
5
18
  debug: 0,
6
19
  info: 1,
@@ -55,6 +68,129 @@ export function clearErrorNotifier() {
55
68
  function shouldLog(level) {
56
69
  return levelOrder[level] >= levelOrder[minLevel];
57
70
  }
71
+ /** Instrumentation scope for emitted LogRecords; matches the tracer name. */
72
+ const LOGGER_SCOPE = "senpi-trading-runtime";
73
+ const severityByLevel = {
74
+ debug: SeverityNumber.DEBUG,
75
+ info: SeverityNumber.INFO,
76
+ warn: SeverityNumber.WARN,
77
+ error: SeverityNumber.ERROR,
78
+ };
79
+ /** Normalize any thrown value to OTel exception semconv. Full type + message + stack for `Error`s. */
80
+ function normalizeException(error) {
81
+ if (error instanceof Error) {
82
+ const normalized = { type: error.name, message: error.message };
83
+ if (error.stack)
84
+ normalized.stacktrace = error.stack;
85
+ return normalized;
86
+ }
87
+ return { message: String(error) };
88
+ }
89
+ /** The exception-semconv attribute keys for an emitted LogRecord. */
90
+ function exceptionAttributes(exception) {
91
+ const attrs = { "exception.message": exception.message };
92
+ if (exception.type !== undefined)
93
+ attrs["exception.type"] = exception.type;
94
+ if (exception.stacktrace !== undefined)
95
+ attrs["exception.stacktrace"] = exception.stacktrace;
96
+ return attrs;
97
+ }
98
+ /**
99
+ * Safety net for raw `Error`s in the attributes bag: an `Error` is not a valid OTel attribute value,
100
+ * so it would be silently dropped. Strip every `Error` from the bag (keeping attributes valid) and
101
+ * surface the first one — for the legacy `{ err }` convention the caller passed no explicit error, so
102
+ * that first `Error` becomes the exception and the record is flagged (`code.error.scavenged`) to make
103
+ * the un-migrated site findable. Returns null when the bag holds no `Error`.
104
+ */
105
+ function scavengeBagError(attributes) {
106
+ if (typeof attributes !== "object" || attributes === null || Array.isArray(attributes))
107
+ return null;
108
+ const entries = Object.entries(attributes);
109
+ const hit = entries.find(([, value]) => value instanceof Error);
110
+ if (hit === undefined)
111
+ return null;
112
+ const cleaned = {};
113
+ for (const [key, value] of entries) {
114
+ if (!(value instanceof Error))
115
+ cleaned[key] = value;
116
+ }
117
+ return { error: hit[1], cleaned };
118
+ }
119
+ /**
120
+ * Resolve the discriminated `(message, error?, attributes?)` arguments. The error slot collides with
121
+ * the legacy attributes-second convention, so we disambiguate at runtime: an explicit attributes arg
122
+ * (`arg3`) makes `arg2` the error; otherwise a plain object in `arg2` is the attributes bag
123
+ * (back-compat) and anything else — an `Error`, a thrown string/number, etc. — is the error. A thrown
124
+ * plain object (rare) is indistinguishable from a bag, so use the explicit three-arg form for it.
125
+ */
126
+ function resolveErrorArgs(arg2, arg3) {
127
+ if (arg3 !== undefined)
128
+ return { error: arg2, attributes: arg3 };
129
+ if (typeof arg2 === "object" && arg2 !== null && !Array.isArray(arg2) && !(arg2 instanceof Error)) {
130
+ return { error: undefined, attributes: arg2 };
131
+ }
132
+ return { error: arg2, attributes: undefined };
133
+ }
134
+ /**
135
+ * Record the error on the active span: `recordException` for both warn and error so
136
+ * a swallowed-and-continuing failure still paints the waterfall (`withSpan` only records on rethrow);
137
+ * `setStatus(ERROR)` for `error` only — a `warn` is a handled failure and must not fail the span.
138
+ */
139
+ function recordExceptionOnActiveSpan(error, level) {
140
+ try {
141
+ const span = trace.getActiveSpan();
142
+ if (span === undefined)
143
+ return;
144
+ span.recordException(error instanceof Error ? error : { message: String(error) });
145
+ if (level === "error") {
146
+ span.setStatus({
147
+ code: SpanStatusCode.ERROR,
148
+ message: error instanceof Error ? error.message : String(error),
149
+ });
150
+ }
151
+ }
152
+ catch {
153
+ // A tracing failure must never disturb the logging caller.
154
+ }
155
+ }
156
+ /**
157
+ * Assemble LogRecord attributes: the component namespace, the caller's `attributes` (a plain
158
+ * object is the attributes bag — spread as-is; anything else is wrapped under `log.attributes`),
159
+ * any `extra` keys the warn/error path derived (exception semconv + the scavenger flag), and the
160
+ * current runtime's `senpi.*` identity from async-context (last, so it can't be clobbered). Identity
161
+ * is absent outside a runtime flow (e.g. process boot) — correct, not a gap.
162
+ */
163
+ function buildLogAttributes(namespace, attributes, extra) {
164
+ const merged = { "code.namespace": namespace };
165
+ if (attributes !== undefined) {
166
+ if (typeof attributes === "object" && attributes !== null && !Array.isArray(attributes)) {
167
+ Object.assign(merged, attributes);
168
+ }
169
+ else {
170
+ merged["log.attributes"] = attributes;
171
+ }
172
+ }
173
+ if (extra !== undefined)
174
+ Object.assign(merged, extra);
175
+ const identity = getTrackingContext()?.identityAttributes;
176
+ if (identity)
177
+ Object.assign(merged, identity);
178
+ return merged;
179
+ }
180
+ /** Emit a structured LogRecord to the global Logs API. Guarded: telemetry never breaks the caller. */
181
+ function emitLogRecord(namespace, level, message, attributes, extra) {
182
+ try {
183
+ logs.getLogger(LOGGER_SCOPE).emit({
184
+ severityNumber: severityByLevel[level],
185
+ severityText: level.toUpperCase(),
186
+ body: message,
187
+ attributes: buildLogAttributes(namespace, attributes, extra),
188
+ });
189
+ }
190
+ catch {
191
+ // A telemetry-side failure must never disturb the logging caller.
192
+ }
193
+ }
58
194
  function dispatchErrorNotification(payload) {
59
195
  const notifier = errorNotifier;
60
196
  if (notifier == null || notifyingError)
@@ -72,59 +208,255 @@ function dispatchErrorNotification(payload) {
72
208
  }
73
209
  })();
74
210
  }
211
+ /** Cap each redact-slot string at the per-value limit. Keys are pinned at the call site, so unbounded. */
212
+ function capRedactFields(fields) {
213
+ const out = {};
214
+ for (const [key, value] of Object.entries(fields)) {
215
+ out[key] = capValue(value, MAX_ATTR_VALUE_CHARS);
216
+ }
217
+ return out;
218
+ }
219
+ /** Cap string scalar values at the per-value limit; numbers/booleans pass through. Not redacted. */
220
+ function capScalars(attributes) {
221
+ if (attributes === undefined)
222
+ return undefined;
223
+ const out = {};
224
+ for (const [key, value] of Object.entries(attributes)) {
225
+ out[key] = typeof value === "string" ? capValue(value, MAX_ATTR_VALUE_CHARS) : value;
226
+ }
227
+ return out;
228
+ }
229
+ /**
230
+ * Merge an event's redacted free-text fields and scalar attributes into one bag under a total-size +
231
+ * key-count budget (the same caps the recording row builder enforces, so one fat event can't blow
232
+ * past the OTLP body cap and drop the whole record). Scalars are added after the redact fields, so on
233
+ * a key collision the safe structured scalar wins over the free-text field — the redact slot is
234
+ * supplementary, not primary. Per-value capping already happened upstream. Runtime identity is
235
+ * layered on later in {@link buildLogAttributes} and stays authoritative.
236
+ */
237
+ function mergeEventAttributes(attributes, redactFields) {
238
+ const merged = {};
239
+ let totalChars = 0;
240
+ let keyCount = 0;
241
+ const add = (key, value) => {
242
+ const cost = key.length + String(value).length;
243
+ if (keyCount >= MAX_BAG_KEYS || totalChars + cost > MAX_TOTAL_ATTR_CHARS)
244
+ return;
245
+ if (!(key in merged))
246
+ keyCount++;
247
+ merged[key] = value;
248
+ totalChars += cost;
249
+ };
250
+ if (redactFields !== undefined)
251
+ for (const [k, v] of Object.entries(redactFields))
252
+ add(k, v);
253
+ if (attributes !== undefined)
254
+ for (const [k, v] of Object.entries(attributes))
255
+ add(k, v);
256
+ return merged;
257
+ }
258
+ /**
259
+ * Emit one event LogRecord: the caller's safe scalar `attributes`, the (already capped) redacted
260
+ * free-text `redactFields`, `code.namespace`, runtime identity, and the catalog `name` as the OTel
261
+ * eventName. Severity is from `level`; the body is the narrative. `timestampMs` is the call-time
262
+ * stamp — passed explicitly so the redacted path (which emits a tick or more late) records the time
263
+ * the event happened, not the time redaction finished, keeping the log ordered by occurrence.
264
+ * Guarded — telemetry never disturbs the caller.
265
+ */
266
+ function emitEventRecord(namespace, name, level, body, attributes, redactFields, timestampMs) {
267
+ try {
268
+ const merged = buildLogAttributes(namespace, mergeEventAttributes(attributes, redactFields));
269
+ logs.getLogger(LOGGER_SCOPE).emit({
270
+ timestamp: timestampMs,
271
+ severityNumber: severityByLevel[level],
272
+ severityText: level.toUpperCase(),
273
+ eventName: name,
274
+ body,
275
+ attributes: merged,
276
+ });
277
+ }
278
+ catch {
279
+ // A telemetry-side failure must never disturb the logging caller.
280
+ }
281
+ }
282
+ /**
283
+ * Redact the free-text fields (already capped) and emit, re-entering the captured trace context so
284
+ * the deferred LogRecord still carries the active span's `trace_id`/`span_id` and runtime identity.
285
+ * Redaction is intrinsically async (the redactor scans + awaits its mnemonic pre-pass), so this path
286
+ * cannot be made synchronous; the record carries the call-time `timestampMs`, so a consumer sorting
287
+ * by timestamp sees it in occurrence order regardless of how late redaction finishes. Fire-and-forget:
288
+ * the caller's `void` contract holds. Any failure — a thrown redactor, an emit error — is swallowed;
289
+ * an individual string whose redaction throws is dropped rather than emitted raw, so nothing
290
+ * unredacted reaches the wire on this path.
291
+ */
292
+ function emitEventRedacted(redactor, captured, namespace, name, level, body, attributes, redactFields, timestampMs) {
293
+ void (async () => {
294
+ try {
295
+ const redacted = {};
296
+ for (const [key, value] of Object.entries(redactFields)) {
297
+ try {
298
+ redacted[key] = await redactor.redact(value);
299
+ }
300
+ catch {
301
+ // Drop a value whose redaction threw rather than emit it unredacted.
302
+ }
303
+ }
304
+ context.with(captured, () => {
305
+ emitEventRecord(namespace, name, level, body, attributes, redacted, timestampMs);
306
+ });
307
+ }
308
+ catch {
309
+ // The whole deferred path is fire-and-forget; no failure may surface as an
310
+ // unhandled rejection on the caller's process.
311
+ }
312
+ })();
313
+ }
314
+ /**
315
+ * Effective severity for an event: the catalogued canonical level is a FLOOR. A caller may escalate
316
+ * a catalogued event (e.g. an outcome that failed → `error`), but may never label it below its
317
+ * canonical severity (an `order.failed` stays `error` even if a caller passes `info`).
318
+ */
319
+ function effectiveEventLevel(name, level) {
320
+ const canonical = canonicalSeverity(name);
321
+ return levelOrder[level] >= levelOrder[canonical] ? level : canonical;
322
+ }
75
323
  export function createLogger(namespace) {
76
324
  return {
77
- debug(message, meta) {
325
+ debug(message, attributes) {
78
326
  if (!shouldLog("debug"))
79
327
  return;
80
328
  const prefix = `${namespace} [debug]`;
81
- if (meta !== undefined) {
82
- console.log(prefix, message, meta);
329
+ if (attributes !== undefined) {
330
+ console.log(prefix, message, attributes);
83
331
  }
84
332
  else {
85
333
  console.log(prefix, message);
86
334
  }
335
+ emitLogRecord(namespace, "debug", message, attributes);
87
336
  },
88
- info(message, meta) {
337
+ info(message, attributes) {
89
338
  if (!shouldLog("info"))
90
339
  return;
91
340
  const prefix = `${namespace} [info]`;
92
- if (meta !== undefined) {
93
- console.log(prefix, message, meta);
341
+ if (attributes !== undefined) {
342
+ console.log(prefix, message, attributes);
94
343
  }
95
344
  else {
96
345
  console.log(prefix, message);
97
346
  }
347
+ emitLogRecord(namespace, "info", message, attributes);
98
348
  },
99
- warn(message, meta) {
349
+ warn(message, error, attributes) {
100
350
  if (!shouldLog("warn"))
101
351
  return;
102
- const prefix = `${namespace} [warn]`;
103
- if (meta !== undefined) {
104
- console.warn(prefix, message, meta);
105
- }
106
- else {
107
- console.warn(prefix, message);
108
- }
352
+ emitErrorAwareRecord(namespace, "warn", message, error, attributes);
109
353
  },
110
- error(message, meta) {
354
+ error(message, error, attributes) {
111
355
  if (!shouldLog("error"))
112
356
  return;
113
- const prefix = `${namespace} [error]`;
114
- if (meta !== undefined) {
115
- console.error(prefix, message, meta);
357
+ emitErrorAwareRecord(namespace, "error", message, error, attributes);
358
+ },
359
+ event(name, level, opts) {
360
+ // The catalog severity is a floor — a caller may escalate but never demote a catalogued event.
361
+ const effectiveLevel = effectiveEventLevel(name, level);
362
+ // Stamp once, synchronously, so the redacted (deferred) path records when the event happened —
363
+ // not when redaction finished — and async redaction can never reorder the log.
364
+ const timestampMs = Date.now();
365
+ const { body, redact } = opts;
366
+ const attributes = capScalars(opts.attributes);
367
+ // The event log is the trade narrative and must never go dark because someone lowered
368
+ // SENPI_LOG_LEVEL: the collector emit below is unconditional. Only the local console MIRROR
369
+ // respects the level, to keep a quiet terminal quiet.
370
+ if (shouldLog(effectiveLevel)) {
371
+ const prefix = `${namespace} [${effectiveLevel}] ${name}`;
372
+ const sink = effectiveLevel === "warn"
373
+ ? console.warn
374
+ : effectiveLevel === "error"
375
+ ? console.error
376
+ : console.log;
377
+ if (attributes !== undefined)
378
+ sink(prefix, body, attributes);
379
+ else
380
+ sink(prefix, body);
381
+ }
382
+ const hasRedactFields = redact !== undefined && Object.keys(redact).length > 0;
383
+ if (!hasRedactFields) {
384
+ emitEventRecord(namespace, name, effectiveLevel, body, attributes, undefined, timestampMs);
385
+ return;
116
386
  }
117
- else {
118
- console.error(prefix, message);
387
+ const capped = capRedactFields(redact);
388
+ const redactor = getDefaultPiiRedactor();
389
+ // No redactor (boot window or tests): fail-safe — emit body + scalars, drop the redact fields
390
+ // rather than let an unredacted free-text value reach the wire.
391
+ if (redactor === null) {
392
+ emitEventRecord(namespace, name, effectiveLevel, body, attributes, undefined, timestampMs);
393
+ return;
119
394
  }
120
- dispatchErrorNotification({
121
- namespace,
122
- level: "error",
123
- message,
124
- meta,
125
- timestamp: new Date().toISOString(),
126
- });
395
+ // Defer only this record behind the async redaction, re-entering the captured trace context.
396
+ // The call-time timestamp above keeps it ordered despite the deferral.
397
+ emitEventRedacted(redactor, context.active(), namespace, name, effectiveLevel, body, attributes, capped, timestampMs);
127
398
  },
128
399
  };
129
400
  }
401
+ /**
402
+ * A complete {@link Logger} that discards everything. Use it as an explicit "be silent here" default
403
+ * (e.g. tests, or a consumer that doesn't wire logging) instead of hand-rolling a partial object —
404
+ * being defined alongside {@link Logger} it always satisfies the full contract as the interface grows.
405
+ */
406
+ export const noopLogger = {
407
+ debug: () => { },
408
+ info: () => { },
409
+ warn: () => { },
410
+ error: () => { },
411
+ event: () => { },
412
+ };
413
+ /**
414
+ * Shared warn/error path: discriminate the error vs attributes args, scavenge any bag error, render
415
+ * the human line (with the error object, so the stack shows locally), emit the structured record
416
+ * with `exception.*` attributes, record on the active span, and — for `error` — fan out one
417
+ * normalized notification built from the same values.
418
+ */
419
+ function emitErrorAwareRecord(namespace, level, message, arg2, arg3) {
420
+ let { error, attributes } = resolveErrorArgs(arg2, arg3);
421
+ let scavenged = false;
422
+ // Always strip raw Errors from the bag so they can't slip through as invalid OTel attributes;
423
+ // adopt the lifted one as the exception only when the caller passed no explicit error.
424
+ const found = scavengeBagError(attributes);
425
+ if (found !== null) {
426
+ attributes = found.cleaned;
427
+ if (error === undefined) {
428
+ error = found.error;
429
+ scavenged = true;
430
+ }
431
+ }
432
+ const exception = error !== undefined ? normalizeException(error) : undefined;
433
+ let extra;
434
+ if (exception !== undefined)
435
+ extra = exceptionAttributes(exception);
436
+ if (scavenged)
437
+ extra = { ...extra, "code.error.scavenged": true };
438
+ const prefix = `${namespace} [${level}]`;
439
+ const extras = [];
440
+ if (error !== undefined)
441
+ extras.push(error);
442
+ if (attributes !== undefined)
443
+ extras.push(attributes);
444
+ const sink = level === "warn" ? console.warn : console.error;
445
+ sink(prefix, message, ...extras);
446
+ emitLogRecord(namespace, level, message, attributes, extra);
447
+ if (error !== undefined)
448
+ recordExceptionOnActiveSpan(error, level);
449
+ if (level === "error") {
450
+ dispatchErrorNotification({
451
+ namespace,
452
+ level: "error",
453
+ message,
454
+ // The caller's bag without the error (which rides in `exception`) — not the `composed`
455
+ // bag, whose folded-in `exception.*` keys would duplicate the exception block.
456
+ attributes,
457
+ exception,
458
+ timestamp: new Date().toISOString(),
459
+ });
460
+ }
461
+ }
130
462
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@senpi/runtime",
3
- "version": "3.0.6-dev.runtime-phase-2.20260630134145",
3
+ "version": "3.0.6-dev.runtime-phase-2.20260630134327",
4
4
  "description": "Senpi runtime plugin for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -34,6 +34,8 @@
34
34
  "@anthropic-ai/sdk": "^0.39.0",
35
35
  "@hyperdx/node-opentelemetry": "^0.11.0",
36
36
  "@modelcontextprotocol/sdk": "^1.0.0",
37
+ "@opentelemetry/api": "^1.9.1",
38
+ "@opentelemetry/api-logs": "^0.218.0",
37
39
  "@opentelemetry/instrumentation-undici": "^0.28.0",
38
40
  "@sinclair/typebox": "^0.34.0",
39
41
  "async-retry": "^1.3.3",
@@ -49,6 +51,8 @@
49
51
  "openclaw": ">=2026.5.0"
50
52
  },
51
53
  "devDependencies": {
54
+ "@opentelemetry/context-async-hooks": "^2.8.0",
55
+ "@opentelemetry/sdk-trace-base": "^2.8.0",
52
56
  "@types/async-retry": "^1.4.9",
53
57
  "@types/node": "^22.0.0",
54
58
  "tsx": "^4.21.0",