@mastra/playground-ui 66.0.0 → 66.0.1-alpha.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/dist/domains/traces/components/format-trace-thread-messages.cjs.js +52 -0
- package/dist/domains/traces/components/format-trace-thread-messages.cjs.js.map +1 -1
- package/dist/domains/traces/components/format-trace-thread-messages.es.js +51 -1
- package/dist/domains/traces/components/format-trace-thread-messages.es.js.map +1 -1
- package/dist/domains/traces/components/read-only-tool-call-provider.cjs.js +23 -0
- package/dist/domains/traces/components/read-only-tool-call-provider.cjs.js.map +1 -0
- package/dist/domains/traces/components/read-only-tool-call-provider.d.ts +1 -0
- package/dist/domains/traces/components/read-only-tool-call-provider.es.js +22 -0
- package/dist/domains/traces/components/read-only-tool-call-provider.es.js.map +1 -0
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +123 -67
- package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +131 -75
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-details-view.cjs.js +19 -11
- package/dist/domains/traces/components/span-details-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-details-view.es.js +22 -14
- package/dist/domains/traces/components/span-details-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-outcome.cjs.js +78 -0
- package/dist/domains/traces/components/span-outcome.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-outcome.d.ts +1 -0
- package/dist/domains/traces/components/span-outcome.es.js +77 -0
- package/dist/domains/traces/components/span-outcome.es.js.map +1 -0
- package/dist/domains/traces/components/span-outcome.utils.cjs.js +360 -0
- package/dist/domains/traces/components/span-outcome.utils.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-outcome.utils.d.ts +1 -0
- package/dist/domains/traces/components/span-outcome.utils.es.js +357 -0
- package/dist/domains/traces/components/span-outcome.utils.es.js.map +1 -0
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +32 -15
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +32 -16
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -10
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -10
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +22 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js +22 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +4 -7
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +4 -7
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js +21 -19
- package/dist/domains/traces/components/span-payload/span-payload-registry.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-registry.es.js +22 -20
- package/dist/domains/traces/components/span-payload/span-payload-registry.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +62 -19
- package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-section.es.js +62 -20
- package/dist/domains/traces/components/span-payload/span-payload-section.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +51 -140
- package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +54 -143
- package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +99 -0
- package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-payload/span-processor-mutations.d.ts +1 -0
- package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +98 -0
- package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js.map +1 -0
- package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +48 -3
- package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.es.js +48 -5
- package/dist/domains/traces/components/span-payload/span-tools-section.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload.cjs.js +6 -1
- package/dist/domains/traces/components/span-payload.es.js +5 -4
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/trace-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-details-view.es.js +1 -1
- package/dist/domains/traces/components/trace-thread-item-view.cjs.js +26 -38
- package/dist/domains/traces/components/trace-thread-item-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-thread-item-view.es.js +26 -38
- package/dist/domains/traces/components/trace-thread-item-view.es.js.map +1 -1
- package/dist/domains/traces/components.cjs.js +7 -2
- package/dist/domains/traces/components.es.js +6 -5
- package/dist/domains/traces/hooks/use-trace-span-navigation.cjs.js +1 -1
- package/dist/domains/traces/hooks/use-trace-span-navigation.es.js +1 -1
- package/dist/domains/traces.cjs.js +7 -2
- package/dist/domains/traces.es.js +6 -5
- package/dist/{span-payload-primitives-Fi1kSYyM.js → span-payload-primitives-CNDSzk1Q.js} +2 -2
- package/dist/{span-payload-primitives-Fi1kSYyM.js.map → span-payload-primitives-CNDSzk1Q.js.map} +1 -1
- package/dist/{span-payload-primitives-rxerCV7Y.cjs → span-payload-primitives-DNhjpAtm.cjs} +2 -2
- package/dist/{span-payload-primitives-rxerCV7Y.cjs.map → span-payload-primitives-DNhjpAtm.cjs.map} +1 -1
- package/dist/src/domains/traces/components/format-trace-thread-messages.d.ts +14 -0
- package/dist/src/domains/traces/components/read-only-tool-call-provider.d.ts +5 -0
- package/dist/src/domains/traces/components/span-outcome.d.ts +15 -0
- package/dist/src/domains/traces/components/span-outcome.utils.d.ts +32 -0
- package/dist/src/domains/traces/components/span-payload/index.d.ts +4 -3
- package/dist/src/domains/traces/components/span-payload/span-error-renderer.d.ts +2 -0
- package/dist/src/domains/traces/components/span-payload/span-payload-json.d.ts +3 -1
- package/dist/src/domains/traces/components/span-payload/span-payload-processor.d.ts +1 -4
- package/dist/src/domains/traces/components/span-payload/span-payload-registry.d.ts +5 -14
- package/dist/src/domains/traces/components/span-payload/span-payload-section.d.ts +20 -1
- package/dist/src/domains/traces/components/span-payload/span-processor-attributes.d.ts +4 -4
- package/dist/src/domains/traces/components/span-payload/span-processor-mutations.d.ts +5 -0
- package/dist/src/domains/traces/components/span-payload/span-tools-section.d.ts +14 -2
- package/dist/style.css +22 -2
- package/package.json +6 -6
|
@@ -274,6 +274,58 @@ function formatTraceThreadMessages(spans) {
|
|
|
274
274
|
});
|
|
275
275
|
return messages;
|
|
276
276
|
}
|
|
277
|
+
/** The tool calls a model span asked for, as recorded in its `output.toolCalls`. */
|
|
278
|
+
function getRequestedToolCalls(span) {
|
|
279
|
+
const toolCalls = isRecord(span.output) ? span.output.toolCalls : void 0;
|
|
280
|
+
if (!Array.isArray(toolCalls)) return [];
|
|
281
|
+
return toolCalls.flatMap((call) => {
|
|
282
|
+
const toolName = readString(call, "toolName");
|
|
283
|
+
if (!toolName || !isRecord(call)) return [];
|
|
284
|
+
return [{
|
|
285
|
+
toolCallId: readString(call, "toolCallId"),
|
|
286
|
+
toolName,
|
|
287
|
+
args: call.args ?? call.input
|
|
288
|
+
}];
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* One message per tool call a model span asked for, read back from the trace's tool span
|
|
293
|
+
* (its input and result) when there is one, so the chat's tool rows can draw them.
|
|
294
|
+
*/
|
|
295
|
+
function formatSpanToolCallMessages(span, spans) {
|
|
296
|
+
const toolSpans = /* @__PURE__ */ new Map();
|
|
297
|
+
for (const candidate of spans) {
|
|
298
|
+
const toolCallId = TOOL_SPAN_TYPES.has(candidate.spanType) ? readString(candidate.attributes, "toolCallId") : void 0;
|
|
299
|
+
if (toolCallId) toolSpans.set(toolCallId, candidate);
|
|
300
|
+
}
|
|
301
|
+
return getRequestedToolCalls(span).flatMap((call, index) => {
|
|
302
|
+
if (require_domains_chat_tools_tool_card_kind.isHiddenTool(call.toolName)) return [];
|
|
303
|
+
const toolSpan = call.toolCallId ? toolSpans.get(call.toolCallId) : void 0;
|
|
304
|
+
const part = toolSpan ? toToolPart(toolSpan) : {
|
|
305
|
+
type: "tool-invocation",
|
|
306
|
+
toolInvocation: {
|
|
307
|
+
toolCallId: call.toolCallId ?? `${span.spanId}:${index}`,
|
|
308
|
+
toolName: call.toolName,
|
|
309
|
+
args: call.args ?? {},
|
|
310
|
+
state: "call"
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
return [{
|
|
314
|
+
id: `${span.traceId}:${span.spanId}:tool:${index}`,
|
|
315
|
+
role: "assistant",
|
|
316
|
+
createdAt: new Date(span.startedAt),
|
|
317
|
+
threadId: span.threadId ?? void 0,
|
|
318
|
+
content: {
|
|
319
|
+
format: 2,
|
|
320
|
+
parts: [part],
|
|
321
|
+
content: ""
|
|
322
|
+
},
|
|
323
|
+
traceSpanIds: toolSpan ? [toolSpan.spanId] : []
|
|
324
|
+
}];
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
exports.formatSpanToolCallMessages = formatSpanToolCallMessages;
|
|
277
328
|
exports.formatTraceThreadMessages = formatTraceThreadMessages;
|
|
329
|
+
exports.getRequestedToolCalls = getRequestedToolCalls;
|
|
278
330
|
|
|
279
331
|
//# sourceMappingURL=format-trace-thread-messages.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-trace-thread-messages.cjs.js","names":["SpanType","isHiddenTool","formatHierarchicalSpans","getSpanSignal","isUserSignalType"],"sources":["../../../../src/domains/traces/components/format-trace-thread-messages.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { MastraDBMessage, MastraMessagePart } from '@mastra/core/agent/message-list';\nimport { SpanType } from '@mastra/core/observability';\nimport { isUserSignalType } from '@/domains/chat/messages/signal-data';\nimport { isHiddenTool } from '@/domains/chat/tools/tool-card-kind';\nimport { formatHierarchicalSpans } from '@/domains/traces/components/format-hierarchical-spans';\nimport type { UISpan } from '@/domains/traces/types';\nimport { getSpanSignal } from '@/domains/traces/utils/span-signal';\n\ntype SpanRecord = Awaited<ReturnType<MastraClient['getTrace']>>['spans'][number];\n\nconst TOOL_SPAN_TYPES = new Set<string>([\n SpanType.TOOL_CALL,\n SpanType.MCP_TOOL_CALL,\n SpanType.CLIENT_TOOL_CALL,\n SpanType.PROVIDER_TOOL_CALL,\n]);\n\n/** Top-level executions started by a tool call (e.g. a workflow tool running its workflow). */\nconst TOOL_EXECUTION_SPAN_TYPES = new Set<string>([SpanType.WORKFLOW_RUN, SpanType.AGENT_RUN]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst toTextParts = (content: unknown): MastraMessagePart[] => {\n if (typeof content === 'string') return [{ type: 'text', text: content }];\n if (isRecord(content) && Array.isArray(content.parts)) return toTextParts(content.parts);\n if (!Array.isArray(content)) return [];\n\n return content.flatMap<MastraMessagePart>(part => {\n if (!isRecord(part)) return [];\n if (part.type === 'text' && typeof part.text === 'string') {\n return [{ type: 'text' as const, text: part.text }];\n }\n if (part.type === 'file' && typeof part.mimeType === 'string' && typeof part.data === 'string') {\n return [{ type: 'file' as const, mimeType: part.mimeType, data: part.data }];\n }\n return [];\n });\n};\n\nconst getUserParts = (input: unknown): MastraMessagePart[] => {\n if (typeof input === 'string') return toTextParts(input);\n if (isRecord(input) && (input.type === 'user' || input.type === 'user-message')) {\n return toTextParts(input.contents);\n }\n\n const messages = Array.isArray(input)\n ? input\n : isRecord(input) && Array.isArray(input.messages)\n ? input.messages\n : [];\n\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (isRecord(message) && message.role === 'user') return toTextParts(message.content);\n }\n\n return [];\n};\n\nconst getResponseText = (output: unknown): string => {\n if (!isRecord(output)) return '';\n if (typeof output.text === 'string') return output.text;\n if (output.object === undefined) return '';\n return typeof output.object === 'string' ? output.object : JSON.stringify(output.object);\n};\n\nconst readString = (value: unknown, key: string): string | undefined => {\n if (!isRecord(value)) return undefined;\n const field = value[key];\n return typeof field === 'string' ? field : undefined;\n};\n\nconst toolNameOf = (span: SpanRecord): string => span.entityName ?? span.entityId ?? span.name;\n\nconst toToolPart = (span: SpanRecord): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const state = failed ? 'output-error' : settled ? 'result' : 'call';\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: readString(span.attributes, 'toolCallId') ?? span.spanId,\n toolName: toolNameOf(span),\n args: span.input ?? {},\n state,\n ...(settled ? { result: span.output } : {}),\n ...(failed ? { isError: true, errorText: readString(span.error, 'message') } : {}),\n },\n providerExecuted: span.spanType === SpanType.PROVIDER_TOOL_CALL,\n };\n};\n\nconst OBSERVATIONS_TAG = /<observations>([\\s\\S]*?)<\\/observations>/;\n\nconst findGeneratedText = (node: UISpan, spanById: Map<string, SpanRecord>): string => {\n for (const child of node.spans ?? []) {\n const span = spanById.get(child.id);\n if (span?.spanType === SpanType.MODEL_GENERATION) {\n const text = getResponseText(span.output);\n if (text) return text;\n }\n const nested = findGeneratedText(child, spanById);\n if (nested) return nested;\n }\n return '';\n};\n\n/** Same tool shape the chat builds from `data-om-*` parts, so the observation badge renders. */\nconst toObservationPart = (span: SpanRecord, node: UISpan, spanById: Map<string, SpanRecord>): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const text = findGeneratedText(node, spanById);\n const observations = (OBSERVATIONS_TAG.exec(text)?.[1] ?? text).trim();\n const inputTokens = span.attributes?.inputTokens;\n const omData = {\n cycleId: span.spanId,\n operationType: readString(span.attributes, 'operationType') === 'reflect' ? 'reflection' : 'observation',\n startedAt: new Date(span.startedAt).toISOString(),\n ...(typeof inputTokens === 'number' ? { tokensObserved: inputTokens } : {}),\n ...(observations ? { observations } : {}),\n ...(settled && span.endedAt\n ? {\n [failed ? 'failedAt' : 'completedAt']: new Date(span.endedAt).toISOString(),\n durationMs: new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime(),\n }\n : {}),\n ...(failed ? { error: readString(span.error, 'message') } : {}),\n _state: failed ? 'failed' : settled ? 'complete' : 'loading',\n };\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: `om-${span.spanId}`,\n toolName: 'mastra-memory-om-observation',\n args: omData,\n state: settled ? 'result' : 'call',\n ...(settled ? { result: { omData } } : {}),\n },\n };\n};\n\n/** Model chunk spans whose accumulated content becomes the assistant's response text. */\nconst RESPONSE_CHUNK_TYPES = new Set(['text', 'object']);\n\nconst isResponseChunkSpan = (span: SpanRecord) =>\n span.spanType === SpanType.MODEL_CHUNK && RESPONSE_CHUNK_TYPES.has(readString(span.attributes, 'chunkType') ?? '');\n\ninterface ToolCallPart {\n part: MastraMessagePart;\n /** The tool-call span plus any top-level execution it started (workflow/agent run). */\n spanIds: string[];\n toolCallId?: string;\n startedAt: SpanRecord['startedAt'];\n}\n\nconst OM_PROCESSOR_ID = 'observational-memory';\nconst OM_AGENT_IDS = new Set([\n 'observational-memory-observer',\n 'observational-memory-reflector',\n 'multi-thread-observer',\n]);\n\n/** Observational memory machinery (its processor run or its observer/reflector agents) is never part of the chat. */\nconst isObservationalMemoryInternalSpan = (span: SpanRecord) => {\n if (span.spanType === SpanType.PROCESSOR_RUN) {\n return span.entityId === OM_PROCESSOR_ID || span.name.endsWith(`: ${OM_PROCESSOR_ID}`);\n }\n if (span.spanType === SpanType.AGENT_RUN) {\n return OM_AGENT_IDS.has(span.entityId ?? '') || OM_AGENT_IDS.has(span.entityName ?? '');\n }\n return false;\n};\n\n/**\n * Walks the span tree collecting each tool call (with the spans behind it) in visit order,\n * plus the ids of the model chunks that produced the response text.\n */\nconst collectAssistantSpans = (\n root: UISpan,\n spans: SpanRecord[],\n): { tools: ToolCallPart[]; textSpanIds: string[]; resumedOutput: unknown } => {\n const spanById = new Map(spans.map(span => [span.spanId, span]));\n const tools: ToolCallPart[] = [];\n const textSpanIds: string[] = [];\n let resumedOutput: unknown;\n\n const visit = (nodes: UISpan[]) => {\n for (const node of nodes) {\n const span = spanById.get(node.id);\n if (!span) continue;\n if (TOOL_SPAN_TYPES.has(span.spanType)) {\n // Tools the chat never draws (task tools, working memory) get no message either.\n if (isHiddenTool(toolNameOf(span))) continue;\n // A tool that runs a workflow or an agent gets that top-level execution featured too,\n // so the user can see what the tool call actually did without featuring every nested step.\n const executionIds = (node.spans ?? []).flatMap(child =>\n TOOL_EXECUTION_SPAN_TYPES.has(child.type) ? [child.id] : [],\n );\n const part = toToolPart(span);\n const spanIds = [span.spanId, ...executionIds];\n // A suspended call (e.g. submit_plan) is resumed under the same toolCallId: one call, one part.\n const toolCallId = readString(span.attributes, 'toolCallId');\n const existing = toolCallId ? tools.find(tool => tool.toolCallId === toolCallId) : undefined;\n if (existing) {\n const earlier = new Date(existing.startedAt) <= new Date(span.startedAt);\n if (earlier) existing.part = part;\n existing.spanIds = earlier ? [...existing.spanIds, ...spanIds] : [...spanIds, ...existing.spanIds];\n if (!earlier) existing.startedAt = span.startedAt;\n } else {\n tools.push({ part, spanIds, toolCallId, startedAt: span.startedAt });\n }\n continue;\n }\n // Observational memory runs its own observer/reflector agent: render it as the chat's OM badge\n // and skip its subtree so the observer's output is never mistaken for the assistant's reply.\n const omOperation = readString(span.attributes, 'operationType');\n if (span.spanType === SpanType.MEMORY_OPERATION && (omOperation === 'observe' || omOperation === 'reflect')) {\n tools.push({\n part: toObservationPart(span, node, spanById),\n spanIds: [span.spanId],\n startedAt: span.startedAt,\n });\n continue;\n }\n if (isObservationalMemoryInternalSpan(span)) continue;\n if (isResponseChunkSpan(span)) textSpanIds.push(span.spanId);\n // A suspended run resumes as a nested agent run (outside any tool call) that carries the final response.\n if (span.spanType === SpanType.AGENT_RUN) resumedOutput = span.output;\n visit(node.spans ?? []);\n }\n };\n\n visit(root.spans ?? []);\n return { tools, textSpanIds, resumedOutput };\n};\n\nconst messageContent = (parts: MastraMessagePart[]) =>\n parts.flatMap(part => (part.type === 'text' && typeof part.text === 'string' ? [part.text] : [])).join('\\n');\n\n/** A `MastraDBMessage` reconstructed from trace spans, remembering which spans were used to build it. */\nexport interface TraceViewMastraDBMessage extends MastraDBMessage {\n /** Ids of the spans used to build this message, in visit order (root span first). */\n traceSpanIds: string[];\n}\n\nexport function formatTraceThreadMessages(spans: SpanRecord[]): TraceViewMastraDBMessage[] {\n const hierarchy = formatHierarchicalSpans(\n spans.map(span => ({\n spanId: span.spanId,\n name: span.name,\n spanType: span.spanType,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n parentSpanId: span.parentSpanId,\n })),\n );\n const hierarchicalRoot = hierarchy.find(span => span.type === SpanType.AGENT_RUN);\n if (!hierarchicalRoot) return [];\n const root = spans.find(span => span.spanId === hierarchicalRoot.id);\n if (!root) return [];\n\n const userParts = getUserParts(root.input);\n const signal = getSpanSignal(root);\n // A run started by a non-user signal (a skill, a reminder…) opens with that signal instead of a user turn.\n const signalParts = signal && !isUserSignalType(signal.type) ? toTextParts(signal.contents) : [];\n const { tools, textSpanIds, resumedOutput } = collectAssistantSpans(hierarchicalRoot, spans);\n const responseText = getResponseText(root.output) || getResponseText(resumedOutput);\n const assistantCreatedAt = new Date(root.endedAt ?? root.startedAt);\n const threadId = root.threadId ?? undefined;\n\n const messages: TraceViewMastraDBMessage[] = [\n ...(signal && signalParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:signal`,\n role: 'signal' as const,\n type: signal.tagName,\n createdAt: new Date(root.startedAt),\n threadId,\n content: {\n format: 2 as const,\n parts: signalParts,\n content: messageContent(signalParts),\n metadata: {\n signal: {\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n attributes: signal.attributes,\n metadata: signal.metadata,\n },\n },\n },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // A resumed run's input is the resume payload, not a user message: no user bubble then.\n ...(userParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:user`,\n role: 'user' as const,\n createdAt: new Date(root.startedAt),\n threadId,\n content: { format: 2 as const, parts: userParts, content: messageContent(userParts) },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // One message per tool call so each part maps to exactly the spans behind it.\n ...tools.map<TraceViewMastraDBMessage>(({ part, spanIds }) => ({\n id: `${root.traceId}:${spanIds[0]}:tool`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [part], content: '' },\n traceSpanIds: [root.spanId, ...spanIds],\n })),\n ];\n\n if (responseText) {\n messages.push({\n id: `${root.traceId}:${root.spanId}:assistant`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [{ type: 'text', text: responseText }], content: responseText },\n traceSpanIds: [root.spanId, ...textSpanIds],\n });\n }\n\n return messages;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format-trace-thread-messages.cjs.js","names":["SpanType","isHiddenTool","formatHierarchicalSpans","getSpanSignal","isUserSignalType"],"sources":["../../../../src/domains/traces/components/format-trace-thread-messages.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { MastraDBMessage, MastraMessagePart } from '@mastra/core/agent/message-list';\nimport { SpanType } from '@mastra/core/observability';\nimport { isUserSignalType } from '@/domains/chat/messages/signal-data';\nimport { isHiddenTool } from '@/domains/chat/tools/tool-card-kind';\nimport { formatHierarchicalSpans } from '@/domains/traces/components/format-hierarchical-spans';\nimport type { UISpan } from '@/domains/traces/types';\nimport { getSpanSignal } from '@/domains/traces/utils/span-signal';\n\ntype SpanRecord = Awaited<ReturnType<MastraClient['getTrace']>>['spans'][number];\n/** A span as the span panel holds it, without the trace-level `status`. */\ntype SpanFields = Omit<SpanRecord, 'status'>;\n\nconst TOOL_SPAN_TYPES = new Set<string>([\n SpanType.TOOL_CALL,\n SpanType.MCP_TOOL_CALL,\n SpanType.CLIENT_TOOL_CALL,\n SpanType.PROVIDER_TOOL_CALL,\n]);\n\n/** Top-level executions started by a tool call (e.g. a workflow tool running its workflow). */\nconst TOOL_EXECUTION_SPAN_TYPES = new Set<string>([SpanType.WORKFLOW_RUN, SpanType.AGENT_RUN]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst toTextParts = (content: unknown): MastraMessagePart[] => {\n if (typeof content === 'string') return [{ type: 'text', text: content }];\n if (isRecord(content) && Array.isArray(content.parts)) return toTextParts(content.parts);\n if (!Array.isArray(content)) return [];\n\n return content.flatMap<MastraMessagePart>(part => {\n if (!isRecord(part)) return [];\n if (part.type === 'text' && typeof part.text === 'string') {\n return [{ type: 'text' as const, text: part.text }];\n }\n if (part.type === 'file' && typeof part.mimeType === 'string' && typeof part.data === 'string') {\n return [{ type: 'file' as const, mimeType: part.mimeType, data: part.data }];\n }\n return [];\n });\n};\n\nconst getUserParts = (input: unknown): MastraMessagePart[] => {\n if (typeof input === 'string') return toTextParts(input);\n if (isRecord(input) && (input.type === 'user' || input.type === 'user-message')) {\n return toTextParts(input.contents);\n }\n\n const messages = Array.isArray(input)\n ? input\n : isRecord(input) && Array.isArray(input.messages)\n ? input.messages\n : [];\n\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (isRecord(message) && message.role === 'user') return toTextParts(message.content);\n }\n\n return [];\n};\n\nconst getResponseText = (output: unknown): string => {\n if (!isRecord(output)) return '';\n if (typeof output.text === 'string') return output.text;\n if (output.object === undefined) return '';\n return typeof output.object === 'string' ? output.object : JSON.stringify(output.object);\n};\n\nconst readString = (value: unknown, key: string): string | undefined => {\n if (!isRecord(value)) return undefined;\n const field = value[key];\n return typeof field === 'string' ? field : undefined;\n};\n\nconst toolNameOf = (span: SpanFields): string => span.entityName ?? span.entityId ?? span.name;\n\nconst toToolPart = (span: SpanFields): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const state = failed ? 'output-error' : settled ? 'result' : 'call';\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: readString(span.attributes, 'toolCallId') ?? span.spanId,\n toolName: toolNameOf(span),\n args: span.input ?? {},\n state,\n ...(settled ? { result: span.output } : {}),\n ...(failed ? { isError: true, errorText: readString(span.error, 'message') } : {}),\n },\n providerExecuted: span.spanType === SpanType.PROVIDER_TOOL_CALL,\n };\n};\n\nconst OBSERVATIONS_TAG = /<observations>([\\s\\S]*?)<\\/observations>/;\n\nconst findGeneratedText = (node: UISpan, spanById: Map<string, SpanRecord>): string => {\n for (const child of node.spans ?? []) {\n const span = spanById.get(child.id);\n if (span?.spanType === SpanType.MODEL_GENERATION) {\n const text = getResponseText(span.output);\n if (text) return text;\n }\n const nested = findGeneratedText(child, spanById);\n if (nested) return nested;\n }\n return '';\n};\n\n/** Same tool shape the chat builds from `data-om-*` parts, so the observation badge renders. */\nconst toObservationPart = (span: SpanRecord, node: UISpan, spanById: Map<string, SpanRecord>): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const text = findGeneratedText(node, spanById);\n const observations = (OBSERVATIONS_TAG.exec(text)?.[1] ?? text).trim();\n const inputTokens = span.attributes?.inputTokens;\n const omData = {\n cycleId: span.spanId,\n operationType: readString(span.attributes, 'operationType') === 'reflect' ? 'reflection' : 'observation',\n startedAt: new Date(span.startedAt).toISOString(),\n ...(typeof inputTokens === 'number' ? { tokensObserved: inputTokens } : {}),\n ...(observations ? { observations } : {}),\n ...(settled && span.endedAt\n ? {\n [failed ? 'failedAt' : 'completedAt']: new Date(span.endedAt).toISOString(),\n durationMs: new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime(),\n }\n : {}),\n ...(failed ? { error: readString(span.error, 'message') } : {}),\n _state: failed ? 'failed' : settled ? 'complete' : 'loading',\n };\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: `om-${span.spanId}`,\n toolName: 'mastra-memory-om-observation',\n args: omData,\n state: settled ? 'result' : 'call',\n ...(settled ? { result: { omData } } : {}),\n },\n };\n};\n\n/** Model chunk spans whose accumulated content becomes the assistant's response text. */\nconst RESPONSE_CHUNK_TYPES = new Set(['text', 'object']);\n\nconst isResponseChunkSpan = (span: SpanRecord) =>\n span.spanType === SpanType.MODEL_CHUNK && RESPONSE_CHUNK_TYPES.has(readString(span.attributes, 'chunkType') ?? '');\n\ninterface ToolCallPart {\n part: MastraMessagePart;\n /** The tool-call span plus any top-level execution it started (workflow/agent run). */\n spanIds: string[];\n toolCallId?: string;\n startedAt: SpanRecord['startedAt'];\n}\n\nconst OM_PROCESSOR_ID = 'observational-memory';\nconst OM_AGENT_IDS = new Set([\n 'observational-memory-observer',\n 'observational-memory-reflector',\n 'multi-thread-observer',\n]);\n\n/** Observational memory machinery (its processor run or its observer/reflector agents) is never part of the chat. */\nconst isObservationalMemoryInternalSpan = (span: SpanRecord) => {\n if (span.spanType === SpanType.PROCESSOR_RUN) {\n return span.entityId === OM_PROCESSOR_ID || span.name.endsWith(`: ${OM_PROCESSOR_ID}`);\n }\n if (span.spanType === SpanType.AGENT_RUN) {\n return OM_AGENT_IDS.has(span.entityId ?? '') || OM_AGENT_IDS.has(span.entityName ?? '');\n }\n return false;\n};\n\n/**\n * Walks the span tree collecting each tool call (with the spans behind it) in visit order,\n * plus the ids of the model chunks that produced the response text.\n */\nconst collectAssistantSpans = (\n root: UISpan,\n spans: SpanRecord[],\n): { tools: ToolCallPart[]; textSpanIds: string[]; resumedOutput: unknown } => {\n const spanById = new Map(spans.map(span => [span.spanId, span]));\n const tools: ToolCallPart[] = [];\n const textSpanIds: string[] = [];\n let resumedOutput: unknown;\n\n const visit = (nodes: UISpan[]) => {\n for (const node of nodes) {\n const span = spanById.get(node.id);\n if (!span) continue;\n if (TOOL_SPAN_TYPES.has(span.spanType)) {\n // Tools the chat never draws (task tools, working memory) get no message either.\n if (isHiddenTool(toolNameOf(span))) continue;\n // A tool that runs a workflow or an agent gets that top-level execution featured too,\n // so the user can see what the tool call actually did without featuring every nested step.\n const executionIds = (node.spans ?? []).flatMap(child =>\n TOOL_EXECUTION_SPAN_TYPES.has(child.type) ? [child.id] : [],\n );\n const part = toToolPart(span);\n const spanIds = [span.spanId, ...executionIds];\n // A suspended call (e.g. submit_plan) is resumed under the same toolCallId: one call, one part.\n const toolCallId = readString(span.attributes, 'toolCallId');\n const existing = toolCallId ? tools.find(tool => tool.toolCallId === toolCallId) : undefined;\n if (existing) {\n const earlier = new Date(existing.startedAt) <= new Date(span.startedAt);\n if (earlier) existing.part = part;\n existing.spanIds = earlier ? [...existing.spanIds, ...spanIds] : [...spanIds, ...existing.spanIds];\n if (!earlier) existing.startedAt = span.startedAt;\n } else {\n tools.push({ part, spanIds, toolCallId, startedAt: span.startedAt });\n }\n continue;\n }\n // Observational memory runs its own observer/reflector agent: render it as the chat's OM badge\n // and skip its subtree so the observer's output is never mistaken for the assistant's reply.\n const omOperation = readString(span.attributes, 'operationType');\n if (span.spanType === SpanType.MEMORY_OPERATION && (omOperation === 'observe' || omOperation === 'reflect')) {\n tools.push({\n part: toObservationPart(span, node, spanById),\n spanIds: [span.spanId],\n startedAt: span.startedAt,\n });\n continue;\n }\n if (isObservationalMemoryInternalSpan(span)) continue;\n if (isResponseChunkSpan(span)) textSpanIds.push(span.spanId);\n // A suspended run resumes as a nested agent run (outside any tool call) that carries the final response.\n if (span.spanType === SpanType.AGENT_RUN) resumedOutput = span.output;\n visit(node.spans ?? []);\n }\n };\n\n visit(root.spans ?? []);\n return { tools, textSpanIds, resumedOutput };\n};\n\nconst messageContent = (parts: MastraMessagePart[]) =>\n parts.flatMap(part => (part.type === 'text' && typeof part.text === 'string' ? [part.text] : [])).join('\\n');\n\n/** A `MastraDBMessage` reconstructed from trace spans, remembering which spans were used to build it. */\nexport interface TraceViewMastraDBMessage extends MastraDBMessage {\n /** Ids of the spans used to build this message, in visit order (root span first). */\n traceSpanIds: string[];\n}\n\nexport function formatTraceThreadMessages(spans: SpanRecord[]): TraceViewMastraDBMessage[] {\n const hierarchy = formatHierarchicalSpans(\n spans.map(span => ({\n spanId: span.spanId,\n name: span.name,\n spanType: span.spanType,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n parentSpanId: span.parentSpanId,\n })),\n );\n const hierarchicalRoot = hierarchy.find(span => span.type === SpanType.AGENT_RUN);\n if (!hierarchicalRoot) return [];\n const root = spans.find(span => span.spanId === hierarchicalRoot.id);\n if (!root) return [];\n\n const userParts = getUserParts(root.input);\n const signal = getSpanSignal(root);\n // A run started by a non-user signal (a skill, a reminder…) opens with that signal instead of a user turn.\n const signalParts = signal && !isUserSignalType(signal.type) ? toTextParts(signal.contents) : [];\n const { tools, textSpanIds, resumedOutput } = collectAssistantSpans(hierarchicalRoot, spans);\n const responseText = getResponseText(root.output) || getResponseText(resumedOutput);\n const assistantCreatedAt = new Date(root.endedAt ?? root.startedAt);\n const threadId = root.threadId ?? undefined;\n\n const messages: TraceViewMastraDBMessage[] = [\n ...(signal && signalParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:signal`,\n role: 'signal' as const,\n type: signal.tagName,\n createdAt: new Date(root.startedAt),\n threadId,\n content: {\n format: 2 as const,\n parts: signalParts,\n content: messageContent(signalParts),\n metadata: {\n signal: {\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n attributes: signal.attributes,\n metadata: signal.metadata,\n },\n },\n },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // A resumed run's input is the resume payload, not a user message: no user bubble then.\n ...(userParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:user`,\n role: 'user' as const,\n createdAt: new Date(root.startedAt),\n threadId,\n content: { format: 2 as const, parts: userParts, content: messageContent(userParts) },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // One message per tool call so each part maps to exactly the spans behind it.\n ...tools.map<TraceViewMastraDBMessage>(({ part, spanIds }) => ({\n id: `${root.traceId}:${spanIds[0]}:tool`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [part], content: '' },\n traceSpanIds: [root.spanId, ...spanIds],\n })),\n ];\n\n if (responseText) {\n messages.push({\n id: `${root.traceId}:${root.spanId}:assistant`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [{ type: 'text', text: responseText }], content: responseText },\n traceSpanIds: [root.spanId, ...textSpanIds],\n });\n }\n\n return messages;\n}\n\ninterface RequestedToolCall {\n toolCallId?: string;\n toolName: string;\n args: unknown;\n}\n\n/** The tool calls a model span asked for, as recorded in its `output.toolCalls`. */\nexport function getRequestedToolCalls(span: SpanFields): RequestedToolCall[] {\n const toolCalls = isRecord(span.output) ? span.output.toolCalls : undefined;\n if (!Array.isArray(toolCalls)) return [];\n return toolCalls.flatMap(call => {\n const toolName = readString(call, 'toolName');\n if (!toolName || !isRecord(call)) return [];\n return [{ toolCallId: readString(call, 'toolCallId'), toolName, args: call.args ?? call.input }];\n });\n}\n\n/**\n * One message per tool call a model span asked for, read back from the trace's tool span\n * (its input and result) when there is one, so the chat's tool rows can draw them.\n */\nexport function formatSpanToolCallMessages(span: SpanFields, spans: SpanFields[]): TraceViewMastraDBMessage[] {\n const toolSpans = new Map<string, SpanFields>();\n for (const candidate of spans) {\n const toolCallId = TOOL_SPAN_TYPES.has(candidate.spanType)\n ? readString(candidate.attributes, 'toolCallId')\n : undefined;\n if (toolCallId) toolSpans.set(toolCallId, candidate);\n }\n\n return getRequestedToolCalls(span).flatMap<TraceViewMastraDBMessage>((call, index) => {\n if (isHiddenTool(call.toolName)) return [];\n const toolSpan = call.toolCallId ? toolSpans.get(call.toolCallId) : undefined;\n const part: MastraMessagePart = toolSpan\n ? toToolPart(toolSpan)\n : {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: call.toolCallId ?? `${span.spanId}:${index}`,\n toolName: call.toolName,\n args: call.args ?? {},\n state: 'call',\n },\n };\n return [\n {\n id: `${span.traceId}:${span.spanId}:tool:${index}`,\n role: 'assistant',\n createdAt: new Date(span.startedAt),\n threadId: span.threadId ?? undefined,\n content: { format: 2, parts: [part], content: '' },\n traceSpanIds: toolSpan ? [toolSpan.spanId] : [],\n },\n ];\n });\n}\n"],"mappings":"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"}
|
|
@@ -273,6 +273,56 @@ function formatTraceThreadMessages(spans) {
|
|
|
273
273
|
});
|
|
274
274
|
return messages;
|
|
275
275
|
}
|
|
276
|
-
|
|
276
|
+
/** The tool calls a model span asked for, as recorded in its `output.toolCalls`. */
|
|
277
|
+
function getRequestedToolCalls(span) {
|
|
278
|
+
const toolCalls = isRecord(span.output) ? span.output.toolCalls : void 0;
|
|
279
|
+
if (!Array.isArray(toolCalls)) return [];
|
|
280
|
+
return toolCalls.flatMap((call) => {
|
|
281
|
+
const toolName = readString(call, "toolName");
|
|
282
|
+
if (!toolName || !isRecord(call)) return [];
|
|
283
|
+
return [{
|
|
284
|
+
toolCallId: readString(call, "toolCallId"),
|
|
285
|
+
toolName,
|
|
286
|
+
args: call.args ?? call.input
|
|
287
|
+
}];
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* One message per tool call a model span asked for, read back from the trace's tool span
|
|
292
|
+
* (its input and result) when there is one, so the chat's tool rows can draw them.
|
|
293
|
+
*/
|
|
294
|
+
function formatSpanToolCallMessages(span, spans) {
|
|
295
|
+
const toolSpans = /* @__PURE__ */ new Map();
|
|
296
|
+
for (const candidate of spans) {
|
|
297
|
+
const toolCallId = TOOL_SPAN_TYPES.has(candidate.spanType) ? readString(candidate.attributes, "toolCallId") : void 0;
|
|
298
|
+
if (toolCallId) toolSpans.set(toolCallId, candidate);
|
|
299
|
+
}
|
|
300
|
+
return getRequestedToolCalls(span).flatMap((call, index) => {
|
|
301
|
+
if (isHiddenTool(call.toolName)) return [];
|
|
302
|
+
const toolSpan = call.toolCallId ? toolSpans.get(call.toolCallId) : void 0;
|
|
303
|
+
const part = toolSpan ? toToolPart(toolSpan) : {
|
|
304
|
+
type: "tool-invocation",
|
|
305
|
+
toolInvocation: {
|
|
306
|
+
toolCallId: call.toolCallId ?? `${span.spanId}:${index}`,
|
|
307
|
+
toolName: call.toolName,
|
|
308
|
+
args: call.args ?? {},
|
|
309
|
+
state: "call"
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
return [{
|
|
313
|
+
id: `${span.traceId}:${span.spanId}:tool:${index}`,
|
|
314
|
+
role: "assistant",
|
|
315
|
+
createdAt: new Date(span.startedAt),
|
|
316
|
+
threadId: span.threadId ?? void 0,
|
|
317
|
+
content: {
|
|
318
|
+
format: 2,
|
|
319
|
+
parts: [part],
|
|
320
|
+
content: ""
|
|
321
|
+
},
|
|
322
|
+
traceSpanIds: toolSpan ? [toolSpan.spanId] : []
|
|
323
|
+
}];
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
export { formatSpanToolCallMessages, formatTraceThreadMessages, getRequestedToolCalls };
|
|
277
327
|
|
|
278
328
|
//# sourceMappingURL=format-trace-thread-messages.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-trace-thread-messages.es.js","names":[],"sources":["../../../../src/domains/traces/components/format-trace-thread-messages.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { MastraDBMessage, MastraMessagePart } from '@mastra/core/agent/message-list';\nimport { SpanType } from '@mastra/core/observability';\nimport { isUserSignalType } from '@/domains/chat/messages/signal-data';\nimport { isHiddenTool } from '@/domains/chat/tools/tool-card-kind';\nimport { formatHierarchicalSpans } from '@/domains/traces/components/format-hierarchical-spans';\nimport type { UISpan } from '@/domains/traces/types';\nimport { getSpanSignal } from '@/domains/traces/utils/span-signal';\n\ntype SpanRecord = Awaited<ReturnType<MastraClient['getTrace']>>['spans'][number];\n\nconst TOOL_SPAN_TYPES = new Set<string>([\n SpanType.TOOL_CALL,\n SpanType.MCP_TOOL_CALL,\n SpanType.CLIENT_TOOL_CALL,\n SpanType.PROVIDER_TOOL_CALL,\n]);\n\n/** Top-level executions started by a tool call (e.g. a workflow tool running its workflow). */\nconst TOOL_EXECUTION_SPAN_TYPES = new Set<string>([SpanType.WORKFLOW_RUN, SpanType.AGENT_RUN]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst toTextParts = (content: unknown): MastraMessagePart[] => {\n if (typeof content === 'string') return [{ type: 'text', text: content }];\n if (isRecord(content) && Array.isArray(content.parts)) return toTextParts(content.parts);\n if (!Array.isArray(content)) return [];\n\n return content.flatMap<MastraMessagePart>(part => {\n if (!isRecord(part)) return [];\n if (part.type === 'text' && typeof part.text === 'string') {\n return [{ type: 'text' as const, text: part.text }];\n }\n if (part.type === 'file' && typeof part.mimeType === 'string' && typeof part.data === 'string') {\n return [{ type: 'file' as const, mimeType: part.mimeType, data: part.data }];\n }\n return [];\n });\n};\n\nconst getUserParts = (input: unknown): MastraMessagePart[] => {\n if (typeof input === 'string') return toTextParts(input);\n if (isRecord(input) && (input.type === 'user' || input.type === 'user-message')) {\n return toTextParts(input.contents);\n }\n\n const messages = Array.isArray(input)\n ? input\n : isRecord(input) && Array.isArray(input.messages)\n ? input.messages\n : [];\n\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (isRecord(message) && message.role === 'user') return toTextParts(message.content);\n }\n\n return [];\n};\n\nconst getResponseText = (output: unknown): string => {\n if (!isRecord(output)) return '';\n if (typeof output.text === 'string') return output.text;\n if (output.object === undefined) return '';\n return typeof output.object === 'string' ? output.object : JSON.stringify(output.object);\n};\n\nconst readString = (value: unknown, key: string): string | undefined => {\n if (!isRecord(value)) return undefined;\n const field = value[key];\n return typeof field === 'string' ? field : undefined;\n};\n\nconst toolNameOf = (span: SpanRecord): string => span.entityName ?? span.entityId ?? span.name;\n\nconst toToolPart = (span: SpanRecord): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const state = failed ? 'output-error' : settled ? 'result' : 'call';\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: readString(span.attributes, 'toolCallId') ?? span.spanId,\n toolName: toolNameOf(span),\n args: span.input ?? {},\n state,\n ...(settled ? { result: span.output } : {}),\n ...(failed ? { isError: true, errorText: readString(span.error, 'message') } : {}),\n },\n providerExecuted: span.spanType === SpanType.PROVIDER_TOOL_CALL,\n };\n};\n\nconst OBSERVATIONS_TAG = /<observations>([\\s\\S]*?)<\\/observations>/;\n\nconst findGeneratedText = (node: UISpan, spanById: Map<string, SpanRecord>): string => {\n for (const child of node.spans ?? []) {\n const span = spanById.get(child.id);\n if (span?.spanType === SpanType.MODEL_GENERATION) {\n const text = getResponseText(span.output);\n if (text) return text;\n }\n const nested = findGeneratedText(child, spanById);\n if (nested) return nested;\n }\n return '';\n};\n\n/** Same tool shape the chat builds from `data-om-*` parts, so the observation badge renders. */\nconst toObservationPart = (span: SpanRecord, node: UISpan, spanById: Map<string, SpanRecord>): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const text = findGeneratedText(node, spanById);\n const observations = (OBSERVATIONS_TAG.exec(text)?.[1] ?? text).trim();\n const inputTokens = span.attributes?.inputTokens;\n const omData = {\n cycleId: span.spanId,\n operationType: readString(span.attributes, 'operationType') === 'reflect' ? 'reflection' : 'observation',\n startedAt: new Date(span.startedAt).toISOString(),\n ...(typeof inputTokens === 'number' ? { tokensObserved: inputTokens } : {}),\n ...(observations ? { observations } : {}),\n ...(settled && span.endedAt\n ? {\n [failed ? 'failedAt' : 'completedAt']: new Date(span.endedAt).toISOString(),\n durationMs: new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime(),\n }\n : {}),\n ...(failed ? { error: readString(span.error, 'message') } : {}),\n _state: failed ? 'failed' : settled ? 'complete' : 'loading',\n };\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: `om-${span.spanId}`,\n toolName: 'mastra-memory-om-observation',\n args: omData,\n state: settled ? 'result' : 'call',\n ...(settled ? { result: { omData } } : {}),\n },\n };\n};\n\n/** Model chunk spans whose accumulated content becomes the assistant's response text. */\nconst RESPONSE_CHUNK_TYPES = new Set(['text', 'object']);\n\nconst isResponseChunkSpan = (span: SpanRecord) =>\n span.spanType === SpanType.MODEL_CHUNK && RESPONSE_CHUNK_TYPES.has(readString(span.attributes, 'chunkType') ?? '');\n\ninterface ToolCallPart {\n part: MastraMessagePart;\n /** The tool-call span plus any top-level execution it started (workflow/agent run). */\n spanIds: string[];\n toolCallId?: string;\n startedAt: SpanRecord['startedAt'];\n}\n\nconst OM_PROCESSOR_ID = 'observational-memory';\nconst OM_AGENT_IDS = new Set([\n 'observational-memory-observer',\n 'observational-memory-reflector',\n 'multi-thread-observer',\n]);\n\n/** Observational memory machinery (its processor run or its observer/reflector agents) is never part of the chat. */\nconst isObservationalMemoryInternalSpan = (span: SpanRecord) => {\n if (span.spanType === SpanType.PROCESSOR_RUN) {\n return span.entityId === OM_PROCESSOR_ID || span.name.endsWith(`: ${OM_PROCESSOR_ID}`);\n }\n if (span.spanType === SpanType.AGENT_RUN) {\n return OM_AGENT_IDS.has(span.entityId ?? '') || OM_AGENT_IDS.has(span.entityName ?? '');\n }\n return false;\n};\n\n/**\n * Walks the span tree collecting each tool call (with the spans behind it) in visit order,\n * plus the ids of the model chunks that produced the response text.\n */\nconst collectAssistantSpans = (\n root: UISpan,\n spans: SpanRecord[],\n): { tools: ToolCallPart[]; textSpanIds: string[]; resumedOutput: unknown } => {\n const spanById = new Map(spans.map(span => [span.spanId, span]));\n const tools: ToolCallPart[] = [];\n const textSpanIds: string[] = [];\n let resumedOutput: unknown;\n\n const visit = (nodes: UISpan[]) => {\n for (const node of nodes) {\n const span = spanById.get(node.id);\n if (!span) continue;\n if (TOOL_SPAN_TYPES.has(span.spanType)) {\n // Tools the chat never draws (task tools, working memory) get no message either.\n if (isHiddenTool(toolNameOf(span))) continue;\n // A tool that runs a workflow or an agent gets that top-level execution featured too,\n // so the user can see what the tool call actually did without featuring every nested step.\n const executionIds = (node.spans ?? []).flatMap(child =>\n TOOL_EXECUTION_SPAN_TYPES.has(child.type) ? [child.id] : [],\n );\n const part = toToolPart(span);\n const spanIds = [span.spanId, ...executionIds];\n // A suspended call (e.g. submit_plan) is resumed under the same toolCallId: one call, one part.\n const toolCallId = readString(span.attributes, 'toolCallId');\n const existing = toolCallId ? tools.find(tool => tool.toolCallId === toolCallId) : undefined;\n if (existing) {\n const earlier = new Date(existing.startedAt) <= new Date(span.startedAt);\n if (earlier) existing.part = part;\n existing.spanIds = earlier ? [...existing.spanIds, ...spanIds] : [...spanIds, ...existing.spanIds];\n if (!earlier) existing.startedAt = span.startedAt;\n } else {\n tools.push({ part, spanIds, toolCallId, startedAt: span.startedAt });\n }\n continue;\n }\n // Observational memory runs its own observer/reflector agent: render it as the chat's OM badge\n // and skip its subtree so the observer's output is never mistaken for the assistant's reply.\n const omOperation = readString(span.attributes, 'operationType');\n if (span.spanType === SpanType.MEMORY_OPERATION && (omOperation === 'observe' || omOperation === 'reflect')) {\n tools.push({\n part: toObservationPart(span, node, spanById),\n spanIds: [span.spanId],\n startedAt: span.startedAt,\n });\n continue;\n }\n if (isObservationalMemoryInternalSpan(span)) continue;\n if (isResponseChunkSpan(span)) textSpanIds.push(span.spanId);\n // A suspended run resumes as a nested agent run (outside any tool call) that carries the final response.\n if (span.spanType === SpanType.AGENT_RUN) resumedOutput = span.output;\n visit(node.spans ?? []);\n }\n };\n\n visit(root.spans ?? []);\n return { tools, textSpanIds, resumedOutput };\n};\n\nconst messageContent = (parts: MastraMessagePart[]) =>\n parts.flatMap(part => (part.type === 'text' && typeof part.text === 'string' ? [part.text] : [])).join('\\n');\n\n/** A `MastraDBMessage` reconstructed from trace spans, remembering which spans were used to build it. */\nexport interface TraceViewMastraDBMessage extends MastraDBMessage {\n /** Ids of the spans used to build this message, in visit order (root span first). */\n traceSpanIds: string[];\n}\n\nexport function formatTraceThreadMessages(spans: SpanRecord[]): TraceViewMastraDBMessage[] {\n const hierarchy = formatHierarchicalSpans(\n spans.map(span => ({\n spanId: span.spanId,\n name: span.name,\n spanType: span.spanType,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n parentSpanId: span.parentSpanId,\n })),\n );\n const hierarchicalRoot = hierarchy.find(span => span.type === SpanType.AGENT_RUN);\n if (!hierarchicalRoot) return [];\n const root = spans.find(span => span.spanId === hierarchicalRoot.id);\n if (!root) return [];\n\n const userParts = getUserParts(root.input);\n const signal = getSpanSignal(root);\n // A run started by a non-user signal (a skill, a reminder…) opens with that signal instead of a user turn.\n const signalParts = signal && !isUserSignalType(signal.type) ? toTextParts(signal.contents) : [];\n const { tools, textSpanIds, resumedOutput } = collectAssistantSpans(hierarchicalRoot, spans);\n const responseText = getResponseText(root.output) || getResponseText(resumedOutput);\n const assistantCreatedAt = new Date(root.endedAt ?? root.startedAt);\n const threadId = root.threadId ?? undefined;\n\n const messages: TraceViewMastraDBMessage[] = [\n ...(signal && signalParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:signal`,\n role: 'signal' as const,\n type: signal.tagName,\n createdAt: new Date(root.startedAt),\n threadId,\n content: {\n format: 2 as const,\n parts: signalParts,\n content: messageContent(signalParts),\n metadata: {\n signal: {\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n attributes: signal.attributes,\n metadata: signal.metadata,\n },\n },\n },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // A resumed run's input is the resume payload, not a user message: no user bubble then.\n ...(userParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:user`,\n role: 'user' as const,\n createdAt: new Date(root.startedAt),\n threadId,\n content: { format: 2 as const, parts: userParts, content: messageContent(userParts) },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // One message per tool call so each part maps to exactly the spans behind it.\n ...tools.map<TraceViewMastraDBMessage>(({ part, spanIds }) => ({\n id: `${root.traceId}:${spanIds[0]}:tool`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [part], content: '' },\n traceSpanIds: [root.spanId, ...spanIds],\n })),\n ];\n\n if (responseText) {\n messages.push({\n id: `${root.traceId}:${root.spanId}:assistant`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [{ type: 'text', text: responseText }], content: responseText },\n traceSpanIds: [root.spanId, ...textSpanIds],\n });\n }\n\n return messages;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format-trace-thread-messages.es.js","names":[],"sources":["../../../../src/domains/traces/components/format-trace-thread-messages.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { MastraDBMessage, MastraMessagePart } from '@mastra/core/agent/message-list';\nimport { SpanType } from '@mastra/core/observability';\nimport { isUserSignalType } from '@/domains/chat/messages/signal-data';\nimport { isHiddenTool } from '@/domains/chat/tools/tool-card-kind';\nimport { formatHierarchicalSpans } from '@/domains/traces/components/format-hierarchical-spans';\nimport type { UISpan } from '@/domains/traces/types';\nimport { getSpanSignal } from '@/domains/traces/utils/span-signal';\n\ntype SpanRecord = Awaited<ReturnType<MastraClient['getTrace']>>['spans'][number];\n/** A span as the span panel holds it, without the trace-level `status`. */\ntype SpanFields = Omit<SpanRecord, 'status'>;\n\nconst TOOL_SPAN_TYPES = new Set<string>([\n SpanType.TOOL_CALL,\n SpanType.MCP_TOOL_CALL,\n SpanType.CLIENT_TOOL_CALL,\n SpanType.PROVIDER_TOOL_CALL,\n]);\n\n/** Top-level executions started by a tool call (e.g. a workflow tool running its workflow). */\nconst TOOL_EXECUTION_SPAN_TYPES = new Set<string>([SpanType.WORKFLOW_RUN, SpanType.AGENT_RUN]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst toTextParts = (content: unknown): MastraMessagePart[] => {\n if (typeof content === 'string') return [{ type: 'text', text: content }];\n if (isRecord(content) && Array.isArray(content.parts)) return toTextParts(content.parts);\n if (!Array.isArray(content)) return [];\n\n return content.flatMap<MastraMessagePart>(part => {\n if (!isRecord(part)) return [];\n if (part.type === 'text' && typeof part.text === 'string') {\n return [{ type: 'text' as const, text: part.text }];\n }\n if (part.type === 'file' && typeof part.mimeType === 'string' && typeof part.data === 'string') {\n return [{ type: 'file' as const, mimeType: part.mimeType, data: part.data }];\n }\n return [];\n });\n};\n\nconst getUserParts = (input: unknown): MastraMessagePart[] => {\n if (typeof input === 'string') return toTextParts(input);\n if (isRecord(input) && (input.type === 'user' || input.type === 'user-message')) {\n return toTextParts(input.contents);\n }\n\n const messages = Array.isArray(input)\n ? input\n : isRecord(input) && Array.isArray(input.messages)\n ? input.messages\n : [];\n\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (isRecord(message) && message.role === 'user') return toTextParts(message.content);\n }\n\n return [];\n};\n\nconst getResponseText = (output: unknown): string => {\n if (!isRecord(output)) return '';\n if (typeof output.text === 'string') return output.text;\n if (output.object === undefined) return '';\n return typeof output.object === 'string' ? output.object : JSON.stringify(output.object);\n};\n\nconst readString = (value: unknown, key: string): string | undefined => {\n if (!isRecord(value)) return undefined;\n const field = value[key];\n return typeof field === 'string' ? field : undefined;\n};\n\nconst toolNameOf = (span: SpanFields): string => span.entityName ?? span.entityId ?? span.name;\n\nconst toToolPart = (span: SpanFields): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const state = failed ? 'output-error' : settled ? 'result' : 'call';\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: readString(span.attributes, 'toolCallId') ?? span.spanId,\n toolName: toolNameOf(span),\n args: span.input ?? {},\n state,\n ...(settled ? { result: span.output } : {}),\n ...(failed ? { isError: true, errorText: readString(span.error, 'message') } : {}),\n },\n providerExecuted: span.spanType === SpanType.PROVIDER_TOOL_CALL,\n };\n};\n\nconst OBSERVATIONS_TAG = /<observations>([\\s\\S]*?)<\\/observations>/;\n\nconst findGeneratedText = (node: UISpan, spanById: Map<string, SpanRecord>): string => {\n for (const child of node.spans ?? []) {\n const span = spanById.get(child.id);\n if (span?.spanType === SpanType.MODEL_GENERATION) {\n const text = getResponseText(span.output);\n if (text) return text;\n }\n const nested = findGeneratedText(child, spanById);\n if (nested) return nested;\n }\n return '';\n};\n\n/** Same tool shape the chat builds from `data-om-*` parts, so the observation badge renders. */\nconst toObservationPart = (span: SpanRecord, node: UISpan, spanById: Map<string, SpanRecord>): MastraMessagePart => {\n const failed = Boolean(span.error);\n const settled = Boolean(span.endedAt);\n const text = findGeneratedText(node, spanById);\n const observations = (OBSERVATIONS_TAG.exec(text)?.[1] ?? text).trim();\n const inputTokens = span.attributes?.inputTokens;\n const omData = {\n cycleId: span.spanId,\n operationType: readString(span.attributes, 'operationType') === 'reflect' ? 'reflection' : 'observation',\n startedAt: new Date(span.startedAt).toISOString(),\n ...(typeof inputTokens === 'number' ? { tokensObserved: inputTokens } : {}),\n ...(observations ? { observations } : {}),\n ...(settled && span.endedAt\n ? {\n [failed ? 'failedAt' : 'completedAt']: new Date(span.endedAt).toISOString(),\n durationMs: new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime(),\n }\n : {}),\n ...(failed ? { error: readString(span.error, 'message') } : {}),\n _state: failed ? 'failed' : settled ? 'complete' : 'loading',\n };\n\n return {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: `om-${span.spanId}`,\n toolName: 'mastra-memory-om-observation',\n args: omData,\n state: settled ? 'result' : 'call',\n ...(settled ? { result: { omData } } : {}),\n },\n };\n};\n\n/** Model chunk spans whose accumulated content becomes the assistant's response text. */\nconst RESPONSE_CHUNK_TYPES = new Set(['text', 'object']);\n\nconst isResponseChunkSpan = (span: SpanRecord) =>\n span.spanType === SpanType.MODEL_CHUNK && RESPONSE_CHUNK_TYPES.has(readString(span.attributes, 'chunkType') ?? '');\n\ninterface ToolCallPart {\n part: MastraMessagePart;\n /** The tool-call span plus any top-level execution it started (workflow/agent run). */\n spanIds: string[];\n toolCallId?: string;\n startedAt: SpanRecord['startedAt'];\n}\n\nconst OM_PROCESSOR_ID = 'observational-memory';\nconst OM_AGENT_IDS = new Set([\n 'observational-memory-observer',\n 'observational-memory-reflector',\n 'multi-thread-observer',\n]);\n\n/** Observational memory machinery (its processor run or its observer/reflector agents) is never part of the chat. */\nconst isObservationalMemoryInternalSpan = (span: SpanRecord) => {\n if (span.spanType === SpanType.PROCESSOR_RUN) {\n return span.entityId === OM_PROCESSOR_ID || span.name.endsWith(`: ${OM_PROCESSOR_ID}`);\n }\n if (span.spanType === SpanType.AGENT_RUN) {\n return OM_AGENT_IDS.has(span.entityId ?? '') || OM_AGENT_IDS.has(span.entityName ?? '');\n }\n return false;\n};\n\n/**\n * Walks the span tree collecting each tool call (with the spans behind it) in visit order,\n * plus the ids of the model chunks that produced the response text.\n */\nconst collectAssistantSpans = (\n root: UISpan,\n spans: SpanRecord[],\n): { tools: ToolCallPart[]; textSpanIds: string[]; resumedOutput: unknown } => {\n const spanById = new Map(spans.map(span => [span.spanId, span]));\n const tools: ToolCallPart[] = [];\n const textSpanIds: string[] = [];\n let resumedOutput: unknown;\n\n const visit = (nodes: UISpan[]) => {\n for (const node of nodes) {\n const span = spanById.get(node.id);\n if (!span) continue;\n if (TOOL_SPAN_TYPES.has(span.spanType)) {\n // Tools the chat never draws (task tools, working memory) get no message either.\n if (isHiddenTool(toolNameOf(span))) continue;\n // A tool that runs a workflow or an agent gets that top-level execution featured too,\n // so the user can see what the tool call actually did without featuring every nested step.\n const executionIds = (node.spans ?? []).flatMap(child =>\n TOOL_EXECUTION_SPAN_TYPES.has(child.type) ? [child.id] : [],\n );\n const part = toToolPart(span);\n const spanIds = [span.spanId, ...executionIds];\n // A suspended call (e.g. submit_plan) is resumed under the same toolCallId: one call, one part.\n const toolCallId = readString(span.attributes, 'toolCallId');\n const existing = toolCallId ? tools.find(tool => tool.toolCallId === toolCallId) : undefined;\n if (existing) {\n const earlier = new Date(existing.startedAt) <= new Date(span.startedAt);\n if (earlier) existing.part = part;\n existing.spanIds = earlier ? [...existing.spanIds, ...spanIds] : [...spanIds, ...existing.spanIds];\n if (!earlier) existing.startedAt = span.startedAt;\n } else {\n tools.push({ part, spanIds, toolCallId, startedAt: span.startedAt });\n }\n continue;\n }\n // Observational memory runs its own observer/reflector agent: render it as the chat's OM badge\n // and skip its subtree so the observer's output is never mistaken for the assistant's reply.\n const omOperation = readString(span.attributes, 'operationType');\n if (span.spanType === SpanType.MEMORY_OPERATION && (omOperation === 'observe' || omOperation === 'reflect')) {\n tools.push({\n part: toObservationPart(span, node, spanById),\n spanIds: [span.spanId],\n startedAt: span.startedAt,\n });\n continue;\n }\n if (isObservationalMemoryInternalSpan(span)) continue;\n if (isResponseChunkSpan(span)) textSpanIds.push(span.spanId);\n // A suspended run resumes as a nested agent run (outside any tool call) that carries the final response.\n if (span.spanType === SpanType.AGENT_RUN) resumedOutput = span.output;\n visit(node.spans ?? []);\n }\n };\n\n visit(root.spans ?? []);\n return { tools, textSpanIds, resumedOutput };\n};\n\nconst messageContent = (parts: MastraMessagePart[]) =>\n parts.flatMap(part => (part.type === 'text' && typeof part.text === 'string' ? [part.text] : [])).join('\\n');\n\n/** A `MastraDBMessage` reconstructed from trace spans, remembering which spans were used to build it. */\nexport interface TraceViewMastraDBMessage extends MastraDBMessage {\n /** Ids of the spans used to build this message, in visit order (root span first). */\n traceSpanIds: string[];\n}\n\nexport function formatTraceThreadMessages(spans: SpanRecord[]): TraceViewMastraDBMessage[] {\n const hierarchy = formatHierarchicalSpans(\n spans.map(span => ({\n spanId: span.spanId,\n name: span.name,\n spanType: span.spanType,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n parentSpanId: span.parentSpanId,\n })),\n );\n const hierarchicalRoot = hierarchy.find(span => span.type === SpanType.AGENT_RUN);\n if (!hierarchicalRoot) return [];\n const root = spans.find(span => span.spanId === hierarchicalRoot.id);\n if (!root) return [];\n\n const userParts = getUserParts(root.input);\n const signal = getSpanSignal(root);\n // A run started by a non-user signal (a skill, a reminder…) opens with that signal instead of a user turn.\n const signalParts = signal && !isUserSignalType(signal.type) ? toTextParts(signal.contents) : [];\n const { tools, textSpanIds, resumedOutput } = collectAssistantSpans(hierarchicalRoot, spans);\n const responseText = getResponseText(root.output) || getResponseText(resumedOutput);\n const assistantCreatedAt = new Date(root.endedAt ?? root.startedAt);\n const threadId = root.threadId ?? undefined;\n\n const messages: TraceViewMastraDBMessage[] = [\n ...(signal && signalParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:signal`,\n role: 'signal' as const,\n type: signal.tagName,\n createdAt: new Date(root.startedAt),\n threadId,\n content: {\n format: 2 as const,\n parts: signalParts,\n content: messageContent(signalParts),\n metadata: {\n signal: {\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n attributes: signal.attributes,\n metadata: signal.metadata,\n },\n },\n },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // A resumed run's input is the resume payload, not a user message: no user bubble then.\n ...(userParts.length > 0\n ? [\n {\n id: `${root.traceId}:${root.spanId}:user`,\n role: 'user' as const,\n createdAt: new Date(root.startedAt),\n threadId,\n content: { format: 2 as const, parts: userParts, content: messageContent(userParts) },\n traceSpanIds: [root.spanId],\n },\n ]\n : []),\n // One message per tool call so each part maps to exactly the spans behind it.\n ...tools.map<TraceViewMastraDBMessage>(({ part, spanIds }) => ({\n id: `${root.traceId}:${spanIds[0]}:tool`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [part], content: '' },\n traceSpanIds: [root.spanId, ...spanIds],\n })),\n ];\n\n if (responseText) {\n messages.push({\n id: `${root.traceId}:${root.spanId}:assistant`,\n role: 'assistant',\n createdAt: assistantCreatedAt,\n threadId,\n content: { format: 2, parts: [{ type: 'text', text: responseText }], content: responseText },\n traceSpanIds: [root.spanId, ...textSpanIds],\n });\n }\n\n return messages;\n}\n\ninterface RequestedToolCall {\n toolCallId?: string;\n toolName: string;\n args: unknown;\n}\n\n/** The tool calls a model span asked for, as recorded in its `output.toolCalls`. */\nexport function getRequestedToolCalls(span: SpanFields): RequestedToolCall[] {\n const toolCalls = isRecord(span.output) ? span.output.toolCalls : undefined;\n if (!Array.isArray(toolCalls)) return [];\n return toolCalls.flatMap(call => {\n const toolName = readString(call, 'toolName');\n if (!toolName || !isRecord(call)) return [];\n return [{ toolCallId: readString(call, 'toolCallId'), toolName, args: call.args ?? call.input }];\n });\n}\n\n/**\n * One message per tool call a model span asked for, read back from the trace's tool span\n * (its input and result) when there is one, so the chat's tool rows can draw them.\n */\nexport function formatSpanToolCallMessages(span: SpanFields, spans: SpanFields[]): TraceViewMastraDBMessage[] {\n const toolSpans = new Map<string, SpanFields>();\n for (const candidate of spans) {\n const toolCallId = TOOL_SPAN_TYPES.has(candidate.spanType)\n ? readString(candidate.attributes, 'toolCallId')\n : undefined;\n if (toolCallId) toolSpans.set(toolCallId, candidate);\n }\n\n return getRequestedToolCalls(span).flatMap<TraceViewMastraDBMessage>((call, index) => {\n if (isHiddenTool(call.toolName)) return [];\n const toolSpan = call.toolCallId ? toolSpans.get(call.toolCallId) : undefined;\n const part: MastraMessagePart = toolSpan\n ? toToolPart(toolSpan)\n : {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: call.toolCallId ?? `${span.spanId}:${index}`,\n toolName: call.toolName,\n args: call.args ?? {},\n state: 'call',\n },\n };\n return [\n {\n id: `${span.traceId}:${span.spanId}:tool:${index}`,\n role: 'assistant',\n createdAt: new Date(span.startedAt),\n threadId: span.threadId ?? undefined,\n content: { format: 2, parts: [part], content: '' },\n traceSpanIds: toolSpan ? [toolSpan.spanId] : [],\n },\n ];\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_domains_chat_context_tool_call_context = require("../../chat/context/tool-call-context.cjs.js");
|
|
3
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
+
// src/domains/traces/components/read-only-tool-call-provider.tsx
|
|
5
|
+
var noop = () => {};
|
|
6
|
+
/** Tool cards read back from a trace: nothing is running and nothing can be approved. */
|
|
7
|
+
function ReadOnlyToolCallProvider({ children }) {
|
|
8
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_chat_context_tool_call_context.ToolCallProvider, {
|
|
9
|
+
approveToolcall: noop,
|
|
10
|
+
declineToolcall: noop,
|
|
11
|
+
approveToolcallGenerate: noop,
|
|
12
|
+
declineToolcallGenerate: noop,
|
|
13
|
+
approveNetworkToolcall: noop,
|
|
14
|
+
declineNetworkToolcall: noop,
|
|
15
|
+
isRunning: false,
|
|
16
|
+
toolCallApprovals: {},
|
|
17
|
+
networkToolCallApprovals: {},
|
|
18
|
+
children
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
exports.ReadOnlyToolCallProvider = ReadOnlyToolCallProvider;
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=read-only-tool-call-provider.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only-tool-call-provider.cjs.js","names":["ToolCallProvider"],"sources":["../../../../src/domains/traces/components/read-only-tool-call-provider.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { ToolCallProvider } from '@/domains/chat/context/tool-call-context';\n\nconst noop = () => {};\n\n/** Tool cards read back from a trace: nothing is running and nothing can be approved. */\nexport function ReadOnlyToolCallProvider({ children }: { children: ReactNode }) {\n return (\n <ToolCallProvider\n approveToolcall={noop}\n declineToolcall={noop}\n approveToolcallGenerate={noop}\n declineToolcallGenerate={noop}\n approveNetworkToolcall={noop}\n declineNetworkToolcall={noop}\n isRunning={false}\n toolCallApprovals={{}}\n networkToolCallApprovals={{}}\n >\n {children}\n </ToolCallProvider>\n );\n}\n"],"mappings":";;;;AAGA,IAAM,aAAa,CAAC;;AAGpB,SAAgB,yBAAyB,EAAE,YAAqC;CAC9E,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,+CAAAA,kBAAD;EACE,iBAAiB;EACjB,iBAAiB;EACjB,yBAAyB;EACzB,yBAAyB;EACzB,wBAAwB;EACxB,wBAAwB;EACxB,WAAW;EACX,mBAAmB,CAAC;EACpB,0BAA0B,CAAC;EAE1B;CACe,CAAA;AAEtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/traces/components/read-only-tool-call-provider';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ToolCallProvider } from "../../chat/context/tool-call-context.es.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
// src/domains/traces/components/read-only-tool-call-provider.tsx
|
|
4
|
+
var noop = () => {};
|
|
5
|
+
/** Tool cards read back from a trace: nothing is running and nothing can be approved. */
|
|
6
|
+
function ReadOnlyToolCallProvider({ children }) {
|
|
7
|
+
return /* @__PURE__ */ jsx(ToolCallProvider, {
|
|
8
|
+
approveToolcall: noop,
|
|
9
|
+
declineToolcall: noop,
|
|
10
|
+
approveToolcallGenerate: noop,
|
|
11
|
+
declineToolcallGenerate: noop,
|
|
12
|
+
approveNetworkToolcall: noop,
|
|
13
|
+
declineNetworkToolcall: noop,
|
|
14
|
+
isRunning: false,
|
|
15
|
+
toolCallApprovals: {},
|
|
16
|
+
networkToolCallApprovals: {},
|
|
17
|
+
children
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export { ReadOnlyToolCallProvider };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=read-only-tool-call-provider.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only-tool-call-provider.es.js","names":[],"sources":["../../../../src/domains/traces/components/read-only-tool-call-provider.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { ToolCallProvider } from '@/domains/chat/context/tool-call-context';\n\nconst noop = () => {};\n\n/** Tool cards read back from a trace: nothing is running and nothing can be approved. */\nexport function ReadOnlyToolCallProvider({ children }: { children: ReactNode }) {\n return (\n <ToolCallProvider\n approveToolcall={noop}\n declineToolcall={noop}\n approveToolcallGenerate={noop}\n declineToolcallGenerate={noop}\n approveNetworkToolcall={noop}\n declineNetworkToolcall={noop}\n isRunning={false}\n toolCallApprovals={{}}\n networkToolCallApprovals={{}}\n >\n {children}\n </ToolCallProvider>\n );\n}\n"],"mappings":";;;AAGA,IAAM,aAAa,CAAC;;AAGpB,SAAgB,yBAAyB,EAAE,YAAqC;CAC9E,OACE,oBAAC,kBAAD;EACE,iBAAiB;EACjB,iBAAiB;EACjB,yBAAyB;EACzB,yBAAyB;EACzB,wBAAwB;EACxB,wBAAwB;EACxB,WAAW;EACX,mBAAmB,CAAC;EACpB,0BAA0B,CAAC;EAE1B;CACe,CAAA;AAEtB"}
|