@agentuity/runtime 0.0.51 → 0.0.53

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 (113) hide show
  1. package/dist/_config.js +99 -0
  2. package/dist/_config.js.map +1 -0
  3. package/dist/_context.d.ts +11 -11
  4. package/dist/_context.d.ts.map +1 -1
  5. package/dist/_context.js +84 -0
  6. package/dist/_context.js.map +1 -0
  7. package/dist/_idle.js +24 -0
  8. package/dist/_idle.js.map +1 -0
  9. package/dist/_server.js +489 -0
  10. package/dist/_server.js.map +1 -0
  11. package/dist/_services.js +258 -0
  12. package/dist/_services.js.map +1 -0
  13. package/dist/_tokens.js +98 -0
  14. package/dist/_tokens.js.map +1 -0
  15. package/dist/_util.js +54 -0
  16. package/dist/_util.js.map +1 -0
  17. package/dist/_waituntil.js +87 -0
  18. package/dist/_waituntil.js.map +1 -0
  19. package/dist/agent.d.ts +24 -15
  20. package/dist/agent.d.ts.map +1 -1
  21. package/dist/agent.js +507 -0
  22. package/dist/agent.js.map +1 -0
  23. package/dist/app.d.ts +6 -1
  24. package/dist/app.d.ts.map +1 -1
  25. package/dist/app.js +72 -0
  26. package/dist/app.js.map +1 -0
  27. package/dist/eval.d.ts +1 -1
  28. package/dist/eval.d.ts.map +1 -1
  29. package/dist/eval.js +2 -0
  30. package/dist/eval.js.map +1 -0
  31. package/dist/index.js +11 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/io/email.js +154 -0
  34. package/dist/io/email.js.map +1 -0
  35. package/dist/logger/console.js +274 -0
  36. package/dist/logger/console.js.map +1 -0
  37. package/dist/logger/index.js +3 -0
  38. package/dist/logger/index.js.map +1 -0
  39. package/dist/logger/internal.js +133 -0
  40. package/dist/logger/internal.js.map +1 -0
  41. package/dist/logger/logger.js +2 -0
  42. package/dist/logger/logger.js.map +1 -0
  43. package/dist/logger/user.js +7 -0
  44. package/dist/logger/user.js.map +1 -0
  45. package/dist/logger/util.js +77 -0
  46. package/dist/logger/util.js.map +1 -0
  47. package/dist/otel/config.js +23 -0
  48. package/dist/otel/config.js.map +1 -0
  49. package/dist/otel/console.js +52 -0
  50. package/dist/otel/console.js.map +1 -0
  51. package/dist/otel/exporters/index.js +4 -0
  52. package/dist/otel/exporters/index.js.map +1 -0
  53. package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
  54. package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
  55. package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
  56. package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
  57. package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
  58. package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
  59. package/dist/otel/fetch.js +81 -0
  60. package/dist/otel/fetch.js.map +1 -0
  61. package/dist/otel/http.js +44 -0
  62. package/dist/otel/http.js.map +1 -0
  63. package/dist/otel/logger.js +278 -0
  64. package/dist/otel/logger.js.map +1 -0
  65. package/dist/otel/otel.js +233 -0
  66. package/dist/otel/otel.js.map +1 -0
  67. package/dist/router.js +350 -0
  68. package/dist/router.js.map +1 -0
  69. package/dist/services/evalrun/composite.js +26 -0
  70. package/dist/services/evalrun/composite.js.map +1 -0
  71. package/dist/services/evalrun/http.js +74 -0
  72. package/dist/services/evalrun/http.js.map +1 -0
  73. package/dist/services/evalrun/index.js +5 -0
  74. package/dist/services/evalrun/index.js.map +1 -0
  75. package/dist/services/evalrun/json.js +38 -0
  76. package/dist/services/evalrun/json.js.map +1 -0
  77. package/dist/services/evalrun/local.js +22 -0
  78. package/dist/services/evalrun/local.js.map +1 -0
  79. package/dist/services/local/_db.js +144 -0
  80. package/dist/services/local/_db.js.map +1 -0
  81. package/dist/services/local/_router.js +60 -0
  82. package/dist/services/local/_router.js.map +1 -0
  83. package/dist/services/local/_util.js +42 -0
  84. package/dist/services/local/_util.js.map +1 -0
  85. package/dist/services/local/index.js +8 -0
  86. package/dist/services/local/index.js.map +1 -0
  87. package/dist/services/local/keyvalue.js +114 -0
  88. package/dist/services/local/keyvalue.js.map +1 -0
  89. package/dist/services/local/objectstore.js +117 -0
  90. package/dist/services/local/objectstore.js.map +1 -0
  91. package/dist/services/local/stream.js +218 -0
  92. package/dist/services/local/stream.js.map +1 -0
  93. package/dist/services/local/vector.js +183 -0
  94. package/dist/services/local/vector.js.map +1 -0
  95. package/dist/services/session/composite.js +26 -0
  96. package/dist/services/session/composite.js.map +1 -0
  97. package/dist/services/session/http.js +42 -0
  98. package/dist/services/session/http.js.map +1 -0
  99. package/dist/services/session/index.js +5 -0
  100. package/dist/services/session/index.js.map +1 -0
  101. package/dist/services/session/json.js +35 -0
  102. package/dist/services/session/json.js.map +1 -0
  103. package/dist/services/session/local.js +22 -0
  104. package/dist/services/session/local.js.map +1 -0
  105. package/dist/session.js +199 -0
  106. package/dist/session.js.map +1 -0
  107. package/dist/workbench.js +38 -0
  108. package/dist/workbench.js.map +1 -0
  109. package/package.json +5 -5
  110. package/src/_context.ts +34 -13
  111. package/src/agent.ts +76 -40
  112. package/src/app.ts +6 -1
  113. package/src/eval.ts +1 -1
@@ -0,0 +1,111 @@
1
+ import { ExportResultCode } from '@opentelemetry/core';
2
+ import { existsSync, appendFileSync, mkdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { randomUUID } from 'node:crypto';
5
+ /**
6
+ * JSONL implementation of the SpanExporter interface
7
+ * Writes traces to a timestamped JSONL file
8
+ */
9
+ export class JSONLTraceExporter {
10
+ currentFile = null;
11
+ basePath;
12
+ filePrefix;
13
+ /**
14
+ * Creates a new JSONL trace exporter
15
+ * @param basePath - Directory to store the JSONL files
16
+ */
17
+ constructor(basePath) {
18
+ this.basePath = basePath;
19
+ this.filePrefix = 'otel-trace';
20
+ this.ensureDirectory();
21
+ }
22
+ ensureDirectory() {
23
+ if (!existsSync(this.basePath)) {
24
+ mkdirSync(this.basePath, { recursive: true });
25
+ }
26
+ }
27
+ getOrCreateFile() {
28
+ // If current file exists, use it
29
+ if (this.currentFile && existsSync(this.currentFile)) {
30
+ return this.currentFile;
31
+ }
32
+ this.currentFile = join(this.basePath, `${this.filePrefix}-${Date.now()}.${randomUUID()}.jsonl`);
33
+ return this.currentFile;
34
+ }
35
+ /**
36
+ * Exports spans to a JSONL file
37
+ *
38
+ * @param spans - The spans to export
39
+ * @param resultCallback - Callback function to report the export result
40
+ */
41
+ export(spans, resultCallback) {
42
+ try {
43
+ if (spans.length === 0) {
44
+ resultCallback({ code: ExportResultCode.SUCCESS });
45
+ return;
46
+ }
47
+ const file = this.getOrCreateFile();
48
+ const lines = [];
49
+ for (const span of spans) {
50
+ const record = {
51
+ traceId: span.spanContext().traceId,
52
+ spanId: span.spanContext().spanId,
53
+ traceState: span.spanContext().traceState?.serialize(),
54
+ name: span.name,
55
+ kind: span.kind,
56
+ startTime: span.startTime,
57
+ endTime: span.endTime,
58
+ attributes: span.attributes,
59
+ status: span.status,
60
+ events: span.events,
61
+ links: span.links,
62
+ resource: span.resource.attributes,
63
+ droppedAttributesCount: span.droppedAttributesCount,
64
+ droppedEventsCount: span.droppedEventsCount,
65
+ droppedLinksCount: span.droppedLinksCount,
66
+ duration: span.duration,
67
+ ended: span.ended,
68
+ };
69
+ lines.push(JSON.stringify(record));
70
+ }
71
+ const payload = `${lines.join('\n')}\n`;
72
+ try {
73
+ appendFileSync(file, payload, 'utf-8');
74
+ }
75
+ catch (err) {
76
+ // File may have been deleted, reset and retry once
77
+ const code = err.code;
78
+ if (code === 'ENOENT') {
79
+ this.currentFile = null;
80
+ const newFile = this.getOrCreateFile();
81
+ appendFileSync(newFile, payload, 'utf-8');
82
+ }
83
+ else {
84
+ throw err;
85
+ }
86
+ }
87
+ resultCallback({ code: ExportResultCode.SUCCESS });
88
+ }
89
+ catch (error) {
90
+ resultCallback({
91
+ code: ExportResultCode.FAILED,
92
+ error: error instanceof Error ? error : new Error(String(error)),
93
+ });
94
+ }
95
+ }
96
+ /**
97
+ * Shuts down the exporter
98
+ *
99
+ * @returns A promise that resolves when shutdown is complete
100
+ */
101
+ async shutdown() {
102
+ this.currentFile = null;
103
+ }
104
+ /**
105
+ * Forces a flush of any pending data
106
+ */
107
+ async forceFlush() {
108
+ // No-op for file-based exporter as writes are synchronous
109
+ }
110
+ }
111
+ //# sourceMappingURL=jsonl-trace-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-trace-exporter.js","sourceRoot":"","sources":["../../../src/otel/exporters/jsonl-trace-exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { context, propagation, SpanStatusCode, trace } from '@opentelemetry/api';
2
+ /**
3
+ * Reference to the original fetch function before instrumentation
4
+ */
5
+ export const __originalFetch = fetch; // save the original fetch before we patch it
6
+ /**
7
+ * Instruments the global fetch function with OpenTelemetry tracing
8
+ *
9
+ * Replaces the global fetch with an instrumented version that creates spans
10
+ * for each HTTP request and propagates trace context in headers
11
+ */
12
+ export function instrumentFetch() {
13
+ const patch = async (input, init) => {
14
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
15
+ const method = init?.method ||
16
+ (typeof input !== 'string' && !(input instanceof URL) ? input.method || 'GET' : 'GET');
17
+ // Get the active span if it exists
18
+ const activeSpan = trace.getActiveSpan();
19
+ // If there's no active span, just call the original fetch
20
+ if (!activeSpan) {
21
+ return __originalFetch(input, init);
22
+ }
23
+ // Get the current active context
24
+ const currentContext = context.active();
25
+ const _url = new URL(url);
26
+ // Create a child span using the current context
27
+ const childSpan = trace.getTracer('fetch').startSpan(`HTTP ${method}`, {
28
+ attributes: {
29
+ 'http.url': url,
30
+ 'http.path': _url.pathname,
31
+ 'http.method': method,
32
+ host: _url.host,
33
+ },
34
+ }, currentContext);
35
+ try {
36
+ // Add trace context to headers
37
+ // Add trace context to headers; preserve headers from Request input
38
+ const baseHeaders = typeof input !== 'string' && !(input instanceof URL) && input instanceof Request
39
+ ? input.headers
40
+ : undefined;
41
+ const headers = new Headers(baseHeaders ?? init?.headers ?? {});
42
+ const carrier = {};
43
+ // Create a new context with the child span
44
+ const newContext = trace.setSpan(currentContext, childSpan);
45
+ // Use the new context for propagation
46
+ propagation.inject(newContext, carrier);
47
+ // Copy the carrier properties to headers
48
+ for (const [key, value] of Object.entries(carrier)) {
49
+ headers.set(key, value);
50
+ }
51
+ // Create new init object with updated headers
52
+ const newInit = {
53
+ ...init,
54
+ headers,
55
+ };
56
+ const response = await __originalFetch(input, newInit);
57
+ // Add response attributes to span
58
+ childSpan.setAttributes({
59
+ 'http.status_code': response.status,
60
+ 'http.user_agent': response.headers.get('user-agent') || '',
61
+ });
62
+ if (!response.ok) {
63
+ childSpan.setStatus({ code: SpanStatusCode.ERROR });
64
+ }
65
+ else {
66
+ childSpan.setStatus({ code: SpanStatusCode.OK });
67
+ }
68
+ return response;
69
+ }
70
+ catch (error) {
71
+ childSpan.recordException(error);
72
+ childSpan.setStatus({ code: SpanStatusCode.ERROR });
73
+ throw error;
74
+ }
75
+ finally {
76
+ childSpan.end();
77
+ }
78
+ };
79
+ globalThis.fetch = patch;
80
+ }
81
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/otel/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { context, propagation } from '@opentelemetry/api';
2
+ /**
3
+ * Injects trace context into response headers using the OpenTelemetry propagation API
4
+ *
5
+ * @param headers - Optional existing headers to include
6
+ * @returns A record of headers with trace context injected
7
+ */
8
+ export function injectTraceContextToHeaders(headers = {}) {
9
+ let _headers;
10
+ if (headers instanceof Headers) {
11
+ _headers = {};
12
+ headers.forEach((v, k) => {
13
+ _headers[k] = v;
14
+ });
15
+ }
16
+ else {
17
+ _headers = { ...headers };
18
+ }
19
+ // Create a carrier object for the headers
20
+ const carrier = { ..._headers };
21
+ // Get the current context
22
+ const currentContext = context.active();
23
+ // Inject trace context into the carrier
24
+ propagation.inject(currentContext, carrier);
25
+ return carrier;
26
+ }
27
+ /**
28
+ * Extracts trace context from Bun Request headers
29
+ *
30
+ * @param req - The Bun Request object
31
+ * @returns The context with trace information
32
+ */
33
+ export function extractTraceContextFromRequest(req) {
34
+ // Create a carrier object from the headers
35
+ const carrier = {};
36
+ // Convert headers to the format expected by the propagator
37
+ req.headers.forEach((value, key) => {
38
+ carrier[key.toLowerCase()] = value;
39
+ });
40
+ // Extract the context using the global propagator
41
+ const activeContext = context.active();
42
+ return propagation.extract(activeContext, carrier);
43
+ }
44
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/otel/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAC1C,UAA4C,EAAE;IAE9C,IAAI,QAAgC,CAAC;IACrC,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAChC,QAAQ,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,QAAQ,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,0CAA0C;IAC1C,MAAM,OAAO,GAA2B,EAAE,GAAG,QAAQ,EAA4B,CAAC;IAElF,0BAA0B;IAC1B,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAExC,wCAAwC;IACxC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAC7C,GAAY;IAEZ,2CAA2C;IAC3C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,2DAA2D;IAC3D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAClC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACvC,OAAO,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,278 @@
1
+ import { format } from 'node:util';
2
+ import { safeStringify } from '@agentuity/core';
3
+ import * as LogsAPI from '@opentelemetry/api-logs';
4
+ import ConsoleLogger from '../logger/console';
5
+ import { getAgentContext } from '../_context';
6
+ /**
7
+ * Reference to the original console object before patching
8
+ */
9
+ export const __originalConsole = Object.create(console); // save the original console before we patch it
10
+ export class OtelLogger {
11
+ delegate;
12
+ context;
13
+ logger;
14
+ logLevel;
15
+ constructor(useConsole, delegate, context, logLevel) {
16
+ this.delegate = delegate;
17
+ this.context = context;
18
+ this.logLevel = logLevel ?? 'info';
19
+ this.logger = useConsole ? new ConsoleLogger(context, false, this.logLevel) : undefined;
20
+ }
21
+ formatMessage(message) {
22
+ if (typeof message === 'string') {
23
+ return message;
24
+ }
25
+ try {
26
+ return safeStringify(message);
27
+ }
28
+ catch {
29
+ // Handle circular references or other unknown stringification errors
30
+ return String(message);
31
+ }
32
+ }
33
+ getAttributes() {
34
+ try {
35
+ const actx = getAgentContext();
36
+ const current = actx.current?.metadata;
37
+ if (current) {
38
+ const result = {
39
+ ...(this.context ?? {}),
40
+ };
41
+ for (const [key, value] of Object.entries(current)) {
42
+ if (value !== null && value !== undefined) {
43
+ result[`@agentuity/${key}`] = value;
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ }
49
+ catch {
50
+ /* fall through */
51
+ }
52
+ return this.context;
53
+ }
54
+ emit(severityNumber, severityText, body) {
55
+ const attributes = this.getAttributes();
56
+ try {
57
+ this.delegate.emit({
58
+ severityNumber,
59
+ severityText,
60
+ body,
61
+ attributes: attributes,
62
+ });
63
+ }
64
+ catch (error) {
65
+ // Log error to console if available, but don't fail the entire operation
66
+ this.logger?.error('Failed to emit log to OTLP instance:', error);
67
+ }
68
+ }
69
+ shouldLog(level) {
70
+ switch (this.logLevel) {
71
+ case 'trace':
72
+ return true;
73
+ case 'debug':
74
+ return (level === LogsAPI.SeverityNumber.DEBUG ||
75
+ level == LogsAPI.SeverityNumber.INFO ||
76
+ level == LogsAPI.SeverityNumber.WARN ||
77
+ level == LogsAPI.SeverityNumber.ERROR);
78
+ case 'info':
79
+ return (level == LogsAPI.SeverityNumber.INFO ||
80
+ level == LogsAPI.SeverityNumber.WARN ||
81
+ level == LogsAPI.SeverityNumber.ERROR);
82
+ case 'warn':
83
+ return level == LogsAPI.SeverityNumber.WARN || level == LogsAPI.SeverityNumber.ERROR;
84
+ case 'error':
85
+ return level == LogsAPI.SeverityNumber.ERROR;
86
+ }
87
+ return false;
88
+ }
89
+ trace(message, ...args) {
90
+ if (!this.shouldLog(LogsAPI.SeverityNumber.TRACE)) {
91
+ return;
92
+ }
93
+ this.logger?.trace(message, ...args);
94
+ let body;
95
+ try {
96
+ body = format(this.formatMessage(message), ...args);
97
+ }
98
+ catch {
99
+ // Fallback if format causes recursion
100
+ body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
101
+ }
102
+ this.emit(LogsAPI.SeverityNumber.TRACE, 'TRACE', body);
103
+ }
104
+ debug(message, ...args) {
105
+ if (!this.shouldLog(LogsAPI.SeverityNumber.DEBUG)) {
106
+ return;
107
+ }
108
+ this.logger?.debug(message, ...args);
109
+ let body;
110
+ try {
111
+ body = format(this.formatMessage(message), ...args);
112
+ }
113
+ catch {
114
+ // Fallback if format causes recursion
115
+ body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
116
+ }
117
+ this.emit(LogsAPI.SeverityNumber.DEBUG, 'DEBUG', body);
118
+ }
119
+ info(message, ...args) {
120
+ if (!this.shouldLog(LogsAPI.SeverityNumber.INFO)) {
121
+ return;
122
+ }
123
+ this.logger?.info(message, ...args);
124
+ let body;
125
+ try {
126
+ body = format(this.formatMessage(message), ...args);
127
+ }
128
+ catch {
129
+ // Fallback if format causes recursion
130
+ body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
131
+ }
132
+ this.emit(LogsAPI.SeverityNumber.INFO, 'INFO', body);
133
+ }
134
+ warn(message, ...args) {
135
+ if (!this.shouldLog(LogsAPI.SeverityNumber.WARN)) {
136
+ return;
137
+ }
138
+ this.logger?.warn(message, ...args);
139
+ let body;
140
+ try {
141
+ body = format(this.formatMessage(message), ...args);
142
+ }
143
+ catch {
144
+ // Fallback if format causes recursion
145
+ body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
146
+ }
147
+ this.emit(LogsAPI.SeverityNumber.WARN, 'WARN', body);
148
+ }
149
+ error(message, ...args) {
150
+ if (!this.shouldLog(LogsAPI.SeverityNumber.ERROR)) {
151
+ return;
152
+ }
153
+ this.logger?.error(message, ...args);
154
+ let body;
155
+ try {
156
+ body = format(this.formatMessage(message), ...args);
157
+ }
158
+ catch {
159
+ // Fallback if format causes recursion
160
+ body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
161
+ }
162
+ this.emit(LogsAPI.SeverityNumber.ERROR, 'ERROR', body);
163
+ }
164
+ fatal(message, ...args) {
165
+ this.error(message, ...args);
166
+ process.exit(1);
167
+ }
168
+ child(opts) {
169
+ return new OtelLogger(!!this.logger, this.delegate, {
170
+ ...(this.context ?? {}),
171
+ ...opts,
172
+ }, this.logLevel);
173
+ }
174
+ }
175
+ /**
176
+ * Creates a logger that integrates with OpenTelemetry
177
+ *
178
+ * @param useConsole - Whether to also log to the console
179
+ * @param context - Additional context to include with log records
180
+ * @returns A logger instance
181
+ */
182
+ export function createLogger(useConsole, context, logLevel) {
183
+ const delegate = LogsAPI.logs.getLogger('default', undefined, {
184
+ scopeAttributes: context,
185
+ });
186
+ return new OtelLogger(useConsole, delegate, context, logLevel);
187
+ }
188
+ /**
189
+ * Patches the global console object to integrate with OpenTelemetry logging
190
+ *
191
+ * @param attributes - Attributes to include with all console log records
192
+ */
193
+ export function patchConsole(enabled, attributes, logLevel) {
194
+ if (!enabled) {
195
+ return;
196
+ }
197
+ const _patch = { ...__originalConsole };
198
+ const delegate = createLogger(true, attributes, logLevel);
199
+ // Patch individual console methods instead of reassigning the whole object
200
+ _patch.log = (...args) => {
201
+ delegate.info(args[0], ...args.slice(1));
202
+ };
203
+ _patch.error = (...args) => {
204
+ delegate.error(args[0], ...args.slice(1));
205
+ };
206
+ _patch.warn = (...args) => {
207
+ delegate.warn(args[0], ...args.slice(1));
208
+ };
209
+ _patch.debug = (...args) => {
210
+ delegate.debug(args[0], ...args.slice(1));
211
+ };
212
+ _patch.info = (...args) => {
213
+ delegate.info(args[0], ...args.slice(1));
214
+ };
215
+ _patch.dir = (...args) => {
216
+ let msg = '';
217
+ if (args.length === 1) {
218
+ msg = format(args[0]);
219
+ }
220
+ else if (args.length >= 2) {
221
+ msg = format(args[0], args[1]);
222
+ }
223
+ else {
224
+ msg = safeStringify(args);
225
+ }
226
+ delegate.debug(msg);
227
+ };
228
+ _patch.dirxml = (...args) => {
229
+ delegate.debug('dirxml:', ...args);
230
+ };
231
+ _patch.table = (...args) => {
232
+ delegate.debug('table:', ...args);
233
+ };
234
+ _patch.trace = (...args) => {
235
+ delegate.debug(args[0], ...args.slice(1));
236
+ };
237
+ _patch.group = (...args) => {
238
+ delegate.debug('group:', ...args);
239
+ };
240
+ _patch.groupCollapsed = (...args) => {
241
+ delegate.debug('groupCollapsed:', ...args);
242
+ };
243
+ _patch.groupEnd = () => {
244
+ delegate.debug('groupEnd');
245
+ };
246
+ _patch.clear = () => {
247
+ /* no-op */
248
+ };
249
+ _patch.count = (...args) => {
250
+ delegate.debug('count:', ...args);
251
+ };
252
+ _patch.countReset = (...args) => {
253
+ delegate.debug('countReset:', ...args);
254
+ };
255
+ _patch.assert = (condition, ...args) => {
256
+ if (!condition) {
257
+ delegate.error('assertion failed:', ...args);
258
+ }
259
+ };
260
+ _patch.time = (...args) => {
261
+ delegate.debug('time:', ...args);
262
+ };
263
+ _patch.timeLog = (...args) => {
264
+ delegate.debug('timeLog:', ...args);
265
+ };
266
+ _patch.timeEnd = (...args) => {
267
+ delegate.debug('timeEnd:', ...args);
268
+ };
269
+ _patch.profile = (...args) => {
270
+ delegate.debug('profile:', ...args);
271
+ };
272
+ _patch.profileEnd = (...args) => {
273
+ delegate.debug('profileEnd:', ...args);
274
+ };
275
+ // eslint-disable-next-line no-global-assign
276
+ console = globalThis.console = _patch;
277
+ }
278
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/otel/logger.ts"],"names":[],"mappings":"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"}