@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.
- package/ai-tracing.d.ts +1 -0
- package/dist/agent/index.cjs +10 -10
- package/dist/agent/index.js +2 -2
- package/dist/agent/input-processor/processors/index.cjs +6 -6
- package/dist/agent/input-processor/processors/index.js +1 -1
- package/dist/ai-tracing/base.d.ts +87 -0
- package/dist/ai-tracing/base.d.ts.map +1 -0
- package/dist/ai-tracing/default.d.ts +26 -0
- package/dist/ai-tracing/default.d.ts.map +1 -0
- package/dist/ai-tracing/index.cjs +585 -0
- package/dist/ai-tracing/index.cjs.map +1 -0
- package/dist/ai-tracing/index.d.ts +8 -0
- package/dist/ai-tracing/index.d.ts.map +1 -0
- package/dist/ai-tracing/index.js +571 -0
- package/dist/ai-tracing/index.js.map +1 -0
- package/dist/ai-tracing/no-op.d.ts +22 -0
- package/dist/ai-tracing/no-op.d.ts.map +1 -0
- package/dist/ai-tracing/registry.d.ts +27 -0
- package/dist/ai-tracing/registry.d.ts.map +1 -0
- package/dist/ai-tracing/types.d.ts +281 -0
- package/dist/ai-tracing/types.d.ts.map +1 -0
- package/dist/base.cjs +2 -2
- package/dist/base.js +1 -1
- package/dist/bundler/index.cjs +2 -2
- package/dist/bundler/index.js +1 -1
- package/dist/{chunk-YZMDLTKU.js → chunk-2ED6PVVF.js} +3 -3
- package/dist/{chunk-YZMDLTKU.js.map → chunk-2ED6PVVF.js.map} +1 -1
- package/dist/{chunk-LQGUSOL6.cjs → chunk-2EXWZ3PI.cjs} +4 -4
- package/dist/{chunk-LQGUSOL6.cjs.map → chunk-2EXWZ3PI.cjs.map} +1 -1
- package/dist/{chunk-IXLNZWTK.cjs → chunk-4JPOVSKQ.cjs} +12 -12
- package/dist/{chunk-IXLNZWTK.cjs.map → chunk-4JPOVSKQ.cjs.map} +1 -1
- package/dist/{chunk-5BGXG7RU.cjs → chunk-4L6RV2TV.cjs} +5 -5
- package/dist/{chunk-5BGXG7RU.cjs.map → chunk-4L6RV2TV.cjs.map} +1 -1
- package/dist/{chunk-ISULVM3M.js → chunk-57EVKFM5.js} +5 -5
- package/dist/{chunk-ISULVM3M.js.map → chunk-57EVKFM5.js.map} +1 -1
- package/dist/{chunk-R3SQUADS.js → chunk-6AR2Z5ZG.js} +3 -2
- package/dist/chunk-6AR2Z5ZG.js.map +1 -0
- package/dist/{chunk-MZBE4M4N.cjs → chunk-6S7RRJON.cjs} +31 -31
- package/dist/{chunk-MZBE4M4N.cjs.map → chunk-6S7RRJON.cjs.map} +1 -1
- package/dist/{chunk-3FPS3OWO.cjs → chunk-A3BSP25E.cjs} +9 -9
- package/dist/{chunk-3FPS3OWO.cjs.map → chunk-A3BSP25E.cjs.map} +1 -1
- package/dist/{chunk-GTU3WRLN.js → chunk-B7JOIJJU.js} +3 -3
- package/dist/{chunk-GTU3WRLN.js.map → chunk-B7JOIJJU.js.map} +1 -1
- package/dist/{chunk-WVIY3V3E.cjs → chunk-CP7L3XWF.cjs} +4 -4
- package/dist/{chunk-WVIY3V3E.cjs.map → chunk-CP7L3XWF.cjs.map} +1 -1
- package/dist/{chunk-WHQWL4G5.cjs → chunk-DSMC4VSS.cjs} +4 -4
- package/dist/{chunk-WHQWL4G5.cjs.map → chunk-DSMC4VSS.cjs.map} +1 -1
- package/dist/{chunk-GCHV2EI2.cjs → chunk-EKPRMZND.cjs} +4 -4
- package/dist/{chunk-GCHV2EI2.cjs.map → chunk-EKPRMZND.cjs.map} +1 -1
- package/dist/{chunk-65L3POQE.js → chunk-FTPL7ILZ.js} +3 -3
- package/dist/{chunk-65L3POQE.js.map → chunk-FTPL7ILZ.js.map} +1 -1
- package/dist/{chunk-FQ4W6KBT.js → chunk-FUERFM46.js} +3 -3
- package/dist/{chunk-FQ4W6KBT.js.map → chunk-FUERFM46.js.map} +1 -1
- package/dist/{chunk-2RI6A7KD.cjs → chunk-GRL3ZK5B.cjs} +4 -4
- package/dist/{chunk-2RI6A7KD.cjs.map → chunk-GRL3ZK5B.cjs.map} +1 -1
- package/dist/{chunk-TXGTGUX2.cjs → chunk-IDDUQR6P.cjs} +3 -2
- package/dist/chunk-IDDUQR6P.cjs.map +1 -0
- package/dist/chunk-J7PCL3MN.cjs +14 -0
- package/dist/{chunk-64G2N4FJ.cjs.map → chunk-J7PCL3MN.cjs.map} +1 -1
- package/dist/{chunk-Q3XNHNLP.cjs → chunk-JGCB7U4Y.cjs} +9 -9
- package/dist/{chunk-Q3XNHNLP.cjs.map → chunk-JGCB7U4Y.cjs.map} +1 -1
- package/dist/{chunk-EOQURKKG.cjs → chunk-MSXZK7BL.cjs} +5 -5
- package/dist/{chunk-EOQURKKG.cjs.map → chunk-MSXZK7BL.cjs.map} +1 -1
- package/dist/{chunk-4ZERI5QT.js → chunk-OFCCIPH2.js} +3 -3
- package/dist/{chunk-4ZERI5QT.js.map → chunk-OFCCIPH2.js.map} +1 -1
- package/dist/{chunk-JIYY2P56.js → chunk-OM556XHR.js} +5 -5
- package/dist/{chunk-JIYY2P56.js.map → chunk-OM556XHR.js.map} +1 -1
- package/dist/{chunk-YUVS5EDM.js → chunk-OXARRBRN.js} +3 -3
- package/dist/{chunk-YUVS5EDM.js.map → chunk-OXARRBRN.js.map} +1 -1
- package/dist/{chunk-R6WBSG4Q.js → chunk-QEGM6FNZ.js} +3 -3
- package/dist/{chunk-R6WBSG4Q.js.map → chunk-QEGM6FNZ.js.map} +1 -1
- package/dist/{chunk-HPWP7KJY.js → chunk-QVCKOYRP.js} +3 -3
- package/dist/{chunk-HPWP7KJY.js.map → chunk-QVCKOYRP.js.map} +1 -1
- package/dist/{chunk-PBAJIFCU.js → chunk-RLQIQX4O.js} +5 -5
- package/dist/{chunk-PBAJIFCU.js.map → chunk-RLQIQX4O.js.map} +1 -1
- package/dist/{chunk-YVAWHTHK.cjs → chunk-U2CK6AN5.cjs} +4 -4
- package/dist/{chunk-YVAWHTHK.cjs.map → chunk-U2CK6AN5.cjs.map} +1 -1
- package/dist/{chunk-K2243MGP.js → chunk-UAQURMQJ.js} +3 -3
- package/dist/{chunk-K2243MGP.js.map → chunk-UAQURMQJ.js.map} +1 -1
- package/dist/{chunk-6Y3RTBPF.cjs → chunk-VZUGB775.cjs} +4 -4
- package/dist/{chunk-6Y3RTBPF.cjs.map → chunk-VZUGB775.cjs.map} +1 -1
- package/dist/{chunk-LQ54NO3E.js → chunk-YBY6XXFX.js} +3 -3
- package/dist/{chunk-LQ54NO3E.js.map → chunk-YBY6XXFX.js.map} +1 -1
- package/dist/{chunk-2WZYQCRK.cjs → chunk-YT4RGZYO.cjs} +8 -8
- package/dist/{chunk-2WZYQCRK.cjs.map → chunk-YT4RGZYO.cjs.map} +1 -1
- package/dist/{chunk-E26T2PAG.js → chunk-ZRRHATKS.js} +8 -8
- package/dist/{chunk-E26T2PAG.js.map → chunk-ZRRHATKS.js.map} +1 -1
- package/dist/{chunk-WNSZ4ZMC.js → chunk-ZYQFY2H5.js} +3 -3
- package/dist/{chunk-WNSZ4ZMC.js.map → chunk-ZYQFY2H5.js.map} +1 -1
- package/dist/deployer/index.cjs +2 -2
- package/dist/deployer/index.js +1 -1
- package/dist/index.cjs +50 -50
- package/dist/index.js +14 -14
- package/dist/logger/constants.d.ts +1 -0
- package/dist/logger/constants.d.ts.map +1 -1
- package/dist/logger/index.cjs +6 -6
- package/dist/logger/index.js +1 -1
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.js +1 -1
- package/dist/mcp/index.cjs +4 -4
- package/dist/mcp/index.js +2 -2
- package/dist/memory/index.cjs +4 -4
- package/dist/memory/index.js +1 -1
- package/dist/network/index.cjs +6 -6
- package/dist/network/index.js +3 -3
- package/dist/network/vNext/index.cjs +17 -17
- package/dist/network/vNext/index.js +4 -4
- package/dist/relevance/index.cjs +4 -4
- package/dist/relevance/index.js +1 -1
- package/dist/scores/index.cjs +5 -5
- package/dist/scores/index.js +2 -2
- package/dist/server/index.cjs +2 -2
- package/dist/server/index.js +1 -1
- package/dist/storage/index.cjs +15 -15
- package/dist/storage/index.js +4 -4
- package/dist/test-utils/llm-mock.cjs +2 -2
- package/dist/test-utils/llm-mock.js +1 -1
- package/dist/tts/index.cjs +2 -2
- package/dist/tts/index.js +1 -1
- package/dist/utils.cjs +15 -15
- package/dist/utils.js +1 -1
- package/dist/vector/index.cjs +2 -2
- package/dist/vector/index.js +1 -1
- package/dist/voice/index.cjs +4 -4
- package/dist/voice/index.js +1 -1
- package/dist/workflows/index.cjs +10 -10
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/legacy/index.cjs +22 -22
- package/dist/workflows/legacy/index.js +1 -1
- package/dist/workflows/types.d.ts +1 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/chunk-64G2N4FJ.cjs +0 -14
- package/dist/chunk-R3SQUADS.js.map +0 -1
- 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
|