@nodii/telemetry 0.0.2 → 0.3.0

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 (82) hide show
  1. package/README.md +223 -1
  2. package/dist/active-span.d.ts +12 -0
  3. package/dist/active-span.d.ts.map +1 -0
  4. package/dist/active-span.js +20 -0
  5. package/dist/active-span.js.map +1 -0
  6. package/dist/agent-invocable.d.ts +24 -0
  7. package/dist/agent-invocable.d.ts.map +1 -0
  8. package/dist/agent-invocable.js +64 -0
  9. package/dist/agent-invocable.js.map +1 -0
  10. package/dist/audit-types.d.ts +15 -0
  11. package/dist/audit-types.d.ts.map +1 -0
  12. package/dist/audit-types.js +39 -0
  13. package/dist/audit-types.js.map +1 -0
  14. package/dist/audit.d.ts +226 -0
  15. package/dist/audit.d.ts.map +1 -0
  16. package/dist/audit.js +255 -0
  17. package/dist/audit.js.map +1 -0
  18. package/dist/configure.d.ts +34 -0
  19. package/dist/configure.d.ts.map +1 -0
  20. package/dist/configure.js +23 -0
  21. package/dist/configure.js.map +1 -0
  22. package/dist/context.d.ts +40 -0
  23. package/dist/context.d.ts.map +1 -0
  24. package/dist/context.js +70 -0
  25. package/dist/context.js.map +1 -0
  26. package/dist/drizzle/audit-schema.d.ts +884 -0
  27. package/dist/drizzle/audit-schema.d.ts.map +1 -0
  28. package/dist/drizzle/audit-schema.js +268 -0
  29. package/dist/drizzle/audit-schema.js.map +1 -0
  30. package/dist/drizzle/index.d.ts +3 -0
  31. package/dist/drizzle/index.d.ts.map +1 -0
  32. package/dist/drizzle/index.js +5 -0
  33. package/dist/drizzle/index.js.map +1 -0
  34. package/dist/index.d.ts +21 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +31 -5
  37. package/dist/index.js.map +1 -1
  38. package/dist/init.d.ts +39 -0
  39. package/dist/init.d.ts.map +1 -0
  40. package/dist/init.js +114 -0
  41. package/dist/init.js.map +1 -0
  42. package/dist/intent.d.ts +21 -0
  43. package/dist/intent.d.ts.map +1 -0
  44. package/dist/intent.js +123 -0
  45. package/dist/intent.js.map +1 -0
  46. package/dist/logger.d.ts +19 -0
  47. package/dist/logger.d.ts.map +1 -0
  48. package/dist/logger.js +99 -0
  49. package/dist/logger.js.map +1 -0
  50. package/dist/metrics.d.ts +53 -0
  51. package/dist/metrics.d.ts.map +1 -0
  52. package/dist/metrics.js +152 -0
  53. package/dist/metrics.js.map +1 -0
  54. package/dist/otlp-adapter.d.ts +44 -0
  55. package/dist/otlp-adapter.d.ts.map +1 -0
  56. package/dist/otlp-adapter.js +351 -0
  57. package/dist/otlp-adapter.js.map +1 -0
  58. package/dist/outbox-emit.d.ts +34 -0
  59. package/dist/outbox-emit.d.ts.map +1 -0
  60. package/dist/outbox-emit.js +58 -0
  61. package/dist/outbox-emit.js.map +1 -0
  62. package/dist/redaction.d.ts +51 -0
  63. package/dist/redaction.d.ts.map +1 -0
  64. package/dist/redaction.js +173 -0
  65. package/dist/redaction.js.map +1 -0
  66. package/dist/sdk-counters.d.ts +14 -0
  67. package/dist/sdk-counters.d.ts.map +1 -0
  68. package/dist/sdk-counters.js +42 -0
  69. package/dist/sdk-counters.js.map +1 -0
  70. package/dist/tracer.d.ts +63 -0
  71. package/dist/tracer.d.ts.map +1 -0
  72. package/dist/tracer.js +214 -0
  73. package/dist/tracer.js.map +1 -0
  74. package/dist/types.d.ts +230 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +66 -0
  77. package/dist/types.js.map +1 -0
  78. package/dist/uuid.d.ts +5 -0
  79. package/dist/uuid.d.ts.map +1 -0
  80. package/dist/uuid.js +34 -0
  81. package/dist/uuid.js.map +1 -0
  82. package/package.json +44 -7
@@ -0,0 +1,351 @@
1
+ // Real OTLP wiring per D153 + D154. This module replaces the no-op
2
+ // emitters/sinks/backends installed by tracer.ts, logger.ts, and
3
+ // metrics.ts at module-init time with real OTel SDK exporters writing
4
+ // to an OTLP gRPC collector (signoz/signoz-otel-collector) at
5
+ // `OTLPEndpoint` (default `http://localhost:4317`).
6
+ //
7
+ // Wired here:
8
+ // - NodeTracerProvider + BatchSpanProcessor + OTLPTraceExporter
9
+ // - LoggerProvider + BatchLogRecordProcessor + OTLPLogExporter
10
+ // - MeterProvider + PeriodicExportingMetricReader + OTLPMetricExporter
11
+ //
12
+ // We do NOT call NodeSDK.start() — instead we wire providers directly
13
+ // so we can keep the existing SpanEmitter / LogSink / MetricsBackend
14
+ // injection points the rest of the library depends on. This way we
15
+ // don't break the existing v0.1.0 API surface or its tests.
16
+ import { credentials } from "@grpc/grpc-js";
17
+ import { SpanKind as OtelSpanKind, SpanStatusCode, TraceFlags, context as otelContext, trace as otelTrace, } from "@opentelemetry/api";
18
+ import { SeverityNumber, logs as otelLogs, } from "@opentelemetry/api-logs";
19
+ import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-grpc";
20
+ import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-grpc";
21
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc";
22
+ import { Resource } from "@opentelemetry/resources";
23
+ import { BatchLogRecordProcessor, LoggerProvider, } from "@opentelemetry/sdk-logs";
24
+ import { AggregationTemporality, MeterProvider, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
25
+ import { BatchSpanProcessor, NodeTracerProvider, } from "@opentelemetry/sdk-trace-node";
26
+ import { ATTR_DEPLOYMENT_ENVIRONMENT_NAME, ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION, } from "@opentelemetry/semantic-conventions";
27
+ import { _setLogSink } from "./logger";
28
+ import { _setMetricsBackend, } from "./metrics";
29
+ import { incSdkCounter } from "./sdk-counters";
30
+ import { _setSpanEmitter } from "./tracer";
31
+ let activeHandle = null;
32
+ /**
33
+ * Installs the real OTLP exporters by replacing the no-op emitter,
34
+ * sink, and backend with adapters that flush to OTel SDK providers
35
+ * wired to OTLP gRPC.
36
+ *
37
+ * Idempotent — second call returns the same handle.
38
+ */
39
+ export function installOtlpAdapter(cfg) {
40
+ if (activeHandle)
41
+ return activeHandle;
42
+ // Normalize the endpoint so all 3 languages accept the same shape.
43
+ // TS's OTLP exporter requires the `http://` or `https://` scheme on
44
+ // `url`. Python/Go accept bare host:port. We accept either and
45
+ // canonicalize for TS by adding `http://` if missing.
46
+ const otlpUrl = normalizeOtlpUrlForTs(cfg.otlpEndpoint);
47
+ const resource = new Resource({
48
+ [ATTR_SERVICE_NAME]: cfg.serviceName,
49
+ [ATTR_DEPLOYMENT_ENVIRONMENT_NAME]: cfg.env,
50
+ ...(cfg.serviceVersion
51
+ ? { [ATTR_SERVICE_VERSION]: cfg.serviceVersion }
52
+ : {}),
53
+ ...(cfg.deploymentRegion ? { "cloud.region": cfg.deploymentRegion } : {}),
54
+ ...cfg.resourceAttributes,
55
+ });
56
+ // ── Trace pipeline. D153 sending_queue=5000; drop on full.
57
+ const traceExporter = new OTLPTraceExporter({
58
+ url: otlpUrl,
59
+ credentials: credentials.createInsecure(),
60
+ });
61
+ const batchSpanProcessor = new BatchSpanProcessor(traceExporter, {
62
+ maxQueueSize: cfg.errorHandling.otlpSendingQueueSize,
63
+ maxExportBatchSize: 512,
64
+ scheduledDelayMillis: 1000,
65
+ exportTimeoutMillis: 10000,
66
+ });
67
+ const tracerProvider = new NodeTracerProvider({
68
+ resource,
69
+ spanProcessors: [batchSpanProcessor],
70
+ });
71
+ tracerProvider.register();
72
+ // ── Log pipeline. D153 backpressure shares the same lock.
73
+ const logExporter = new OTLPLogExporter({
74
+ url: otlpUrl,
75
+ credentials: credentials.createInsecure(),
76
+ });
77
+ const logRecordProcessor = new BatchLogRecordProcessor(logExporter, {
78
+ maxQueueSize: cfg.errorHandling.otlpSendingQueueSize,
79
+ maxExportBatchSize: 512,
80
+ scheduledDelayMillis: 1000,
81
+ exportTimeoutMillis: 10000,
82
+ });
83
+ const loggerProvider = new LoggerProvider({ resource });
84
+ loggerProvider.addLogRecordProcessor(logRecordProcessor);
85
+ otelLogs.setGlobalLoggerProvider(loggerProvider);
86
+ // ── Metrics pipeline. D21: delta temporality for counters + histograms.
87
+ const metricExporter = new OTLPMetricExporter({
88
+ url: otlpUrl,
89
+ credentials: credentials.createInsecure(),
90
+ temporalityPreference: AggregationTemporality.DELTA,
91
+ });
92
+ const metricReader = new PeriodicExportingMetricReader({
93
+ exporter: metricExporter,
94
+ exportIntervalMillis: 10000,
95
+ exportTimeoutMillis: 5000,
96
+ });
97
+ const meterProvider = new MeterProvider({
98
+ resource,
99
+ readers: [metricReader],
100
+ });
101
+ // ── Wire SpanEmitter to OTel tracer.
102
+ const otelTracer = tracerProvider.getTracer(cfg.serviceName);
103
+ const spanEmitter = {
104
+ emit(record) {
105
+ // We already produced our own span record with hex IDs. The
106
+ // cleanest path is to start an OTel span with the same name,
107
+ // attributes, and status using the existing trace context, then
108
+ // end it. Timestamps are taken from the record so the trace
109
+ // shape matches.
110
+ try {
111
+ const span = otelTracer.startSpan(record.name, {
112
+ startTime: hrtimeFromNs(record.start_ns),
113
+ attributes: toAttributes(record.attributes),
114
+ kind: kindToOTel(record.kind),
115
+ });
116
+ for (const ev of record.events) {
117
+ span.addEvent(ev.name, ev.attributes ? toAttributes(ev.attributes) : undefined, hrtimeFromNs(ev.ts_ns));
118
+ }
119
+ if (record.status === "ERROR") {
120
+ span.setStatus({
121
+ code: SpanStatusCode.ERROR,
122
+ message: record.status_message,
123
+ });
124
+ }
125
+ else if (record.status === "OK") {
126
+ span.setStatus({ code: SpanStatusCode.OK });
127
+ }
128
+ span.end(hrtimeFromNs(record.end_ns));
129
+ }
130
+ catch (err) {
131
+ incSdkCounter("telemetry.sdk.export_failures_total", {
132
+ signal: "traces",
133
+ reason: classifyExportError(err),
134
+ });
135
+ }
136
+ },
137
+ };
138
+ _setSpanEmitter(spanEmitter);
139
+ // ── Wire LogSink to OTel logger.
140
+ const otelLogger = loggerProvider.getLogger(cfg.serviceName);
141
+ const logSink = (envelope, fields) => {
142
+ try {
143
+ const traceCtx = currentTraceCtx();
144
+ const merged = {
145
+ severityNumber: severityFromLevel(envelope.level),
146
+ severityText: envelope.level,
147
+ body: envelope.msg,
148
+ attributes: toAttributes(buildLogAttributes(envelope, fields)),
149
+ timestamp: Date.now(),
150
+ ...(traceCtx
151
+ ? {
152
+ traceId: traceCtx.traceId,
153
+ spanId: traceCtx.spanId,
154
+ traceFlags: traceCtx.traceFlags,
155
+ }
156
+ : {}),
157
+ };
158
+ otelLogger.emit(merged);
159
+ }
160
+ catch (err) {
161
+ incSdkCounter("telemetry.sdk.export_failures_total", {
162
+ signal: "logs",
163
+ reason: classifyExportError(err),
164
+ });
165
+ }
166
+ };
167
+ _setLogSink(logSink);
168
+ // ── Wire MetricsBackend to OTel meter.
169
+ const meter = meterProvider.getMeter(cfg.serviceName);
170
+ const counterCache = new Map();
171
+ const histogramCache = new Map();
172
+ const otelBackend = {
173
+ recordCounter(name, by, labels) {
174
+ try {
175
+ let c = counterCache.get(name);
176
+ if (!c) {
177
+ c = meter.createCounter(name);
178
+ counterCache.set(name, c);
179
+ }
180
+ c.add(by, toAttributes(labels));
181
+ }
182
+ catch (err) {
183
+ incSdkCounter("telemetry.sdk.export_failures_total", {
184
+ signal: "metrics",
185
+ reason: classifyExportError(err),
186
+ });
187
+ }
188
+ },
189
+ recordHistogram(name, value, labels) {
190
+ try {
191
+ let h = histogramCache.get(name);
192
+ if (!h) {
193
+ h = meter.createHistogram(name);
194
+ histogramCache.set(name, h);
195
+ }
196
+ h.record(value, toAttributes(labels));
197
+ }
198
+ catch (err) {
199
+ incSdkCounter("telemetry.sdk.export_failures_total", {
200
+ signal: "metrics",
201
+ reason: classifyExportError(err),
202
+ });
203
+ }
204
+ },
205
+ };
206
+ _setMetricsBackend(otelBackend);
207
+ activeHandle = {
208
+ tracerProvider,
209
+ loggerProvider,
210
+ meterProvider,
211
+ async forceFlush() {
212
+ await Promise.allSettled([
213
+ tracerProvider.forceFlush(),
214
+ loggerProvider.forceFlush(),
215
+ meterProvider.forceFlush(),
216
+ ]);
217
+ },
218
+ async shutdown() {
219
+ await this.forceFlush();
220
+ await Promise.allSettled([
221
+ tracerProvider.shutdown(),
222
+ loggerProvider.shutdown(),
223
+ meterProvider.shutdown(),
224
+ ]);
225
+ activeHandle = null;
226
+ },
227
+ };
228
+ return activeHandle;
229
+ }
230
+ /** Force-flushes the active OTLP pipelines. No-op when not installed. */
231
+ export async function forceFlush() {
232
+ if (!activeHandle)
233
+ return;
234
+ await activeHandle.forceFlush();
235
+ }
236
+ /** Shuts down the OTLP pipelines. No-op when not installed. */
237
+ export async function shutdownOtlpAdapter() {
238
+ if (!activeHandle)
239
+ return;
240
+ await activeHandle.shutdown();
241
+ }
242
+ /** For tests + introspection. */
243
+ export function getOtlpAdapterHandle() {
244
+ return activeHandle;
245
+ }
246
+ /** Test-only reset; does NOT shutdown providers. */
247
+ export function _resetOtlpAdapterForTests() {
248
+ activeHandle = null;
249
+ }
250
+ // ── helpers ────────────────────────────────────────────────────────
251
+ function hrtimeFromNs(ns) {
252
+ const n = typeof ns === "bigint" ? ns : BigInt(Math.floor(ns));
253
+ const seconds = Number(n / 1000000000n);
254
+ const nanos = Number(n % 1000000000n);
255
+ return [seconds, nanos];
256
+ }
257
+ function toAttributes(attrs) {
258
+ const out = {};
259
+ for (const [k, v] of Object.entries(attrs)) {
260
+ if (v === null || v === undefined)
261
+ continue;
262
+ if (typeof v === "string" ||
263
+ typeof v === "number" ||
264
+ typeof v === "boolean") {
265
+ out[k] = v;
266
+ }
267
+ else {
268
+ out[k] = JSON.stringify(v);
269
+ }
270
+ }
271
+ return out;
272
+ }
273
+ function kindToOTel(kind) {
274
+ switch (kind) {
275
+ case "SERVER":
276
+ return OtelSpanKind.SERVER;
277
+ case "CLIENT":
278
+ return OtelSpanKind.CLIENT;
279
+ case "PRODUCER":
280
+ return OtelSpanKind.PRODUCER;
281
+ case "CONSUMER":
282
+ return OtelSpanKind.CONSUMER;
283
+ default:
284
+ return OtelSpanKind.INTERNAL;
285
+ }
286
+ }
287
+ function severityFromLevel(level) {
288
+ switch (level) {
289
+ case "debug":
290
+ return SeverityNumber.DEBUG;
291
+ case "info":
292
+ return SeverityNumber.INFO;
293
+ case "warn":
294
+ return SeverityNumber.WARN;
295
+ case "error":
296
+ return SeverityNumber.ERROR;
297
+ default:
298
+ return SeverityNumber.UNSPECIFIED;
299
+ }
300
+ }
301
+ function buildLogAttributes(envelope, fields) {
302
+ const attrs = {
303
+ "service.name": envelope.service,
304
+ "deployment.environment.name": envelope.env,
305
+ tenant_id: envelope.tenant_id,
306
+ request_id: envelope.request_id,
307
+ ...(envelope.user_id ? { user_id: envelope.user_id } : {}),
308
+ ...(envelope.actor_type ? { actor_type: envelope.actor_type } : {}),
309
+ ...(envelope.on_behalf_of ? { on_behalf_of: envelope.on_behalf_of } : {}),
310
+ ...(envelope.intent_id ? { intent_id: envelope.intent_id } : {}),
311
+ ...(envelope.trace_id ? { "telemetry.trace_id": envelope.trace_id } : {}),
312
+ ...(envelope.span_id ? { "telemetry.span_id": envelope.span_id } : {}),
313
+ ...fields,
314
+ };
315
+ return attrs;
316
+ }
317
+ function currentTraceCtx() {
318
+ const span = otelTrace.getSpan(otelContext.active());
319
+ if (!span)
320
+ return null;
321
+ const sc = span.spanContext();
322
+ if (!sc.traceId)
323
+ return null;
324
+ return {
325
+ traceId: sc.traceId,
326
+ spanId: sc.spanId,
327
+ traceFlags: sc.traceFlags ?? TraceFlags.NONE,
328
+ };
329
+ }
330
+ function classifyExportError(err) {
331
+ const msg = err instanceof Error ? err.message : String(err);
332
+ if (/queue/i.test(msg))
333
+ return "queue_full";
334
+ if (/timeout/i.test(msg))
335
+ return "timeout";
336
+ if (/5\d\d/.test(msg))
337
+ return "server_5xx";
338
+ return "network_error";
339
+ }
340
+ /**
341
+ * Cross-language endpoint normalization. Python and Go accept
342
+ * `localhost:4317`; TS's OTLP gRPC exporter requires a URL with
343
+ * scheme. We accept both and prepend `http://` for TS if absent.
344
+ */
345
+ function normalizeOtlpUrlForTs(endpoint) {
346
+ const trimmed = endpoint.trim();
347
+ if (/^[a-zA-Z]+:\/\//.test(trimmed))
348
+ return trimmed;
349
+ return `http://${trimmed}`;
350
+ }
351
+ //# sourceMappingURL=otlp-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-adapter.js","sourceRoot":"","sources":["../src/otlp-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface OutboxEvent {
2
+ /** Locked topic format `<service>.<entity>.<verb>.v<N>`. */
3
+ topic: string;
4
+ /** Stable event id. UUIDv7 preferred. */
5
+ event_id: string;
6
+ payload: Record<string, unknown>;
7
+ /** Schema version embedded in the topic; surfaced here for outbox writers that want it as a column. */
8
+ schema_version: number;
9
+ }
10
+ export interface OutboxColumns {
11
+ tenant_id: string | null;
12
+ request_id: string | null;
13
+ intent_id: string | null;
14
+ trace_parent: string | null;
15
+ trace_state: string | null;
16
+ context_envelope: Record<string, unknown>;
17
+ }
18
+ export type OutboxWriter = (event: OutboxEvent, columns: OutboxColumns) => Promise<void> | void;
19
+ /**
20
+ * SDK-internal: the `@nodii/telemetry/outbox` adapter or service init
21
+ * code sets the writer. Public callers MUST NOT call this directly.
22
+ */
23
+ export declare function _setOutboxWriter(w: OutboxWriter): void;
24
+ export declare function _resetOutboxWriterForTests(): void;
25
+ /**
26
+ * Stage an outbox row. Per D43: hybrid columns + context_envelope
27
+ * jsonb. The columns are derived from the active NodiiContext + OTel
28
+ * span; the envelope is a JSON blob of the remaining context fields.
29
+ *
30
+ * Returns the resolved columns so callers (typically the intent
31
+ * lifecycle) can verify what was staged.
32
+ */
33
+ export declare function emitOutbox(event: OutboxEvent): Promise<OutboxColumns>;
34
+ //# sourceMappingURL=outbox-emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-emit.d.ts","sourceRoot":"","sources":["../src/outbox-emit.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,uGAAuG;IACvG,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAQ1B;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAEtD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB3E"}
@@ -0,0 +1,58 @@
1
+ // Outbox emit helper.
2
+ //
3
+ // Per D43 + the communication-doctrine § 9.1: outbox rows carry the
4
+ // propagation columns directly (`tenant_id, request_id, intent_id,
5
+ // trace_parent, trace_state`) plus a `context_envelope jsonb` blob.
6
+ //
7
+ // `@nodii/telemetry` exposes a thin emit helper that consumers call to
8
+ // stage an outbox row in their service's transaction. The library
9
+ // itself does NOT own the outbox table — that's a per-service schema.
10
+ // Consumers register a writer via `_setOutboxWriter` (typically through
11
+ // the `@nodii/telemetry/outbox` subpath adapter); the default is a
12
+ // no-op that allows `intent.begin/complete/abandon` to call through
13
+ // without crashing when the consumer hasn't wired the outbox yet.
14
+ import { getContext } from "./context";
15
+ import { getActiveSpan } from "./active-span";
16
+ const noopWriter = () => {
17
+ /* no-op default; consumers wire a real writer */
18
+ };
19
+ let writer = noopWriter;
20
+ /**
21
+ * SDK-internal: the `@nodii/telemetry/outbox` adapter or service init
22
+ * code sets the writer. Public callers MUST NOT call this directly.
23
+ */
24
+ export function _setOutboxWriter(w) {
25
+ writer = w;
26
+ }
27
+ export function _resetOutboxWriterForTests() {
28
+ writer = noopWriter;
29
+ }
30
+ /**
31
+ * Stage an outbox row. Per D43: hybrid columns + context_envelope
32
+ * jsonb. The columns are derived from the active NodiiContext + OTel
33
+ * span; the envelope is a JSON blob of the remaining context fields.
34
+ *
35
+ * Returns the resolved columns so callers (typically the intent
36
+ * lifecycle) can verify what was staged.
37
+ */
38
+ export async function emitOutbox(event) {
39
+ const ctx = getContext();
40
+ const span = getActiveSpan();
41
+ const traceParent = span && ctx ? `00-${span.trace_id}-${span.span_id}-01` : null;
42
+ const columns = {
43
+ tenant_id: ctx?.tenant_id ?? null,
44
+ request_id: ctx?.request_id ?? null,
45
+ intent_id: ctx?.intent_id ?? null,
46
+ trace_parent: traceParent,
47
+ trace_state: null,
48
+ context_envelope: {
49
+ user_id: ctx?.user_id ?? null,
50
+ actor_type: ctx?.actor_type ?? null,
51
+ on_behalf_of: ctx?.on_behalf_of ?? null,
52
+ role: ctx?.role ?? null,
53
+ },
54
+ };
55
+ await writer(event, columns);
56
+ return columns;
57
+ }
58
+ //# sourceMappingURL=outbox-emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-emit.js","sourceRoot":"","sources":["../src/outbox-emit.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,EAAE;AACF,oEAAoE;AACpE,mEAAmE;AACnE,oEAAoE;AACpE,EAAE;AACF,uEAAuE;AACvE,kEAAkE;AAClE,sEAAsE;AACtE,wEAAwE;AACxE,mEAAmE;AACnE,oEAAoE;AACpE,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AA0B9C,MAAM,UAAU,GAAiB,GAAG,EAAE;IACpC,iDAAiD;AACnD,CAAC,CAAC;AAEF,IAAI,MAAM,GAAiB,UAAU,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAe;IAC9C,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,GAAG,UAAU,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAkB;IACjD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,WAAW,GACf,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,OAAO,GAAkB;QAC7B,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;QACjC,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,IAAI;QACnC,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,IAAI;QACjC,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE;YAChB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,IAAI;YAC7B,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,IAAI;YACnC,YAAY,EAAE,GAAG,EAAE,YAAY,IAAI,IAAI;YACvC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI;SACxB;KACF,CAAC;IACF,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * D2 PII field-name allowlist. Keys whose name matches one of these
3
+ * (case-insensitive) get their value stripped to `[REDACTED]` before
4
+ * the log/span attribute is emitted.
5
+ *
6
+ * Source: the legacy telemetry doctrine D2 PII list, transcribed for
7
+ * v0.1.0. Adding new keys is an ADR-gated change.
8
+ */
9
+ export declare const PII_FIELD_NAMES: readonly string[];
10
+ /**
11
+ * Returns true iff the key name matches the D2 PII field-name list.
12
+ * Comparison is case-insensitive on the bare key (no normalization
13
+ * beyond `toLowerCase()`).
14
+ */
15
+ export declare function isPiiFieldName(key: string): boolean;
16
+ /**
17
+ * Redacts an arbitrary record by replacing values whose keys match the
18
+ * D2 PII list with `[REDACTED]`. Nested records are walked recursively.
19
+ * Arrays are walked element-by-element. Primitives at the top level are
20
+ * returned untouched (this function is for records only).
21
+ *
22
+ * Throws nothing under normal input; if a value is a non-serializable
23
+ * object (e.g. circular reference encountered via JSON.stringify
24
+ * elsewhere) the caller wraps this in `attemptRedaction()` to catch.
25
+ */
26
+ export declare function redactFields(input: Record<string, unknown>): Record<string, unknown>;
27
+ /**
28
+ * Apply the D15 regex pass to a string. Returns the redacted string.
29
+ * Each pattern that fires replaces its match with [REDACTED]; multiple
30
+ * matches per string are all replaced.
31
+ */
32
+ export declare function redactString(s: string): string;
33
+ /**
34
+ * Fail-closed wrapper. Returns:
35
+ * - `{ ok: true, redacted }` when redaction succeeded.
36
+ * - `{ ok: false, reason }` when redaction threw — caller drops the
37
+ * record and bumps `telemetry.sdk.redaction_failure_total{reason}`.
38
+ *
39
+ * Per D15 the line is DROPPED, not emitted unredacted. This is the
40
+ * canonical pass; the collector pass (D59) is defense-in-depth.
41
+ */
42
+ export type RedactionResult<T> = {
43
+ ok: true;
44
+ redacted: T;
45
+ } | {
46
+ ok: false;
47
+ reason: string;
48
+ };
49
+ export declare function attemptRedactFields(input: Record<string, unknown>): RedactionResult<Record<string, unknown>>;
50
+ export declare function attemptRedactString(s: string): RedactionResult<string>;
51
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAyCnC,CAAC;AAwCX;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAYD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAA;CAAE,GACzB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAS1C;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAStE"}