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

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 (102) hide show
  1. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +5 -9
  2. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -1
  3. package/dist/actions/llm-decision/anthropic-llm-decision.js +6 -86
  4. package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -1
  5. package/dist/actions/llm-decision/factory.d.ts +0 -6
  6. package/dist/actions/llm-decision/factory.d.ts.map +1 -1
  7. package/dist/actions/llm-decision/factory.js +0 -2
  8. package/dist/actions/llm-decision/factory.js.map +1 -1
  9. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
  10. package/dist/actions/llm-decision/openclaw-llm-decision.js +20 -0
  11. package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +23 -11
  14. package/dist/index.js.map +1 -1
  15. package/dist/recording/wiring/emitter-factory.d.ts +0 -5
  16. package/dist/recording/wiring/emitter-factory.d.ts.map +1 -1
  17. package/dist/recording/wiring/emitter-factory.js +0 -18
  18. package/dist/recording/wiring/emitter-factory.js.map +1 -1
  19. package/dist/recording/wiring/index.d.ts +1 -1
  20. package/dist/recording/wiring/index.d.ts.map +1 -1
  21. package/dist/recording/wiring/index.js +1 -1
  22. package/dist/recording/wiring/index.js.map +1 -1
  23. package/dist/runtime/runtime-schema.d.ts +4 -53
  24. package/dist/runtime/runtime-schema.d.ts.map +1 -1
  25. package/dist/runtime/runtime-schema.js +4 -4
  26. package/dist/runtime/runtime-schema.js.map +1 -1
  27. package/dist/runtime/runtime.d.ts.map +1 -1
  28. package/dist/runtime/runtime.js +9 -15
  29. package/dist/runtime/runtime.js.map +1 -1
  30. package/dist/senpi/client.d.ts +10 -0
  31. package/dist/senpi/client.d.ts.map +1 -1
  32. package/dist/senpi/client.js +69 -49
  33. package/dist/senpi/client.js.map +1 -1
  34. package/dist/telemetry/metrics.d.ts +47 -0
  35. package/dist/telemetry/metrics.d.ts.map +1 -0
  36. package/dist/telemetry/metrics.js +154 -0
  37. package/dist/telemetry/metrics.js.map +1 -0
  38. package/dist/telemetry/otel-sdk.d.ts +21 -33
  39. package/dist/telemetry/otel-sdk.d.ts.map +1 -1
  40. package/dist/telemetry/otel-sdk.js +77 -50
  41. package/dist/telemetry/otel-sdk.js.map +1 -1
  42. package/dist/telemetry/tracing.d.ts +2 -1
  43. package/dist/telemetry/tracing.d.ts.map +1 -1
  44. package/dist/telemetry/tracing.js +1 -1
  45. package/dist/telemetry/tracing.js.map +1 -1
  46. package/dist/tracking/spans/constants.d.ts +4 -11
  47. package/dist/tracking/spans/constants.d.ts.map +1 -1
  48. package/dist/tracking/spans/constants.js +4 -23
  49. package/dist/tracking/spans/constants.js.map +1 -1
  50. package/dist/tracking/spans/gen-ai.d.ts +70 -0
  51. package/dist/tracking/spans/gen-ai.d.ts.map +1 -0
  52. package/dist/tracking/spans/gen-ai.js +330 -0
  53. package/dist/tracking/spans/gen-ai.js.map +1 -0
  54. package/dist/tracking/spans/index.d.ts +6 -8
  55. package/dist/tracking/spans/index.d.ts.map +1 -1
  56. package/dist/tracking/spans/index.js +6 -11
  57. package/dist/tracking/spans/index.js.map +1 -1
  58. package/dist/tracking/spans/redact-pii.d.ts +18 -20
  59. package/dist/tracking/spans/redact-pii.d.ts.map +1 -1
  60. package/dist/tracking/spans/redact-pii.js +30 -29
  61. package/dist/tracking/spans/redact-pii.js.map +1 -1
  62. package/dist/tracking/spans/span-hooks.d.ts +0 -17
  63. package/dist/tracking/spans/span-hooks.d.ts.map +1 -1
  64. package/dist/tracking/spans/span-hooks.js +407 -207
  65. package/dist/tracking/spans/span-hooks.js.map +1 -1
  66. package/package.json +1 -1
  67. package/dist/tracking/spans/fan-out-span-transport.d.ts +0 -22
  68. package/dist/tracking/spans/fan-out-span-transport.d.ts.map +0 -1
  69. package/dist/tracking/spans/fan-out-span-transport.js +0 -49
  70. package/dist/tracking/spans/fan-out-span-transport.js.map +0 -1
  71. package/dist/tracking/spans/otel/fit-row-budget.d.ts +0 -22
  72. package/dist/tracking/spans/otel/fit-row-budget.d.ts.map +0 -1
  73. package/dist/tracking/spans/otel/fit-row-budget.js +0 -91
  74. package/dist/tracking/spans/otel/fit-row-budget.js.map +0 -1
  75. package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts +0 -16
  76. package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts.map +0 -1
  77. package/dist/tracking/spans/otel/map-span-to-trace-row.js +0 -227
  78. package/dist/tracking/spans/otel/map-span-to-trace-row.js.map +0 -1
  79. package/dist/tracking/spans/otel/recording-span-transport.d.ts +0 -43
  80. package/dist/tracking/spans/otel/recording-span-transport.d.ts.map +0 -1
  81. package/dist/tracking/spans/otel/recording-span-transport.js +0 -67
  82. package/dist/tracking/spans/otel/recording-span-transport.js.map +0 -1
  83. package/dist/tracking/spans/otel/span-ids.d.ts +0 -22
  84. package/dist/tracking/spans/otel/span-ids.d.ts.map +0 -1
  85. package/dist/tracking/spans/otel/span-ids.js +0 -32
  86. package/dist/tracking/spans/otel/span-ids.js.map +0 -1
  87. package/dist/tracking/spans/plugin-span-tracker.d.ts +0 -9
  88. package/dist/tracking/spans/plugin-span-tracker.d.ts.map +0 -1
  89. package/dist/tracking/spans/plugin-span-tracker.js +0 -115
  90. package/dist/tracking/spans/plugin-span-tracker.js.map +0 -1
  91. package/dist/tracking/spans/span-tracker.d.ts +0 -133
  92. package/dist/tracking/spans/span-tracker.d.ts.map +0 -1
  93. package/dist/tracking/spans/span-tracker.js +0 -721
  94. package/dist/tracking/spans/span-tracker.js.map +0 -1
  95. package/dist/tracking/spans/span-transport.d.ts +0 -71
  96. package/dist/tracking/spans/span-transport.d.ts.map +0 -1
  97. package/dist/tracking/spans/span-transport.js +0 -240
  98. package/dist/tracking/spans/span-transport.js.map +0 -1
  99. package/dist/tracking/spans/types.d.ts +0 -101
  100. package/dist/tracking/spans/types.d.ts.map +0 -1
  101. package/dist/tracking/spans/types.js +0 -6
  102. package/dist/tracking/spans/types.js.map +0 -1
@@ -1,67 +0,0 @@
1
- /**
2
- * RecordingSpanTransport — ships agent spans to the OTEL v2 `/v1/traces` path.
3
- *
4
- * Implements the same `SpanTransport` seam as `BatchingSpanTransport`, but maps
5
- * each `TrackingSpan` to a HyperDX `TraceRow` and enqueues it on a dedicated
6
- * recording `TelemetryBatcher` (one per gateway — built at plugin register(),
7
- * not borrowed from a per-runtime batcher).
8
- *
9
- * Pipeline per span (fire-and-forget, never throws into the SpanTracker):
10
- * truncate oversized data fields → redact PII → map to TraceRow → enqueueTrace
11
- *
12
- * Truncation + redaction mirror BatchingSpanTransport so the new path never
13
- * ships unredacted or oversized payloads. The recording batcher serializes at
14
- * enqueue, so (unlike the legacy transport) both run BEFORE the row is built.
15
- *
16
- * `flush`/`shutdown` first await any in-flight per-span processing, then the
17
- * batcher — so a flush is deterministic (no row stranded mid-pipeline).
18
- */
19
- import { truncateSpanData } from "../span-transport.js";
20
- import { getDefaultPiiRedactor, redactSpanData, } from "../redact-pii.js";
21
- import { trackingSpanToTraceRow } from "./map-span-to-trace-row.js";
22
- import { fitTraceRowToBudget } from "./fit-row-budget.js";
23
- import { createLogger } from "../../../utils/logger.js";
24
- const logger = createLogger("[senpi-core][recording-span-transport]");
25
- export class RecordingSpanTransport {
26
- batcher;
27
- redactorOverride;
28
- pending = new Set();
29
- constructor(options) {
30
- this.batcher = options.batcher;
31
- this.redactorOverride = options.redactor;
32
- }
33
- enqueue(span) {
34
- const p = this.process(span).finally(() => this.pending.delete(p));
35
- this.pending.add(p);
36
- }
37
- async flush() {
38
- await this.drainPending();
39
- await this.batcher.flush();
40
- }
41
- async shutdown() {
42
- await this.drainPending();
43
- await this.batcher.shutdown();
44
- }
45
- /** Truncate → redact → map → enqueue. Self-contained; never throws. */
46
- async process(span) {
47
- try {
48
- const truncated = truncateSpanData(span);
49
- const redactor = this.redactorOverride === undefined
50
- ? getDefaultPiiRedactor()
51
- : this.redactorOverride;
52
- const cleaned = redactor ? await redactSpanData(truncated, redactor) : truncated;
53
- // Fit to the OTEL per-row byte cap (256 KB server-side) — the legacy
54
- // 2 MB/field truncation above doesn't bound the assembled row.
55
- this.batcher.enqueueTrace(fitTraceRowToBudget(trackingSpanToTraceRow(cleaned)));
56
- }
57
- catch (err) {
58
- logger.warn("span → trace-row pipeline failed; dropped", {
59
- err: err instanceof Error ? err.message : String(err),
60
- });
61
- }
62
- }
63
- async drainPending() {
64
- await Promise.allSettled([...this.pending]);
65
- }
66
- }
67
- //# sourceMappingURL=recording-span-transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recording-span-transport.js","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/recording-span-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAEL,qBAAqB,EACrB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,MAAM,GAAG,YAAY,CAAC,wCAAwC,CAAC,CAAC;AAYtE,MAAM,OAAO,sBAAsB;IAChB,OAAO,CAAmB;IAC1B,gBAAgB,CAAiC;IACjD,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEpD,YAAY,OAAsC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,IAAkB;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,uEAAuE;IAC/D,KAAK,CAAC,OAAO,CAAC,IAAkB;QACtC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,QAAQ,GACZ,IAAI,CAAC,gBAAgB,KAAK,SAAS;gBACjC,CAAC,CAAC,qBAAqB,EAAE;gBACzB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,qEAAqE;YACrE,+DAA+D;YAC/D,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;gBACvD,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACtD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Deterministic OTEL id derivation for agent spans.
3
- *
4
- * Unlike scanner spans (each its own trace, random ids via `cryptoIdGenerator`),
5
- * agent spans must group by run and preserve their parent/child tree. So ids are
6
- * *derived* — a hash of the stable source key — rather than random:
7
- *
8
- * - `TraceId` = hash(runId) → every span in one agent run shares it
9
- * - `SpanId` = hash(span.id)
10
- * - `ParentSpanId` = hash(span.parentSpanId) ("" stays "" for roots)
11
- *
12
- * A child's `parentSpanId` holds the parent span's raw id, so
13
- * `deriveParentSpanId(child.parentSpanId)` equals `deriveSpanId(parent.id)` —
14
- * the link reconstructs in HyperDX.
15
- */
16
- /** 32 lowercase-hex chars (16 bytes) derived from the agent run id. */
17
- export declare function deriveTraceId(runId: string): string;
18
- /** 16 lowercase-hex chars (8 bytes) derived from the span's raw id. */
19
- export declare function deriveSpanId(id: string): string;
20
- /** Derived parent SpanId; empty string (root) passes through unchanged. */
21
- export declare function deriveParentSpanId(parentSpanId: string): string;
22
- //# sourceMappingURL=span-ids.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-ids.d.ts","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/span-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Deterministic OTEL id derivation for agent spans.
3
- *
4
- * Unlike scanner spans (each its own trace, random ids via `cryptoIdGenerator`),
5
- * agent spans must group by run and preserve their parent/child tree. So ids are
6
- * *derived* — a hash of the stable source key — rather than random:
7
- *
8
- * - `TraceId` = hash(runId) → every span in one agent run shares it
9
- * - `SpanId` = hash(span.id)
10
- * - `ParentSpanId` = hash(span.parentSpanId) ("" stays "" for roots)
11
- *
12
- * A child's `parentSpanId` holds the parent span's raw id, so
13
- * `deriveParentSpanId(child.parentSpanId)` equals `deriveSpanId(parent.id)` —
14
- * the link reconstructs in HyperDX.
15
- */
16
- import { createHash } from "node:crypto";
17
- function hashHex(input, bytes) {
18
- return createHash("sha256").update(input).digest("hex").slice(0, bytes * 2);
19
- }
20
- /** 32 lowercase-hex chars (16 bytes) derived from the agent run id. */
21
- export function deriveTraceId(runId) {
22
- return hashHex(runId, 16);
23
- }
24
- /** 16 lowercase-hex chars (8 bytes) derived from the span's raw id. */
25
- export function deriveSpanId(id) {
26
- return hashHex(id, 8);
27
- }
28
- /** Derived parent SpanId; empty string (root) passes through unchanged. */
29
- export function deriveParentSpanId(parentSpanId) {
30
- return parentSpanId === "" ? "" : deriveSpanId(parentSpanId);
31
- }
32
- //# sourceMappingURL=span-ids.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-ids.js","sourceRoot":"","sources":["../../../../src/tracking/spans/otel/span-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,OAAO,CAAC,KAAa,EAAE,KAAa;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,YAAoB;IACrD,OAAO,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;AAC/D,CAAC"}
@@ -1,9 +0,0 @@
1
- import { SpanTracker } from "./span-tracker.js";
2
- import type { SpanTransport } from "./types.js";
3
- export type SpanSinkMode = "legacy" | "dual" | "otel";
4
- /** Parse `SENPI_SPANS_SINK`; unknown/unset → `dual` (the validation default). */
5
- export declare function resolveSpanSinkMode(value: string | undefined): SpanSinkMode;
6
- /** Compose the active transport from the two children per the sink mode. */
7
- export declare function composeSpanTransport(mode: SpanSinkMode, legacy: SpanTransport, recording: SpanTransport): SpanTransport;
8
- export declare function createPluginSpanTracker(apiKey: string | undefined): SpanTracker;
9
- //# sourceMappingURL=plugin-span-tracker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-span-tracker.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/plugin-span-tracker.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQhD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAI3E;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,aAAa,GACvB,aAAa,CASf;AA8BD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,WAAW,CAsDb"}
@@ -1,115 +0,0 @@
1
- /**
2
- * Plugin-scoped SpanTracker factory.
3
- *
4
- * One SpanTracker is built at plugin register() and shared across all runtime
5
- * instances and OpenClaw hooks running inside this gateway. The transport is
6
- * authenticated with the gateway's single SENPI_API_KEY (one-gateway-per-user
7
- * deployment assumption).
8
- *
9
- * Span sink (OTEL v2 cutover): `SENPI_SPANS_SINK` selects where spans go —
10
- * - `legacy` → POST /api/v1/tracking/spans (BatchingSpanTransport)
11
- * - `dual` → both, via FanOutSpanTransport (default; validation phase)
12
- * - `otel` → POST /v1/traces (RecordingSpanTransport → recording batcher)
13
- * Every transition is config-only (set the env var + restart); see the design
14
- * doc's cutover plan.
15
- */
16
- import { createLogger } from "../../utils/logger.js";
17
- import { TRACKING_API_BASE_URL } from "../constants.js";
18
- import { createBatcher, createTelemetryClient, resolveTransportConfig, } from "../../recording/transport/index.js";
19
- import { TRACES_PATH } from "../../recording/transport/config.js";
20
- import { BatchingSpanTransport, NoOpSpanTransport } from "./span-transport.js";
21
- import { FanOutSpanTransport } from "./fan-out-span-transport.js";
22
- import { RecordingSpanTransport } from "./otel/recording-span-transport.js";
23
- import { SpanTracker } from "./span-tracker.js";
24
- import { createOpenRedactionAdapter, setDefaultPiiRedactor, } from "./redact-pii.js";
25
- const logger = createLogger("[senpi-core][plugin-span-tracker]");
26
- /** Parse `SENPI_SPANS_SINK`; unknown/unset → `dual` (the validation default). */
27
- export function resolveSpanSinkMode(value) {
28
- const v = value?.trim().toLowerCase();
29
- if (v === "legacy" || v === "dual" || v === "otel")
30
- return v;
31
- return "dual";
32
- }
33
- /** Compose the active transport from the two children per the sink mode. */
34
- export function composeSpanTransport(mode, legacy, recording) {
35
- switch (mode) {
36
- case "legacy":
37
- return legacy;
38
- case "otel":
39
- return recording;
40
- case "dual":
41
- return new FanOutSpanTransport([legacy, recording]);
42
- }
43
- }
44
- /**
45
- * Register the process-wide default PII redactor at boot. Always on, no env gate:
46
- * `logger.event()` redact fields (free-text LLM reasoning, venue errors, raw signals)
47
- * are scrubbed on the live path. The same default redactor also covers the span path —
48
- * for spans this only ADDS scrubbing, never removes it.
49
- *
50
- * Fire-and-forget and never awaited, so it adds no boot latency and can't introduce a
51
- * boot failure mode. The OpenRedaction + bip39 imports are dynamic, so they cold-start
52
- * here; until the promise resolves `getDefaultPiiRedactor()` is null and the event path
53
- * fails safe (drops the fields rather than emitting them raw). On install failure the
54
- * redactor stays null — the fields keep being dropped, never leaked.
55
- */
56
- function initPiiRedactor() {
57
- createOpenRedactionAdapter()
58
- .then((redactor) => {
59
- setDefaultPiiRedactor(redactor);
60
- logger.info("PII redaction ready — event redact fields and spans scrubbed for emails, international phones (US/IN/CN/KR/JP/UK/BR/+intl), vendor API keys, EVM private keys, and BIP39 mnemonics before transport");
61
- })
62
- .catch((err) => {
63
- logger.warn("PII redaction init failed — event evidence will be DROPPED (never emitted raw); check openredaction install", { err: err instanceof Error ? err.message : String(err) });
64
- });
65
- }
66
- export function createPluginSpanTracker(apiKey) {
67
- initPiiRedactor();
68
- if (!apiKey) {
69
- logger.warn("span telemetry disabled: set SENPI_API_KEY (or pass apiKey) so spans reach senpi-agent-telemetry; NoOpSpanTransport drops spans");
70
- return new SpanTracker({ transport: new NoOpSpanTransport() });
71
- }
72
- const mode = resolveSpanSinkMode(process.env.SENPI_SPANS_SINK);
73
- const trackingBaseUrl = process.env.SENPI_TRACKING_URL ?? TRACKING_API_BASE_URL;
74
- // Build only the children the mode needs; the unused side is a cheap NoOp.
75
- const legacy = mode === "otel"
76
- ? new NoOpSpanTransport()
77
- : new BatchingSpanTransport({ baseUrl: trackingBaseUrl, apiKey });
78
- let recording;
79
- if (mode === "legacy") {
80
- recording = new NoOpSpanTransport();
81
- }
82
- else {
83
- const otelConfig = resolveTransportConfig({ getToken: () => apiKey });
84
- // DIAGNOSTIC: confirm exactly where the span batcher posts and with what.
85
- logger.info("span otel transport target", {
86
- baseUrl: otelConfig.baseUrl,
87
- tracesPath: TRACES_PATH,
88
- tokenPresent: Boolean(apiKey),
89
- flushIntervalMs: otelConfig.flushIntervalMs,
90
- });
91
- const baseClient = createTelemetryClient(otelConfig);
92
- // DIAGNOSTIC: log every trace send outcome (does it arrive? accepted? rejected? why?).
93
- const loggingClient = {
94
- sendTraces: async (rowsJson) => {
95
- const res = await baseClient.sendTraces(rowsJson);
96
- logger.info("span otel sendTraces result", {
97
- rows: rowsJson.length,
98
- outcome: res.outcome,
99
- status: res.status,
100
- accepted: res.accepted,
101
- rejected: res.rejected,
102
- errors: res.errors?.slice(0, 3),
103
- });
104
- return res;
105
- },
106
- sendLogs: (rowsJson) => baseClient.sendLogs(rowsJson),
107
- };
108
- recording = new RecordingSpanTransport({
109
- batcher: createBatcher(otelConfig, loggingClient),
110
- });
111
- }
112
- logger.info("span sink mode", { mode });
113
- return new SpanTracker({ transport: composeSpanTransport(mode, legacy, recording) });
114
- }
115
- //# sourceMappingURL=plugin-span-tracker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-span-tracker.js","sourceRoot":"","sources":["../../../src/tracking/spans/plugin-span-tracker.ts"],"names":[],"mappings":"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"}
@@ -1,133 +0,0 @@
1
- import type { EmissionSource, SpanTransport } from "./types.js";
2
- export interface SpanContextFields {
3
- correlationId?: string | null;
4
- address?: string | null;
5
- recipeName?: string | null;
6
- runtimeId?: string | null;
7
- runtimeVersion?: string | null;
8
- }
9
- export interface OpenLlmSpanInput extends SpanContextFields {
10
- sessionKey: string;
11
- runId: string;
12
- emissionSource: EmissionSource;
13
- startedAt?: number;
14
- input: Record<string, unknown>;
15
- }
16
- export interface FinalizeLlmSpanInput extends SpanContextFields {
17
- sessionKey: string;
18
- runId: string;
19
- output?: Record<string, unknown>;
20
- error?: unknown;
21
- model?: string | null;
22
- tokensIn?: number | null;
23
- tokensOut?: number | null;
24
- costUsd?: number | null;
25
- }
26
- export interface OpenToolSpanInput extends SpanContextFields {
27
- sessionKey: string;
28
- runId: string;
29
- emissionSource: EmissionSource;
30
- toolCallId: string | null;
31
- toolName: string;
32
- toolInput?: Record<string, unknown>;
33
- startedAt?: number;
34
- }
35
- export interface FinalizeToolSpanInput extends SpanContextFields {
36
- sessionKey: string;
37
- runId: string;
38
- toolCallId: string | null;
39
- toolName: string;
40
- output?: unknown;
41
- error?: unknown;
42
- durationMs?: number;
43
- }
44
- export interface DirectLlmSpanInput extends SpanContextFields {
45
- sessionKey: string;
46
- runId: string;
47
- startedAt: number;
48
- endedAt: number;
49
- model?: string | null;
50
- tokensIn?: number | null;
51
- tokensOut?: number | null;
52
- costUsd?: number | null;
53
- input: Record<string, unknown>;
54
- output?: Record<string, unknown>;
55
- error?: unknown;
56
- parentSpanId?: string | null;
57
- }
58
- export interface DirectToolSpanInput extends SpanContextFields {
59
- sessionKey: string;
60
- runId: string;
61
- toolCallId?: string | null;
62
- toolName: string;
63
- startedAt: number;
64
- endedAt: number;
65
- input?: Record<string, unknown>;
66
- output?: unknown;
67
- error?: unknown;
68
- parentSpanId?: string | null;
69
- }
70
- export interface OpenSubagentInput extends SpanContextFields {
71
- hostSessionKey: string;
72
- hostRunId: string;
73
- childSessionKey: string;
74
- parentSpanId: string | null;
75
- input: Record<string, unknown>;
76
- startedAt?: number;
77
- }
78
- export interface MergeSubagentInput {
79
- childSessionKey: string;
80
- /** Status to record (e.g., "spawned", "delivery_target"). */
81
- status: string;
82
- /** Additional fields to merge into `data` (e.g., delivery metadata). */
83
- patch?: Record<string, unknown>;
84
- }
85
- export interface FinalizeSubagentInput {
86
- childSessionKey: string;
87
- status: string;
88
- output?: Record<string, unknown>;
89
- error?: unknown;
90
- }
91
- export interface AgentEndInput extends SpanContextFields {
92
- sessionKey: string;
93
- runId: string;
94
- outcome?: unknown;
95
- error?: unknown;
96
- }
97
- export interface SpanTrackerOptions {
98
- transport: SpanTransport;
99
- /** Override Date.now for tests. */
100
- now?: () => number;
101
- staleTimeoutMs?: number;
102
- sweepIntervalMs?: number;
103
- /** Start the periodic stale sweeper. Set false in tests for determinism. */
104
- enableSweeper?: boolean;
105
- }
106
- export declare class SpanTracker {
107
- private readonly transport;
108
- private readonly now;
109
- private readonly staleTimeoutMs;
110
- private readonly openSpans;
111
- private readonly openSubagents;
112
- private toolSeq;
113
- private sweepTimer;
114
- constructor(options: SpanTrackerOptions);
115
- openLlmSpan(input: OpenLlmSpanInput): string;
116
- finalizeLlmSpan(input: FinalizeLlmSpanInput): void;
117
- /** Returns the id of the currently-open LLM span for (session, run), or null. */
118
- getActiveLlmSpanId(sessionKey: string, runId: string): string | null;
119
- openToolSpan(input: OpenToolSpanInput): string;
120
- finalizeToolSpan(input: FinalizeToolSpanInput): void;
121
- openSubagentSpan(input: OpenSubagentInput): string;
122
- /** Merge fields into an existing subagent (e.g., on _spawned, _delivery_target). Lazy-creates if missing. */
123
- mergeSubagentSpan(input: MergeSubagentInput, context?: SpanContextFields): void;
124
- finalizeSubagentSpan(input: FinalizeSubagentInput, context?: SpanContextFields): void;
125
- captureAgentEnd(input: AgentEndInput): void;
126
- captureLlmSpan(input: DirectLlmSpanInput): void;
127
- captureToolSpan(input: DirectToolSpanInput): void;
128
- sweepStale(): void;
129
- shutdown(): Promise<void>;
130
- private enqueueOrphan;
131
- private enqueueSubagentOrphan;
132
- }
133
- //# sourceMappingURL=span-tracker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-tracker.d.ts","sourceRoot":"","sources":["../../../src/tracking/spans/span-tracker.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,cAAc,EAGd,aAAa,EAEd,MAAM,YAAY,CAAC;AAYpB,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAkDD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,aAAa,CAAC;IACzB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAA+C;gBAErD,OAAO,EAAE,kBAAkB;IAiBvC,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM;IAyC5C,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAmDlD,iFAAiF;IACjF,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpE,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAyD9C,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IA8IpD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAgClD,6GAA6G;IAC7G,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAkC/E,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAoDrF,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAkE3C,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAmC/C,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAsCjD,UAAU,IAAI,IAAI;IA8BZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,qBAAqB;CA4B9B"}