@kb-labs/adapters-pino 2.112.0 → 2.116.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -107,6 +107,7 @@ declare class PinoLoggerAdapter implements ILogger {
107
107
  */
108
108
  private constructor_child;
109
109
  private mergeBindings;
110
+ private sourceOf;
110
111
  info(message: string, meta?: Record<string, unknown>): void;
111
112
  warn(message: string, meta?: Record<string, unknown>): void;
112
113
  error(message: string, error?: Error, meta?: Record<string, unknown>): void;
@@ -125,7 +126,7 @@ declare class PinoLoggerAdapter implements ILogger {
125
126
  * @param callback - Function to call on each log event
126
127
  * @returns Unsubscribe function to remove the callback
127
128
  */
128
- onLog(callback: (record: LogRecord) => void): () => void;
129
+ onLog(callback: (record: LogRecord) => void | Promise<void>): () => void;
129
130
  }
130
131
  /**
131
132
  * Create Pino logger adapter.
package/dist/index.js CHANGED
@@ -1,9 +1,7 @@
1
1
  import pino from 'pino';
2
- import { generateLogId } from '@kb-labs/sdk/adapters';
2
+ import { LOG_CONTEXT_FIELDS, generateLogId } from '@kb-labs/sdk/adapters';
3
3
 
4
4
  // src/index.ts
5
-
6
- // src/log-ring-buffer.ts
7
5
  var LogRingBuffer = class {
8
6
  buffer = [];
9
7
  subscribers = /* @__PURE__ */ new Set();
@@ -66,6 +64,12 @@ var LogRingBuffer = class {
66
64
  return recordLevelIndex >= minLevelIndex;
67
65
  });
68
66
  }
67
+ for (const field of LOG_CONTEXT_FIELDS) {
68
+ const value = query[field];
69
+ if (value !== void 0) {
70
+ results = results.filter((record) => record.fields[field] === value);
71
+ }
72
+ }
69
73
  if (query.limit !== void 0 && query.limit > 0) {
70
74
  results = results.slice(-query.limit);
71
75
  }
@@ -163,11 +167,13 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
163
167
  }
164
168
  } : void 0;
165
169
  const finalTransport = config.options?.transport ?? transport;
166
- this.pino = pino({
170
+ const destination = process.env.KB_LOG_STREAM === "stderr" ? process.stderr : void 0;
171
+ const pinoOptions = {
167
172
  level: resolvedLevel,
168
173
  ...config.options,
169
174
  transport: finalTransport
170
- });
175
+ };
176
+ this.pino = destination ? pino(pinoOptions, destination) : pino(pinoOptions);
171
177
  }
172
178
  /**
173
179
  * Emit log record to all registered callbacks (extensions).
@@ -179,7 +185,12 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
179
185
  }
180
186
  for (const callback of this.logCallbacks) {
181
187
  try {
182
- callback(record);
188
+ void Promise.resolve(callback(record)).catch((error) => {
189
+ process.stderr.write(
190
+ `[kb-logs] log delivery extension failed: ${error instanceof Error ? error.message : String(error)}
191
+ `
192
+ );
193
+ });
183
194
  } catch (error) {
184
195
  console.error("[PinoLogger] Error in onLog callback:", error);
185
196
  }
@@ -202,6 +213,10 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
202
213
  }
203
214
  return { ...this.bindings, ...meta };
204
215
  }
216
+ sourceOf(meta) {
217
+ const source = meta.source ?? meta.serviceId ?? meta.applicationId;
218
+ return typeof source === "string" && source.length > 0 ? source : "unknown";
219
+ }
205
220
  info(message, meta) {
206
221
  const logId = generateLogId();
207
222
  const timestamp = Date.now();
@@ -213,7 +228,7 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
213
228
  level: "info",
214
229
  message,
215
230
  fields: mergedMeta,
216
- source: mergedMeta.source ?? "unknown"
231
+ source: this.sourceOf(mergedMeta)
217
232
  };
218
233
  this.logBuffer?.append(record);
219
234
  this.emitLog(record);
@@ -229,7 +244,7 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
229
244
  level: "warn",
230
245
  message,
231
246
  fields: mergedMeta,
232
- source: mergedMeta.source ?? "unknown"
247
+ source: this.sourceOf(mergedMeta)
233
248
  };
234
249
  this.logBuffer?.append(record);
235
250
  this.emitLog(record);
@@ -255,7 +270,7 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
255
270
  level: "error",
256
271
  message,
257
272
  fields: enrichedMeta,
258
- source: mergedMeta.source ?? "unknown"
273
+ source: this.sourceOf(mergedMeta)
259
274
  };
260
275
  this.logBuffer?.append(record);
261
276
  this.emitLog(record);
@@ -281,7 +296,7 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
281
296
  level: "fatal",
282
297
  message,
283
298
  fields: enrichedMeta,
284
- source: mergedMeta.source ?? "unknown"
299
+ source: this.sourceOf(mergedMeta)
285
300
  };
286
301
  this.logBuffer?.append(record);
287
302
  this.emitLog(record);
@@ -297,7 +312,7 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
297
312
  level: "debug",
298
313
  message,
299
314
  fields: mergedMeta,
300
- source: mergedMeta.source ?? "unknown"
315
+ source: this.sourceOf(mergedMeta)
301
316
  };
302
317
  this.logBuffer?.append(record);
303
318
  this.emitLog(record);
@@ -313,7 +328,7 @@ var PinoLoggerAdapter = class _PinoLoggerAdapter {
313
328
  level: "trace",
314
329
  message,
315
330
  fields: mergedMeta,
316
- source: mergedMeta.source ?? "unknown"
331
+ source: this.sourceOf(mergedMeta)
317
332
  };
318
333
  this.logBuffer?.append(record);
319
334
  this.emitLog(record);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/log-ring-buffer.ts","../src/manifest.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/adapters-pino/log-ring-buffer\n * Ring buffer for in-memory log storage with real-time streaming\n */\n\nimport type {\n LogRecord,\n LogQuery,\n ILogBuffer,\n LogLevel,\n} from \"@kb-labs/sdk/adapters\";\n\n/**\n * Ring buffer implementation for log storage\n */\nexport class LogRingBuffer implements ILogBuffer {\n private buffer: LogRecord[] = [];\n private subscribers: Set<(record: LogRecord) => void> = new Set();\n private readonly maxSize: number;\n private readonly maxAge: number;\n\n constructor(maxSize: number = 1000, maxAge: number = 3600000) {\n this.maxSize = maxSize;\n this.maxAge = maxAge; // milliseconds\n }\n\n /**\n * Append log record to buffer\n */\n append(record: LogRecord): void {\n // Add to buffer\n this.buffer.push(record);\n\n // Evict old entries by size\n if (this.buffer.length > this.maxSize) {\n this.buffer.shift();\n }\n\n // Evict old entries by age\n const now = Date.now();\n const cutoff = now - this.maxAge;\n while (this.buffer.length > 0 && this.buffer[0]!.timestamp < cutoff) {\n this.buffer.shift();\n }\n\n // Notify subscribers\n for (const subscriber of this.subscribers) {\n try {\n subscriber(record);\n } catch (error) {\n // Ignore subscriber errors\n console.error(\"[LogRingBuffer] Subscriber error:\", error);\n }\n }\n }\n\n /**\n * Query logs with filters\n */\n query(query?: LogQuery): LogRecord[] {\n let results = [...this.buffer];\n\n if (!query) {\n return results;\n }\n\n // Filter by time range\n if (query.from !== undefined) {\n results = results.filter((r) => r.timestamp >= query.from!);\n }\n if (query.to !== undefined) {\n results = results.filter((r) => r.timestamp <= query.to!);\n }\n\n // Filter by source\n if (query.source !== undefined) {\n results = results.filter((r) => r.source === query.source);\n }\n\n // Filter by level (minimum level)\n if (query.level !== undefined) {\n const levels: LogLevel[] = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n ];\n const minLevelIndex = levels.indexOf(query.level);\n results = results.filter((r) => {\n const recordLevelIndex = levels.indexOf(r.level);\n return recordLevelIndex >= minLevelIndex;\n });\n }\n\n // Apply limit\n if (query.limit !== undefined && query.limit > 0) {\n results = results.slice(-query.limit); // Take most recent N\n }\n\n return results;\n }\n\n /**\n * Subscribe to real-time log stream\n */\n subscribe(callback: (record: LogRecord) => void): () => void {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Find log by ID in buffer\n */\n findById(id: string): LogRecord | undefined {\n return this.buffer.find((record) => record.id === id);\n }\n\n /**\n * Get buffer statistics\n */\n getStats(): {\n total: number;\n bufferSize: number;\n oldestTimestamp: number | null;\n newestTimestamp: number | null;\n } {\n return {\n total: this.buffer.length,\n bufferSize: this.maxSize,\n oldestTimestamp:\n this.buffer.length > 0 ? this.buffer[0]!.timestamp : null,\n newestTimestamp:\n this.buffer.length > 0\n ? this.buffer[this.buffer.length - 1]!.timestamp\n : null,\n };\n }\n}\n","/**\n * @module @kb-labs/adapters-pino/manifest\n * Adapter manifest for Pino logger.\n */\n\nimport type { AdapterManifest } from \"@kb-labs/sdk/adapters\";\n\n/**\n * Adapter manifest for Pino logger.\n */\nexport const manifest: AdapterManifest = {\n manifestVersion: \"1.0.0\",\n id: \"pino-logger\",\n name: \"Pino Logger\",\n version: \"1.0.0\",\n description: \"Production-ready structured logger based on Pino\",\n author: \"KB Labs Team\",\n license: \"KBPL-1.1\",\n type: \"core\",\n implements: \"ILogger\",\n optional: {\n adapters: [\"analytics\"],\n },\n capabilities: {\n streaming: true,\n },\n configSchema: {\n level: {\n type: \"string\",\n enum: [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"],\n default: \"info\",\n description: \"Minimum log level\",\n },\n pretty: {\n type: \"boolean\",\n default: false,\n description: \"Enable pretty printing for development\",\n },\n streaming: {\n type: \"object\",\n description: \"Log streaming/buffering configuration\",\n properties: {\n enabled: { type: \"boolean\", default: false },\n bufferSize: { type: \"number\", default: 1000 },\n bufferMaxAge: { type: \"number\", default: 3600000 },\n },\n },\n },\n};\n","/**\n * @module @kb-labs/adapters-pino\n * Pino adapter implementing ILogger interface.\n *\n * @example\n * ```typescript\n * import { createAdapter } from '@kb-labs/adapters-pino';\n *\n * const logger = createAdapter({\n * level: 'info',\n * pretty: true,\n * });\n *\n * logger.info('Server started', { port: 3000 });\n * logger.error('Failed to connect', new Error('Connection timeout'));\n *\n * const childLogger = logger.child({ service: 'api' });\n * childLogger.debug('Request received');\n * ```\n */\n\nimport pino, { type Logger as PinoLoggerInstance } from \"pino\";\nimport type { ILogger, ILogBuffer, LogRecord } from \"@kb-labs/sdk/adapters\";\nimport { generateLogId } from \"@kb-labs/sdk/adapters\";\nimport { LogRingBuffer } from \"./log-ring-buffer\";\n\n// Re-export manifest\nexport { manifest } from \"./manifest.js\";\n\n/**\n * Configuration for log streaming/buffering\n */\nexport interface StreamingConfig {\n /** Enable log buffering for streaming (default: false) */\n enabled: boolean;\n /** Maximum buffer size (number of log records, default: 1000) */\n bufferSize?: number;\n /** Maximum age of logs in buffer (milliseconds, default: 3600000 = 1 hour) */\n bufferMaxAge?: number;\n}\n\n/**\n * Configuration for Pino logger adapter.\n */\nexport interface PinoLoggerConfig {\n /** Log level (default: 'info') */\n level?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n /** Enable pretty printing for development (default: false) */\n pretty?: boolean;\n /** Streaming configuration (optional) */\n streaming?: StreamingConfig;\n /** Additional pino options */\n options?: pino.LoggerOptions;\n}\n\n/**\n * Pino implementation of ILogger interface.\n */\nexport class PinoLoggerAdapter implements ILogger {\n private pino: PinoLoggerInstance;\n private logBuffer?: LogRingBuffer;\n private logCallbacks = new Set<(record: LogRecord) => void>();\n private bindings: Record<string, unknown> = {};\n\n constructor(config: PinoLoggerConfig = {}) {\n // Resolve log level with priority: ENV var > config.level > 'info'\n // This allows overriding via KB_LOG_LEVEL or LOG_LEVEL environment variables\n const resolvedLevel =\n (process.env.KB_LOG_LEVEL as PinoLoggerConfig[\"level\"]) ??\n (process.env.LOG_LEVEL as PinoLoggerConfig[\"level\"]) ??\n (process.env.KB_DEBUG === 'true' ? 'debug' : undefined) ??\n config.level ??\n \"info\";\n\n // Initialize log buffer if streaming is enabled\n if (config.streaming?.enabled) {\n this.logBuffer = new LogRingBuffer(\n config.streaming.bufferSize ?? 1000,\n config.streaming.bufferMaxAge ?? 3600000,\n );\n }\n\n const transport = config.pretty\n ? {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"SYS:standard\",\n ignore: \"pid,hostname\",\n },\n }\n : undefined;\n\n // Merge options, but transport from config.options takes precedence\n const finalTransport = config.options?.transport ?? transport;\n\n // Always use single pino instance (no multistream)\n // LogRingBuffer is fed directly in log methods, not via Pino stream\n this.pino = pino({\n level: resolvedLevel,\n ...config.options,\n transport: finalTransport,\n });\n }\n\n /**\n * Emit log record to all registered callbacks (extensions).\n * Fire-and-forget - errors in callbacks don't block logging.\n */\n private emitLog(record: LogRecord): void {\n if (this.logCallbacks.size === 0) {\n return;\n }\n\n for (const callback of this.logCallbacks) {\n try {\n callback(record);\n } catch (error) {\n console.error(\"[PinoLogger] Error in onLog callback:\", error);\n }\n }\n }\n\n /**\n * Internal constructor for child loggers.\n */\n private constructor_child(pinoInstance: PinoLoggerInstance, bindings: Record<string, unknown>) {\n const instance = Object.create(PinoLoggerAdapter.prototype);\n instance.pino = pinoInstance;\n instance.logCallbacks = this.logCallbacks; // Share callbacks with parent\n instance.logBuffer = this.logBuffer; // Share buffer with parent\n instance.bindings = bindings;\n return instance;\n }\n\n private mergeBindings(meta?: Record<string, unknown>): Record<string, unknown> {\n if (!meta) {\n return { ...this.bindings };\n }\n return { ...this.bindings, ...meta };\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.info(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"info\",\n message,\n fields: mergedMeta,\n source: (mergedMeta.source as string) ?? \"unknown\",\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.warn(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"warn\",\n message,\n fields: mergedMeta,\n source: (mergedMeta.source as string) ?? \"unknown\",\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n error(message: string, error?: Error, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n const enrichedMeta = {\n ...mergedMeta,\n ...(error && {\n error: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n },\n }),\n };\n\n this.pino.error(enrichedMeta, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"error\",\n message,\n fields: enrichedMeta,\n source: (mergedMeta.source as string) ?? \"unknown\",\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n fatal(message: string, error?: Error, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n const enrichedMeta = {\n ...mergedMeta,\n ...(error && {\n error: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n },\n }),\n };\n\n this.pino.fatal(enrichedMeta, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"fatal\",\n message,\n fields: enrichedMeta,\n source: (mergedMeta.source as string) ?? \"unknown\",\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.debug(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"debug\",\n message,\n fields: mergedMeta,\n source: (mergedMeta.source as string) ?? \"unknown\",\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n trace(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.trace(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"trace\",\n message,\n fields: mergedMeta,\n source: (mergedMeta.source as string) ?? \"unknown\",\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n child(bindings: Record<string, unknown>): ILogger {\n const mergedBindings = { ...this.bindings, ...bindings };\n const childPino = this.pino.child(bindings);\n return this.constructor_child(childPino, mergedBindings);\n }\n\n /**\n * Get log buffer for streaming/querying (ILogger optional method)\n */\n getLogBuffer(): ILogBuffer | undefined {\n return this.logBuffer;\n }\n\n /**\n * Register callback for every log event (ILogger optional method).\n * Used by platform to connect logger extensions (ring buffer, persistence).\n *\n * @param callback - Function to call on each log event\n * @returns Unsubscribe function to remove the callback\n */\n onLog(callback: (record: LogRecord) => void): () => void {\n this.logCallbacks.add(callback);\n return () => this.logCallbacks.delete(callback);\n }\n}\n\n/**\n * Create Pino logger adapter.\n * This is the factory function called by initPlatform() when loading adapters.\n */\nexport function createAdapter(config?: PinoLoggerConfig): PinoLoggerAdapter {\n return new PinoLoggerAdapter(config);\n}\n\n// Default export for direct import\nexport default createAdapter;\n\n// Export buffer class\nexport { LogRingBuffer } from \"./log-ring-buffer\";\n"]}
1
+ {"version":3,"sources":["../src/log-ring-buffer.ts","../src/manifest.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/adapters-pino/log-ring-buffer\n * Ring buffer for in-memory log storage with real-time streaming\n */\n\nimport { LOG_CONTEXT_FIELDS } from \"@kb-labs/sdk/adapters\";\nimport type {\n LogRecord,\n LogQuery,\n ILogBuffer,\n LogLevel,\n} from \"@kb-labs/sdk/adapters\";\n\n/**\n * Ring buffer implementation for log storage\n */\nexport class LogRingBuffer implements ILogBuffer {\n private buffer: LogRecord[] = [];\n private subscribers: Set<(record: LogRecord) => void> = new Set();\n private readonly maxSize: number;\n private readonly maxAge: number;\n\n constructor(maxSize: number = 1000, maxAge: number = 3600000) {\n this.maxSize = maxSize;\n this.maxAge = maxAge; // milliseconds\n }\n\n /**\n * Append log record to buffer\n */\n append(record: LogRecord): void {\n // Add to buffer\n this.buffer.push(record);\n\n // Evict old entries by size\n if (this.buffer.length > this.maxSize) {\n this.buffer.shift();\n }\n\n // Evict old entries by age\n const now = Date.now();\n const cutoff = now - this.maxAge;\n while (this.buffer.length > 0 && this.buffer[0]!.timestamp < cutoff) {\n this.buffer.shift();\n }\n\n // Notify subscribers\n for (const subscriber of this.subscribers) {\n try {\n subscriber(record);\n } catch (error) {\n // Ignore subscriber errors\n console.error(\"[LogRingBuffer] Subscriber error:\", error);\n }\n }\n }\n\n /**\n * Query logs with filters\n */\n query(query?: LogQuery): LogRecord[] {\n let results = [...this.buffer];\n\n if (!query) {\n return results;\n }\n\n // Filter by time range\n if (query.from !== undefined) {\n results = results.filter((r) => r.timestamp >= query.from!);\n }\n if (query.to !== undefined) {\n results = results.filter((r) => r.timestamp <= query.to!);\n }\n\n // Filter by source\n if (query.source !== undefined) {\n results = results.filter((r) => r.source === query.source);\n }\n\n // Filter by level (minimum level)\n if (query.level !== undefined) {\n const levels: LogLevel[] = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n ];\n const minLevelIndex = levels.indexOf(query.level);\n results = results.filter((r) => {\n const recordLevelIndex = levels.indexOf(r.level);\n return recordLevelIndex >= minLevelIndex;\n });\n }\n\n for (const field of LOG_CONTEXT_FIELDS) {\n const value = query[field];\n if (value !== undefined) {\n results = results.filter((record) => record.fields[field] === value);\n }\n }\n\n // Apply limit\n if (query.limit !== undefined && query.limit > 0) {\n results = results.slice(-query.limit); // Take most recent N\n }\n\n return results;\n }\n\n /**\n * Subscribe to real-time log stream\n */\n subscribe(callback: (record: LogRecord) => void): () => void {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Find log by ID in buffer\n */\n findById(id: string): LogRecord | undefined {\n return this.buffer.find((record) => record.id === id);\n }\n\n /**\n * Get buffer statistics\n */\n getStats(): {\n total: number;\n bufferSize: number;\n oldestTimestamp: number | null;\n newestTimestamp: number | null;\n } {\n return {\n total: this.buffer.length,\n bufferSize: this.maxSize,\n oldestTimestamp:\n this.buffer.length > 0 ? this.buffer[0]!.timestamp : null,\n newestTimestamp:\n this.buffer.length > 0\n ? this.buffer[this.buffer.length - 1]!.timestamp\n : null,\n };\n }\n}\n","/**\n * @module @kb-labs/adapters-pino/manifest\n * Adapter manifest for Pino logger.\n */\n\nimport type { AdapterManifest } from \"@kb-labs/sdk/adapters\";\n\n/**\n * Adapter manifest for Pino logger.\n */\nexport const manifest: AdapterManifest = {\n manifestVersion: \"1.0.0\",\n id: \"pino-logger\",\n name: \"Pino Logger\",\n version: \"1.0.0\",\n description: \"Production-ready structured logger based on Pino\",\n author: \"KB Labs Team\",\n license: \"KBPL-1.1\",\n type: \"core\",\n implements: \"ILogger\",\n optional: {\n adapters: [\"analytics\"],\n },\n capabilities: {\n streaming: true,\n },\n configSchema: {\n level: {\n type: \"string\",\n enum: [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"],\n default: \"info\",\n description: \"Minimum log level\",\n },\n pretty: {\n type: \"boolean\",\n default: false,\n description: \"Enable pretty printing for development\",\n },\n streaming: {\n type: \"object\",\n description: \"Log streaming/buffering configuration\",\n properties: {\n enabled: { type: \"boolean\", default: false },\n bufferSize: { type: \"number\", default: 1000 },\n bufferMaxAge: { type: \"number\", default: 3600000 },\n },\n },\n },\n};\n","/**\n * @module @kb-labs/adapters-pino\n * Pino adapter implementing ILogger interface.\n *\n * @example\n * ```typescript\n * import { createAdapter } from '@kb-labs/adapters-pino';\n *\n * const logger = createAdapter({\n * level: 'info',\n * pretty: true,\n * });\n *\n * logger.info('Server started', { port: 3000 });\n * logger.error('Failed to connect', new Error('Connection timeout'));\n *\n * const childLogger = logger.child({ service: 'api' });\n * childLogger.debug('Request received');\n * ```\n */\n\nimport pino, { type Logger as PinoLoggerInstance } from \"pino\";\nimport type { ILogger, ILogBuffer, LogRecord } from \"@kb-labs/sdk/adapters\";\nimport { generateLogId } from \"@kb-labs/sdk/adapters\";\nimport { LogRingBuffer } from \"./log-ring-buffer\";\n\n// Re-export manifest\nexport { manifest } from \"./manifest.js\";\n\n/**\n * Configuration for log streaming/buffering\n */\nexport interface StreamingConfig {\n /** Enable log buffering for streaming (default: false) */\n enabled: boolean;\n /** Maximum buffer size (number of log records, default: 1000) */\n bufferSize?: number;\n /** Maximum age of logs in buffer (milliseconds, default: 3600000 = 1 hour) */\n bufferMaxAge?: number;\n}\n\n/**\n * Configuration for Pino logger adapter.\n */\nexport interface PinoLoggerConfig {\n /** Log level (default: 'info') */\n level?: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n /** Enable pretty printing for development (default: false) */\n pretty?: boolean;\n /** Streaming configuration (optional) */\n streaming?: StreamingConfig;\n /** Additional pino options */\n options?: pino.LoggerOptions;\n}\n\n/**\n * Pino implementation of ILogger interface.\n */\nexport class PinoLoggerAdapter implements ILogger {\n private pino: PinoLoggerInstance;\n private logBuffer?: LogRingBuffer;\n private logCallbacks = new Set<(record: LogRecord) => void | Promise<void>>();\n private bindings: Record<string, unknown> = {};\n\n constructor(config: PinoLoggerConfig = {}) {\n // Resolve log level with priority: ENV var > config.level > 'info'\n // This allows overriding via KB_LOG_LEVEL or LOG_LEVEL environment variables\n const resolvedLevel =\n (process.env.KB_LOG_LEVEL as PinoLoggerConfig[\"level\"]) ??\n (process.env.LOG_LEVEL as PinoLoggerConfig[\"level\"]) ??\n (process.env.KB_DEBUG === \"true\" ? \"debug\" : undefined) ??\n config.level ??\n \"info\";\n\n // Initialize log buffer if streaming is enabled\n if (config.streaming?.enabled) {\n this.logBuffer = new LogRingBuffer(\n config.streaming.bufferSize ?? 1000,\n config.streaming.bufferMaxAge ?? 3600000,\n );\n }\n\n const transport = config.pretty\n ? {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"SYS:standard\",\n ignore: \"pid,hostname\",\n },\n }\n : undefined;\n\n // Merge options, but transport from config.options takes precedence\n const finalTransport = config.options?.transport ?? transport;\n\n // Always use single pino instance (no multistream). The CLI sets the\n // stream explicitly so diagnostics cannot contaminate command stdout.\n const destination =\n process.env.KB_LOG_STREAM === \"stderr\" ? process.stderr : undefined;\n const pinoOptions = {\n level: resolvedLevel,\n ...config.options,\n transport: finalTransport,\n };\n this.pino = destination\n ? pino(pinoOptions, destination)\n : pino(pinoOptions);\n }\n\n /**\n * Emit log record to all registered callbacks (extensions).\n * Fire-and-forget - errors in callbacks don't block logging.\n */\n private emitLog(record: LogRecord): void {\n if (this.logCallbacks.size === 0) {\n return;\n }\n\n for (const callback of this.logCallbacks) {\n try {\n void Promise.resolve(callback(record)).catch((error: unknown) => {\n // Delivery extensions are optional. A failed durable sink must not\n // take down the service or recurse through this logger.\n process.stderr.write(\n `[kb-logs] log delivery extension failed: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n });\n } catch (error) {\n console.error(\"[PinoLogger] Error in onLog callback:\", error);\n }\n }\n }\n\n /**\n * Internal constructor for child loggers.\n */\n private constructor_child(\n pinoInstance: PinoLoggerInstance,\n bindings: Record<string, unknown>,\n ) {\n const instance = Object.create(PinoLoggerAdapter.prototype);\n instance.pino = pinoInstance;\n instance.logCallbacks = this.logCallbacks; // Share callbacks with parent\n instance.logBuffer = this.logBuffer; // Share buffer with parent\n instance.bindings = bindings;\n return instance;\n }\n\n private mergeBindings(\n meta?: Record<string, unknown>,\n ): Record<string, unknown> {\n if (!meta) {\n return { ...this.bindings };\n }\n return { ...this.bindings, ...meta };\n }\n\n private sourceOf(meta: Record<string, unknown>): string {\n const source = meta.source ?? meta.serviceId ?? meta.applicationId;\n return typeof source === \"string\" && source.length > 0 ? source : \"unknown\";\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.info(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"info\",\n message,\n fields: mergedMeta,\n source: this.sourceOf(mergedMeta),\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.warn(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"warn\",\n message,\n fields: mergedMeta,\n source: this.sourceOf(mergedMeta),\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n error(message: string, error?: Error, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n const enrichedMeta = {\n ...mergedMeta,\n ...(error && {\n error: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n },\n }),\n };\n\n this.pino.error(enrichedMeta, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"error\",\n message,\n fields: enrichedMeta,\n source: this.sourceOf(mergedMeta),\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n fatal(message: string, error?: Error, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n const enrichedMeta = {\n ...mergedMeta,\n ...(error && {\n error: {\n message: error.message,\n stack: error.stack,\n name: error.name,\n },\n }),\n };\n\n this.pino.fatal(enrichedMeta, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"fatal\",\n message,\n fields: enrichedMeta,\n source: this.sourceOf(mergedMeta),\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.debug(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"debug\",\n message,\n fields: mergedMeta,\n source: this.sourceOf(mergedMeta),\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n trace(message: string, meta?: Record<string, unknown>): void {\n const logId = generateLogId();\n const timestamp = Date.now();\n const mergedMeta = this.mergeBindings(meta);\n\n this.pino.trace(meta ?? {}, message);\n\n const record: LogRecord = {\n id: logId,\n timestamp,\n level: \"trace\",\n message,\n fields: mergedMeta,\n source: this.sourceOf(mergedMeta),\n };\n\n this.logBuffer?.append(record);\n this.emitLog(record);\n }\n\n child(bindings: Record<string, unknown>): ILogger {\n const mergedBindings = { ...this.bindings, ...bindings };\n const childPino = this.pino.child(bindings);\n return this.constructor_child(childPino, mergedBindings);\n }\n\n /**\n * Get log buffer for streaming/querying (ILogger optional method)\n */\n getLogBuffer(): ILogBuffer | undefined {\n return this.logBuffer;\n }\n\n /**\n * Register callback for every log event (ILogger optional method).\n * Used by platform to connect logger extensions (ring buffer, persistence).\n *\n * @param callback - Function to call on each log event\n * @returns Unsubscribe function to remove the callback\n */\n onLog(callback: (record: LogRecord) => void | Promise<void>): () => void {\n this.logCallbacks.add(callback);\n return () => this.logCallbacks.delete(callback);\n }\n}\n\n/**\n * Create Pino logger adapter.\n * This is the factory function called by initPlatform() when loading adapters.\n */\nexport function createAdapter(config?: PinoLoggerConfig): PinoLoggerAdapter {\n return new PinoLoggerAdapter(config);\n}\n\n// Default export for direct import\nexport default createAdapter;\n\n// Export buffer class\nexport { LogRingBuffer } from \"./log-ring-buffer\";\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/adapters-pino",
3
3
  "description": "Pino adapter implementing ILogger interface",
4
- "version": "2.112.0",
4
+ "version": "2.116.11",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -15,28 +15,18 @@
15
15
  "dist",
16
16
  "README.md"
17
17
  ],
18
- "scripts": {
19
- "build": "tsup",
20
- "clean": "rimraf dist",
21
- "dev": "tsup --watch",
22
- "lint": "eslint src --ext .ts",
23
- "lint:fix": "eslint . --fix",
24
- "test": "vitest run --passWithNoTests",
25
- "test:watch": "vitest",
26
- "type-check": "tsc --noEmit"
27
- },
28
18
  "dependencies": {
29
19
  "pino": "^9.0.0"
30
20
  },
31
21
  "devDependencies": {
32
- "@kb-labs/devkit": "workspace:*",
33
- "@kb-labs/sdk": "workspace:*",
34
22
  "@types/node": "^24.3.3",
35
23
  "eslint": "^9",
36
24
  "rimraf": "^6.0.1",
37
25
  "tsup": "^8.5.0",
38
26
  "typescript": "^5.6.3",
39
- "vitest": "^3.2.6"
27
+ "vitest": "^3.2.6",
28
+ "@kb-labs/devkit": "2.116.11",
29
+ "@kb-labs/sdk": "2.115.0"
40
30
  },
41
31
  "engines": {
42
32
  "node": ">=22.0.0",
@@ -46,7 +36,17 @@
46
36
  "manifest": "./dist/manifest.js"
47
37
  },
48
38
  "peerDependencies": {
49
- "@kb-labs/sdk": "workspace:^"
39
+ "@kb-labs/sdk": "^2.115.0"
50
40
  },
51
- "sideEffects": false
52
- }
41
+ "sideEffects": false,
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "clean": "rimraf dist",
45
+ "dev": "tsup --watch",
46
+ "lint": "eslint src --ext .ts",
47
+ "lint:fix": "eslint . --fix",
48
+ "test": "vitest run --passWithNoTests",
49
+ "test:watch": "vitest",
50
+ "type-check": "tsc --noEmit"
51
+ }
52
+ }