@mastra/core 0.13.0-alpha.3 → 0.13.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 (135) hide show
  1. package/ai-tracing.d.ts +1 -0
  2. package/dist/agent/index.cjs +10 -10
  3. package/dist/agent/index.js +2 -2
  4. package/dist/agent/input-processor/processors/index.cjs +6 -6
  5. package/dist/agent/input-processor/processors/index.js +1 -1
  6. package/dist/ai-tracing/base.d.ts +87 -0
  7. package/dist/ai-tracing/base.d.ts.map +1 -0
  8. package/dist/ai-tracing/default.d.ts +26 -0
  9. package/dist/ai-tracing/default.d.ts.map +1 -0
  10. package/dist/ai-tracing/index.cjs +585 -0
  11. package/dist/ai-tracing/index.cjs.map +1 -0
  12. package/dist/ai-tracing/index.d.ts +8 -0
  13. package/dist/ai-tracing/index.d.ts.map +1 -0
  14. package/dist/ai-tracing/index.js +571 -0
  15. package/dist/ai-tracing/index.js.map +1 -0
  16. package/dist/ai-tracing/no-op.d.ts +22 -0
  17. package/dist/ai-tracing/no-op.d.ts.map +1 -0
  18. package/dist/ai-tracing/registry.d.ts +27 -0
  19. package/dist/ai-tracing/registry.d.ts.map +1 -0
  20. package/dist/ai-tracing/types.d.ts +281 -0
  21. package/dist/ai-tracing/types.d.ts.map +1 -0
  22. package/dist/base.cjs +2 -2
  23. package/dist/base.js +1 -1
  24. package/dist/bundler/index.cjs +2 -2
  25. package/dist/bundler/index.js +1 -1
  26. package/dist/{chunk-YZMDLTKU.js → chunk-2ED6PVVF.js} +3 -3
  27. package/dist/{chunk-YZMDLTKU.js.map → chunk-2ED6PVVF.js.map} +1 -1
  28. package/dist/{chunk-LQGUSOL6.cjs → chunk-2EXWZ3PI.cjs} +4 -4
  29. package/dist/{chunk-LQGUSOL6.cjs.map → chunk-2EXWZ3PI.cjs.map} +1 -1
  30. package/dist/{chunk-IXLNZWTK.cjs → chunk-4JPOVSKQ.cjs} +12 -12
  31. package/dist/{chunk-IXLNZWTK.cjs.map → chunk-4JPOVSKQ.cjs.map} +1 -1
  32. package/dist/{chunk-5BGXG7RU.cjs → chunk-4L6RV2TV.cjs} +5 -5
  33. package/dist/{chunk-5BGXG7RU.cjs.map → chunk-4L6RV2TV.cjs.map} +1 -1
  34. package/dist/{chunk-ISULVM3M.js → chunk-57EVKFM5.js} +5 -5
  35. package/dist/{chunk-ISULVM3M.js.map → chunk-57EVKFM5.js.map} +1 -1
  36. package/dist/{chunk-R3SQUADS.js → chunk-6AR2Z5ZG.js} +3 -2
  37. package/dist/chunk-6AR2Z5ZG.js.map +1 -0
  38. package/dist/{chunk-MZBE4M4N.cjs → chunk-6S7RRJON.cjs} +31 -31
  39. package/dist/{chunk-MZBE4M4N.cjs.map → chunk-6S7RRJON.cjs.map} +1 -1
  40. package/dist/{chunk-3FPS3OWO.cjs → chunk-A3BSP25E.cjs} +9 -9
  41. package/dist/{chunk-3FPS3OWO.cjs.map → chunk-A3BSP25E.cjs.map} +1 -1
  42. package/dist/{chunk-GTU3WRLN.js → chunk-B7JOIJJU.js} +3 -3
  43. package/dist/{chunk-GTU3WRLN.js.map → chunk-B7JOIJJU.js.map} +1 -1
  44. package/dist/{chunk-WVIY3V3E.cjs → chunk-CP7L3XWF.cjs} +4 -4
  45. package/dist/{chunk-WVIY3V3E.cjs.map → chunk-CP7L3XWF.cjs.map} +1 -1
  46. package/dist/{chunk-WHQWL4G5.cjs → chunk-DSMC4VSS.cjs} +4 -4
  47. package/dist/{chunk-WHQWL4G5.cjs.map → chunk-DSMC4VSS.cjs.map} +1 -1
  48. package/dist/{chunk-GCHV2EI2.cjs → chunk-EKPRMZND.cjs} +4 -4
  49. package/dist/{chunk-GCHV2EI2.cjs.map → chunk-EKPRMZND.cjs.map} +1 -1
  50. package/dist/{chunk-65L3POQE.js → chunk-FTPL7ILZ.js} +3 -3
  51. package/dist/{chunk-65L3POQE.js.map → chunk-FTPL7ILZ.js.map} +1 -1
  52. package/dist/{chunk-FQ4W6KBT.js → chunk-FUERFM46.js} +3 -3
  53. package/dist/{chunk-FQ4W6KBT.js.map → chunk-FUERFM46.js.map} +1 -1
  54. package/dist/{chunk-2RI6A7KD.cjs → chunk-GRL3ZK5B.cjs} +4 -4
  55. package/dist/{chunk-2RI6A7KD.cjs.map → chunk-GRL3ZK5B.cjs.map} +1 -1
  56. package/dist/{chunk-TXGTGUX2.cjs → chunk-IDDUQR6P.cjs} +3 -2
  57. package/dist/chunk-IDDUQR6P.cjs.map +1 -0
  58. package/dist/chunk-J7PCL3MN.cjs +14 -0
  59. package/dist/{chunk-64G2N4FJ.cjs.map → chunk-J7PCL3MN.cjs.map} +1 -1
  60. package/dist/{chunk-Q3XNHNLP.cjs → chunk-JGCB7U4Y.cjs} +9 -9
  61. package/dist/{chunk-Q3XNHNLP.cjs.map → chunk-JGCB7U4Y.cjs.map} +1 -1
  62. package/dist/{chunk-EOQURKKG.cjs → chunk-MSXZK7BL.cjs} +5 -5
  63. package/dist/{chunk-EOQURKKG.cjs.map → chunk-MSXZK7BL.cjs.map} +1 -1
  64. package/dist/{chunk-4ZERI5QT.js → chunk-OFCCIPH2.js} +3 -3
  65. package/dist/{chunk-4ZERI5QT.js.map → chunk-OFCCIPH2.js.map} +1 -1
  66. package/dist/{chunk-JIYY2P56.js → chunk-OM556XHR.js} +5 -5
  67. package/dist/{chunk-JIYY2P56.js.map → chunk-OM556XHR.js.map} +1 -1
  68. package/dist/{chunk-YUVS5EDM.js → chunk-OXARRBRN.js} +3 -3
  69. package/dist/{chunk-YUVS5EDM.js.map → chunk-OXARRBRN.js.map} +1 -1
  70. package/dist/{chunk-R6WBSG4Q.js → chunk-QEGM6FNZ.js} +3 -3
  71. package/dist/{chunk-R6WBSG4Q.js.map → chunk-QEGM6FNZ.js.map} +1 -1
  72. package/dist/{chunk-HPWP7KJY.js → chunk-QVCKOYRP.js} +3 -3
  73. package/dist/{chunk-HPWP7KJY.js.map → chunk-QVCKOYRP.js.map} +1 -1
  74. package/dist/{chunk-PBAJIFCU.js → chunk-RLQIQX4O.js} +5 -5
  75. package/dist/{chunk-PBAJIFCU.js.map → chunk-RLQIQX4O.js.map} +1 -1
  76. package/dist/{chunk-YVAWHTHK.cjs → chunk-U2CK6AN5.cjs} +4 -4
  77. package/dist/{chunk-YVAWHTHK.cjs.map → chunk-U2CK6AN5.cjs.map} +1 -1
  78. package/dist/{chunk-K2243MGP.js → chunk-UAQURMQJ.js} +3 -3
  79. package/dist/{chunk-K2243MGP.js.map → chunk-UAQURMQJ.js.map} +1 -1
  80. package/dist/{chunk-6Y3RTBPF.cjs → chunk-VZUGB775.cjs} +4 -4
  81. package/dist/{chunk-6Y3RTBPF.cjs.map → chunk-VZUGB775.cjs.map} +1 -1
  82. package/dist/{chunk-LQ54NO3E.js → chunk-YBY6XXFX.js} +3 -3
  83. package/dist/{chunk-LQ54NO3E.js.map → chunk-YBY6XXFX.js.map} +1 -1
  84. package/dist/{chunk-2WZYQCRK.cjs → chunk-YT4RGZYO.cjs} +8 -8
  85. package/dist/{chunk-2WZYQCRK.cjs.map → chunk-YT4RGZYO.cjs.map} +1 -1
  86. package/dist/{chunk-E26T2PAG.js → chunk-ZRRHATKS.js} +8 -8
  87. package/dist/{chunk-E26T2PAG.js.map → chunk-ZRRHATKS.js.map} +1 -1
  88. package/dist/{chunk-WNSZ4ZMC.js → chunk-ZYQFY2H5.js} +3 -3
  89. package/dist/{chunk-WNSZ4ZMC.js.map → chunk-ZYQFY2H5.js.map} +1 -1
  90. package/dist/deployer/index.cjs +2 -2
  91. package/dist/deployer/index.js +1 -1
  92. package/dist/index.cjs +50 -50
  93. package/dist/index.js +14 -14
  94. package/dist/logger/constants.d.ts +1 -0
  95. package/dist/logger/constants.d.ts.map +1 -1
  96. package/dist/logger/index.cjs +6 -6
  97. package/dist/logger/index.js +1 -1
  98. package/dist/mastra/index.cjs +2 -2
  99. package/dist/mastra/index.js +1 -1
  100. package/dist/mcp/index.cjs +4 -4
  101. package/dist/mcp/index.js +2 -2
  102. package/dist/memory/index.cjs +4 -4
  103. package/dist/memory/index.js +1 -1
  104. package/dist/network/index.cjs +6 -6
  105. package/dist/network/index.js +3 -3
  106. package/dist/network/vNext/index.cjs +17 -17
  107. package/dist/network/vNext/index.js +4 -4
  108. package/dist/relevance/index.cjs +4 -4
  109. package/dist/relevance/index.js +1 -1
  110. package/dist/scores/index.cjs +5 -5
  111. package/dist/scores/index.js +2 -2
  112. package/dist/server/index.cjs +2 -2
  113. package/dist/server/index.js +1 -1
  114. package/dist/storage/index.cjs +15 -15
  115. package/dist/storage/index.js +4 -4
  116. package/dist/test-utils/llm-mock.cjs +2 -2
  117. package/dist/test-utils/llm-mock.js +1 -1
  118. package/dist/tts/index.cjs +2 -2
  119. package/dist/tts/index.js +1 -1
  120. package/dist/utils.cjs +15 -15
  121. package/dist/utils.js +1 -1
  122. package/dist/vector/index.cjs +2 -2
  123. package/dist/vector/index.js +1 -1
  124. package/dist/voice/index.cjs +4 -4
  125. package/dist/voice/index.js +1 -1
  126. package/dist/workflows/index.cjs +10 -10
  127. package/dist/workflows/index.js +1 -1
  128. package/dist/workflows/legacy/index.cjs +22 -22
  129. package/dist/workflows/legacy/index.js +1 -1
  130. package/dist/workflows/types.d.ts +1 -0
  131. package/dist/workflows/types.d.ts.map +1 -1
  132. package/package.json +4 -4
  133. package/dist/chunk-64G2N4FJ.cjs +0 -14
  134. package/dist/chunk-R3SQUADS.js.map +0 -1
  135. package/dist/chunk-TXGTGUX2.cjs.map +0 -1
@@ -0,0 +1,585 @@
1
+ 'use strict';
2
+
3
+ var chunk3BFAQTC3_cjs = require('../chunk-3BFAQTC3.cjs');
4
+ var chunkYT4RGZYO_cjs = require('../chunk-YT4RGZYO.cjs');
5
+ var chunkIDDUQR6P_cjs = require('../chunk-IDDUQR6P.cjs');
6
+
7
+ // src/ai-tracing/no-op.ts
8
+ var NoOpAISpan = class _NoOpAISpan {
9
+ id;
10
+ name;
11
+ type;
12
+ metadata;
13
+ trace;
14
+ traceId;
15
+ startTime;
16
+ endTime;
17
+ aiTracing;
18
+ constructor(options, aiTracing) {
19
+ this.id = "no-op";
20
+ this.name = options.name;
21
+ this.type = options.type;
22
+ this.metadata = options.metadata;
23
+ this.trace = options.parent ? options.parent.trace : this;
24
+ this.traceId = "no-op-trace";
25
+ this.startTime = /* @__PURE__ */ new Date();
26
+ this.aiTracing = aiTracing;
27
+ }
28
+ end() {
29
+ }
30
+ error() {
31
+ }
32
+ createChildSpan(type, name, metadata) {
33
+ return new _NoOpAISpan({ type, name, metadata, parent: this }, this.aiTracing);
34
+ }
35
+ update() {
36
+ }
37
+ };
38
+
39
+ // src/ai-tracing/types.ts
40
+ var AISpanType = /* @__PURE__ */ ((AISpanType2) => {
41
+ AISpanType2["AGENT_RUN"] = "agent_run";
42
+ AISpanType2["GENERIC"] = "generic";
43
+ AISpanType2["LLM_GENERATION"] = "llm_generation";
44
+ AISpanType2["MCP_TOOL_CALL"] = "mcp_tool_call";
45
+ AISpanType2["TOOL_CALL"] = "tool_call";
46
+ AISpanType2["WORKFLOW_RUN"] = "workflow_run";
47
+ AISpanType2["WORKFLOW_STEP"] = "workflow_step";
48
+ return AISpanType2;
49
+ })(AISpanType || {});
50
+ var SamplingStrategyType = /* @__PURE__ */ ((SamplingStrategyType2) => {
51
+ SamplingStrategyType2["ALWAYS"] = "always";
52
+ SamplingStrategyType2["NEVER"] = "never";
53
+ SamplingStrategyType2["RATIO"] = "ratio";
54
+ SamplingStrategyType2["CUSTOM"] = "custom";
55
+ return SamplingStrategyType2;
56
+ })(SamplingStrategyType || {});
57
+ var AITracingEventType = /* @__PURE__ */ ((AITracingEventType2) => {
58
+ AITracingEventType2["SPAN_STARTED"] = "span_started";
59
+ AITracingEventType2["SPAN_UPDATED"] = "span_updated";
60
+ AITracingEventType2["SPAN_ENDED"] = "span_ended";
61
+ return AITracingEventType2;
62
+ })(AITracingEventType || {});
63
+
64
+ // src/ai-tracing/base.ts
65
+ var MastraAITracing = class extends chunkYT4RGZYO_cjs.MastraBase {
66
+ config;
67
+ constructor(config) {
68
+ super({ component: chunkIDDUQR6P_cjs.RegisteredLogger.AI_TELEMETRY, name: config.serviceName });
69
+ this.config = config;
70
+ this.logger.debug(`AI Tracing initialized [service=${config.serviceName}] [sampling=${this.config.sampling.type}]`);
71
+ }
72
+ // ============================================================================
73
+ // Protected getters for clean config access
74
+ // ============================================================================
75
+ get exporters() {
76
+ return this.config.exporters || [];
77
+ }
78
+ get processors() {
79
+ return this.config.processors || [];
80
+ }
81
+ // ============================================================================
82
+ // Public API - Single type-safe span creation method
83
+ // ============================================================================
84
+ /**
85
+ * Start a new span of a specific AISpanType
86
+ */
87
+ startSpan(type, name, metadata, parent, runtimeContext, attributes) {
88
+ if (!this.shouldSample({ runtimeContext, attributes })) {
89
+ return new NoOpAISpan({ type, name, metadata, parent }, this);
90
+ }
91
+ const options = {
92
+ type,
93
+ name,
94
+ metadata,
95
+ parent
96
+ };
97
+ const span = this.createSpan(options);
98
+ span.trace = parent ? parent.trace : span;
99
+ this.wireSpanLifecycle(span);
100
+ this.emitSpanStarted(span);
101
+ return span;
102
+ }
103
+ // ============================================================================
104
+ // Configuration Management
105
+ // ============================================================================
106
+ /**
107
+ * Get current configuration
108
+ */
109
+ getConfig() {
110
+ return { ...this.config };
111
+ }
112
+ // ============================================================================
113
+ // Plugin Access
114
+ // ============================================================================
115
+ /**
116
+ * Get all exporters
117
+ */
118
+ getExporters() {
119
+ return [...this.exporters];
120
+ }
121
+ /**
122
+ * Get all processors
123
+ */
124
+ getProcessors() {
125
+ return [...this.processors];
126
+ }
127
+ /**
128
+ * Get the logger instance (for exporters and other components)
129
+ */
130
+ getLogger() {
131
+ return this.logger;
132
+ }
133
+ // ============================================================================
134
+ // Span Lifecycle Management
135
+ // ============================================================================
136
+ /**
137
+ * Automatically wires up AI tracing lifecycle events for any span
138
+ * This ensures all spans emit events regardless of implementation
139
+ */
140
+ wireSpanLifecycle(span) {
141
+ const originalEnd = span.end.bind(span);
142
+ const originalUpdate = span.update.bind(span);
143
+ span.end = (metadata) => {
144
+ originalEnd(metadata);
145
+ this.emitSpanEnded(span);
146
+ };
147
+ span.update = (metadata) => {
148
+ originalUpdate(metadata);
149
+ this.emitSpanUpdated(span);
150
+ };
151
+ }
152
+ // ============================================================================
153
+ // Utility Methods
154
+ // ============================================================================
155
+ /**
156
+ * Check if an AI trace should be sampled
157
+ */
158
+ shouldSample(traceContext) {
159
+ const { sampling } = this.config;
160
+ switch (sampling.type) {
161
+ case "always" /* ALWAYS */:
162
+ return true;
163
+ case "never" /* NEVER */:
164
+ return false;
165
+ case "ratio" /* RATIO */:
166
+ if (sampling.probability === void 0 || sampling.probability < 0 || sampling.probability > 1) {
167
+ this.logger.warn(
168
+ `Invalid sampling probability: ${sampling.probability}. Expected value between 0 and 1. Defaulting to no sampling.`
169
+ );
170
+ return false;
171
+ }
172
+ return Math.random() < sampling.probability;
173
+ case "custom" /* CUSTOM */:
174
+ return sampling.sampler(traceContext);
175
+ default:
176
+ throw new Error(`Sampling strategy type not implemented: ${sampling.type}`);
177
+ }
178
+ }
179
+ /**
180
+ * Process a span through all processors
181
+ */
182
+ processSpan(span) {
183
+ let processedSpan = span;
184
+ for (const processor of this.processors) {
185
+ if (!processedSpan) {
186
+ break;
187
+ }
188
+ try {
189
+ processedSpan = processor.process(processedSpan);
190
+ } catch (error) {
191
+ this.logger.error(`Processor error [name=${processor.name}]`, error);
192
+ }
193
+ }
194
+ return processedSpan;
195
+ }
196
+ // ============================================================================
197
+ // Event-driven Export Methods
198
+ // ============================================================================
199
+ /**
200
+ * Emit a span started event
201
+ */
202
+ emitSpanStarted(span) {
203
+ const processedSpan = this.processSpan(span);
204
+ if (processedSpan) {
205
+ this.exportEvent({ type: "span_started" /* SPAN_STARTED */, span: processedSpan }).catch((error) => {
206
+ this.logger.error("Failed to export span_started event", error);
207
+ });
208
+ }
209
+ }
210
+ /**
211
+ * Emit a span ended event (called automatically when spans end)
212
+ */
213
+ emitSpanEnded(span) {
214
+ const processedSpan = this.processSpan(span);
215
+ if (processedSpan) {
216
+ this.exportEvent({ type: "span_ended" /* SPAN_ENDED */, span: processedSpan }).catch((error) => {
217
+ this.logger.error("Failed to export span_ended event", error);
218
+ });
219
+ }
220
+ }
221
+ /**
222
+ * Emit a span updated event
223
+ */
224
+ emitSpanUpdated(span) {
225
+ const processedSpan = this.processSpan(span);
226
+ if (processedSpan) {
227
+ this.exportEvent({ type: "span_updated" /* SPAN_UPDATED */, span: processedSpan }).catch((error) => {
228
+ this.logger.error("Failed to export span_updated event", error);
229
+ });
230
+ }
231
+ }
232
+ /**
233
+ * Export tracing event through all exporters (realtime mode)
234
+ */
235
+ async exportEvent(event) {
236
+ const exportPromises = this.exporters.map(async (exporter) => {
237
+ try {
238
+ if (exporter.exportEvent) {
239
+ await exporter.exportEvent(event);
240
+ this.logger.debug(`Event exported [exporter=${exporter.name}] [type=${event.type}]`);
241
+ }
242
+ } catch (error) {
243
+ this.logger.error(`Export error [exporter=${exporter.name}]`, error);
244
+ }
245
+ });
246
+ await Promise.allSettled(exportPromises);
247
+ }
248
+ // ============================================================================
249
+ // Lifecycle Management
250
+ // ============================================================================
251
+ /**
252
+ * Initialize AI tracing (called by Mastra during component registration)
253
+ */
254
+ async init() {
255
+ this.logger.debug(`AI Tracing initialization started [name=${this.name}]`);
256
+ this.logger.info(`AI Tracing initialized successfully [name=${this.name}]`);
257
+ }
258
+ /**
259
+ * Shutdown AI tracing and clean up resources
260
+ */
261
+ async shutdown() {
262
+ this.logger.debug(`AI Tracing shutdown started [name=${this.name}]`);
263
+ const shutdownPromises = [...this.exporters.map((e) => e.shutdown()), ...this.processors.map((p) => p.shutdown())];
264
+ await Promise.allSettled(shutdownPromises);
265
+ this.logger.info(`AI Tracing shutdown completed [name=${this.name}]`);
266
+ }
267
+ };
268
+
269
+ // src/ai-tracing/default.ts
270
+ function generateSpanId() {
271
+ const bytes = new Uint8Array(8);
272
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
273
+ crypto.getRandomValues(bytes);
274
+ } else {
275
+ for (let i = 0; i < 8; i++) {
276
+ bytes[i] = Math.floor(Math.random() * 256);
277
+ }
278
+ }
279
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
280
+ }
281
+ function generateTraceId() {
282
+ const bytes = new Uint8Array(16);
283
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
284
+ crypto.getRandomValues(bytes);
285
+ } else {
286
+ for (let i = 0; i < 16; i++) {
287
+ bytes[i] = Math.floor(Math.random() * 256);
288
+ }
289
+ }
290
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
291
+ }
292
+ var DefaultAISpan = class {
293
+ id;
294
+ name;
295
+ type;
296
+ metadata;
297
+ trace;
298
+ traceId;
299
+ startTime;
300
+ endTime;
301
+ aiTracing;
302
+ constructor(options, aiTracing) {
303
+ this.id = generateSpanId();
304
+ this.name = options.name;
305
+ this.type = options.type;
306
+ this.metadata = options.metadata;
307
+ this.trace = options.parent ? options.parent.trace : this;
308
+ this.startTime = /* @__PURE__ */ new Date();
309
+ this.aiTracing = aiTracing;
310
+ if (!options.parent) {
311
+ this.traceId = generateTraceId();
312
+ } else {
313
+ this.traceId = options.parent.trace.traceId;
314
+ }
315
+ }
316
+ end(metadata) {
317
+ this.endTime = /* @__PURE__ */ new Date();
318
+ if (metadata) {
319
+ this.metadata = { ...this.metadata, ...metadata };
320
+ }
321
+ }
322
+ error(error, endSpan = true) {
323
+ const errorMetadata = error instanceof chunk3BFAQTC3_cjs.MastraError ? {
324
+ error: {
325
+ id: error.id,
326
+ details: error.details,
327
+ category: error.category,
328
+ domain: error.domain,
329
+ message: error.message
330
+ }
331
+ } : {
332
+ error: {
333
+ message: error.message
334
+ }
335
+ };
336
+ if (endSpan) {
337
+ this.end(errorMetadata);
338
+ } else {
339
+ this.update(errorMetadata);
340
+ }
341
+ }
342
+ createChildSpan(type, name, metadata) {
343
+ return this.aiTracing.startSpan(type, name, metadata, this);
344
+ }
345
+ update(metadata) {
346
+ this.metadata = { ...this.metadata, ...metadata };
347
+ }
348
+ async export() {
349
+ return JSON.stringify({
350
+ id: this.id,
351
+ metadata: this.metadata,
352
+ startTime: this.startTime,
353
+ endTime: this.endTime,
354
+ traceId: this.traceId
355
+ // OpenTelemetry trace ID
356
+ });
357
+ }
358
+ };
359
+ var SensitiveDataFilter = class {
360
+ name = "sensitive-data-filter";
361
+ sensitiveFields;
362
+ constructor(sensitiveFields) {
363
+ this.sensitiveFields = (sensitiveFields || [
364
+ "password",
365
+ "token",
366
+ "secret",
367
+ "key",
368
+ "apiKey",
369
+ "auth",
370
+ "authorization",
371
+ "bearer",
372
+ "jwt",
373
+ "credential",
374
+ "sessionId"
375
+ ]).map((field) => field.toLowerCase());
376
+ }
377
+ process(span) {
378
+ const deepFilter = (obj, seen = /* @__PURE__ */ new WeakSet()) => {
379
+ if (obj === null || typeof obj !== "object") {
380
+ return obj;
381
+ }
382
+ if (seen.has(obj)) {
383
+ return "[Circular Reference]";
384
+ }
385
+ seen.add(obj);
386
+ if (Array.isArray(obj)) {
387
+ return obj.map((item) => deepFilter(item, seen));
388
+ }
389
+ const filtered = {};
390
+ Object.keys(obj).forEach((key) => {
391
+ if (this.sensitiveFields.includes(key.toLowerCase())) {
392
+ if (obj[key] && typeof obj[key] === "object") {
393
+ filtered[key] = deepFilter(obj[key], seen);
394
+ } else {
395
+ filtered[key] = "[REDACTED]";
396
+ }
397
+ } else {
398
+ filtered[key] = deepFilter(obj[key], seen);
399
+ }
400
+ });
401
+ return filtered;
402
+ };
403
+ try {
404
+ const filteredSpan = { ...span };
405
+ filteredSpan.metadata = deepFilter(span.metadata);
406
+ return filteredSpan;
407
+ } catch (error) {
408
+ const safeSpan = { ...span };
409
+ safeSpan.metadata = {
410
+ "[FILTERING_ERROR]": "Metadata was completely redacted due to filtering error",
411
+ "[ERROR_MESSAGE]": error instanceof Error ? error.message : "Unknown filtering error"
412
+ };
413
+ return safeSpan;
414
+ }
415
+ }
416
+ async shutdown() {
417
+ }
418
+ };
419
+ var DefaultConsoleExporter = class {
420
+ name = "default-console";
421
+ logger;
422
+ constructor(logger) {
423
+ if (logger) {
424
+ this.logger = logger;
425
+ } else {
426
+ this.logger = new chunkIDDUQR6P_cjs.ConsoleLogger({
427
+ name: "default-console-exporter"
428
+ });
429
+ }
430
+ }
431
+ async exportEvent(event) {
432
+ const span = event.span;
433
+ const formatMetadata = (metadata) => {
434
+ try {
435
+ return JSON.stringify(metadata, null, 2);
436
+ } catch (error) {
437
+ const errMsg = error instanceof Error ? error.message : "Unknown formatting error";
438
+ return `[Unable to serialize metadata: ${errMsg}]`;
439
+ }
440
+ };
441
+ const formatDuration = (startTime, endTime) => {
442
+ if (!endTime) return "N/A";
443
+ const duration = endTime.getTime() - startTime.getTime();
444
+ return `${duration}ms`;
445
+ };
446
+ switch (event.type) {
447
+ case "span_started" /* SPAN_STARTED */:
448
+ this.logger.info(`\u{1F680} SPAN_STARTED`);
449
+ this.logger.info(` Type: ${span.type}`);
450
+ this.logger.info(` Name: ${span.name}`);
451
+ this.logger.info(` ID: ${span.id}`);
452
+ this.logger.info(` Trace ID: ${span.traceId}`);
453
+ this.logger.info(` Metadata: ${formatMetadata(span.metadata)}`);
454
+ this.logger.info("\u2500".repeat(80));
455
+ break;
456
+ case "span_ended" /* SPAN_ENDED */:
457
+ const duration = formatDuration(span.startTime, span.endTime);
458
+ this.logger.info(`\u2705 SPAN_ENDED`);
459
+ this.logger.info(` Type: ${span.type}`);
460
+ this.logger.info(` Name: ${span.name}`);
461
+ this.logger.info(` ID: ${span.id}`);
462
+ this.logger.info(` Duration: ${duration}`);
463
+ this.logger.info(` Trace ID: ${span.traceId}`);
464
+ this.logger.info(` Final Metadata: ${formatMetadata(span.metadata)}`);
465
+ this.logger.info("\u2500".repeat(80));
466
+ break;
467
+ case "span_updated" /* SPAN_UPDATED */:
468
+ this.logger.info(`\u{1F4DD} SPAN_UPDATED`);
469
+ this.logger.info(` Type: ${span.type}`);
470
+ this.logger.info(` Name: ${span.name}`);
471
+ this.logger.info(` ID: ${span.id}`);
472
+ this.logger.info(` Trace ID: ${span.traceId}`);
473
+ this.logger.info(` Updated Metadata: ${formatMetadata(span.metadata)}`);
474
+ this.logger.info("\u2500".repeat(80));
475
+ break;
476
+ default:
477
+ throw new Error(`Tracing event type not implemented: ${event.type}`);
478
+ }
479
+ }
480
+ async shutdown() {
481
+ this.logger.info("DefaultConsoleExporter shutdown");
482
+ }
483
+ };
484
+ var aiTracingDefaultConfig = {
485
+ serviceName: "mastra-ai-service",
486
+ sampling: { type: "always" /* ALWAYS */ },
487
+ exporters: [new DefaultConsoleExporter()],
488
+ // Uses its own fallback logger
489
+ processors: [new SensitiveDataFilter()]
490
+ };
491
+ var DefaultAITracing = class extends MastraAITracing {
492
+ constructor(config = aiTracingDefaultConfig) {
493
+ super(config);
494
+ }
495
+ // ============================================================================
496
+ // Abstract Method Implementations
497
+ // ============================================================================
498
+ createSpan(options) {
499
+ return new DefaultAISpan(options, this);
500
+ }
501
+ };
502
+
503
+ // src/ai-tracing/registry.ts
504
+ var AITracingRegistry = class {
505
+ instances = /* @__PURE__ */ new Map();
506
+ defaultInstance;
507
+ /**
508
+ * Register a tracing instance
509
+ */
510
+ register(name, instance, isDefault = false) {
511
+ this.instances.set(name, instance);
512
+ if (isDefault || !this.defaultInstance) {
513
+ this.defaultInstance = instance;
514
+ }
515
+ }
516
+ /**
517
+ * Get a tracing instance by name
518
+ */
519
+ get(name) {
520
+ if (name) {
521
+ return this.instances.get(name);
522
+ }
523
+ return this.defaultInstance;
524
+ }
525
+ /**
526
+ * Unregister a tracing instance
527
+ */
528
+ unregister(name) {
529
+ const instance = this.instances.get(name);
530
+ if (instance && instance === this.defaultInstance) {
531
+ const remaining = Array.from(this.instances.values()).filter((i) => i !== instance);
532
+ this.defaultInstance = remaining[0];
533
+ }
534
+ return this.instances.delete(name);
535
+ }
536
+ /**
537
+ * Clear all instances
538
+ */
539
+ clear() {
540
+ this.instances.clear();
541
+ this.defaultInstance = void 0;
542
+ }
543
+ /**
544
+ * Get all registered instances
545
+ */
546
+ getAll() {
547
+ return new Map(this.instances);
548
+ }
549
+ };
550
+ var aiTracingRegistry = new AITracingRegistry();
551
+ function registerAITracing(name, instance, isDefault = false) {
552
+ aiTracingRegistry.register(name, instance, isDefault);
553
+ }
554
+ function getAITracing(name) {
555
+ return aiTracingRegistry.get(name);
556
+ }
557
+ function unregisterAITracing(name) {
558
+ return aiTracingRegistry.unregister(name);
559
+ }
560
+ function clearAITracingRegistry() {
561
+ aiTracingRegistry.clear();
562
+ }
563
+ function hasAITracing(name) {
564
+ const tracing = getAITracing(name);
565
+ if (!tracing) return false;
566
+ const config = tracing.getConfig();
567
+ const sampling = config.sampling;
568
+ return sampling.type !== "never" /* NEVER */;
569
+ }
570
+
571
+ exports.AISpanType = AISpanType;
572
+ exports.AITracingEventType = AITracingEventType;
573
+ exports.DefaultAITracing = DefaultAITracing;
574
+ exports.DefaultConsoleExporter = DefaultConsoleExporter;
575
+ exports.MastraAITracing = MastraAITracing;
576
+ exports.SamplingStrategyType = SamplingStrategyType;
577
+ exports.SensitiveDataFilter = SensitiveDataFilter;
578
+ exports.aiTracingDefaultConfig = aiTracingDefaultConfig;
579
+ exports.clearAITracingRegistry = clearAITracingRegistry;
580
+ exports.getAITracing = getAITracing;
581
+ exports.hasAITracing = hasAITracing;
582
+ exports.registerAITracing = registerAITracing;
583
+ exports.unregisterAITracing = unregisterAITracing;
584
+ //# sourceMappingURL=index.cjs.map
585
+ //# sourceMappingURL=index.cjs.map