@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,230 @@
1
+ /**
2
+ * D41 lock: the per-request context written ONCE on request entry by an
3
+ * SDK middleware adapter (§ 5.9), never mutated within a request. Read
4
+ * via `getContext()`; child scopes created via `withContext({...}, fn)`.
5
+ */
6
+ export interface NodiiContext {
7
+ /** UUID. Bare label `tenant_id` per D20 — same key across signals. */
8
+ tenant_id: string;
9
+ /** null when `actor_type !== 'user'`. */
10
+ user_id: string | null;
11
+ actor_type: ActorType;
12
+ /** Set when `actor_type === 'agent'`. */
13
+ on_behalf_of: string | null;
14
+ role: string;
15
+ request_id: string;
16
+ /** Set when an intent is active (D46/D155). */
17
+ intent_id: string | null;
18
+ }
19
+ /** D41 + D45/D46 (E5 reframe). Locked enum. */
20
+ export type ActorType = "user" | "agent" | "system" | "service";
21
+ /**
22
+ * D18 lock: six metric families. SDK rejects metric registrations whose
23
+ * declared family is outside this enum.
24
+ */
25
+ export type MetricFamily = "request_handler" | "saga" | "async_worker" | "outbox" | "pool" | "intent";
26
+ export declare const METRIC_FAMILIES: readonly MetricFamily[];
27
+ /**
28
+ * D156 lock (operator-confirmed: 7 fields despite prose saying "8"):
29
+ * `@agentInvocable` runtime metadata. Build-time codegen emits these to
30
+ * `agent-methods.generated.json` per service; runtime is a no-op at
31
+ * v0.1.0.
32
+ */
33
+ export interface AgentInvocableConfig {
34
+ mode: AgentInvocableMode;
35
+ authTier: AgentInvocableAuthTier;
36
+ sideEffects: readonly AgentInvocableSideEffect[];
37
+ /** Required when `mode === 'strict-only'`. */
38
+ allowedPipelines?: readonly string[];
39
+ idempotency: AgentInvocableIdempotency;
40
+ rateLimit?: AgentInvocableRateLimit;
41
+ description: string;
42
+ }
43
+ export type AgentInvocableMode = "composable" | "strict-only" | "human-only";
44
+ export type AgentInvocableAuthTier = "autonomous" | "confirmation-required" | "never";
45
+ /** D156 bounded vocab. SDK validates against this list at registration. */
46
+ export type AgentInvocableSideEffect = "db.write" | "db.delete" | "email.send" | "sms.send" | "slack.post" | "payment.charge" | "payment.refund" | "external-api" | "file.write" | "notification.send";
47
+ export declare const AGENT_INVOCABLE_SIDE_EFFECTS: readonly AgentInvocableSideEffect[];
48
+ export type AgentInvocableIdempotency = "keyed-by-request-id" | "natural-key" | "none";
49
+ export interface AgentInvocableRateLimit {
50
+ perMinute?: number;
51
+ perHour?: number;
52
+ perDay?: number;
53
+ }
54
+ /**
55
+ * D155 lock: intent_types registry shared with E5 gateway classifier
56
+ * via `intent-rules.json`. Loaded by `initTelemetry()` at start; SDK
57
+ * validates `intent.begin(typeName)` against this on every call (HARD
58
+ * from v0.1.0).
59
+ */
60
+ export interface IntentTypeDefinition {
61
+ typeName: string;
62
+ server_mintable: boolean;
63
+ client_mintable: boolean;
64
+ /** D155: per-type timeout. */
65
+ timeout_seconds: number;
66
+ }
67
+ export type IntentTypeRegistry = Record<string, IntentTypeDefinition>;
68
+ /**
69
+ * D16/D63/D64/D65/D66 lock — full shape ships at v0.1.0 with defaults
70
+ * matching OFF-at-launch. Flipping sampling on is a config change, NOT
71
+ * an API change. SDK reads `samplingConfig` from `initTelemetry()` but
72
+ * applies it only when D78 trigger fires.
73
+ */
74
+ export interface SamplingConfig {
75
+ /** D16: default false (off at launch). */
76
+ enabled: boolean;
77
+ keepRules: {
78
+ /** D65 default 1.0 (100%). */
79
+ errors: number;
80
+ /** D65 default 1.0. */
81
+ sagas: number;
82
+ /** D65 default 1.0. */
83
+ agentAttributed: number;
84
+ /** D65 default 1.0. */
85
+ intent: number;
86
+ /** D64: latency keep-rule family-tiered. */
87
+ slowPerFamily: Record<MetricFamily, number>;
88
+ /** D65: per-family baseline probabilistic. */
89
+ baseline: Record<MetricFamily, number>;
90
+ };
91
+ cascade: {
92
+ /** D66: default true. */
93
+ keptTraceForcesKeptSpans: boolean;
94
+ /** D66: default true. */
95
+ keptTraceForcesKeptLogs: boolean;
96
+ };
97
+ }
98
+ /** Defaults exposed for callers who want to override only a slice. */
99
+ export declare const DEFAULT_SAMPLING_CONFIG: SamplingConfig;
100
+ /** D154 lock. */
101
+ export interface AutoInstrumentationConfig {
102
+ httpServer?: boolean;
103
+ httpClient?: boolean;
104
+ grpcServer?: boolean;
105
+ grpcClient?: boolean;
106
+ /** TS only per D149. */
107
+ bullmqProducer?: boolean;
108
+ /** TS only per D149. */
109
+ bullmqConsumer?: boolean;
110
+ /** D67 default on; runtime override per-service. */
111
+ pgQuerySpans?: boolean;
112
+ hostMetrics?: boolean;
113
+ logAutoStamping?: boolean;
114
+ resourceAttributes?: boolean;
115
+ /** D15: SDK-side canonical, fail-closed. */
116
+ piiRedaction?: boolean;
117
+ redisSpans?: boolean;
118
+ dnsLookups?: boolean;
119
+ fileSystem?: boolean;
120
+ pgDetailedStatement?: boolean;
121
+ }
122
+ /**
123
+ * D153 lock: backpressure + drop policy. SDK queue → memory_limiter →
124
+ * exporter queue. No persistent buffer at v1. Drop is the policy; the
125
+ * counter is the observability.
126
+ */
127
+ export interface ErrorHandlingConfig {
128
+ /** D153 default: 5000. */
129
+ otlpSendingQueueSize: number;
130
+ /** Drop on queue full; counter increments. Always true at v0.1.0. */
131
+ dropOnFull: true;
132
+ }
133
+ /** Reasons recorded by `telemetry.sdk.export_failures_total`. */
134
+ export type ExportFailureReason = "queue_full" | "network_error" | "server_5xx" | "timeout";
135
+ /**
136
+ * D60 resource attributes. `serviceName` + `env` are required;
137
+ * everything else is optional and surfaces as OTel Resource attributes.
138
+ */
139
+ export interface ResourceAttributes {
140
+ serviceName: string;
141
+ /** 'dev' | 'uat' | 'prod' typical; locked at service deploy time. */
142
+ env: string;
143
+ serviceVersion?: string;
144
+ deploymentRegion?: string;
145
+ /** Free-form additional attributes. */
146
+ extra?: Record<string, string | number | boolean>;
147
+ }
148
+ /** The full `initTelemetry()` argument shape. */
149
+ export interface InitTelemetryConfig {
150
+ /** D60 resource attributes. `serviceName` + `env` required. */
151
+ serviceName: string;
152
+ env: string;
153
+ serviceVersion?: string;
154
+ deploymentRegion?: string;
155
+ /** OTLP gRPC endpoint, e.g. `https://otel.dev.nucleus-cloud.in`. */
156
+ otlpEndpoint?: string;
157
+ /** D24 metric vocabulary registry. Loaded from disk via `vocabularyRegistry` arg. */
158
+ vocabularyRegistry?: MetricVocabularyRegistry;
159
+ /** D155 intent_types registry. */
160
+ intentTypes?: IntentTypeRegistry;
161
+ /** D154 toggles; missing = use D154 defaults. */
162
+ autoInstrumentation?: AutoInstrumentationConfig;
163
+ /** D16 sampling stub; defaults to OFF. */
164
+ samplingConfig?: SamplingConfig;
165
+ /** D153 backpressure + drop. */
166
+ errorHandling?: Partial<ErrorHandlingConfig>;
167
+ /** Free-form extra resource attributes (D60). */
168
+ resourceAttributes?: Record<string, string | number | boolean>;
169
+ /**
170
+ * When true, the real OTLP gRPC exporters are NOT installed at init —
171
+ * tracer/logger/metrics keep their no-op backends. Used by unit tests
172
+ * that want to assert SDK semantics without a live collector.
173
+ * Default: false (real OTLP exporters wired when `otlpEndpoint` is set).
174
+ */
175
+ disableOtlp?: boolean;
176
+ }
177
+ /**
178
+ * D24 lock: every metric name must be in this registry, with a family
179
+ * + description + the D-number that ADR-gates its inclusion. Registry
180
+ * file shipped as JSON at `vocabulary.json` (D24 § 5.4), loaded into
181
+ * this shape by `initTelemetry()`.
182
+ */
183
+ export interface MetricVocabularyEntry {
184
+ family: MetricFamily;
185
+ description: string;
186
+ /** D-number reference, e.g. `D23`. */
187
+ decision: string;
188
+ }
189
+ export type MetricVocabularyRegistry = Record<string, MetricVocabularyEntry>;
190
+ /**
191
+ * Locked log envelope per D13. All 11 fields are SDK-injected from
192
+ * `NodiiContext` + the initTelemetry config + active OTel context.
193
+ * Callers pass only `msg` + custom fields.
194
+ */
195
+ export interface LogEnvelope {
196
+ level: LogLevel;
197
+ /** ISO-8601 timestamp. */
198
+ ts: string;
199
+ msg: string;
200
+ /** From `initTelemetry({ serviceName })`. */
201
+ service: string;
202
+ /** From `initTelemetry({ env })`. */
203
+ env: string;
204
+ /** From `NodiiContext.tenant_id`. */
205
+ tenant_id: string;
206
+ /** From `NodiiContext.user_id`. May be null. */
207
+ user_id: string | null;
208
+ /** Set when `actor_type === 'agent'`; mirrors `NodiiContext.on_behalf_of`. */
209
+ on_behalf_of?: string | null;
210
+ /** D41 actor_type. */
211
+ actor_type?: ActorType;
212
+ /** From `NodiiContext.request_id`. */
213
+ request_id: string;
214
+ /** From active OTel context. Null when no span is active. */
215
+ trace_id: string | null;
216
+ /** From active OTel context. Null when no span is active. */
217
+ span_id: string | null;
218
+ /** From `NodiiContext.intent_id`. */
219
+ intent_id: string | null;
220
+ }
221
+ /** D14 levels. `info` default in prod; `debug` runtime-toggleable per-tenant. */
222
+ export type LogLevel = "debug" | "info" | "warn" | "error";
223
+ /**
224
+ * SDK error thrown when any public API is called before
225
+ * `initTelemetry()` has run. Caller catches → fix init order.
226
+ */
227
+ export declare class TelemetryNotInitialized extends Error {
228
+ constructor();
229
+ }
230
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,66 @@
1
+ // Core type surface for @nodii/telemetry v0.1.0.
2
+ //
3
+ // Locked by feature_doc `nodii-libs/telemetry` v3 (D13, D18, D20–D22,
4
+ // D26, D40–D43, D60, D151–D156). Every other module in this package
5
+ // imports from here.
6
+ export const METRIC_FAMILIES = [
7
+ "request_handler",
8
+ "saga",
9
+ "async_worker",
10
+ "outbox",
11
+ "pool",
12
+ "intent",
13
+ ];
14
+ export const AGENT_INVOCABLE_SIDE_EFFECTS = [
15
+ "db.write",
16
+ "db.delete",
17
+ "email.send",
18
+ "sms.send",
19
+ "slack.post",
20
+ "payment.charge",
21
+ "payment.refund",
22
+ "external-api",
23
+ "file.write",
24
+ "notification.send",
25
+ ];
26
+ /** Defaults exposed for callers who want to override only a slice. */
27
+ export const DEFAULT_SAMPLING_CONFIG = {
28
+ enabled: false,
29
+ keepRules: {
30
+ errors: 1.0,
31
+ sagas: 1.0,
32
+ agentAttributed: 1.0,
33
+ intent: 1.0,
34
+ slowPerFamily: {
35
+ request_handler: 1.0,
36
+ saga: 1.0,
37
+ async_worker: 1.0,
38
+ outbox: 1.0,
39
+ pool: 1.0,
40
+ intent: 1.0,
41
+ },
42
+ baseline: {
43
+ request_handler: 0.1,
44
+ saga: 0.1,
45
+ async_worker: 0.1,
46
+ outbox: 0.1,
47
+ pool: 0.1,
48
+ intent: 0.1,
49
+ },
50
+ },
51
+ cascade: {
52
+ keptTraceForcesKeptSpans: true,
53
+ keptTraceForcesKeptLogs: true,
54
+ },
55
+ };
56
+ /**
57
+ * SDK error thrown when any public API is called before
58
+ * `initTelemetry()` has run. Caller catches → fix init order.
59
+ */
60
+ export class TelemetryNotInitialized extends Error {
61
+ constructor() {
62
+ super("`@nodii/telemetry` was not initialized before use. Call `initTelemetry(...)` once at process start.");
63
+ this.name = "TelemetryNotInitialized";
64
+ }
65
+ }
66
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,qBAAqB;AAoCrB,MAAM,CAAC,MAAM,eAAe,GAA4B;IACtD,iBAAiB;IACjB,MAAM;IACN,cAAc;IACd,QAAQ;IACR,MAAM;IACN,QAAQ;CACA,CAAC;AAsCX,MAAM,CAAC,MAAM,4BAA4B,GACvC;IACE,UAAU;IACV,WAAW;IACX,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,cAAc;IACd,YAAY;IACZ,mBAAmB;CACX,CAAC;AA4Db,sEAAsE;AACtE,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,OAAO,EAAE,KAAK;IACd,SAAS,EAAE;QACT,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,GAAG;QACV,eAAe,EAAE,GAAG;QACpB,MAAM,EAAE,GAAG;QACX,aAAa,EAAE;YACb,eAAe,EAAE,GAAG;YACpB,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,GAAG;SACZ;QACD,QAAQ,EAAE;YACR,eAAe,EAAE,GAAG;YACpB,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,GAAG;SACZ;KACF;IACD,OAAO,EAAE;QACP,wBAAwB,EAAE,IAAI;QAC9B,uBAAuB,EAAE,IAAI;KAC9B;CACF,CAAC;AA4IF;;;GAGG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD;QACE,KAAK,CACH,qGAAqG,CACtG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
package/dist/uuid.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /** Generate a UUIDv7. Time-ordered, k-sortable. */
2
+ export declare function uuidv7(): string;
3
+ /** Validate UUIDv7 surface shape (8-4-4-4-12 hex, version nibble = 7). */
4
+ export declare function isUuidv7(s: string): boolean;
5
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAUA,mDAAmD;AACnD,wBAAgB,MAAM,IAAI,MAAM,CAyB/B;AAED,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAI3C"}
package/dist/uuid.js ADDED
@@ -0,0 +1,34 @@
1
+ // UUIDv7 mint. Used by:
2
+ // - `intent.begin()` to generate the intent_id sync (D155).
3
+ // - Middleware adapters minting `request_id` when the inbound request
4
+ // lacks one (§ 5.9 — fallback only).
5
+ //
6
+ // UUIDv7 layout (RFC 9562 §5.7):
7
+ // 48-bit Unix ts ms | 4-bit version (=7) | 12-bit rand | 2-bit variant (=10) | 62-bit rand
8
+ import { randomBytes } from "node:crypto";
9
+ /** Generate a UUIDv7. Time-ordered, k-sortable. */
10
+ export function uuidv7() {
11
+ const ts = BigInt(Date.now());
12
+ const rand = randomBytes(10); // 80 bits of randomness; we use 74 (12 + 62)
13
+ // 6 bytes of timestamp.
14
+ const tsHex = ts.toString(16).padStart(12, "0");
15
+ // 2 bytes for: 4-bit version (=7) + 12-bit random
16
+ const r12 = ((rand[0] ?? 0) << 4) | ((rand[1] ?? 0) >> 4); // 12 bits
17
+ const verAndRand = (0x7000 | (r12 & 0x0fff)).toString(16).padStart(4, "0");
18
+ // 2 bytes for: 2-bit variant (=10) + 14-bit random
19
+ const r14 = (((rand[1] ?? 0) & 0x0f) << 10) |
20
+ ((rand[2] ?? 0) << 2) |
21
+ ((rand[3] ?? 0) >> 6); // 14 bits
22
+ const variantAndRand = (0x8000 | (r14 & 0x3fff))
23
+ .toString(16)
24
+ .padStart(4, "0");
25
+ // 6 bytes (48 bits) of remaining random.
26
+ const tailBytes = rand.subarray(3, 9);
27
+ const tailHex = Buffer.from(tailBytes).toString("hex");
28
+ return `${tsHex.slice(0, 8)}-${tsHex.slice(8, 12)}-${verAndRand}-${variantAndRand}-${tailHex}`;
29
+ }
30
+ /** Validate UUIDv7 surface shape (8-4-4-4-12 hex, version nibble = 7). */
31
+ export function isUuidv7(s) {
32
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(s);
33
+ }
34
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,8DAA8D;AAC9D,wEAAwE;AACxE,yCAAyC;AACzC,EAAE;AACF,iCAAiC;AACjC,6FAA6F;AAE7F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,mDAAmD;AACnD,MAAM,UAAU,MAAM;IACpB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,6CAA6C;IAE3E,wBAAwB;IACxB,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAEhD,kDAAkD;IAClD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU;IACrE,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE3E,mDAAmD;IACnD,MAAM,GAAG,GACP,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU;IACnC,MAAM,cAAc,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;SAC7C,QAAQ,CAAC,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEpB,yCAAyC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEvD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;AACjG,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,wEAAwE,CAAC,IAAI,CAClF,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nodii/telemetry",
3
- "version": "0.0.2",
4
- "description": "Placeholder for @nodii/telemetryimplementation lands at v0.1.0",
3
+ "version": "0.3.0",
4
+ "description": "Substrate observability library for the Nodii microservice stack OTel wrapper, log envelope, intent lifecycle, audit signal, agent registry, context propagation. Spec: planning hub docKey=telemetry.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -10,24 +10,61 @@
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
12
  "default": "./dist/index.js"
13
+ },
14
+ "./drizzle": {
15
+ "types": "./dist/drizzle/index.d.ts",
16
+ "default": "./dist/drizzle/index.js"
13
17
  }
14
18
  },
15
- "files": ["dist"],
19
+ "files": [
20
+ "dist"
21
+ ],
16
22
  "publishConfig": {
17
- "access": "public",
18
- "provenance": true
23
+ "access": "public"
19
24
  },
20
25
  "scripts": {
21
26
  "build": "tsc",
22
27
  "typecheck": "tsc --noEmit",
23
- "test": "echo 'no tests yet; placeholder package'"
28
+ "test": "bun test"
29
+ },
30
+ "dependencies": {
31
+ "@grpc/grpc-js": "^1.12.2",
32
+ "@opentelemetry/api": "^1.9.0",
33
+ "@opentelemetry/api-logs": "^0.57.2",
34
+ "@opentelemetry/exporter-logs-otlp-grpc": "^0.57.2",
35
+ "@opentelemetry/exporter-metrics-otlp-grpc": "^0.57.2",
36
+ "@opentelemetry/exporter-trace-otlp-grpc": "^0.57.2",
37
+ "@opentelemetry/resources": "^1.30.1",
38
+ "@opentelemetry/sdk-logs": "^0.57.2",
39
+ "@opentelemetry/sdk-metrics": "^1.30.1",
40
+ "@opentelemetry/sdk-node": "^0.57.2",
41
+ "@opentelemetry/sdk-trace-base": "^1.30.1",
42
+ "@opentelemetry/sdk-trace-node": "^1.30.1",
43
+ "@opentelemetry/semantic-conventions": "^1.28.0"
44
+ },
45
+ "peerDependencies": {
46
+ "@opentelemetry/api": "^1.9.0",
47
+ "@opentelemetry/api-logs": "^0.57.2",
48
+ "drizzle-orm": "^0.36.0"
49
+ },
50
+ "peerDependenciesMeta": {
51
+ "@opentelemetry/api": {
52
+ "optional": true
53
+ },
54
+ "@opentelemetry/api-logs": {
55
+ "optional": true
56
+ },
57
+ "drizzle-orm": {
58
+ "optional": true
59
+ }
24
60
  },
25
61
  "devDependencies": {
62
+ "drizzle-orm": "^0.36.0",
26
63
  "typescript": "^5.9.3"
27
64
  },
28
65
  "repository": {
29
66
  "type": "git",
30
- "url": "https://github.com/cognion-nucleus/nodii-libs.git",
67
+ "url": "git+https://github.com/cognion-nucleus/nodii-libs.git",
31
68
  "directory": "ts/telemetry"
32
69
  }
33
70
  }