@mastra/core 1.3.0 → 1.4.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/CHANGELOG.md +462 -0
- package/datasets.d.ts +1 -0
- package/dist/agent/agent.d.ts +1 -1
- package/dist/agent/index.cjs +13 -13
- package/dist/agent/index.js +2 -2
- package/dist/agent/message-list/adapters/AIV4Adapter.d.ts.map +1 -1
- package/dist/agent/message-list/adapters/AIV5Adapter.d.ts.map +1 -1
- package/dist/agent/message-list/conversion/output-converter.d.ts +2 -1
- package/dist/agent/message-list/conversion/output-converter.d.ts.map +1 -1
- package/dist/agent/message-list/index.cjs +18 -18
- package/dist/agent/message-list/index.js +1 -1
- package/dist/agent/workflows/prepare-stream/index.d.ts +1 -1
- package/dist/chunk-3JVFFAJX.cjs +1207 -0
- package/dist/chunk-3JVFFAJX.cjs.map +1 -0
- package/dist/{chunk-WL3AW3YA.js → chunk-3X3CZUXI.js} +4070 -3983
- package/dist/chunk-3X3CZUXI.js.map +1 -0
- package/dist/{chunk-2GWTJFVM.js → chunk-4EHGOATH.js} +46 -14
- package/dist/chunk-4EHGOATH.js.map +1 -0
- package/dist/{chunk-YNXIGRQE.cjs → chunk-4IJ4UDZX.cjs} +319 -83
- package/dist/chunk-4IJ4UDZX.cjs.map +1 -0
- package/dist/{chunk-CGPH7CMG.cjs → chunk-4KFEMXTV.cjs} +46 -14
- package/dist/chunk-4KFEMXTV.cjs.map +1 -0
- package/dist/{chunk-PHYJYZ32.js → chunk-4TQ4EBYX.js} +16 -8
- package/dist/chunk-4TQ4EBYX.js.map +1 -0
- package/dist/{chunk-SIZEIYNH.js → chunk-4XSAZPPS.js} +254 -18
- package/dist/chunk-4XSAZPPS.js.map +1 -0
- package/dist/{chunk-KUTU2YZF.js → chunk-5Q5Y34SS.js} +5 -5
- package/dist/{chunk-KUTU2YZF.js.map → chunk-5Q5Y34SS.js.map} +1 -1
- package/dist/{chunk-EH6SAGEO.cjs → chunk-64WGYTQK.cjs} +72 -53
- package/dist/{chunk-EH6SAGEO.cjs.map → chunk-64WGYTQK.cjs.map} +1 -1
- package/dist/{chunk-OOCEAC6U.cjs → chunk-65PHUUMF.cjs} +3 -3
- package/dist/{chunk-OOCEAC6U.cjs.map → chunk-65PHUUMF.cjs.map} +1 -1
- package/dist/{chunk-JNE2ABVB.js → chunk-7NKUSQEV.js} +1094 -10
- package/dist/chunk-7NKUSQEV.js.map +1 -0
- package/dist/{chunk-ZHFM7HCQ.js → chunk-AXHBJ4GX.js} +3 -3
- package/dist/{chunk-ZHFM7HCQ.js.map → chunk-AXHBJ4GX.js.map} +1 -1
- package/dist/{chunk-ILQXPZCD.js → chunk-AY6DBRS3.js} +37 -21
- package/dist/chunk-AY6DBRS3.js.map +1 -0
- package/dist/{chunk-TERSHTY5.cjs → chunk-BP7VYTOP.cjs} +1116 -21
- package/dist/chunk-BP7VYTOP.cjs.map +1 -0
- package/dist/{chunk-UE2G2LRP.cjs → chunk-CZ4NQANZ.cjs} +37 -21
- package/dist/chunk-CZ4NQANZ.cjs.map +1 -0
- package/dist/{chunk-NCC45KOB.cjs → chunk-DBSVT6AR.cjs} +7 -7
- package/dist/{chunk-NCC45KOB.cjs.map → chunk-DBSVT6AR.cjs.map} +1 -1
- package/dist/{chunk-BXLLXTT4.js → chunk-FLPEGTEK.js} +4 -4
- package/dist/{chunk-BXLLXTT4.js.map → chunk-FLPEGTEK.js.map} +1 -1
- package/dist/{chunk-ON2KVIUJ.cjs → chunk-HYRYTTMT.cjs} +7 -7
- package/dist/{chunk-ON2KVIUJ.cjs.map → chunk-HYRYTTMT.cjs.map} +1 -1
- package/dist/chunk-NJ7TL3LQ.js +1196 -0
- package/dist/chunk-NJ7TL3LQ.js.map +1 -0
- package/dist/{chunk-EUG4AON3.cjs → chunk-NKYWDNCI.cjs} +8 -7
- package/dist/{chunk-EUG4AON3.cjs.map → chunk-NKYWDNCI.cjs.map} +1 -1
- package/dist/{chunk-UHVG25VW.cjs → chunk-NZG2JAKS.cjs} +23 -15
- package/dist/chunk-NZG2JAKS.cjs.map +1 -0
- package/dist/{chunk-44SUGDBR.js → chunk-PS5ONCXY.js} +109 -5
- package/dist/chunk-PS5ONCXY.js.map +1 -0
- package/dist/{chunk-57QAF2ZQ.js → chunk-QTTWRCB5.js} +4 -4
- package/dist/{chunk-57QAF2ZQ.js.map → chunk-QTTWRCB5.js.map} +1 -1
- package/dist/{chunk-VM25PDSW.js → chunk-RZ4CIIZR.js} +4 -4
- package/dist/{chunk-VM25PDSW.js.map → chunk-RZ4CIIZR.js.map} +1 -1
- package/dist/{chunk-C3XU7ZDC.cjs → chunk-SU5APAM6.cjs} +123 -4
- package/dist/chunk-SU5APAM6.cjs.map +1 -0
- package/dist/{chunk-3MJCJLZS.js → chunk-U2HKJZCI.js} +24 -5
- package/dist/{chunk-3MJCJLZS.js.map → chunk-U2HKJZCI.js.map} +1 -1
- package/dist/{chunk-GCTAD6B7.cjs → chunk-VD5YA6RH.cjs} +12 -12
- package/dist/{chunk-GCTAD6B7.cjs.map → chunk-VD5YA6RH.cjs.map} +1 -1
- package/dist/{chunk-KAJNBNWP.cjs → chunk-YNNJLLFN.cjs} +4071 -3984
- package/dist/chunk-YNNJLLFN.cjs.map +1 -0
- package/dist/datasets/dataset.d.ts +153 -0
- package/dist/datasets/dataset.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/aggregate.d.ts +46 -0
- package/dist/datasets/experiment/analytics/aggregate.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/compare.d.ts +33 -0
- package/dist/datasets/experiment/analytics/compare.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/index.d.ts +9 -0
- package/dist/datasets/experiment/analytics/index.d.ts.map +1 -0
- package/dist/datasets/experiment/analytics/types.d.ts +103 -0
- package/dist/datasets/experiment/analytics/types.d.ts.map +1 -0
- package/dist/datasets/experiment/executor.d.ts +40 -0
- package/dist/datasets/experiment/executor.d.ts.map +1 -0
- package/dist/datasets/experiment/index.d.ts +31 -0
- package/dist/datasets/experiment/index.d.ts.map +1 -0
- package/dist/datasets/experiment/scorer.d.ts +21 -0
- package/dist/datasets/experiment/scorer.d.ts.map +1 -0
- package/dist/datasets/experiment/types.d.ts +140 -0
- package/dist/datasets/experiment/types.d.ts.map +1 -0
- package/dist/datasets/index.cjs +69 -0
- package/dist/datasets/index.cjs.map +1 -0
- package/dist/datasets/index.d.ts +6 -0
- package/dist/datasets/index.d.ts.map +1 -0
- package/dist/datasets/index.js +4 -0
- package/dist/datasets/index.js.map +1 -0
- package/dist/datasets/manager.d.ts +73 -0
- package/dist/datasets/manager.d.ts.map +1 -0
- package/dist/datasets/validation/errors.d.ts +44 -0
- package/dist/datasets/validation/errors.d.ts.map +1 -0
- package/dist/datasets/validation/index.d.ts +3 -0
- package/dist/datasets/validation/index.d.ts.map +1 -0
- package/dist/datasets/validation/validator.d.ts +24 -0
- package/dist/datasets/validation/validator.d.ts.map +1 -0
- package/dist/docs/SKILL.md +1 -3
- package/dist/docs/assets/SOURCE_MAP.json +436 -346
- package/dist/docs/references/docs-memory-observational-memory.md +86 -11
- package/dist/docs/references/docs-streaming-events.md +23 -0
- package/dist/docs/references/docs-workspace-filesystem.md +72 -1
- package/dist/docs/references/docs-workspace-overview.md +95 -12
- package/dist/docs/references/docs-workspace-sandbox.md +2 -0
- package/dist/docs/references/guides-agent-frameworks-ai-sdk.md +6 -2
- package/dist/docs/references/reference-ai-sdk-with-mastra.md +1 -1
- package/dist/docs/references/reference-memory-observational-memory.md +318 -9
- package/dist/docs/references/reference-streaming-workflows-stream.md +1 -0
- package/dist/docs/references/reference-workflows-workflow-methods-foreach.md +30 -0
- package/dist/docs/references/reference.md +3 -0
- package/dist/editor/index.d.ts +1 -1
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/types.d.ts +21 -3
- package/dist/editor/types.d.ts.map +1 -1
- package/dist/evals/index.cjs +20 -20
- package/dist/evals/index.js +3 -3
- package/dist/evals/scoreTraces/index.cjs +5 -5
- package/dist/evals/scoreTraces/index.js +2 -2
- package/dist/features/index.cjs +1 -1
- package/dist/features/index.cjs.map +1 -1
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +1 -1
- package/dist/features/index.js.map +1 -1
- package/dist/index.cjs +2 -7
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/llm/index.cjs +10 -10
- package/dist/llm/index.js +2 -2
- package/dist/llm/model/provider-types.generated.d.ts +1694 -1659
- package/dist/loop/index.cjs +12 -12
- package/dist/loop/index.js +1 -1
- package/dist/loop/network/index.d.ts +1 -1
- package/dist/loop/workflows/agentic-execution/index.d.ts +1 -1
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-loop/index.d.ts +1 -1
- package/dist/loop/workflows/errors.d.ts +4 -0
- package/dist/loop/workflows/errors.d.ts.map +1 -0
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.d.ts +2 -0
- package/dist/mastra/index.d.ts.map +1 -1
- package/dist/mastra/index.js +1 -1
- package/dist/memory/index.cjs +14 -14
- package/dist/memory/index.js +1 -1
- package/dist/memory/memory.d.ts +5 -0
- package/dist/memory/memory.d.ts.map +1 -1
- package/dist/memory/types.d.ts +56 -0
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/processors/index.cjs +41 -41
- package/dist/processors/index.js +1 -1
- package/dist/processors/processors/skills.d.ts +1 -1
- package/dist/processors/processors/skills.d.ts.map +1 -1
- package/dist/processors/runner.d.ts.map +1 -1
- package/dist/processors/trailing-assistant-guard.d.ts +34 -0
- package/dist/processors/trailing-assistant-guard.d.ts.map +1 -0
- package/dist/provider-registry-6LZAGQET.cjs +40 -0
- package/dist/{provider-registry-C6XCYX44.cjs.map → provider-registry-6LZAGQET.cjs.map} +1 -1
- package/dist/provider-registry-QUNT7S55.js +3 -0
- package/dist/{provider-registry-NWU4YFQW.js.map → provider-registry-QUNT7S55.js.map} +1 -1
- package/dist/provider-registry.json +4068 -3981
- package/dist/relevance/index.cjs +3 -3
- package/dist/relevance/index.js +1 -1
- package/dist/storage/base.d.ts +4 -1
- package/dist/storage/base.d.ts.map +1 -1
- package/dist/storage/constants.cjs +87 -27
- package/dist/storage/constants.d.ts +21 -2
- package/dist/storage/constants.d.ts.map +1 -1
- package/dist/storage/constants.js +1 -1
- package/dist/storage/domains/agents/inmemory.d.ts.map +1 -1
- package/dist/storage/domains/datasets/base.d.ts +83 -0
- package/dist/storage/domains/datasets/base.d.ts.map +1 -0
- package/dist/storage/domains/datasets/index.d.ts +3 -0
- package/dist/storage/domains/datasets/index.d.ts.map +1 -0
- package/dist/storage/domains/datasets/inmemory.d.ts +40 -0
- package/dist/storage/domains/datasets/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/experiments/base.d.ts +28 -0
- package/dist/storage/domains/experiments/base.d.ts.map +1 -0
- package/dist/storage/domains/experiments/index.d.ts +3 -0
- package/dist/storage/domains/experiments/index.d.ts.map +1 -0
- package/dist/storage/domains/experiments/inmemory.d.ts +28 -0
- package/dist/storage/domains/experiments/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/index.d.ts +3 -0
- package/dist/storage/domains/index.d.ts.map +1 -1
- package/dist/storage/domains/inmemory-db.d.ts +9 -1
- package/dist/storage/domains/inmemory-db.d.ts.map +1 -1
- package/dist/storage/domains/mcp-clients/base.d.ts +47 -0
- package/dist/storage/domains/mcp-clients/base.d.ts.map +1 -0
- package/dist/storage/domains/mcp-clients/index.d.ts +3 -0
- package/dist/storage/domains/mcp-clients/index.d.ts.map +1 -0
- package/dist/storage/domains/mcp-clients/inmemory.d.ts +31 -0
- package/dist/storage/domains/mcp-clients/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/operations/inmemory.d.ts.map +1 -1
- package/dist/storage/index.cjs +201 -117
- package/dist/storage/index.js +2 -2
- package/dist/storage/mock.d.ts.map +1 -1
- package/dist/storage/types.d.ts +338 -3
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/stream/base/output.d.ts.map +1 -1
- package/dist/stream/index.cjs +11 -11
- package/dist/stream/index.js +2 -2
- package/dist/stream/types.d.ts +15 -0
- package/dist/stream/types.d.ts.map +1 -1
- package/dist/test-utils/llm-mock.cjs +4 -4
- package/dist/test-utils/llm-mock.js +1 -1
- package/dist/tool-loop-agent/index.cjs +4 -4
- package/dist/tool-loop-agent/index.js +1 -1
- package/dist/tool-provider/index.cjs +4 -0
- package/dist/tool-provider/index.cjs.map +1 -0
- package/dist/tool-provider/index.d.ts +2 -0
- package/dist/tool-provider/index.d.ts.map +1 -0
- package/dist/tool-provider/index.js +3 -0
- package/dist/tool-provider/index.js.map +1 -0
- package/dist/tool-provider/types.d.ts +113 -0
- package/dist/tool-provider/types.d.ts.map +1 -0
- package/dist/utils.cjs +23 -23
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -1
- package/dist/vector/index.cjs +7 -7
- package/dist/vector/index.js +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/evented/workflow-event-processor/index.d.ts.map +1 -1
- package/dist/workflows/handlers/control-flow.d.ts.map +1 -1
- package/dist/workflows/index.cjs +25 -25
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/workflow.d.ts +2 -2
- package/dist/workflows/workflow.d.ts.map +1 -1
- package/dist/workspace/filesystem/filesystem.d.ts +5 -15
- package/dist/workspace/filesystem/filesystem.d.ts.map +1 -1
- package/dist/workspace/filesystem/local-filesystem.d.ts +18 -2
- package/dist/workspace/filesystem/local-filesystem.d.ts.map +1 -1
- package/dist/workspace/filesystem/mastra-filesystem.d.ts +21 -1
- package/dist/workspace/filesystem/mastra-filesystem.d.ts.map +1 -1
- package/dist/workspace/index.cjs +41 -41
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +1 -1
- package/dist/workspace/lifecycle.d.ts +49 -53
- package/dist/workspace/lifecycle.d.ts.map +1 -1
- package/dist/workspace/sandbox/local-sandbox.d.ts +1 -1
- package/dist/workspace/sandbox/local-sandbox.d.ts.map +1 -1
- package/dist/workspace/sandbox/mastra-sandbox.d.ts +3 -2
- package/dist/workspace/sandbox/mastra-sandbox.d.ts.map +1 -1
- package/dist/workspace/sandbox/sandbox.d.ts +3 -4
- package/dist/workspace/sandbox/sandbox.d.ts.map +1 -1
- package/dist/workspace/workspace.d.ts +2 -15
- package/dist/workspace/workspace.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/llm/model/provider-types.generated.d.ts +1694 -1659
- package/tool-provider.d.ts +1 -0
- package/dist/chunk-2GWTJFVM.js.map +0 -1
- package/dist/chunk-44SUGDBR.js.map +0 -1
- package/dist/chunk-C3XU7ZDC.cjs.map +0 -1
- package/dist/chunk-CGPH7CMG.cjs.map +0 -1
- package/dist/chunk-ILQXPZCD.js.map +0 -1
- package/dist/chunk-JNE2ABVB.js.map +0 -1
- package/dist/chunk-KAJNBNWP.cjs.map +0 -1
- package/dist/chunk-PHYJYZ32.js.map +0 -1
- package/dist/chunk-SIZEIYNH.js.map +0 -1
- package/dist/chunk-TERSHTY5.cjs.map +0 -1
- package/dist/chunk-UE2G2LRP.cjs.map +0 -1
- package/dist/chunk-UHVG25VW.cjs.map +0 -1
- package/dist/chunk-WL3AW3YA.js.map +0 -1
- package/dist/chunk-YNXIGRQE.cjs.map +0 -1
- package/dist/docs/references/reference-cli-mastra.md +0 -336
- package/dist/docs/references/reference-deployer-cloudflare.md +0 -56
- package/dist/provider-registry-C6XCYX44.cjs +0 -40
- package/dist/provider-registry-NWU4YFQW.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/message-list/detection/TypeDetector.ts","../src/agent/message-list/prompt/data-content.ts","../src/agent/message-list/prompt/image-utils.ts","../src/agent/message-list/utils/provider-compat.ts","../src/agent/message-list/adapters/AIV4Adapter.ts","../src/agent/message-list/adapters/AIV5Adapter.ts","../src/agent/message-list/cache/CacheKeyGenerator.ts","../src/agent/message-list/conversion/to-prompt.ts","../src/agent/message-list/conversion/utils.ts","../src/agent/message-list/conversion/input-converter.ts","../src/agent/message-list/conversion/output-converter.ts","../src/stream/aisdk/v5/file.ts","../src/agent/message-list/conversion/step-content.ts","../src/agent/message-list/merge/MessageMerger.ts","../src/stream/aisdk/v5/compat/content.ts","../src/stream/aisdk/v5/compat/media.ts","../src/agent/message-list/prompt/convert-file.ts","../src/agent/message-list/prompt/attachments-to-parts.ts","../src/agent/message-list/prompt/convert-to-mastra-v1.ts","../src/utils/fetchWithRetry.ts","../src/agent/message-list/prompt/download-assets.ts","../src/agent/message-list/state/serialization.ts","../src/agent/message-list/state/MessageStateManager.ts","../src/agent/message-list/message-list.ts","../src/agent/message-list/utils/convert-messages.ts"],"names":["uiMessage","filterEmptyTextParts","toolResultPart","matchingCall","convertUint8ArrayToBase64","stepParts","convertBase64ToUint8Array","processBlock","content","toolInvocations","i","randomUUID"],"mappings":"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","file":"chunk-AY6DBRS3.js","sourcesContent":["import type { Message as AIV4Message, UIMessage as UIMessageV4 } from '@internal/ai-sdk-v4';\n\nimport type { MastraDBMessage, MastraMessageV1 } from '../state/types';\nimport type { AIV5Type, CoreMessageV4 } from '../types';\n\n/**\n * Type representing all possible message input formats\n */\nexport type MessageInput =\n | AIV5Type.UIMessage\n | AIV5Type.ModelMessage\n | (UIMessageV4 & { metadata?: Record<string, unknown> })\n | AIV4Message\n | CoreMessageV4\n | MastraMessageV1\n | MastraDBMessage;\n\n/**\n * TypeDetector - Centralized type detection for different message formats\n *\n * This class provides consistent type detection across all message formats,\n * which is critical for:\n * - Determining which conversion path to use\n * - Validating incoming message formats\n * - Providing better TypeScript type narrowing\n *\n * The detection order is important because some formats share similar properties.\n */\nexport class TypeDetector {\n /**\n * Check if a message is a MastraDBMessage (format 2)\n */\n static isMastraDBMessage(msg: MessageInput): msg is MastraDBMessage {\n return Boolean(\n 'content' in msg &&\n msg.content &&\n !Array.isArray(msg.content) &&\n typeof msg.content !== 'string' &&\n 'format' in msg.content &&\n msg.content.format === 2,\n );\n }\n\n /**\n * Check if a message is a MastraMessageV1 (legacy format)\n */\n static isMastraMessageV1(msg: MessageInput): msg is MastraMessageV1 {\n return !TypeDetector.isMastraDBMessage(msg) && ('threadId' in msg || 'resourceId' in msg);\n }\n\n /**\n * Check if a message is either Mastra format (V1 or V2/DB)\n */\n static isMastraMessage(msg: MessageInput): msg is MastraDBMessage | MastraMessageV1 {\n return TypeDetector.isMastraDBMessage(msg) || TypeDetector.isMastraMessageV1(msg);\n }\n\n /**\n * Check if a message is an AIV4 UIMessage\n */\n static isAIV4UIMessage(msg: MessageInput): msg is UIMessageV4 {\n return (\n !TypeDetector.isMastraMessage(msg) &&\n !TypeDetector.isAIV4CoreMessage(msg) &&\n 'parts' in msg &&\n !TypeDetector.hasAIV5UIMessageCharacteristics(msg)\n );\n }\n\n /**\n * Check if a message is an AIV5 UIMessage\n */\n static isAIV5UIMessage(msg: MessageInput): msg is AIV5Type.UIMessage {\n return (\n !TypeDetector.isMastraMessage(msg) &&\n !TypeDetector.isAIV5CoreMessage(msg) &&\n 'parts' in msg &&\n TypeDetector.hasAIV5UIMessageCharacteristics(msg)\n );\n }\n\n /**\n * Check if a message is an AIV4 CoreMessage\n */\n static isAIV4CoreMessage(msg: MessageInput): msg is CoreMessageV4 {\n // V4 CoreMessage has role and content like V5, but content can be array of parts\n return (\n !TypeDetector.isMastraMessage(msg) &&\n !('parts' in msg) &&\n 'content' in msg &&\n !TypeDetector.hasAIV5CoreMessageCharacteristics(msg)\n );\n }\n\n /**\n * Check if a message is an AIV5 ModelMessage (CoreMessage equivalent)\n */\n static isAIV5CoreMessage(msg: MessageInput): msg is AIV5Type.ModelMessage {\n return (\n !TypeDetector.isMastraMessage(msg) &&\n !('parts' in msg) &&\n 'content' in msg &&\n TypeDetector.hasAIV5CoreMessageCharacteristics(msg)\n );\n }\n\n /**\n * Check if a message has AIV5 UIMessage characteristics\n *\n * V5 UIMessages have specific part types and field names that differ from V4\n */\n static hasAIV5UIMessageCharacteristics(\n msg: AIV5Type.UIMessage | UIMessageV4 | AIV4Message,\n ): msg is AIV5Type.UIMessage {\n // ai v4 has these separated arrays of parts that don't record overall order\n // so we can check for their presence as a faster/early check\n if (\n 'toolInvocations' in msg ||\n 'reasoning' in msg ||\n 'experimental_attachments' in msg ||\n 'data' in msg ||\n 'annotations' in msg\n // don't check `content` in msg because it fully narrows the type to v5 and there's a chance someone might mess up and add content to a v5 message, that's more likely than the other keys\n )\n return false;\n\n if (!msg.parts) return false; // this is likely an AIV4Type.Message\n\n for (const part of msg.parts) {\n if ('metadata' in part) return true;\n\n // tools are annoying cause ai v5 has the type as\n // tool-${toolName}\n // in v4 we had tool-invocation\n // technically\n // v4 tool\n if ('toolInvocation' in part) return false;\n // v5 tool\n if ('toolCallId' in part) return true;\n\n if (part.type === 'source') return false;\n if (part.type === 'source-url') return true;\n\n if (part.type === 'reasoning') {\n if ('state' in part || 'text' in part) return true; // v5\n if ('reasoning' in part || 'details' in part) return false; // v4\n }\n\n if (part.type === 'file' && 'mediaType' in part) return true;\n }\n\n return false; // default to v4 for backwards compat\n }\n\n /**\n * Check if a message has AIV5 CoreMessage characteristics\n *\n * V5 ModelMessages use different field names (output vs result, input vs args, mediaType vs mimeType)\n */\n static hasAIV5CoreMessageCharacteristics(\n msg:\n | CoreMessageV4\n | AIV5Type.ModelMessage\n // This is here because AIV4 \"Message\" type can omit parts! 😱\n | AIV4Message,\n ): msg is AIV5Type.ModelMessage {\n if ('experimental_providerMetadata' in msg) return false; // is v4 cause v5 doesn't have this property\n\n // String content is identical in both v4 and v5, so we can safely treat it as v5-compatible\n // This doesn't misclassify v4 messages because the format is the same\n if (typeof msg.content === 'string') return true;\n\n for (const part of msg.content) {\n if (part.type === 'tool-result' && 'output' in part) return true; // v5 renamed result->output,\n if (part.type === 'tool-call' && 'input' in part) return true; // v5 renamed args->input\n if (part.type === 'tool-result' && 'result' in part) return false; // v5 renamed result->output,\n if (part.type === 'tool-call' && 'args' in part) return false; // v5 renamed args->input\n\n // for file and image\n if ('mediaType' in part) return true; // v5 renamed mimeType->mediaType\n if ('mimeType' in part) return false;\n\n // applies to multiple part types\n if ('experimental_providerMetadata' in part) return false; // was in v4 but deprecated for providerOptions, v4+5 have providerOptions though, can't check the other way\n\n if (part.type === 'reasoning' && 'signature' in part) return false; // v5 doesn't have signature, which is optional in v4\n\n if (part.type === 'redacted-reasoning') return false; // only in v4, seems like in v5 they add it to providerOptions or something?\n }\n\n // If no distinguishing features were found, the message format is identical in v4 and v5\n // We return true (v5-compatible) because the message can be used as-is with v5\n return true;\n }\n\n /**\n * Get the normalized role for a message\n * Maps 'tool' role to 'assistant' since tool messages are displayed as part of assistant conversation\n */\n static getRole(message: MessageInput): MastraDBMessage['role'] {\n if (message.role === 'assistant' || message.role === 'tool') return 'assistant';\n if (message.role === 'user') return 'user';\n if (message.role === 'system') return 'system';\n throw new Error(\n `BUG: add handling for message role ${message.role} in message ${JSON.stringify(message, null, 2)}`,\n );\n }\n}\n","import { convertUint8ArrayToBase64 } from '@ai-sdk/provider-utils-v5';\nimport { z } from 'zod';\n\n/**\nData content. Can either be a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer.\n */\nexport type DataContent = string | Uint8Array | ArrayBuffer | Buffer;\n\n/**\n@internal\n */\nexport const dataContentSchema: z.ZodType<DataContent> = z.union([\n z.string(),\n z.instanceof(Uint8Array),\n z.instanceof(ArrayBuffer),\n z.custom(\n // Buffer might not be available in some environments such as CloudFlare:\n (value: unknown): value is Buffer => globalThis.Buffer?.isBuffer(value) ?? false,\n { message: 'Must be a Buffer' },\n ),\n]);\n\n/**\nConverts data content to a base64-encoded string.\n\n@param content - Data content to convert.\n@returns Base64-encoded string.\n*/\nexport function convertDataContentToBase64String(content: DataContent): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n\n return convertUint8ArrayToBase64(content);\n}\n","import { convertDataContentToBase64String } from './data-content';\n\n/**\n * Image content can be a string (URL or data URI), a URL object, or binary data\n */\nexport type ImageContent = string | URL | Uint8Array | ArrayBuffer | Buffer;\n\n/**\n * Represents the parsed components of a data URI\n */\nexport interface DataUriParts {\n mimeType?: string;\n base64Content: string;\n isDataUri: boolean;\n}\n\n/**\n * Parses a data URI string into its components.\n * Format: data:[<mediatype>][;base64],<data>\n *\n * @param dataUri - The data URI string to parse\n * @returns Parsed components including MIME type and base64 content\n */\nexport function parseDataUri(dataUri: string): DataUriParts {\n if (!dataUri.startsWith('data:')) {\n return {\n isDataUri: false,\n base64Content: dataUri,\n };\n }\n\n const base64Index = dataUri.indexOf(',');\n if (base64Index === -1) {\n // Malformed data URI, return as-is\n return {\n isDataUri: true,\n base64Content: dataUri,\n };\n }\n\n const header = dataUri.substring(5, base64Index); // Skip 'data:' prefix\n const base64Content = dataUri.substring(base64Index + 1);\n\n // Extract MIME type from header (before ';base64' or ';')\n const semicolonIndex = header.indexOf(';');\n const mimeType = semicolonIndex !== -1 ? header.substring(0, semicolonIndex) : header;\n\n return {\n isDataUri: true,\n mimeType: mimeType || undefined,\n base64Content,\n };\n}\n\n/**\n * Creates a data URI from base64 content and MIME type.\n *\n * @param base64Content - The base64 encoded content\n * @param mimeType - The MIME type (defaults to 'application/octet-stream')\n * @returns A properly formatted data URI\n */\nexport function createDataUri(base64Content: string, mimeType: string = 'application/octet-stream'): string {\n // If it's already a data URI, return as-is\n if (base64Content.startsWith('data:')) {\n return base64Content;\n }\n return `data:${mimeType};base64,${base64Content}`;\n}\n\n/**\n * Converts various image data formats to a string representation.\n * - Strings are returned as-is (could be URLs or data URIs)\n * - URL objects are converted to strings\n * - Binary data (Uint8Array, ArrayBuffer, Buffer) is converted to base64\n *\n * @param image - The image data in various formats\n * @param fallbackMimeType - MIME type to use when creating data URIs from binary data\n * @returns String representation of the image (URL, data URI, or base64)\n */\nexport function imageContentToString(image: ImageContent, fallbackMimeType?: string): string {\n if (typeof image === 'string') {\n return image;\n }\n\n if (image instanceof URL) {\n return image.toString();\n }\n\n if (image instanceof Uint8Array || image instanceof ArrayBuffer || (globalThis.Buffer && Buffer.isBuffer(image))) {\n // Convert binary data to base64\n const base64 = convertDataContentToBase64String(image);\n // If it's not already a data URI, create one\n if (fallbackMimeType && !base64.startsWith('data:')) {\n return `data:${fallbackMimeType};base64,${base64}`;\n }\n return base64;\n }\n\n // Fallback for unknown types - try to convert to string\n return String(image);\n}\n\n/**\n * Converts various image data formats to a data URI string.\n *\n * @param image - The image data in various formats\n * @param mimeType - MIME type for the data URI (defaults to 'image/png')\n * @returns Data URI string\n */\nexport function imageContentToDataUri(image: ImageContent, mimeType: string = 'image/png'): string {\n const imageStr = imageContentToString(image, mimeType);\n\n // If it's already a data URI, return as-is\n if (imageStr.startsWith('data:')) {\n return imageStr;\n }\n\n // If it's an HTTP(S) URL, return as-is (can't convert to data URI)\n if (imageStr.startsWith('http://') || imageStr.startsWith('https://')) {\n return imageStr;\n }\n\n // Otherwise, assume it's base64 and create a data URI\n return `data:${mimeType};base64,${imageStr}`;\n}\n\n/**\n * Gets a stable cache key component for image content.\n * Used for generating hash keys for caching purposes.\n *\n * @param image - The image data in various formats\n * @returns A string or number suitable for cache key generation\n */\nexport function getImageCacheKey(image: ImageContent): string | number {\n if (image instanceof URL) {\n return image.toString();\n }\n\n if (typeof image === 'string') {\n return image.length;\n }\n\n if (image instanceof Uint8Array) {\n return image.byteLength;\n }\n\n if (image instanceof ArrayBuffer) {\n return image.byteLength;\n }\n\n return image;\n}\n\n/**\n * Checks if a string is a valid URL (including protocol-relative URLs).\n *\n * @param str - The string to check\n * @returns true if the string is a valid URL\n */\nexport function isValidUrl(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n // Try as protocol-relative URL\n if (str.startsWith('//')) {\n try {\n new URL(`https:${str}`);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n }\n}\n\n/**\n * Categorizes a string as a URL, data URI, or raw data (base64/other).\n * Also extracts MIME type from data URIs when present.\n *\n * @param data - The string data to categorize\n * @param fallbackMimeType - Optional fallback MIME type\n * @returns Categorized data with type and extracted MIME type\n */\nexport function categorizeFileData(\n data: string,\n fallbackMimeType?: string,\n): {\n type: 'url' | 'dataUri' | 'raw';\n mimeType?: string;\n data: string;\n} {\n // Parse as data URI first to extract MIME type\n const parsed = parseDataUri(data);\n const mimeType = parsed.isDataUri && parsed.mimeType ? parsed.mimeType : fallbackMimeType;\n\n // Check if it's a data URI\n if (parsed.isDataUri) {\n return {\n type: 'dataUri',\n mimeType,\n data,\n };\n }\n\n // Check if it's a URL\n if (isValidUrl(data)) {\n return {\n type: 'url',\n mimeType,\n data,\n };\n }\n\n // Otherwise it's raw data (likely base64 or other string data)\n return {\n type: 'raw',\n mimeType,\n data,\n };\n}\n\n/**\n * Classifies a string as a URL, data URI, or raw data.\n *\n * @param data - The string to classify\n * @returns Object with classification and extracted metadata\n */\nexport function classifyFileData(data: string): {\n type: 'url' | 'dataUri' | 'base64' | 'other';\n mimeType?: string;\n} {\n // Check if it's a data URI\n const parsed = parseDataUri(data);\n if (parsed.isDataUri) {\n return {\n type: 'dataUri',\n mimeType: parsed.mimeType,\n };\n }\n\n // Check if it's a URL\n if (isValidUrl(data)) {\n return { type: 'url' };\n }\n\n // Check if it looks like base64 (simple heuristic)\n if (/^[A-Za-z0-9+/\\-_]+=*$/.test(data) && data.length > 20) {\n return { type: 'base64' };\n }\n\n return { type: 'other' };\n}\n","import type { CoreMessage as CoreMessageV4 } from '@internal/ai-sdk-v4';\nimport type { ModelMessage, ToolResultPart } from '@internal/ai-sdk-v5';\n\nimport { MastraError, ErrorDomain, ErrorCategory } from '../../../error';\nimport type { MastraDBMessage } from '../state/types';\n\n/**\n * Tool result with input field (Anthropic requirement)\n */\nexport type ToolResultWithInput = ToolResultPart & {\n input: Record<string, unknown>;\n};\n\n// ============================================================================\n// Gemini Compatibility\n// ============================================================================\n\n/**\n * Ensures message array is compatible with Gemini API requirements.\n *\n * Gemini API requires:\n * 1. The first non-system message must be from the user role\n * 2. Cannot have only system messages - at least one user/assistant is required\n *\n * @param messages - Array of model messages to validate and fix\n * @returns Modified messages array that satisfies Gemini requirements\n * @throws MastraError if no user or assistant messages are present\n *\n * @see https://github.com/mastra-ai/mastra/issues/7287 - Tool call ordering\n * @see https://github.com/mastra-ai/mastra/issues/8053 - Single turn validation\n */\nexport function ensureGeminiCompatibleMessages<T extends ModelMessage | CoreMessageV4>(messages: T[]): T[] {\n const result = [...messages];\n\n // Ensure first non-system message is user\n const firstNonSystemIndex = result.findIndex(m => m.role !== 'system');\n\n if (firstNonSystemIndex === -1) {\n // Only system messages or empty - this is an error condition\n throw new MastraError({\n id: 'NO_USER_OR_ASSISTANT_MESSAGES',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: 'This request does not contain any user or assistant messages. At least one user or assistant message is required to generate a response.',\n });\n } else if (result[firstNonSystemIndex]?.role === 'assistant') {\n // First non-system is assistant, insert user message before it\n result.splice(firstNonSystemIndex, 0, {\n role: 'user',\n content: '.',\n } as T);\n }\n\n return result;\n}\n\n// ============================================================================\n// Anthropic Compatibility\n// ============================================================================\n\n/**\n * Ensures model messages are compatible with Anthropic API requirements.\n *\n * Anthropic API requires tool-result parts to include an 'input' field\n * that matches the original tool call arguments.\n *\n * @param messages - Array of model messages to transform\n * @param dbMessages - MastraDB messages to look up tool call args from\n * @returns Messages with tool-result parts enriched with input field\n *\n * @see https://github.com/mastra-ai/mastra/issues/11376 - Anthropic models fail with empty object tool input\n */\nexport function ensureAnthropicCompatibleMessages(\n messages: ModelMessage[],\n dbMessages: MastraDBMessage[],\n): ModelMessage[] {\n return messages.map(msg => enrichToolResultsWithInput(msg, dbMessages));\n}\n\n/**\n * Enriches a single message's tool-result parts with input field\n */\nfunction enrichToolResultsWithInput(message: ModelMessage, dbMessages: MastraDBMessage[]): ModelMessage {\n if (message.role !== 'tool' || !Array.isArray(message.content)) {\n return message;\n }\n\n return {\n ...message,\n content: message.content.map(part => {\n if (part.type === 'tool-result') {\n return {\n ...part,\n input: findToolCallArgs(dbMessages, part.toolCallId),\n } as ToolResultWithInput;\n }\n return part;\n }),\n } as ModelMessage;\n}\n\n// ============================================================================\n// OpenAI Compatibility\n// ============================================================================\n\n/**\n * Checks if a message part has OpenAI reasoning itemId\n *\n * OpenAI reasoning items are tracked via `providerMetadata.openai.itemId` (e.g., `rs_...`).\n * Each reasoning item has a unique itemId that must be preserved for proper deduplication.\n *\n * @param part - A message part to check\n * @returns true if the part has an OpenAI itemId\n *\n * @see https://github.com/mastra-ai/mastra/issues/9005 - OpenAI reasoning items filtering\n */\nexport function hasOpenAIReasoningItemId(part: unknown): boolean {\n if (!part || typeof part !== 'object') return false;\n const partAny = part as Record<string, unknown>;\n\n if (!('providerMetadata' in partAny) || !partAny.providerMetadata) return false;\n const metadata = partAny.providerMetadata as Record<string, unknown>;\n\n if (!('openai' in metadata) || !metadata.openai) return false;\n const openai = metadata.openai as Record<string, unknown>;\n\n return 'itemId' in openai && typeof openai.itemId === 'string';\n}\n\n/**\n * Extracts the OpenAI itemId from a message part if present\n *\n * @param part - A message part to extract from\n * @returns The itemId string or undefined if not present\n */\nexport function getOpenAIReasoningItemId(part: unknown): string | undefined {\n if (!hasOpenAIReasoningItemId(part)) return undefined;\n\n const partAny = part as Record<string, unknown>;\n const metadata = partAny.providerMetadata as Record<string, unknown>;\n const openai = metadata.openai as Record<string, unknown>;\n\n return openai.itemId as string;\n}\n\n// ============================================================================\n// Tool Call Args Lookup\n// ============================================================================\n\n/**\n * Finds the tool call args for a given toolCallId by searching through messages.\n * This is used to reconstruct the input field when converting tool-result parts to StaticToolResult.\n *\n * Searches through messages in reverse order (most recent first) for better performance.\n * Checks both content.parts (v2 format) and toolInvocations (legacy AIV4 format).\n *\n * @param messages - Array of MastraDB messages to search through\n * @param toolCallId - The ID of the tool call to find args for\n * @returns The args object from the matching tool call, or an empty object if not found\n */\nexport function findToolCallArgs(messages: MastraDBMessage[], toolCallId: string): Record<string, unknown> {\n // Search through all messages in reverse order (most recent first) for better performance\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (!msg || msg.role !== 'assistant') {\n continue;\n }\n\n // Check both content.parts (v2 format) and toolInvocations (legacy format)\n if (msg.content.parts) {\n // Look for tool-invocation with matching toolCallId (can be in 'call' or 'result' state)\n const toolCallPart = msg.content.parts.find(\n p => p.type === 'tool-invocation' && p.toolInvocation.toolCallId === toolCallId,\n );\n\n if (toolCallPart && toolCallPart.type === 'tool-invocation') {\n // Return the args even if it's undefined or empty object\n return toolCallPart.toolInvocation.args || {};\n }\n }\n\n // Also check toolInvocations array (AIV4 format)\n if (msg.content.toolInvocations) {\n const toolInvocation = msg.content.toolInvocations.find(inv => inv.toolCallId === toolCallId);\n\n if (toolInvocation) {\n return toolInvocation.args || {};\n }\n }\n }\n\n // If not found in DB messages, return empty object\n return {};\n}\n","import type {\n UIMessage as UIMessageV4,\n CoreMessage as CoreMessageV4,\n ToolInvocation as ToolInvocationV4,\n} from '@internal/ai-sdk-v4';\n\nimport { MastraError, ErrorDomain, ErrorCategory } from '../../../error';\nimport { TypeDetector } from '../detection/TypeDetector';\nimport { convertDataContentToBase64String } from '../prompt/data-content';\nimport { categorizeFileData, createDataUri, imageContentToString } from '../prompt/image-utils';\nimport type {\n MastraDBMessage,\n MastraMessageContentV2,\n MastraMessagePart,\n UIMessageV4Part,\n MessageSource,\n UIMessageWithMetadata,\n} from '../state/types';\nimport { findToolCallArgs } from '../utils/provider-compat';\n\n/**\n * Filter out data-* parts from MastraMessagePart[] to get V4-compatible parts.\n * Data parts are a Mastra extension for custom streaming data and aren't supported by AI SDK V4.\n */\nfunction filterDataParts(parts: MastraMessagePart[]): UIMessageV4Part[] {\n return parts.filter((part): part is UIMessageV4Part => !part.type.startsWith('data-'));\n}\n\n/**\n * Filter out empty text parts from message parts array.\n * Empty text blocks are not allowed by Anthropic's API and cause request failures.\n * This can happen during streaming when text-start/text-end events occur without actual content.\n * However, if the only part is an empty text part, it is preserved as a legitimate placeholder\n * (e.g. empty assistant messages between tool results and user messages).\n */\nfunction filterEmptyTextParts(parts: MastraMessagePart[]): MastraMessagePart[] {\n const hasNonEmptyParts = parts.some(part => !(part.type === 'text' && part.text === ''));\n if (!hasNonEmptyParts) return parts;\n return parts.filter(part => {\n if (part.type === 'text') {\n return part.text !== '';\n }\n return true;\n });\n}\n\n// Re-export for backward compatibility\nexport type { UIMessageWithMetadata };\n\nexport interface AIV4AdapterContext {\n memoryInfo: { threadId?: string; resourceId?: string } | null;\n newMessageId(): string;\n generateCreatedAt(messageSource: MessageSource, start?: unknown): Date;\n /** Messages array for looking up tool call args */\n dbMessages?: MastraDBMessage[];\n}\n\n/**\n * AIV4Adapter - Handles conversions between MastraDBMessage and AI SDK V4 formats\n *\n * This adapter centralizes all AI SDK V4 (UIMessage and CoreMessage) conversion logic.\n */\nexport class AIV4Adapter {\n /**\n * Convert MastraDBMessage to AI SDK V4 UIMessage\n */\n static toUIMessage(m: MastraDBMessage): UIMessageWithMetadata {\n const experimentalAttachments: UIMessageWithMetadata['experimental_attachments'] = m.content\n .experimental_attachments\n ? [...m.content.experimental_attachments]\n : [];\n const contentString =\n typeof m.content.content === `string` && m.content.content !== ''\n ? m.content.content\n : (m.content.parts ?? []).reduce((prev, part) => {\n if (part.type === `text`) {\n // return only the last text part like AI SDK does\n return part.text;\n }\n return prev;\n }, '');\n\n const parts: MastraMessageContentV2['parts'] = [];\n const sourceParts = m.content.parts ?? [];\n\n if (sourceParts.length) {\n for (const part of sourceParts) {\n if (part.type === `file`) {\n // Normalize part.data to ensure it's a valid URL or data URI\n let normalizedUrl: string;\n if (typeof part.data === 'string') {\n const categorized = categorizeFileData(part.data, part.mimeType);\n if (categorized.type === 'raw') {\n // Raw base64 - convert to data URI\n normalizedUrl = createDataUri(part.data, part.mimeType || 'application/octet-stream');\n } else {\n // Already a URL or data URI\n normalizedUrl = part.data;\n }\n } else {\n // It's a non-string (shouldn't happen in practice for file parts, but handle it)\n normalizedUrl = part.data;\n }\n\n experimentalAttachments.push({\n contentType: part.mimeType,\n url: normalizedUrl,\n });\n } else if (\n part.type === 'tool-invocation' &&\n (part.toolInvocation.state === 'call' || part.toolInvocation.state === 'partial-call')\n ) {\n // Filter out tool invocations with call or partial-call states\n continue;\n } else if (part.type === 'tool-invocation') {\n // Handle tool invocations with step number logic\n const toolInvocation = { ...part.toolInvocation };\n\n // Find the step number for this tool invocation\n let currentStep = -1;\n let toolStep = -1;\n for (const innerPart of sourceParts) {\n if (innerPart.type === `step-start`) currentStep++;\n if (\n innerPart.type === `tool-invocation` &&\n innerPart.toolInvocation.toolCallId === part.toolInvocation.toolCallId\n ) {\n toolStep = currentStep;\n break;\n }\n }\n\n if (toolStep >= 0) {\n const preparedInvocation = {\n step: toolStep,\n ...toolInvocation,\n };\n parts.push({\n type: 'tool-invocation',\n toolInvocation: preparedInvocation,\n });\n } else {\n parts.push({\n type: 'tool-invocation',\n toolInvocation,\n });\n }\n } else {\n parts.push(part);\n }\n }\n }\n\n if (parts.length === 0 && experimentalAttachments.length > 0) {\n // make sure we have atleast one part so this message doesn't get removed when converting to core message\n parts.push({ type: 'text', text: '' });\n }\n\n // Filter out data-* parts when converting to UIMessageV4 (V4 doesn't support them)\n const v4Parts = filterDataParts(parts);\n\n if (m.role === `user`) {\n const uiMessage: UIMessageWithMetadata = {\n id: m.id,\n role: m.role,\n content: m.content.content || contentString,\n createdAt: m.createdAt,\n parts: v4Parts,\n experimental_attachments: experimentalAttachments,\n };\n // Preserve metadata if present\n if (m.content.metadata) {\n uiMessage.metadata = m.content.metadata;\n }\n return uiMessage;\n } else if (m.role === `assistant`) {\n const isSingleTextContentArray =\n Array.isArray(m.content.content) && m.content.content.length === 1 && m.content.content[0].type === `text`;\n\n const uiMessage: UIMessageWithMetadata = {\n id: m.id,\n role: m.role,\n content: isSingleTextContentArray ? contentString : m.content.content || contentString,\n createdAt: m.createdAt,\n parts: v4Parts,\n reasoning: undefined,\n toolInvocations:\n `toolInvocations` in m.content ? m.content.toolInvocations?.filter(t => t.state === 'result') : undefined,\n };\n // Preserve metadata if present\n if (m.content.metadata) {\n uiMessage.metadata = m.content.metadata;\n }\n return uiMessage;\n }\n\n const uiMessage: UIMessageWithMetadata = {\n id: m.id,\n role: m.role,\n content: m.content.content || contentString,\n createdAt: m.createdAt,\n parts: v4Parts,\n experimental_attachments: experimentalAttachments,\n };\n // Preserve metadata if present\n if (m.content.metadata) {\n uiMessage.metadata = m.content.metadata;\n }\n return uiMessage;\n }\n\n /**\n * Converts a MastraDBMessage system message directly to AIV4 CoreMessage format\n */\n static systemToV4Core(message: MastraDBMessage): CoreMessageV4 {\n if (message.role !== `system` || !message.content.content)\n throw new MastraError({\n id: 'INVALID_SYSTEM_MESSAGE_FORMAT',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: `Invalid system message format. System messages must include 'role' and 'content' properties. The content should be a string.`,\n details: {\n receivedMessage: JSON.stringify(message, null, 2),\n },\n });\n\n const coreMessage: CoreMessageV4 = { role: 'system', content: message.content.content };\n\n // Preserve message-level providerMetadata as experimental_providerMetadata (V4 field name)\n if (message.content.providerMetadata) {\n coreMessage.experimental_providerMetadata = message.content.providerMetadata;\n }\n\n return coreMessage;\n }\n\n /**\n * Convert AI SDK V4 UIMessage to MastraDBMessage\n */\n static fromUIMessage(\n message: UIMessageV4 | UIMessageWithMetadata,\n ctx: AIV4AdapterContext,\n messageSource: MessageSource,\n ): MastraDBMessage {\n // Filter out empty text parts to prevent Anthropic API errors\n const filteredParts = message.parts ? filterEmptyTextParts(message.parts) : [];\n\n const content: MastraMessageContentV2 = {\n format: 2,\n parts: filteredParts,\n };\n\n if (message.toolInvocations) content.toolInvocations = message.toolInvocations;\n if (message.reasoning) content.reasoning = message.reasoning;\n if (message.annotations) content.annotations = message.annotations;\n if (message.experimental_attachments) {\n content.experimental_attachments = message.experimental_attachments;\n }\n // Preserve metadata field if present\n if ('metadata' in message && message.metadata !== null && message.metadata !== undefined) {\n content.metadata = message.metadata as Record<string, unknown>;\n }\n\n return {\n id: message.id || ctx.newMessageId(),\n role: TypeDetector.getRole(message),\n createdAt: ctx.generateCreatedAt(messageSource, message.createdAt),\n threadId: ctx.memoryInfo?.threadId,\n resourceId: ctx.memoryInfo?.resourceId,\n content,\n } satisfies MastraDBMessage;\n }\n\n /**\n * Convert AI SDK V4 CoreMessage to MastraDBMessage\n */\n static fromCoreMessage(\n coreMessage: CoreMessageV4,\n ctx: AIV4AdapterContext,\n messageSource: MessageSource,\n ): MastraDBMessage {\n const id = `id` in coreMessage ? (coreMessage.id as string) : ctx.newMessageId();\n const parts: UIMessageV4['parts'] = [];\n const experimentalAttachments: UIMessageV4['experimental_attachments'] = [];\n const toolInvocations: ToolInvocationV4[] = [];\n\n const isSingleTextContent =\n messageSource === `response` &&\n Array.isArray(coreMessage.content) &&\n coreMessage.content.length === 1 &&\n coreMessage.content[0] &&\n coreMessage.content[0].type === `text` &&\n `text` in coreMessage.content[0] &&\n coreMessage.content[0].text;\n\n if (isSingleTextContent && messageSource === `response`) {\n coreMessage.content = isSingleTextContent;\n }\n\n if (typeof coreMessage.content === 'string') {\n parts.push({\n type: 'text',\n text: coreMessage.content,\n });\n } else if (Array.isArray(coreMessage.content)) {\n for (const aiV4Part of coreMessage.content) {\n switch (aiV4Part.type) {\n case 'text': {\n // Add step-start only after tool invocations, not at the beginning\n const prevPart = parts.at(-1);\n if (coreMessage.role === 'assistant' && prevPart && prevPart.type === 'tool-invocation') {\n parts.push({ type: 'step-start' });\n }\n\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'text' as const,\n text: aiV4Part.text,\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n break;\n }\n\n case 'tool-call': {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'tool-invocation' as const,\n toolInvocation: {\n state: 'call',\n toolCallId: aiV4Part.toolCallId,\n toolName: aiV4Part.toolName,\n args: aiV4Part.args,\n },\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n break;\n }\n\n case 'tool-result':\n {\n // Try to find args from the corresponding tool-call in previous messages\n let toolArgs: Record<string, unknown> = {};\n\n // First, check if there's a tool-call in the same message\n const toolCallInSameMsg = coreMessage.content.find(\n p => p.type === 'tool-call' && p.toolCallId === aiV4Part.toolCallId,\n );\n if (toolCallInSameMsg && toolCallInSameMsg.type === 'tool-call') {\n toolArgs = toolCallInSameMsg.args as Record<string, unknown>;\n }\n\n // If not found, look in previous messages for the corresponding tool-call\n if (Object.keys(toolArgs).length === 0 && ctx.dbMessages) {\n toolArgs = findToolCallArgs(ctx.dbMessages, aiV4Part.toolCallId);\n }\n\n // Only use part-level providerOptions if present\n const invocation: ToolInvocationV4 = {\n state: 'result' as const,\n toolCallId: aiV4Part.toolCallId,\n toolName: aiV4Part.toolName,\n result: aiV4Part.result ?? '',\n args: toolArgs,\n };\n\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'tool-invocation',\n toolInvocation: invocation,\n };\n\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n\n parts.push(part);\n toolInvocations.push(invocation);\n }\n break;\n\n case 'reasoning':\n {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'reasoning',\n reasoning: '',\n details: [{ type: 'text', text: aiV4Part.text, signature: aiV4Part.signature }],\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n }\n break;\n case 'redacted-reasoning':\n {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'reasoning',\n reasoning: '',\n details: [{ type: 'redacted', data: aiV4Part.data }],\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n }\n break;\n case 'image': {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'file' as const,\n data: imageContentToString(aiV4Part.image),\n mimeType: aiV4Part.mimeType!,\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n break;\n }\n case 'file': {\n if (aiV4Part.data instanceof URL) {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'file' as const,\n data: aiV4Part.data.toString(),\n mimeType: aiV4Part.mimeType,\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n } else if (typeof aiV4Part.data === 'string') {\n const categorized = categorizeFileData(aiV4Part.data, aiV4Part.mimeType);\n\n if (categorized.type === 'url' || categorized.type === 'dataUri') {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'file' as const,\n data: aiV4Part.data,\n mimeType: categorized.mimeType || 'image/png',\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n } else {\n try {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'file' as const,\n mimeType: categorized.mimeType || 'image/png',\n data: convertDataContentToBase64String(aiV4Part.data),\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n } catch (error) {\n console.error(`Failed to convert binary data to base64 in CoreMessage file part: ${error}`, error);\n }\n }\n } else {\n try {\n const part: MastraDBMessage['content']['parts'][number] = {\n type: 'file' as const,\n mimeType: aiV4Part.mimeType,\n data: convertDataContentToBase64String(aiV4Part.data),\n };\n if (aiV4Part.providerOptions) {\n part.providerMetadata = aiV4Part.providerOptions;\n }\n parts.push(part);\n } catch (error) {\n console.error(`Failed to convert binary data to base64 in CoreMessage file part: ${error}`, error);\n }\n }\n break;\n }\n }\n }\n }\n\n // Filter out empty text parts to prevent Anthropic API errors\n const filteredParts = filterEmptyTextParts(parts);\n\n const content: MastraDBMessage['content'] = {\n format: 2,\n parts: filteredParts,\n };\n\n if (toolInvocations.length) content.toolInvocations = toolInvocations;\n if (typeof coreMessage.content === `string`) content.content = coreMessage.content;\n\n if (experimentalAttachments.length) content.experimental_attachments = experimentalAttachments;\n\n // V4 uses experimental_providerMetadata, V5 uses providerOptions\n if (coreMessage.providerOptions) {\n content.providerMetadata = coreMessage.providerOptions;\n } else if ('experimental_providerMetadata' in coreMessage && coreMessage.experimental_providerMetadata) {\n content.providerMetadata = coreMessage.experimental_providerMetadata;\n }\n\n if ('metadata' in coreMessage && coreMessage.metadata !== null && coreMessage.metadata !== undefined) {\n content.metadata = coreMessage.metadata as Record<string, unknown>;\n }\n\n const rawCreatedAt =\n 'metadata' in coreMessage &&\n coreMessage.metadata &&\n typeof coreMessage.metadata === 'object' &&\n 'createdAt' in coreMessage.metadata\n ? coreMessage.metadata.createdAt\n : undefined;\n\n return {\n id,\n role: TypeDetector.getRole(coreMessage),\n createdAt: ctx.generateCreatedAt(messageSource, rawCreatedAt),\n threadId: ctx.memoryInfo?.threadId,\n resourceId: ctx.memoryInfo?.resourceId,\n content,\n } satisfies MastraDBMessage;\n }\n}\n","import type { ToolInvocationUIPart } from '@ai-sdk/ui-utils-v5';\nimport * as AIV5 from '@internal/ai-sdk-v5';\n\nimport { MastraError, ErrorDomain, ErrorCategory } from '../../../error';\nimport { categorizeFileData, createDataUri, parseDataUri } from '../prompt/image-utils';\nimport type { MastraDBMessage, MastraMessageContentV2, MastraMessagePart, MessageSource } from '../state/types';\nimport type { AIV5Type } from '../types';\n\n/**\n * Filter out empty text parts from message parts array.\n * Empty text blocks are not allowed by Anthropic's API and cause request failures.\n * This can happen during streaming when text-start/text-end events occur without actual content.\n * However, if the only part is an empty text part, it is preserved as a legitimate placeholder\n * (e.g. empty assistant messages between tool results and user messages).\n */\nfunction filterEmptyTextParts(parts: MastraMessagePart[]): MastraMessagePart[] {\n const hasNonEmptyParts = parts.some(part => !(part.type === 'text' && part.text === ''));\n if (!hasNonEmptyParts) return parts;\n return parts.filter(part => {\n if (part.type === 'text') {\n return part.text !== '';\n }\n return true;\n });\n}\n\n/**\n * Extract tool name from AI SDK v5 tool type string\n *\n * V5 format: \"tool-${toolName}\" or \"dynamic-tool\"\n * V4 format: \"tool-invocation\"\n *\n * @param type - The tool type string from AI SDK v5\n * @returns The tool name or 'dynamic-tool' if it's a dynamic tool\n */\nfunction getToolName(type: string | { type: string }): string {\n // Handle objects with type property\n if (typeof type === 'object' && type && 'type' in type) {\n type = type.type;\n }\n\n // Ensure type is a string\n if (typeof type !== 'string') {\n return 'unknown';\n }\n\n if (type === 'dynamic-tool') {\n return 'dynamic-tool';\n }\n\n // Extract tool name from \"tool-${toolName}\" format\n if (type.startsWith('tool-')) {\n return type.slice('tool-'.length); // Remove \"tool-\" prefix\n }\n\n // Fallback for unexpected formats\n return type;\n}\n\nexport interface AIV5AdapterContext {\n memoryInfo: { threadId?: string; resourceId?: string } | null;\n newMessageId?(): string;\n generateCreatedAt?(messageSource: MessageSource, start?: unknown): Date;\n}\n\n/**\n * AIV5Adapter - Handles conversions between MastraDBMessage and AI SDK V5 formats\n *\n * This adapter centralizes all AI SDK V5 (UIMessage and ModelMessage) conversion logic.\n */\nexport class AIV5Adapter {\n /**\n * Direct conversion from MastraDBMessage to AIV5 UIMessage\n */\n static toUIMessage(dbMsg: MastraDBMessage): AIV5Type.UIMessage {\n const parts: AIV5Type.UIMessage['parts'] = [];\n const metadata: Record<string, unknown> = { ...(dbMsg.content.metadata || {}) };\n\n // Add Mastra-specific metadata\n if (dbMsg.createdAt) metadata.createdAt = dbMsg.createdAt;\n if (dbMsg.threadId) metadata.threadId = dbMsg.threadId;\n if (dbMsg.resourceId) metadata.resourceId = dbMsg.resourceId;\n\n // Preserve message-level providerMetadata in metadata so it survives UI → Model conversion\n if (dbMsg.content.providerMetadata) {\n metadata.providerMetadata = dbMsg.content.providerMetadata;\n }\n\n // 1. Handle tool invocations (only if not already in parts array)\n const hasToolInvocationParts = dbMsg.content.parts?.some(p => p.type === 'tool-invocation');\n if (dbMsg.content.toolInvocations && !hasToolInvocationParts) {\n for (const invocation of dbMsg.content.toolInvocations) {\n if (invocation.state === 'result') {\n parts.push({\n type: `tool-${invocation.toolName}`,\n toolCallId: invocation.toolCallId,\n state: 'output-available',\n input: invocation.args,\n output: invocation.result,\n });\n } else {\n parts.push({\n type: `tool-${invocation.toolName}`,\n toolCallId: invocation.toolCallId,\n state: invocation.state === 'call' ? 'input-available' : 'input-streaming',\n input: invocation.args,\n });\n }\n }\n }\n\n // 2. Check if we have parts with providerMetadata first\n const hasReasoningInParts = dbMsg.content.parts?.some(p => p.type === 'reasoning');\n const hasFileInParts = dbMsg.content.parts?.some(p => p.type === 'file');\n\n // 3. Handle reasoning (AIV4 reasoning is a string) - only if not in parts\n if (dbMsg.content.reasoning && !hasReasoningInParts) {\n parts.push({\n type: 'reasoning',\n text: dbMsg.content.reasoning,\n });\n }\n\n // 4. Handle files (experimental_attachments) - only if not in parts\n const attachmentUrls = new Set<string>();\n if (dbMsg.content.experimental_attachments && !hasFileInParts) {\n for (const attachment of dbMsg.content.experimental_attachments) {\n attachmentUrls.add(attachment.url);\n parts.push({\n type: 'file',\n url: attachment.url,\n mediaType: attachment.contentType || 'unknown',\n });\n }\n }\n\n // 5. Handle parts directly (if present in V2)\n let hasNonToolReasoningParts = false;\n if (dbMsg.content.parts) {\n for (const part of dbMsg.content.parts) {\n // Handle tool-invocation parts\n if (part.type === 'tool-invocation' && part.toolInvocation) {\n const inv = part.toolInvocation;\n\n if (inv.state === 'result') {\n parts.push({\n type: `tool-${inv.toolName}`,\n toolCallId: inv.toolCallId,\n input: inv.args,\n output: inv.result,\n state: 'output-available',\n callProviderMetadata: part.providerMetadata,\n } satisfies AIV5Type.ToolUIPart);\n } else {\n parts.push({\n type: `tool-${inv.toolName}`,\n toolCallId: inv.toolCallId,\n input: inv.args,\n state: 'input-available',\n callProviderMetadata: part.providerMetadata,\n } satisfies AIV5Type.ToolUIPart);\n }\n continue;\n }\n\n // Handle reasoning parts\n if (part.type === 'reasoning') {\n const text =\n part.reasoning ||\n (part.details?.reduce((p: string, c) => {\n if (c.type === `text` && c.text) return p + c.text;\n return p;\n }, '') ??\n '');\n if (text || part.details?.length) {\n const v5UIPart: AIV5Type.ReasoningUIPart = {\n type: 'reasoning' as const,\n text: text || '',\n state: 'done' as const,\n };\n if (part.providerMetadata) {\n v5UIPart.providerMetadata = part.providerMetadata;\n }\n parts.push(v5UIPart);\n }\n continue;\n }\n\n // Skip tool-invocation parts without toolInvocation object and other tool- parts\n if (part.type === 'tool-invocation' || part.type.startsWith('tool-')) {\n continue;\n }\n\n // Convert file parts from V2 format (data) to AIV5 format (url)\n if (part.type === 'file') {\n // Skip file parts that came from experimental_attachments to avoid duplicates\n if (typeof part.data === 'string' && attachmentUrls.has(part.data)) {\n continue;\n }\n\n const categorized =\n typeof part.data === 'string'\n ? categorizeFileData(part.data, part.mimeType)\n : { type: 'raw' as const, mimeType: part.mimeType, data: part.data };\n\n if (categorized.type === 'url' && typeof part.data === 'string') {\n const v5UIPart: AIV5Type.FileUIPart = {\n type: 'file' as const,\n url: part.data,\n mediaType: categorized.mimeType || 'image/png',\n };\n if (part.providerMetadata) {\n v5UIPart.providerMetadata = part.providerMetadata;\n }\n parts.push(v5UIPart);\n } else {\n let filePartData: string;\n let extractedMimeType = part.mimeType;\n\n if (typeof part.data === 'string') {\n const parsed = parseDataUri(part.data);\n\n if (parsed.isDataUri) {\n filePartData = parsed.base64Content;\n if (parsed.mimeType) {\n extractedMimeType = extractedMimeType || parsed.mimeType;\n }\n } else {\n filePartData = part.data;\n }\n } else {\n filePartData = part.data;\n }\n\n const finalMimeType = extractedMimeType || 'image/png';\n\n let dataUri: string;\n if (typeof filePartData === 'string' && filePartData.startsWith('data:')) {\n dataUri = filePartData;\n } else {\n dataUri = createDataUri(filePartData, finalMimeType);\n }\n\n const v5UIPart: AIV5Type.FileUIPart = {\n type: 'file' as const,\n url: dataUri,\n mediaType: finalMimeType,\n };\n if (part.providerMetadata) {\n v5UIPart.providerMetadata = part.providerMetadata;\n }\n parts.push(v5UIPart);\n }\n } else if (part.type === 'source') {\n const v5UIPart: AIV5Type.SourceUrlUIPart = {\n type: 'source-url' as const,\n url: part.source.url,\n sourceId: part.source.id,\n title: part.source.title,\n };\n if (part.providerMetadata) {\n v5UIPart.providerMetadata = part.providerMetadata;\n }\n\n parts.push(v5UIPart);\n } else if (part.type === 'text') {\n const v5UIPart: AIV5Type.TextUIPart = {\n type: 'text' as const,\n text: part.text,\n };\n if (part.providerMetadata) {\n v5UIPart.providerMetadata = part.providerMetadata;\n }\n parts.push(v5UIPart);\n hasNonToolReasoningParts = true;\n } else {\n // Other parts (step-start, etc.) can be pushed as-is\n parts.push(part);\n hasNonToolReasoningParts = true;\n }\n }\n }\n\n // 6. Handle text content (fallback if no parts)\n if (dbMsg.content.content && !hasNonToolReasoningParts) {\n parts.push({ type: 'text', text: dbMsg.content.content });\n }\n\n return {\n id: dbMsg.id,\n role: dbMsg.role,\n metadata,\n parts,\n };\n }\n\n /**\n * Direct conversion from AIV5 UIMessage to MastraDBMessage\n */\n static fromUIMessage(uiMsg: AIV5Type.UIMessage): MastraDBMessage {\n const { parts, metadata: rawMetadata } = uiMsg;\n const metadata = (rawMetadata || {}) as Record<string, unknown>;\n\n // Extract Mastra-specific metadata\n const createdAtValue = metadata.createdAt;\n const createdAt = createdAtValue\n ? typeof createdAtValue === 'string'\n ? new Date(createdAtValue)\n : createdAtValue instanceof Date\n ? createdAtValue\n : new Date()\n : new Date();\n const threadId = metadata.threadId as string | undefined;\n const resourceId = metadata.resourceId as string | undefined;\n\n // Remove Mastra-specific metadata from the metadata object\n const cleanMetadata = { ...metadata };\n delete cleanMetadata.createdAt;\n delete cleanMetadata.threadId;\n delete cleanMetadata.resourceId;\n\n // Process parts to build V2 content\n const toolInvocationParts = parts.filter(p => AIV5.isToolUIPart(p));\n const reasoningParts = parts.filter(p => p.type === 'reasoning');\n const fileParts = parts.filter(p => p.type === 'file');\n const textParts = parts.filter(p => p.type === 'text');\n\n // Build tool invocations array\n let toolInvocations: MastraDBMessage['content']['toolInvocations'] = undefined;\n if (toolInvocationParts.length > 0) {\n toolInvocations = toolInvocationParts.map(p => {\n const toolName = getToolName(p);\n if (p.state === 'output-available') {\n return {\n args: p.input,\n result:\n typeof p.output === 'object' && p.output && 'value' in p.output\n ? (p.output as { value: unknown }).value\n : p.output,\n toolCallId: p.toolCallId,\n toolName,\n state: 'result',\n } satisfies NonNullable<MastraDBMessage['content']['toolInvocations']>[0];\n }\n return {\n args: p.input,\n toolCallId: p.toolCallId,\n toolName,\n state: 'call',\n } satisfies NonNullable<MastraDBMessage['content']['toolInvocations']>[0];\n });\n }\n\n // Build reasoning string (AIV4 reasoning is a string, not an array)\n let reasoning: MastraDBMessage['content']['reasoning'] = undefined;\n if (reasoningParts.length > 0) {\n reasoning = reasoningParts.map(p => p.text).join('\\n');\n }\n\n // Build experimental_attachments from file parts\n let experimental_attachments: MastraDBMessage['content']['experimental_attachments'] = undefined;\n if (fileParts.length > 0) {\n experimental_attachments = fileParts.map(p => ({\n url: p.url || '',\n contentType: p.mediaType,\n }));\n }\n\n // Build content from text parts (AIV4 content is a string)\n let content: MastraDBMessage['content']['content'] = undefined;\n if (textParts.length > 0) {\n content = textParts.map(p => p.text).join('');\n }\n // Build V2-compatible parts array\n const v2Parts = parts\n .map(p => {\n // Convert AIV5 UI parts to V2 parts\n if (AIV5.isToolUIPart(p)) {\n const toolName = getToolName(p);\n const callProviderMetadata = 'callProviderMetadata' in p ? p.callProviderMetadata : undefined;\n if (p.state === 'output-available') {\n return {\n type: 'tool-invocation' as const,\n toolInvocation: {\n toolCallId: p.toolCallId,\n toolName,\n args: p.input,\n result:\n typeof p.output === 'object' && p.output && 'value' in p.output\n ? (p.output as { value: unknown }).value\n : p.output,\n state: 'result' as const,\n },\n providerMetadata: callProviderMetadata,\n } satisfies ToolInvocationUIPart & { providerMetadata?: AIV5Type.ProviderMetadata };\n }\n return {\n type: 'tool-invocation' as const,\n toolInvocation: {\n toolCallId: p.toolCallId,\n toolName,\n args: p.input,\n state: 'call' as const,\n },\n providerMetadata: callProviderMetadata,\n } satisfies ToolInvocationUIPart & { providerMetadata?: AIV5Type.ProviderMetadata };\n }\n\n if (p.type === 'reasoning') {\n return {\n type: 'reasoning' as const,\n reasoning: '',\n details: [\n {\n type: 'text' as const,\n text: p.text,\n },\n ],\n providerMetadata: p.providerMetadata,\n };\n }\n\n if (p.type === 'file') {\n return {\n type: 'file' as const,\n mimeType: p.mediaType,\n data: p.url || '',\n providerMetadata: p.providerMetadata,\n };\n }\n\n if (p.type === 'source-url') {\n return {\n type: 'source' as const,\n source: {\n url: p.url,\n sourceType: 'url',\n id: p.url,\n providerMetadata: p.providerMetadata,\n },\n providerMetadata: p.providerMetadata,\n };\n }\n\n if (p.type === 'text') {\n type V2TextPart = {\n type: 'text';\n text: string;\n providerMetadata?: AIV5Type.ProviderMetadata;\n };\n return {\n type: 'text' as const,\n text: p.text,\n providerMetadata: p.providerMetadata,\n } satisfies V2TextPart;\n }\n\n if (p.type === 'step-start') {\n return p;\n }\n\n // Handle data-* parts (custom parts emitted by tools via writer.custom())\n if (typeof p.type === 'string' && p.type.startsWith('data-')) {\n return {\n type: p.type,\n data: 'data' in p ? (p as any).data : undefined,\n };\n }\n\n return null;\n })\n .filter((p): p is NonNullable<typeof p> => p !== null);\n\n // Filter out empty text parts to prevent Anthropic API errors\n const filteredV2Parts = filterEmptyTextParts(v2Parts as MastraMessagePart[]);\n\n return {\n id: uiMsg.id,\n role: uiMsg.role,\n createdAt,\n threadId,\n resourceId,\n content: {\n format: 2,\n parts: filteredV2Parts as MastraMessageContentV2['parts'],\n toolInvocations,\n reasoning,\n experimental_attachments,\n content,\n metadata: Object.keys(cleanMetadata).length > 0 ? cleanMetadata : undefined,\n },\n };\n }\n\n /**\n * Convert image or file to data URI or URL for V2 file part\n */\n private static getDataStringFromAIV5DataPart(part: AIV5Type.ImagePart | AIV5Type.FilePart): string {\n let mimeType: string;\n let data: AIV5.FilePart['data'] | AIV5.ImagePart['image'];\n if ('data' in part) {\n mimeType = part.mediaType || 'application/octet-stream';\n data = part.data;\n } else if ('image' in part) {\n mimeType = part.mediaType || 'image/jpeg';\n data = part.image;\n } else {\n throw new MastraError({\n id: 'MASTRA_AIV5_DATA_PART_INVALID',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: 'Invalid AIV5 data part in getDataStringFromAIV5DataPart',\n details: {\n part,\n },\n });\n }\n\n if (data instanceof URL) {\n return data.toString();\n } else {\n if (data instanceof Buffer) {\n const base64 = data.toString('base64');\n return `data:${mimeType};base64,${base64}`;\n } else if (typeof data === 'string') {\n return data.startsWith('data:') || data.startsWith('http') ? data : `data:${mimeType};base64,${data}`;\n } else if (data instanceof Uint8Array) {\n const base64 = Buffer.from(data).toString('base64');\n return `data:${mimeType};base64,${base64}`;\n } else if (data instanceof ArrayBuffer) {\n const base64 = Buffer.from(data).toString('base64');\n return `data:${mimeType};base64,${base64}`;\n } else {\n return '';\n }\n }\n }\n\n /**\n * Direct conversion from AIV5 ModelMessage to MastraDBMessage\n */\n static fromModelMessage(modelMsg: AIV5Type.ModelMessage, _messageSource?: MessageSource): MastraDBMessage {\n const content = Array.isArray(modelMsg.content)\n ? modelMsg.content\n : [{ type: 'text', text: modelMsg.content } satisfies AIV5.TextPart];\n\n const mastraDBParts: MastraMessageContentV2['parts'] = [];\n const toolInvocations: NonNullable<MastraDBMessage['content']['toolInvocations']> = [];\n const reasoningParts: string[] = [];\n const experimental_attachments: NonNullable<MastraDBMessage['content']['experimental_attachments']> = [];\n\n for (const part of content) {\n if (part.type === 'text') {\n const textPart: MastraDBMessage['content']['parts'][number] = {\n type: 'text' as const,\n text: part.text,\n };\n if (part.providerOptions) {\n textPart.providerMetadata = part.providerOptions;\n }\n mastraDBParts.push(textPart);\n } else if (part.type === 'tool-call') {\n const toolCallPart = part as AIV5Type.ToolCallPart;\n const toolInvocationPart: MastraDBMessage['content']['parts'][number] = {\n type: 'tool-invocation' as const,\n toolInvocation: {\n toolCallId: toolCallPart.toolCallId,\n toolName: toolCallPart.toolName,\n args: toolCallPart.input,\n state: 'call',\n },\n };\n if (part.providerOptions) {\n toolInvocationPart.providerMetadata = part.providerOptions;\n }\n mastraDBParts.push(toolInvocationPart);\n toolInvocations.push({\n toolCallId: toolCallPart.toolCallId,\n toolName: toolCallPart.toolName,\n args: toolCallPart.input,\n state: 'call',\n });\n } else if (part.type === 'tool-result') {\n const toolResultPart = part;\n const matchingCall = toolInvocations.find(inv => inv.toolCallId === toolResultPart.toolCallId);\n\n const matchingV2Part = mastraDBParts.find(\n (p): p is Extract<MastraDBMessage['content']['parts'][number], { type: 'tool-invocation' }> =>\n p.type === 'tool-invocation' &&\n 'toolInvocation' in p &&\n p.toolInvocation.toolCallId === toolResultPart.toolCallId,\n );\n\n const updateMatchingCallInvocationResult = (toolResultPart: AIV5Type.ToolResultPart, matchingCall: any) => {\n matchingCall.state = 'result';\n matchingCall.result =\n typeof toolResultPart.output === 'object' && toolResultPart.output && 'value' in toolResultPart.output\n ? toolResultPart.output.value\n : toolResultPart.output;\n };\n\n if (matchingCall) {\n updateMatchingCallInvocationResult(toolResultPart, matchingCall);\n } else {\n const call: any = {\n state: 'call',\n toolCallId: toolResultPart.toolCallId,\n toolName: toolResultPart.toolName || 'unknown',\n args: {},\n };\n updateMatchingCallInvocationResult(toolResultPart, call);\n toolInvocations.push(call);\n }\n\n if (matchingV2Part && matchingV2Part.type === 'tool-invocation') {\n updateMatchingCallInvocationResult(toolResultPart, matchingV2Part.toolInvocation);\n } else {\n const toolInvocationPart: MastraDBMessage['content']['parts'][number] = {\n type: 'tool-invocation' as const,\n toolInvocation: {\n toolCallId: toolResultPart.toolCallId,\n toolName: toolResultPart.toolName || 'unknown',\n args: {},\n state: 'call',\n },\n };\n updateMatchingCallInvocationResult(toolResultPart, toolInvocationPart.toolInvocation);\n mastraDBParts.push(toolInvocationPart);\n }\n } else if (part.type === 'reasoning') {\n const v2ReasoningPart: MastraDBMessage['content']['parts'][number] = {\n type: 'reasoning',\n reasoning: '',\n details: [{ type: 'text', text: part.text }],\n };\n if (part.providerOptions) {\n v2ReasoningPart.providerMetadata = part.providerOptions;\n }\n mastraDBParts.push(v2ReasoningPart);\n reasoningParts.push(part.text);\n } else if (part.type === 'image') {\n const imagePart = part;\n const mimeType = imagePart.mediaType || 'image/jpeg';\n const imageData = this.getDataStringFromAIV5DataPart(imagePart);\n\n const imageFilePart: MastraDBMessage['content']['parts'][number] = {\n type: 'file',\n data: imageData,\n mimeType,\n };\n if (part.providerOptions) {\n imageFilePart.providerMetadata = part.providerOptions;\n }\n mastraDBParts.push(imageFilePart);\n experimental_attachments.push({\n url: imageData,\n contentType: mimeType,\n });\n } else if (part.type === 'file') {\n const filePart = part;\n const mimeType = filePart.mediaType || 'application/octet-stream';\n const fileData = this.getDataStringFromAIV5DataPart(filePart);\n\n const v2FilePart: MastraDBMessage['content']['parts'][number] = {\n type: 'file',\n data: fileData,\n mimeType,\n };\n if (part.providerOptions) {\n v2FilePart.providerMetadata = part.providerOptions;\n }\n mastraDBParts.push(v2FilePart);\n experimental_attachments.push({\n url: fileData,\n contentType: mimeType,\n });\n }\n }\n\n // Filter out empty text parts to prevent Anthropic API errors\n const filteredMastraDBParts = filterEmptyTextParts(mastraDBParts);\n\n // Build V2 content string\n const contentString = filteredMastraDBParts\n .filter(p => p.type === 'text')\n .map(p => p.text)\n .join('\\n');\n\n // Preserve metadata from the input message if present\n const metadata: Record<string, unknown> =\n 'metadata' in modelMsg && modelMsg.metadata !== null && modelMsg.metadata !== undefined\n ? (modelMsg.metadata as Record<string, unknown>)\n : {};\n\n // Generate ID from modelMsg if available, otherwise create a new one\n const id =\n `id` in modelMsg && typeof modelMsg.id === `string`\n ? modelMsg.id\n : `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const message: MastraDBMessage = {\n id,\n role: modelMsg.role === 'tool' ? 'assistant' : modelMsg.role,\n createdAt: new Date(),\n content: {\n format: 2,\n parts: filteredMastraDBParts,\n toolInvocations: toolInvocations.length > 0 ? toolInvocations : undefined,\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('\\n') : undefined,\n experimental_attachments: experimental_attachments.length > 0 ? experimental_attachments : undefined,\n content: contentString || undefined,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n },\n };\n // Add message-level providerOptions if present\n if (modelMsg.providerOptions) {\n message.content.providerMetadata = modelMsg.providerOptions;\n }\n\n return message;\n }\n}\n","import type { UIMessage as UIMessageV4 } from '@internal/ai-sdk-v4';\nimport * as AIV5 from '@internal/ai-sdk-v5';\n\nimport { getImageCacheKey } from '../prompt/image-utils';\nimport type { AIV5Type, CoreMessageV4 } from '../types';\nimport type { MastraMessagePart, UIMessageV4Part } from './types';\n\n/**\n * CacheKeyGenerator - Centralized cache key generation for message equality checks\n *\n * This class provides consistent cache key generation across all message formats,\n * which is critical for:\n * - Deduplication of messages\n * - Detecting when messages have been updated\n * - Comparing messages across different formats\n *\n * Cache key invariants:\n * - Same message content should always produce the same key\n * - Different content should produce different keys\n * - Provider metadata (e.g., OpenAI reasoning itemId) must be included for proper distinction\n */\nexport class CacheKeyGenerator {\n /**\n * Generate cache key from AIV4 UIMessage parts\n */\n static fromAIV4Parts(parts: UIMessageV4['parts']): string {\n let key = '';\n for (const part of parts) {\n key += part.type;\n key += CacheKeyGenerator.fromAIV4Part(part);\n }\n return key;\n }\n\n /**\n * Generate cache key from a single AIV4 UIMessage part\n */\n static fromAIV4Part(part: UIMessageV4['parts'][number]): string {\n let cacheKey = '';\n if (part.type === 'text') {\n cacheKey += part.text;\n }\n if (part.type === 'tool-invocation') {\n cacheKey += part.toolInvocation.toolCallId;\n cacheKey += part.toolInvocation.state;\n }\n if (part.type === 'reasoning') {\n cacheKey += part.reasoning;\n cacheKey += part.details.reduce((prev, current) => {\n if (current.type === 'text') {\n return prev + current.text.length + (current.signature?.length || 0);\n }\n return prev;\n }, 0);\n\n // OpenAI sends reasoning items (rs_...) inside part.providerMetadata.openai.itemId.\n // When the reasoning text is empty, the default cache key logic produces \"reasoning0\"\n // for *all* reasoning parts. This makes distinct rs_ entries appear identical, so the\n // message-merging logic drops the latest reasoning item. The result is that subsequent\n // OpenAI calls fail with:\n //\n // \"Item 'fc_...' was provided without its required 'reasoning' item\"\n //\n // To fix this, we incorporate the OpenAI itemId into the cache key so each rs_ entry\n // is treated as distinct.\n //\n // Note: We cast `part` to `any` here because the AI SDK's ReasoningUIPart V4 type does\n // NOT declare `providerMetadata` (even though Mastra attaches it at runtime). This\n // access is safe in JavaScript, but TypeScript cannot type it without augmentation,\n // so we intentionally narrow to `any` only for this metadata lookup.\n\n const partAny = part as any;\n\n if (\n partAny &&\n Object.hasOwn(partAny, 'providerMetadata') &&\n partAny.providerMetadata &&\n Object.hasOwn(partAny.providerMetadata, 'openai') &&\n partAny.providerMetadata.openai &&\n Object.hasOwn(partAny.providerMetadata.openai, 'itemId')\n ) {\n const itemId = partAny.providerMetadata.openai.itemId;\n cacheKey += `|${itemId}`;\n }\n }\n if (part.type === 'file') {\n cacheKey += part.data;\n cacheKey += part.mimeType;\n }\n\n return cacheKey;\n }\n\n /**\n * Generate cache key from MastraDB message parts\n */\n static fromDBParts(parts: MastraMessagePart[]): string {\n let key = '';\n for (const part of parts) {\n key += part.type;\n if (part.type.startsWith('data-')) {\n // Stringify data for proper cache key comparison since data can be any type\n const data = (part as AIV5Type.DataUIPart<AIV5.UIDataTypes>).data;\n key += JSON.stringify(data);\n } else {\n // Cast to UIMessageV4Part since we've already handled data-* parts above\n key += CacheKeyGenerator.fromAIV4Part(part as UIMessageV4Part);\n }\n }\n return key;\n }\n\n /**\n * Generate cache key from AIV4 CoreMessage content\n */\n static fromAIV4CoreMessageContent(content: CoreMessageV4['content']): string {\n if (typeof content === 'string') return content;\n let key = '';\n for (const part of content) {\n key += part.type;\n if (part.type === 'text') {\n key += part.text.length;\n }\n if (part.type === 'reasoning') {\n key += part.text.length;\n }\n if (part.type === 'tool-call') {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === 'tool-result') {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === 'file') {\n key += part.filename;\n key += part.mimeType;\n }\n if (part.type === 'image') {\n key += getImageCacheKey(part.image);\n key += part.mimeType;\n }\n if (part.type === 'redacted-reasoning') {\n key += part.data.length;\n }\n }\n return key;\n }\n\n /**\n * Generate cache key from AIV5 UIMessage parts\n */\n static fromAIV5Parts(parts: AIV5Type.UIMessage['parts']): string {\n let key = '';\n for (const part of parts) {\n key += part.type;\n if (part.type === 'text') {\n key += part.text;\n }\n if (AIV5.isToolUIPart(part) || part.type === 'dynamic-tool') {\n key += part.toolCallId;\n key += part.state;\n }\n if (part.type === 'reasoning') {\n key += part.text;\n }\n if (part.type === 'file') {\n key += part.url.length;\n key += part.mediaType;\n key += part.filename || '';\n }\n }\n return key;\n }\n\n /**\n * Generate cache key from AIV5 ModelMessage content\n */\n static fromAIV5ModelMessageContent(content: AIV5Type.ModelMessage['content']): string {\n if (typeof content === 'string') return content;\n let key = '';\n for (const part of content) {\n key += part.type;\n if (part.type === 'text') {\n key += part.text.length;\n }\n if (part.type === 'reasoning') {\n key += part.text.length;\n }\n if (part.type === 'tool-call') {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === 'tool-result') {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === 'file') {\n key += part.filename;\n key += part.mediaType;\n }\n if (part.type === 'image') {\n key += getImageCacheKey(part.image);\n key += part.mediaType;\n }\n }\n return key;\n }\n}\n","import type { LanguageModelV2Prompt } from '@ai-sdk/provider-v5';\nimport type { LanguageModelV1Prompt, CoreMessage as CoreMessageV4 } from '@internal/ai-sdk-v4';\n\nimport { convertDataContentToBase64String } from '../prompt/data-content';\nimport { categorizeFileData, createDataUri } from '../prompt/image-utils';\nimport type { AIV5Type } from '../types';\n\ntype AIV5LanguageModelV2Message = LanguageModelV2Prompt[0];\ntype LanguageModelV1Message = LanguageModelV1Prompt[0];\n\n/**\n * Convert an AI SDK V4 CoreMessage to a V1 LanguageModel prompt message.\n * Used for creating LLM prompt messages without AI SDK streamText/generateText.\n */\nexport function aiV4CoreMessageToV1PromptMessage(coreMessage: CoreMessageV4): LanguageModelV1Message {\n if (coreMessage.role === `system`) {\n return coreMessage;\n }\n\n if (typeof coreMessage.content === `string` && (coreMessage.role === `assistant` || coreMessage.role === `user`)) {\n return {\n ...coreMessage,\n content: [{ type: 'text', text: coreMessage.content }],\n };\n }\n\n if (typeof coreMessage.content === `string`) {\n throw new Error(\n `Saw text content for input CoreMessage, but the role is ${coreMessage.role}. This is only allowed for \"system\", \"assistant\", and \"user\" roles.`,\n );\n }\n\n const roleContent: {\n user: Exclude<Extract<LanguageModelV1Message, { role: 'user' }>['content'], string>;\n assistant: Exclude<Extract<LanguageModelV1Message, { role: 'assistant' }>['content'], string>;\n tool: Exclude<Extract<LanguageModelV1Message, { role: 'tool' }>['content'], string>;\n } = {\n user: [],\n assistant: [],\n tool: [],\n };\n\n const role = coreMessage.role;\n\n for (const part of coreMessage.content) {\n const incompatibleMessage = `Saw incompatible message content part type ${part.type} for message role ${role}`;\n\n switch (part.type) {\n case 'text': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'redacted-reasoning':\n case 'reasoning': {\n if (role !== `assistant`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-call': {\n if (role === `tool` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-result': {\n if (role === `assistant` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'image': {\n if (role === `tool` || role === `assistant`) {\n throw new Error(incompatibleMessage);\n }\n\n let processedImage: URL | Uint8Array;\n\n if (part.image instanceof URL || part.image instanceof Uint8Array) {\n processedImage = part.image;\n } else if (Buffer.isBuffer(part.image) || part.image instanceof ArrayBuffer) {\n processedImage = new Uint8Array(part.image);\n } else {\n // part.image is a string - could be a URL, data URI, or raw base64\n const categorized = categorizeFileData(part.image, part.mimeType);\n\n if (categorized.type === 'raw') {\n // Raw base64 - convert to data URI before creating URL\n const dataUri = createDataUri(part.image, part.mimeType || 'image/png');\n processedImage = new URL(dataUri);\n } else {\n // It's already a URL or data URI\n processedImage = new URL(part.image);\n }\n }\n\n roleContent[role].push({\n ...part,\n image: processedImage,\n });\n break;\n }\n\n case 'file': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push({\n ...part,\n data:\n part.data instanceof URL\n ? part.data\n : typeof part.data === 'string'\n ? part.data\n : convertDataContentToBase64String(part.data),\n });\n break;\n }\n }\n }\n\n if (role === `tool`) {\n return {\n ...coreMessage,\n content: roleContent[role],\n };\n }\n if (role === `user`) {\n return {\n ...coreMessage,\n content: roleContent[role],\n };\n }\n if (role === `assistant`) {\n return {\n ...coreMessage,\n content: roleContent[role],\n };\n }\n\n throw new Error(\n `Encountered unknown role ${role} when converting V4 CoreMessage -> V4 LanguageModelV1Prompt, input message: ${JSON.stringify(coreMessage, null, 2)}`,\n );\n}\n\n/**\n * Convert an AI SDK V5 ModelMessage to a V2 LanguageModel prompt message.\n * Used for creating LLM prompt messages without AI SDK streamText/generateText.\n */\nexport function aiV5ModelMessageToV2PromptMessage(modelMessage: AIV5Type.ModelMessage): AIV5LanguageModelV2Message {\n if (modelMessage.role === `system`) {\n return modelMessage;\n }\n\n if (typeof modelMessage.content === `string` && (modelMessage.role === `assistant` || modelMessage.role === `user`)) {\n return {\n role: modelMessage.role,\n content: [{ type: 'text', text: modelMessage.content }],\n providerOptions: modelMessage.providerOptions,\n };\n }\n\n if (typeof modelMessage.content === `string`) {\n throw new Error(\n `Saw text content for input ModelMessage, but the role is ${modelMessage.role}. This is only allowed for \"system\", \"assistant\", and \"user\" roles.`,\n );\n }\n\n const roleContent: {\n user: Extract<AIV5LanguageModelV2Message, { role: 'user' }>['content'];\n assistant: Extract<AIV5LanguageModelV2Message, { role: 'assistant' }>['content'];\n tool: Extract<AIV5LanguageModelV2Message, { role: 'tool' }>['content'];\n } = {\n user: [],\n assistant: [],\n tool: [],\n };\n\n const role = modelMessage.role;\n\n for (const part of modelMessage.content) {\n const incompatibleMessage = `Saw incompatible message content part type ${part.type} for message role ${role}`;\n\n switch (part.type) {\n case 'text': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'reasoning': {\n if (role === `tool` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-call': {\n if (role !== `assistant`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-result': {\n if (role === `assistant` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'file': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push({\n ...part,\n data: part.data instanceof ArrayBuffer ? new Uint8Array(part.data) : part.data,\n });\n break;\n }\n\n case 'image': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push({\n ...part,\n mediaType: part.mediaType || 'image/unknown',\n type: 'file',\n data: part.image instanceof ArrayBuffer ? new Uint8Array(part.image) : part.image,\n });\n break;\n }\n }\n }\n\n if (role === `tool`) {\n return {\n ...modelMessage,\n content: roleContent[role],\n };\n }\n if (role === `user`) {\n return {\n ...modelMessage,\n content: roleContent[role],\n };\n }\n if (role === `assistant`) {\n return {\n ...modelMessage,\n content: roleContent[role],\n };\n }\n\n throw new Error(\n `Encountered unknown role ${role} when converting V5 ModelMessage -> V5 LanguageModelV2Message, input message: ${JSON.stringify(modelMessage, null, 2)}`,\n );\n}\n","import type { CoreMessage as CoreMessageV4 } from '@internal/ai-sdk-v4';\n\nimport { CacheKeyGenerator } from '../cache/CacheKeyGenerator';\nimport { TypeDetector } from '../detection/TypeDetector';\nimport type { MessageInput } from '../types';\n\n/**\n * Convert CoreMessage content to a plain string.\n * Extracts text from text parts and concatenates them.\n */\nexport function coreContentToString(content: CoreMessageV4['content']): string {\n if (typeof content === `string`) return content;\n\n return content.reduce((p, c) => {\n if (c.type === `text`) {\n p += c.text;\n }\n return p;\n }, '');\n}\n\n/**\n * Compare two messages for equality based on their content.\n * Uses cache keys for efficient comparison across different message formats.\n */\nexport function messagesAreEqual(one: MessageInput, two: MessageInput): boolean {\n const oneUIV4 = TypeDetector.isAIV4UIMessage(one) && one;\n const twoUIV4 = TypeDetector.isAIV4UIMessage(two) && two;\n if (oneUIV4 && !twoUIV4) return false;\n if (oneUIV4 && twoUIV4) {\n return CacheKeyGenerator.fromAIV4Parts(one.parts) === CacheKeyGenerator.fromAIV4Parts(two.parts);\n }\n\n const oneCMV4 = TypeDetector.isAIV4CoreMessage(one) && one;\n const twoCMV4 = TypeDetector.isAIV4CoreMessage(two) && two;\n if (oneCMV4 && !twoCMV4) return false;\n if (oneCMV4 && twoCMV4) {\n return (\n CacheKeyGenerator.fromAIV4CoreMessageContent(oneCMV4.content) ===\n CacheKeyGenerator.fromAIV4CoreMessageContent(twoCMV4.content)\n );\n }\n\n const oneMM1 = TypeDetector.isMastraMessageV1(one) && one;\n const twoMM1 = TypeDetector.isMastraMessageV1(two) && two;\n if (oneMM1 && !twoMM1) return false;\n if (oneMM1 && twoMM1) {\n return (\n oneMM1.id === twoMM1.id &&\n CacheKeyGenerator.fromAIV4CoreMessageContent(oneMM1.content) ===\n CacheKeyGenerator.fromAIV4CoreMessageContent(twoMM1.content)\n );\n }\n\n const oneMM2 = TypeDetector.isMastraDBMessage(one) && one;\n const twoMM2 = TypeDetector.isMastraDBMessage(two) && two;\n if (oneMM2 && !twoMM2) return false;\n if (oneMM2 && twoMM2) {\n return (\n oneMM2.id === twoMM2.id &&\n CacheKeyGenerator.fromDBParts(oneMM2.content.parts) === CacheKeyGenerator.fromDBParts(twoMM2.content.parts)\n );\n }\n\n const oneUIV5 = TypeDetector.isAIV5UIMessage(one) && one;\n const twoUIV5 = TypeDetector.isAIV5UIMessage(two) && two;\n if (oneUIV5 && !twoUIV5) return false;\n if (oneUIV5 && twoUIV5) {\n return CacheKeyGenerator.fromAIV5Parts(one.parts) === CacheKeyGenerator.fromAIV5Parts(two.parts);\n }\n\n const oneCMV5 = TypeDetector.isAIV5CoreMessage(one) && one;\n const twoCMV5 = TypeDetector.isAIV5CoreMessage(two) && two;\n if (oneCMV5 && !twoCMV5) return false;\n if (oneCMV5 && twoCMV5) {\n return (\n CacheKeyGenerator.fromAIV5ModelMessageContent(oneCMV5.content) ===\n CacheKeyGenerator.fromAIV5ModelMessageContent(twoCMV5.content)\n );\n }\n\n // default to it did change. we'll likely never reach this codepath\n return true;\n}\n","import type { CoreMessage as CoreMessageV4, UIMessage as UIMessageV4 } from '@internal/ai-sdk-v4';\n\nimport { AIV4Adapter, AIV5Adapter } from '../adapters';\nimport { TypeDetector } from '../detection/TypeDetector';\nimport type {\n MastraDBMessage,\n MastraMessageV1,\n MessageSource,\n MemoryInfo,\n UIMessageWithMetadata,\n} from '../state/types';\nimport type { MessageInput } from '../types';\n\n/**\n * Context required for input conversion functions.\n * This is passed from MessageList to provide access to instance-specific utilities.\n */\nexport interface InputConversionContext {\n memoryInfo: MemoryInfo | null;\n newMessageId: () => string;\n generateCreatedAt: (messageSource: MessageSource, start?: unknown) => Date;\n /** Messages array for looking up tool call args */\n dbMessages: MastraDBMessage[];\n}\n\n/**\n * Convert any supported message input format to MastraDBMessage.\n * Routes to the appropriate converter based on message type detection.\n */\nexport function inputToMastraDBMessage(\n message: MessageInput,\n messageSource: MessageSource,\n context: InputConversionContext,\n): MastraDBMessage {\n // Validate threadId matches (except for memory messages which can come from other threads)\n if (\n messageSource !== `memory` &&\n `threadId` in message &&\n message.threadId &&\n context.memoryInfo &&\n message.threadId !== context.memoryInfo.threadId\n ) {\n throw new Error(\n `Received input message with wrong threadId. Input ${message.threadId}, expected ${context.memoryInfo.threadId}`,\n );\n }\n\n // Validate resourceId matches\n if (\n `resourceId` in message &&\n message.resourceId &&\n context.memoryInfo?.resourceId &&\n message.resourceId !== context.memoryInfo.resourceId\n ) {\n throw new Error(\n `Received input message with wrong resourceId. Input ${message.resourceId}, expected ${context.memoryInfo.resourceId}`,\n );\n }\n\n if (TypeDetector.isMastraMessageV1(message)) {\n return mastraMessageV1ToMastraDBMessage(message, messageSource, context);\n }\n if (TypeDetector.isMastraDBMessage(message)) {\n return hydrateMastraDBMessageFields(message, context);\n }\n if (TypeDetector.isAIV4CoreMessage(message)) {\n return AIV4Adapter.fromCoreMessage(message, context, messageSource);\n }\n if (TypeDetector.isAIV4UIMessage(message)) {\n return AIV4Adapter.fromUIMessage(message as UIMessageV4 | UIMessageWithMetadata, context, messageSource);\n }\n\n // Use custom ID generator if message doesn't have an ID, otherwise keep the original\n const hasOriginalId = 'id' in message && typeof message.id === 'string';\n const id = hasOriginalId ? message.id : context.newMessageId();\n\n if (TypeDetector.isAIV5CoreMessage(message)) {\n const dbMsg = AIV5Adapter.fromModelMessage(message, messageSource);\n // Only use the original createdAt from input message metadata, not the generated one from the static method\n // This fixes issue #10683 where messages without createdAt would get shuffled\n const rawCreatedAt =\n 'metadata' in message &&\n message.metadata &&\n typeof message.metadata === 'object' &&\n 'createdAt' in message.metadata\n ? message.metadata.createdAt\n : undefined;\n return {\n ...dbMsg,\n id,\n createdAt: context.generateCreatedAt(messageSource, rawCreatedAt),\n threadId: context.memoryInfo?.threadId,\n resourceId: context.memoryInfo?.resourceId,\n };\n }\n if (TypeDetector.isAIV5UIMessage(message)) {\n const dbMsg = AIV5Adapter.fromUIMessage(message);\n // Only use the original createdAt from input message, not the generated one from the static method\n // This fixes issue #10683 where messages without createdAt would get shuffled\n const rawCreatedAt = 'createdAt' in message ? message.createdAt : undefined;\n return {\n ...dbMsg,\n id,\n createdAt: context.generateCreatedAt(messageSource, rawCreatedAt),\n threadId: context.memoryInfo?.threadId,\n resourceId: context.memoryInfo?.resourceId,\n };\n }\n\n throw new Error(`Found unhandled message ${JSON.stringify(message)}`);\n}\n\n/**\n * Convert MastraMessageV1 format to MastraDBMessage.\n */\nexport function mastraMessageV1ToMastraDBMessage(\n message: MastraMessageV1,\n messageSource: MessageSource,\n context: InputConversionContext,\n): MastraDBMessage {\n const coreV2 = AIV4Adapter.fromCoreMessage(\n {\n content: message.content,\n role: message.role,\n } as CoreMessageV4,\n context,\n messageSource,\n );\n\n return {\n id: message.id,\n role: coreV2.role,\n createdAt: context.generateCreatedAt(messageSource, message.createdAt),\n threadId: message.threadId,\n resourceId: message.resourceId,\n content: coreV2.content,\n };\n}\n\n/**\n * Hydrate a MastraDBMessage with missing fields (id, createdAt, threadId, resourceId).\n * Also fixes toolInvocations with empty args by looking in the parts array.\n */\nexport function hydrateMastraDBMessageFields(\n message: MastraDBMessage,\n context: InputConversionContext,\n): MastraDBMessage {\n // Generate ID if missing\n if (!message.id) {\n message.id = context.newMessageId();\n }\n\n if (!(message.createdAt instanceof Date)) {\n message.createdAt = new Date(message.createdAt);\n }\n\n // Fix toolInvocations with empty args by looking in the parts array\n // This handles messages restored from database where toolInvocations might have lost their args\n if (message.content.toolInvocations && message.content.parts) {\n message.content.toolInvocations = message.content.toolInvocations.map(ti => {\n if (!ti.args || Object.keys(ti.args).length === 0) {\n // Find the corresponding tool-invocation part with args\n const partWithArgs = message.content.parts.find(\n part =>\n part.type === 'tool-invocation' &&\n part.toolInvocation &&\n part.toolInvocation.toolCallId === ti.toolCallId &&\n part.toolInvocation.args &&\n Object.keys(part.toolInvocation.args).length > 0,\n );\n if (partWithArgs && partWithArgs.type === 'tool-invocation') {\n return { ...ti, args: partWithArgs.toolInvocation.args };\n }\n }\n return ti;\n });\n }\n\n if (!message.threadId && context.memoryInfo?.threadId) {\n message.threadId = context.memoryInfo.threadId;\n\n if (!message.resourceId && context.memoryInfo?.resourceId) {\n message.resourceId = context.memoryInfo.resourceId;\n }\n }\n\n return message;\n}\n","import { convertToCoreMessages as convertToCoreMessagesV4 } from '@internal/ai-sdk-v4';\nimport type { CoreMessage as CoreMessageV4, UIMessage as UIMessageV4 } from '@internal/ai-sdk-v4';\nimport * as AIV5 from '@internal/ai-sdk-v5';\n\nimport { AIV4Adapter, AIV5Adapter } from '../adapters';\nimport type { AdapterContext } from '../adapters';\nimport { TypeDetector } from '../detection/TypeDetector';\nimport type { MastraDBMessage, MessageSource } from '../state/types';\nimport type { AIV5Type } from '../types';\nimport { ensureAnthropicCompatibleMessages } from '../utils/provider-compat';\n\n/**\n * Sanitizes AIV4 UI messages by filtering out incomplete tool calls.\n * Removes messages with empty parts arrays after sanitization.\n */\nexport function sanitizeAIV4UIMessages(messages: UIMessageV4[]): UIMessageV4[] {\n const msgs = messages\n .map(m => {\n if (m.parts.length === 0) return false;\n const safeParts = m.parts.filter(\n p =>\n p.type !== `tool-invocation` ||\n // calls and partial-calls should be updated to be results at this point\n // if they haven't we can't send them back to the llm and need to remove them.\n (p.toolInvocation.state !== `call` && p.toolInvocation.state !== `partial-call`),\n );\n\n // fully remove this message if it has an empty parts array after stripping out incomplete tool calls.\n if (!safeParts.length) return false;\n\n const sanitized = {\n ...m,\n parts: safeParts,\n };\n\n // ensure toolInvocations are also updated to only show results\n if (`toolInvocations` in m && m.toolInvocations) {\n sanitized.toolInvocations = m.toolInvocations.filter(t => t.state === `result`);\n }\n\n return sanitized;\n })\n .filter((m): m is UIMessageV4 => Boolean(m));\n return msgs;\n}\n\n/**\n * Sanitizes AIV5 UI messages by filtering out streaming states, data-* parts, empty text parts, and optionally incomplete tool calls.\n * Handles legacy data by filtering empty text parts that may exist in pre-existing DB records.\n */\nexport function sanitizeV5UIMessages(\n messages: AIV5Type.UIMessage[],\n filterIncompleteToolCalls = false,\n): AIV5Type.UIMessage[] {\n const msgs = messages\n .map(m => {\n if (m.parts.length === 0) return false;\n // Filter out streaming states and optionally input-available (which aren't supported by convertToModelMessages)\n const safeParts = m.parts.filter(p => {\n // Filter out data-* parts (custom streaming data from writer.custom())\n // These are Mastra extensions not supported by LLM providers.\n // If not filtered, convertToModelMessages produces empty content arrays\n // which causes some models to fail with \"must include at least one parts field\"\n if (typeof p.type === 'string' && p.type.startsWith('data-')) {\n return false;\n }\n\n // Filter out empty text parts to handle legacy data from before this filtering was implemented\n // But preserve them if they are the only parts (legitimate placeholder messages)\n if (p.type === 'text' && (!('text' in p) || p.text === '' || p.text?.trim() === '')) {\n const hasNonEmptyParts = m.parts.some(\n part => !(part.type === 'text' && (!('text' in part) || part.text === '' || part.text?.trim() === '')),\n );\n if (hasNonEmptyParts) return false;\n }\n\n if (!AIV5.isToolUIPart(p)) return true;\n\n // When sending messages TO the LLM: only keep completed tool calls (output-available/output-error)\n // This filters out input-available (incomplete client-side tool calls) and input-streaming\n if (filterIncompleteToolCalls) {\n return p.state === 'output-available' || p.state === 'output-error';\n }\n\n // When processing response messages FROM the LLM: keep input-available states\n // (tool calls waiting for client-side execution) but filter out input-streaming\n return p.state !== 'input-streaming';\n });\n\n if (!safeParts.length) return false;\n\n const sanitized = {\n ...m,\n parts: safeParts.map(part => {\n if (AIV5.isToolUIPart(part) && part.state === 'output-available') {\n return {\n ...part,\n output:\n typeof part.output === 'object' && part.output && 'value' in part.output\n ? part.output.value\n : part.output,\n };\n }\n return part;\n }),\n };\n\n return sanitized;\n })\n .filter((m): m is AIV5Type.UIMessage => Boolean(m));\n return msgs;\n}\n\n/**\n * Adds step-start parts between tool parts and non-tool parts for proper AIV5 message conversion.\n * This ensures AIV5.convertToModelMessages produces the correct message order.\n */\nexport function addStartStepPartsForAIV5(messages: AIV5Type.UIMessage[]): AIV5Type.UIMessage[] {\n for (const message of messages) {\n if (message.role !== `assistant`) continue;\n for (const [index, part] of message.parts.entries()) {\n if (!AIV5.isToolUIPart(part)) continue;\n const nextPart = message.parts.at(index + 1);\n // If we don't insert step-start between tools and other parts, AIV5.convertToModelMessages will incorrectly add extra tool parts in the wrong order\n // ex: ui message with parts: [tool-result, text] becomes [assistant-message-with-both-parts, tool-result-message], when it should become [tool-call-message, tool-result-message, text-message]\n // However, we should NOT add step-start between consecutive tool parts (parallel tool calls)\n if (nextPart && nextPart.type !== `step-start` && !AIV5.isToolUIPart(nextPart)) {\n message.parts.splice(index + 1, 0, { type: 'step-start' });\n }\n }\n }\n return messages;\n}\n\n/**\n * Converts AIV4 UI messages to AIV4 Core messages.\n */\nexport function aiV4UIMessagesToAIV4CoreMessages(messages: UIMessageV4[]): CoreMessageV4[] {\n return convertToCoreMessagesV4(sanitizeAIV4UIMessages(messages));\n}\n\n/**\n * Converts AIV5 UI messages to AIV5 Model messages.\n * Handles sanitization, step-start insertion, provider options restoration, and Anthropic compatibility.\n *\n * @param messages - AIV5 UI messages to convert\n * @param dbMessages - MastraDB messages used to look up tool call args for Anthropic compatibility\n * @param filterIncompleteToolCalls - Whether to filter out incomplete tool calls\n */\nexport function aiV5UIMessagesToAIV5ModelMessages(\n messages: AIV5Type.UIMessage[],\n dbMessages: MastraDBMessage[],\n filterIncompleteToolCalls = false,\n): AIV5Type.ModelMessage[] {\n const sanitized = sanitizeV5UIMessages(messages, filterIncompleteToolCalls);\n const preprocessed = addStartStepPartsForAIV5(sanitized);\n const result = AIV5.convertToModelMessages(preprocessed);\n\n // Restore message-level providerOptions from metadata.providerMetadata\n // This preserves providerOptions through the DB → UI → Model conversion\n const withProviderOptions = result.map((modelMsg, index) => {\n const uiMsg = preprocessed[index];\n\n if (\n uiMsg?.metadata &&\n typeof uiMsg.metadata === 'object' &&\n 'providerMetadata' in uiMsg.metadata &&\n uiMsg.metadata.providerMetadata\n ) {\n return {\n ...modelMsg,\n providerOptions: uiMsg.metadata.providerMetadata as AIV5Type.ProviderMetadata,\n } satisfies AIV5Type.ModelMessage;\n }\n\n return modelMsg;\n });\n\n // Add input field to tool-result parts for Anthropic API compatibility (fixes issue #11376)\n return ensureAnthropicCompatibleMessages(withProviderOptions, dbMessages);\n}\n\n/**\n * Converts AIV4 Core messages to AIV5 Model messages.\n */\nexport function aiV4CoreMessagesToAIV5ModelMessages(\n messages: CoreMessageV4[],\n source: MessageSource,\n adapterContext: AdapterContext,\n dbMessages: MastraDBMessage[],\n): AIV5Type.ModelMessage[] {\n return aiV5UIMessagesToAIV5ModelMessages(\n messages.map(m => AIV4Adapter.fromCoreMessage(m, adapterContext, source)).map(m => AIV5Adapter.toUIMessage(m)),\n dbMessages,\n );\n}\n\n/**\n * Converts various message formats to AIV4 CoreMessage format for system messages.\n * Supports string, MastraDBMessage, or AI SDK message types.\n */\nexport function systemMessageToAIV4Core(\n message: CoreMessageV4 | AIV5Type.ModelMessage | MastraDBMessage | string,\n): CoreMessageV4 {\n if (typeof message === `string`) {\n return { role: 'system', content: message };\n }\n\n if (TypeDetector.isAIV5CoreMessage(message)) {\n const dbMsg = AIV5Adapter.fromModelMessage(message as AIV5Type.ModelMessage, 'system');\n return AIV4Adapter.systemToV4Core(dbMsg);\n }\n\n if (TypeDetector.isMastraDBMessage(message)) {\n return AIV4Adapter.systemToV4Core(message);\n }\n\n return message;\n}\n","import { convertBase64ToUint8Array, convertUint8ArrayToBase64 } from '@ai-sdk/provider-utils-v5';\n\n/**\n * A generated file.\n */\nexport interface GeneratedFile {\n /**\n File as a base64 encoded string.\n */\n readonly base64: string;\n\n /**\n File as a Uint8Array.\n */\n readonly uint8Array: Uint8Array;\n\n /**\n The IANA media type of the file.\n \n @see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n readonly mediaType: string;\n}\n\nexport class DefaultGeneratedFile implements GeneratedFile {\n private base64Data: string | undefined;\n private uint8ArrayData: Uint8Array | undefined;\n\n readonly mediaType: string;\n\n constructor({ data, mediaType }: { data: string | Uint8Array; mediaType: string }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? undefined : data;\n this.uint8ArrayData = isUint8Array ? data : undefined;\n this.mediaType = mediaType;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData!);\n }\n return this.base64Data;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data!);\n }\n return this.uint8ArrayData;\n }\n}\n\nexport class DefaultGeneratedFileWithType extends DefaultGeneratedFile {\n readonly type = 'file';\n\n constructor(options: { data: string | Uint8Array; mediaType: string }) {\n super(options);\n }\n}\n","import * as AIV5 from '@internal/ai-sdk-v5';\n\nimport { DefaultGeneratedFileWithType } from '../../../stream/aisdk/v5/file';\nimport { convertDataContentToBase64String } from '../prompt/data-content';\nimport { parseDataUri } from '../prompt/image-utils';\nimport type { MastraDBMessage } from '../state/types';\nimport type { AIV5Type } from '../types';\nimport { findToolCallArgs } from '../utils/provider-compat';\nimport { sanitizeV5UIMessages } from './output-converter';\n\n/**\n * StepContentExtractor - Handles extraction of step content from response messages\n *\n * This class encapsulates the complex logic for:\n * - Finding step boundaries by looking for step-start markers\n * - Handling special cases like -1 (last step) and tool-only steps\n * - Converting UI messages to model messages and extracting content\n */\nexport class StepContentExtractor {\n /**\n * Extract content for a specific step number from UI messages\n *\n * @param uiMessages - Array of AI SDK V5 UI messages\n * @param stepNumber - Step number to extract (1-indexed, or -1 for last step)\n * @param stepContentFn - Function to convert model messages to step content\n * @returns Step content array\n */\n static extractStepContent(\n uiMessages: AIV5Type.UIMessage[],\n stepNumber: number,\n stepContentFn: (message?: AIV5Type.ModelMessage) => AIV5Type.StepResult<any>['content'],\n ): AIV5Type.StepResult<any>['content'] {\n const uiMessagesParts = uiMessages.flatMap(item => item.parts);\n\n // Find step boundaries by looking for step-start markers\n const stepBoundaries: number[] = [];\n uiMessagesParts.forEach((part, index) => {\n if (part.type === 'step-start') {\n stepBoundaries.push(index);\n }\n });\n\n // Handle -1 to get the last step (the current/most recent step)\n if (stepNumber === -1) {\n return StepContentExtractor.extractLastStep(uiMessagesParts, stepBoundaries, stepContentFn);\n }\n\n // Step 1 is everything before the first step-start\n if (stepNumber === 1) {\n return StepContentExtractor.extractFirstStep(uiMessagesParts, stepBoundaries, stepContentFn);\n }\n\n // For steps 2+, content is between (stepNumber-1)th and stepNumber-th step-start markers\n return StepContentExtractor.extractMiddleStep(uiMessagesParts, stepBoundaries, stepNumber, stepContentFn);\n }\n\n /**\n * Extract the last step content (stepNumber === -1)\n */\n private static extractLastStep(\n uiMessagesParts: AIV5Type.UIMessage['parts'],\n stepBoundaries: number[],\n stepContentFn: (message?: AIV5Type.ModelMessage) => AIV5Type.StepResult<any>['content'],\n ): AIV5Type.StepResult<any>['content'] {\n // For tool-only steps without step-start markers, we need different logic\n // Each tool part represents a complete step (tool call + result)\n const toolParts = uiMessagesParts.filter(p => p.type?.startsWith('tool-'));\n const hasStepStart = stepBoundaries.length > 0;\n\n if (!hasStepStart && toolParts.length > 0) {\n // No step-start markers but we have tool parts\n // Each tool part is a separate step, so return only the last tool\n const lastToolPart = toolParts[toolParts.length - 1];\n if (!lastToolPart) {\n return [];\n }\n const lastToolIndex = uiMessagesParts.indexOf(lastToolPart);\n const previousToolPart = toolParts[toolParts.length - 2];\n const previousToolIndex = previousToolPart ? uiMessagesParts.indexOf(previousToolPart) : -1;\n\n const startIndex = previousToolIndex + 1;\n const stepParts = uiMessagesParts.slice(startIndex, lastToolIndex + 1);\n\n return StepContentExtractor.convertPartsToContent(stepParts, 'last-step', stepContentFn);\n }\n\n // Count total steps (1 + number of step-start markers)\n const totalSteps = stepBoundaries.length + 1;\n\n // Get the content for the last step using the regular step logic\n if (totalSteps === 1 && !hasStepStart) {\n // Only one step, return all content\n return StepContentExtractor.convertPartsToContent(uiMessagesParts, 'last-step', stepContentFn);\n }\n\n // Multiple steps - get content after the last step-start marker\n const lastStepStart = stepBoundaries[stepBoundaries.length - 1];\n if (lastStepStart === undefined) {\n return [];\n }\n const stepParts = uiMessagesParts.slice(lastStepStart + 1);\n\n if (stepParts.length === 0) {\n return [];\n }\n\n return StepContentExtractor.convertPartsToContent(stepParts, 'last-step', stepContentFn);\n }\n\n /**\n * Extract the first step content (stepNumber === 1)\n */\n private static extractFirstStep(\n uiMessagesParts: AIV5Type.UIMessage['parts'],\n stepBoundaries: number[],\n stepContentFn: (message?: AIV5Type.ModelMessage) => AIV5Type.StepResult<any>['content'],\n ): AIV5Type.StepResult<any>['content'] {\n const firstStepStart = stepBoundaries[0] ?? uiMessagesParts.length;\n if (firstStepStart === 0) {\n // No content before first step-start\n return [];\n }\n\n const stepParts = uiMessagesParts.slice(0, firstStepStart);\n return StepContentExtractor.convertPartsToContent(stepParts, 'step-1', stepContentFn);\n }\n\n /**\n * Extract content for steps 2+ (between step-start markers)\n */\n private static extractMiddleStep(\n uiMessagesParts: AIV5Type.UIMessage['parts'],\n stepBoundaries: number[],\n stepNumber: number,\n stepContentFn: (message?: AIV5Type.ModelMessage) => AIV5Type.StepResult<any>['content'],\n ): AIV5Type.StepResult<any>['content'] {\n const stepIndex = stepNumber - 2; // -2 because step 2 is at index 0 in boundaries\n if (stepIndex < 0 || stepIndex >= stepBoundaries.length) {\n return [];\n }\n\n const startIndex = (stepBoundaries[stepIndex] ?? 0) + 1; // Start after the step-start marker\n const endIndex = stepBoundaries[stepIndex + 1] ?? uiMessagesParts.length;\n\n if (startIndex >= endIndex) {\n return [];\n }\n\n const stepParts = uiMessagesParts.slice(startIndex, endIndex);\n return StepContentExtractor.convertPartsToContent(stepParts, `step-${stepNumber}`, stepContentFn);\n }\n\n /**\n * Convert UI message parts to step content\n */\n private static convertPartsToContent(\n parts: AIV5Type.UIMessage['parts'],\n stepId: string,\n stepContentFn: (message?: AIV5Type.ModelMessage) => AIV5Type.StepResult<any>['content'],\n ): AIV5Type.StepResult<any>['content'] {\n const stepUiMessages: AIV5Type.UIMessage[] = [\n {\n id: stepId,\n role: 'assistant',\n parts,\n },\n ];\n\n const modelMessages = AIV5.convertToModelMessages(sanitizeV5UIMessages(stepUiMessages));\n return modelMessages.flatMap(stepContentFn);\n }\n\n /**\n * Convert a single model message content to step result content\n *\n * This handles:\n * - Tool results: adding input field from DB messages\n * - Files: converting to GeneratedFile format\n * - Images: converting to file format with proper media type\n * - Other content: passed through as-is\n *\n * @param message - Model message to convert (or undefined to use latest)\n * @param dbMessages - Database messages for looking up tool call args\n * @param getLatestMessage - Function to get the latest model message if not provided\n */\n static convertToStepContent(\n message: AIV5Type.ModelMessage | undefined,\n dbMessages: MastraDBMessage[],\n getLatestMessage: () => AIV5Type.ModelMessage | undefined,\n ): AIV5Type.StepResult<any>['content'] {\n const latest = message ? message : getLatestMessage();\n if (!latest) return [];\n\n if (typeof latest.content === 'string') {\n return [{ type: 'text', text: latest.content }];\n }\n\n return latest.content.map(c => {\n if (c.type === 'tool-result') {\n return {\n type: 'tool-result',\n input: findToolCallArgs(dbMessages, c.toolCallId),\n output: c.output,\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n } satisfies AIV5Type.StaticToolResult<any>;\n }\n\n if (c.type === 'file') {\n return {\n type: 'file',\n file: new DefaultGeneratedFileWithType({\n data:\n typeof c.data === 'string'\n ? parseDataUri(c.data).base64Content // Strip data URI prefix if present\n : c.data instanceof URL\n ? c.data.toString()\n : convertDataContentToBase64String(c.data),\n mediaType: c.mediaType,\n }),\n } satisfies Extract<AIV5Type.StepResult<any>['content'][number], { type: 'file' }>;\n }\n\n if (c.type === 'image') {\n return {\n type: 'file',\n file: new DefaultGeneratedFileWithType({\n data:\n typeof c.image === 'string'\n ? parseDataUri(c.image).base64Content // Strip data URI prefix if present\n : c.image instanceof URL\n ? c.image.toString()\n : convertDataContentToBase64String(c.image),\n mediaType: c.mediaType || 'unknown',\n }),\n };\n }\n\n return { ...c };\n });\n }\n}\n","import { CacheKeyGenerator } from '../cache/CacheKeyGenerator';\nimport type { MastraDBMessage, MastraMessageContentV2 } from '../state/types';\n\n/**\n * MessageMerger - Handles complex logic for merging assistant messages\n *\n * When streaming responses from LLMs, we often receive multiple messages that need to be\n * merged together:\n * - Tool calls that need to be updated with their results\n * - Text parts that need to be appended\n * - Step-start markers that need to be inserted\n *\n * This class encapsulates all the complex merging logic that was previously spread\n * throughout the MessageList.addOne method.\n */\nexport class MessageMerger {\n /**\n * Check if a message is sealed (should not be merged into).\n * Messages are sealed after observation to preserve observation markers.\n */\n static isSealed(message: MastraDBMessage): boolean {\n const metadata = message.content?.metadata as { mastra?: { sealed?: boolean } } | undefined;\n return metadata?.mastra?.sealed === true;\n }\n\n /**\n * Check if we should merge an incoming message with the latest message\n *\n * @param latestMessage - The most recent message in the list\n * @param incomingMessage - The message being added\n * @param messageSource - The source of the incoming message ('memory', 'input', 'response', 'context')\n * @param isLatestFromMemory - Whether the latest message is from memory\n * @param agentNetworkAppend - Whether agent network append mode is enabled\n */\n\n static shouldMerge(\n latestMessage: MastraDBMessage | undefined,\n incomingMessage: MastraDBMessage,\n messageSource: string,\n isLatestFromMemory: boolean,\n agentNetworkAppend: boolean = false,\n ): boolean {\n if (!latestMessage) return false;\n\n // Don't merge into sealed messages (e.g., messages that have been observed)\n if (MessageMerger.isSealed(latestMessage)) return false;\n\n // Basic merge conditions: both messages must be assistant messages from the same thread\n const shouldAppendToLastAssistantMessage =\n latestMessage.role === 'assistant' &&\n incomingMessage.role === 'assistant' &&\n latestMessage.threadId === incomingMessage.threadId &&\n // If the message is from memory, don't append to the last assistant message\n messageSource !== 'memory';\n\n // Agent network append flag handling\n // When enabled, only merge if the latest message is NOT from memory\n const appendNetworkMessage = agentNetworkAppend ? !isLatestFromMemory : true;\n\n return shouldAppendToLastAssistantMessage && appendNetworkMessage;\n }\n\n /**\n * Merge an incoming assistant message into the latest assistant message\n *\n * This handles:\n * - Updating tool invocations with their results\n * - Adding new parts in the correct order using anchor maps\n * - Inserting step-start markers where needed\n * - Updating timestamps and content strings\n */\n static merge(latestMessage: MastraDBMessage, incomingMessage: MastraDBMessage): void {\n // Update timestamp\n latestMessage.createdAt = incomingMessage.createdAt || latestMessage.createdAt;\n\n // Used for mapping indexes for incomingMessage parts to corresponding indexes in latestMessage\n const toolResultAnchorMap = new Map<number, number>();\n const partsToAdd = new Map<number, MastraMessageContentV2['parts'][number]>();\n\n for (const [index, part] of incomingMessage.content.parts.entries()) {\n // If the incoming part is a tool-invocation result, find the corresponding call in the latest message\n if (part.type === 'tool-invocation') {\n const existingCallPart = [...latestMessage.content.parts]\n .reverse()\n .find(p => p.type === 'tool-invocation' && p.toolInvocation.toolCallId === part.toolInvocation.toolCallId);\n\n const existingCallToolInvocation = !!existingCallPart && existingCallPart.type === 'tool-invocation';\n\n if (existingCallToolInvocation) {\n if (part.toolInvocation.state === 'result') {\n // Update the existing tool-call part with the result\n existingCallPart.toolInvocation = {\n ...existingCallPart.toolInvocation,\n step: part.toolInvocation.step,\n state: 'result',\n result: part.toolInvocation.result,\n args: {\n ...existingCallPart.toolInvocation.args,\n ...part.toolInvocation.args,\n },\n };\n if (!latestMessage.content.toolInvocations) {\n latestMessage.content.toolInvocations = [];\n }\n const toolInvocationIndex = latestMessage.content.toolInvocations.findIndex(\n t => t.toolCallId === existingCallPart.toolInvocation.toolCallId,\n );\n if (toolInvocationIndex === -1) {\n latestMessage.content.toolInvocations.push(existingCallPart.toolInvocation);\n } else {\n latestMessage.content.toolInvocations[toolInvocationIndex] = existingCallPart.toolInvocation;\n }\n }\n // Map the index of the tool call in incomingMessage to the index of the tool call in latestMessage\n const existingIndex = latestMessage.content.parts.findIndex(p => p === existingCallPart);\n toolResultAnchorMap.set(index, existingIndex);\n // Otherwise we do nothing, as we're not updating the tool call\n } else {\n partsToAdd.set(index, part);\n }\n } else {\n partsToAdd.set(index, part);\n }\n }\n\n MessageMerger.addPartsToMessage({\n latestMessage,\n incomingMessage,\n anchorMap: toolResultAnchorMap,\n partsToAdd,\n });\n\n if (latestMessage.createdAt.getTime() < incomingMessage.createdAt.getTime()) {\n latestMessage.createdAt = incomingMessage.createdAt;\n }\n if (!latestMessage.content.content && incomingMessage.content.content) {\n latestMessage.content.content = incomingMessage.content.content;\n }\n if (\n latestMessage.content.content &&\n incomingMessage.content.content &&\n latestMessage.content.content !== incomingMessage.content.content\n ) {\n // Match what AI SDK does - content string is always the latest text part.\n latestMessage.content.content = incomingMessage.content.content;\n }\n }\n\n /**\n * Add parts from the incoming message to the latest message using anchor positions\n */\n private static addPartsToMessage({\n latestMessage,\n incomingMessage,\n anchorMap,\n partsToAdd,\n }: {\n latestMessage: MastraDBMessage;\n incomingMessage: MastraDBMessage;\n anchorMap: Map<number, number>;\n partsToAdd: Map<number, MastraMessageContentV2['parts'][number]>;\n }): void {\n // Walk through incomingMessage, inserting any part not present at the canonical position\n for (let i = 0; i < incomingMessage.content.parts.length; ++i) {\n const part = incomingMessage.content.parts[i];\n if (!part) continue;\n const key = CacheKeyGenerator.fromDBParts([part]);\n const partToAdd = partsToAdd.get(i);\n if (!key || !partToAdd) continue;\n if (anchorMap.size > 0) {\n if (anchorMap.has(i)) continue; // skip anchors\n // Find left anchor in incomingMessage\n const leftAnchorV2 = [...anchorMap.keys()].filter(idx => idx < i).pop() ?? -1;\n // Find right anchor in incomingMessage\n const rightAnchorV2 = [...anchorMap.keys()].find(idx => idx > i) ?? -1;\n\n // Map to latestMessage\n const leftAnchorLatest = leftAnchorV2 !== -1 ? anchorMap.get(leftAnchorV2)! : 0;\n\n // Compute offset from anchor\n const offset = leftAnchorV2 === -1 ? i : i - leftAnchorV2;\n\n // Insert at proportional position\n const insertAt = leftAnchorLatest + offset;\n\n const rightAnchorLatest =\n rightAnchorV2 !== -1 ? anchorMap.get(rightAnchorV2)! : latestMessage.content.parts.length;\n\n if (\n insertAt >= 0 &&\n insertAt <= rightAnchorLatest &&\n !latestMessage.content.parts\n .slice(insertAt, rightAnchorLatest)\n .some(p => CacheKeyGenerator.fromDBParts([p]) === CacheKeyGenerator.fromDBParts([part]))\n ) {\n MessageMerger.pushNewPart({\n latestMessage,\n newMessage: incomingMessage,\n part,\n insertAt,\n });\n for (const [v2Idx, latestIdx] of anchorMap.entries()) {\n if (latestIdx >= insertAt) {\n anchorMap.set(v2Idx, latestIdx + 1);\n }\n }\n }\n } else {\n MessageMerger.pushNewPart({\n latestMessage,\n newMessage: incomingMessage,\n part,\n });\n }\n }\n }\n\n /**\n * Push a new message part to the latest message\n */\n private static pushNewPart({\n latestMessage,\n newMessage,\n part,\n insertAt,\n }: {\n latestMessage: MastraDBMessage;\n newMessage: MastraDBMessage;\n part: MastraMessageContentV2['parts'][number];\n insertAt?: number;\n }): void {\n const partKey = CacheKeyGenerator.fromDBParts([part]);\n const latestPartCount = latestMessage.content.parts.filter(\n p => CacheKeyGenerator.fromDBParts([p]) === partKey,\n ).length;\n const newPartCount = newMessage.content.parts.filter(p => CacheKeyGenerator.fromDBParts([p]) === partKey).length;\n // If the number of parts in the latest message is less than the number of parts in the new message, insert the part\n if (latestPartCount < newPartCount) {\n // Check if we need to add a step-start before text parts when merging assistant messages\n // Only add after tool invocations, and only if the incoming message doesn't already have step-start\n const partIndex = newMessage.content.parts.indexOf(part);\n const hasStepStartBefore = partIndex > 0 && newMessage.content.parts[partIndex - 1]?.type === 'step-start';\n\n const needsStepStart =\n latestMessage.role === 'assistant' &&\n part.type === 'text' &&\n !hasStepStartBefore &&\n latestMessage.content.parts.length > 0 &&\n latestMessage.content.parts.at(-1)?.type === 'tool-invocation';\n\n if (typeof insertAt === 'number') {\n if (needsStepStart) {\n latestMessage.content.parts.splice(insertAt, 0, { type: 'step-start' });\n latestMessage.content.parts.splice(insertAt + 1, 0, part);\n } else {\n latestMessage.content.parts.splice(insertAt, 0, part);\n }\n } else {\n if (needsStepStart) {\n latestMessage.content.parts.push({ type: 'step-start' });\n }\n latestMessage.content.parts.push(part);\n }\n }\n }\n}\n","import type { LanguageModelV2DataContent } from '@ai-sdk/provider-v5';\nimport type { DataContent } from '@internal/ai-sdk-v5';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../../error';\n\nfunction splitDataUrl(dataUrl: string): {\n mediaType: string | undefined;\n base64Content: string | undefined;\n} {\n try {\n const [header, base64Content] = dataUrl.split(',');\n return {\n mediaType: header?.split(';')[0]?.split(':')[1],\n base64Content,\n };\n } catch {\n return {\n mediaType: undefined,\n base64Content: undefined,\n };\n }\n}\n\nexport function convertToDataContent(content: DataContent | URL): {\n data: LanguageModelV2DataContent;\n mediaType: string | undefined;\n} {\n // Buffer & Uint8Array:\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: undefined };\n }\n\n // ArrayBuffer needs conversion to Uint8Array (lightweight):\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: undefined };\n }\n\n // Attempt to create a URL from the data. If it fails, we can assume the data\n // is not a URL and likely some other sort of data.\n if (typeof content === 'string') {\n try {\n content = new URL(content);\n } catch {\n // ignored\n }\n }\n\n // Extract data from data URL:\n if (content instanceof URL && content.protocol === 'data:') {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(content.toString());\n\n if (dataUrlMediaType == null || base64Content == null) {\n throw new MastraError({\n id: 'INVALID_DATA_URL_FORMAT',\n text: `Invalid data URL format in content ${content.toString()}`,\n domain: ErrorDomain.LLM,\n category: ErrorCategory.USER,\n });\n }\n\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n\n return { data: content, mediaType: undefined };\n}\n","import { convertBase64ToUint8Array } from '@ai-sdk/provider-utils-v5';\n\nexport const imageMediaTypeSignatures = [\n {\n mediaType: 'image/gif' as const,\n bytesPrefix: [0x47, 0x49, 0x46],\n base64Prefix: 'R0lG',\n },\n {\n mediaType: 'image/png' as const,\n bytesPrefix: [0x89, 0x50, 0x4e, 0x47],\n base64Prefix: 'iVBORw',\n },\n {\n mediaType: 'image/jpeg' as const,\n bytesPrefix: [0xff, 0xd8],\n base64Prefix: '/9j/',\n },\n {\n mediaType: 'image/webp' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGRg',\n },\n {\n mediaType: 'image/bmp' as const,\n bytesPrefix: [0x42, 0x4d],\n base64Prefix: 'Qk',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x49, 0x49, 0x2a, 0x00],\n base64Prefix: 'SUkqAA',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x4d, 0x4d, 0x00, 0x2a],\n base64Prefix: 'TU0AKg',\n },\n {\n mediaType: 'image/avif' as const,\n bytesPrefix: [0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66],\n base64Prefix: 'AAAAIGZ0eXBhdmlm',\n },\n {\n mediaType: 'image/heic' as const,\n bytesPrefix: [0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63],\n base64Prefix: 'AAAAIGZ0eXBoZWlj',\n },\n] as const;\n\nexport const audioMediaTypeSignatures = [\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xfb],\n base64Prefix: '//s=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xfa],\n base64Prefix: '//o=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xf3],\n base64Prefix: '//M=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xf2],\n base64Prefix: '//I=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xe3],\n base64Prefix: '/+M=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xe2],\n base64Prefix: '/+I=',\n },\n {\n mediaType: 'audio/wav' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGR',\n },\n {\n mediaType: 'audio/ogg' as const,\n bytesPrefix: [0x4f, 0x67, 0x67, 0x53],\n base64Prefix: 'T2dnUw',\n },\n {\n mediaType: 'audio/flac' as const,\n bytesPrefix: [0x66, 0x4c, 0x61, 0x43],\n base64Prefix: 'ZkxhQw',\n },\n {\n mediaType: 'audio/aac' as const,\n bytesPrefix: [0x40, 0x15, 0x00, 0x00],\n base64Prefix: 'QBUA',\n },\n {\n mediaType: 'audio/mp4' as const,\n bytesPrefix: [0x66, 0x74, 0x79, 0x70],\n base64Prefix: 'ZnR5cA',\n },\n {\n mediaType: 'audio/webm',\n bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3],\n base64Prefix: 'GkXf',\n },\n] as const;\n\nconst stripID3 = (data: Uint8Array | string) => {\n const bytes = typeof data === 'string' ? convertBase64ToUint8Array(data) : data;\n const id3Size =\n // @ts-expect-error - bytes array access\n ((bytes[6] & 0x7f) << 21) |\n // @ts-expect-error - bytes array access\n ((bytes[7] & 0x7f) << 14) |\n // @ts-expect-error - bytes array access\n ((bytes[8] & 0x7f) << 7) |\n // @ts-expect-error - bytes array access\n (bytes[9] & 0x7f);\n\n // The raw MP3 starts here\n return bytes.slice(id3Size + 10);\n};\n\nfunction stripID3TagsIfPresent(data: Uint8Array | string): Uint8Array | string {\n const hasId3 =\n (typeof data === 'string' && data.startsWith('SUQz')) ||\n (typeof data !== 'string' &&\n data.length > 10 &&\n data[0] === 0x49 && // 'I'\n data[1] === 0x44 && // 'D'\n data[2] === 0x33); // '3'\n\n return hasId3 ? stripID3(data) : data;\n}\n\nexport function detectMediaType({\n data,\n signatures,\n}: {\n data: Uint8Array | string;\n signatures: typeof audioMediaTypeSignatures | typeof imageMediaTypeSignatures;\n}): (typeof signatures)[number]['mediaType'] | undefined {\n const processedData = stripID3TagsIfPresent(data);\n\n for (const signature of signatures) {\n if (\n typeof processedData === 'string'\n ? processedData.startsWith(signature.base64Prefix)\n : processedData.length >= signature.bytesPrefix.length &&\n signature.bytesPrefix.every((byte, index) => processedData[index] === byte)\n ) {\n return signature.mediaType;\n }\n }\n\n return undefined;\n}\n","import type { DataContent, ImagePart, FilePart } from '@ai-sdk/provider-utils-v5';\nimport type { LanguageModelV2FilePart, LanguageModelV2TextPart } from '@ai-sdk/provider-v5';\nimport { convertToDataContent, detectMediaType, imageMediaTypeSignatures } from '../../../stream/aisdk/v5/compat';\n\nexport function convertImageFilePart(\n part: ImagePart | FilePart,\n downloadedAssets?: Record<string, { mediaType: string | undefined; data: Uint8Array }>,\n): LanguageModelV2TextPart | LanguageModelV2FilePart {\n let originalData: DataContent | URL;\n const type = part.type;\n switch (type) {\n case 'image':\n originalData = part.image;\n break;\n case 'file':\n originalData = part.data;\n\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n\n const { data: convertedData, mediaType: convertedMediaType } = convertToDataContent(originalData);\n\n let mediaType: string | undefined = convertedMediaType ?? part.mediaType;\n let data: Uint8Array | string | URL = convertedData; // binary | base64 | url\n\n // If the content is a URL, we check if it was downloaded:\n if (data instanceof URL && downloadedAssets) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType ??= downloadedFile.mediaType;\n }\n }\n\n // Now that we have the normalized data either as a URL or a Uint8Array,\n // we can create the LanguageModelV2Part.\n switch (type) {\n case 'image': {\n // When possible, try to detect the media type automatically\n // to deal with incorrect media type inputs.\n // When detection fails, use provided media type.\n if (data instanceof Uint8Array || typeof data === 'string') {\n mediaType = detectMediaType({ data, signatures: imageMediaTypeSignatures }) ?? mediaType;\n }\n\n return {\n type: 'file',\n mediaType: mediaType ?? 'image/*', // any image\n filename: undefined,\n data,\n providerOptions: part.providerOptions,\n };\n }\n\n case 'file': {\n // We must have a mediaType for files, if not, throw an error.\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n\n return {\n type: 'file',\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions,\n };\n }\n }\n}\n","import type { Attachment } from '@ai-sdk/ui-utils-v5';\nimport type { FilePart, ImagePart, TextPart } from '@internal/ai-sdk-v4';\nimport { categorizeFileData, createDataUri } from './image-utils';\n\ntype ContentPart = TextPart | ImagePart | FilePart;\n\n/**\n * Converts a list of attachments to a list of content parts\n * for consumption by `ai/core` functions.\n * Currently only supports images and text attachments.\n */\nexport function attachmentsToParts(attachments: Attachment[]): ContentPart[] {\n const parts: ContentPart[] = [];\n\n for (const attachment of attachments) {\n // Categorize the attachment URL to determine if it's a URL, data URI, or raw base64\n const categorized = categorizeFileData(attachment.url, attachment.contentType);\n\n // If it's raw data (base64), convert it to a data URI\n let urlString = attachment.url;\n if (categorized.type === 'raw') {\n urlString = createDataUri(attachment.url, attachment.contentType || 'application/octet-stream');\n }\n\n let url;\n try {\n url = new URL(urlString);\n } catch {\n throw new Error(`Invalid URL: ${attachment.url}`);\n }\n\n switch (url.protocol) {\n case 'http:':\n case 'https:':\n // Cloud storage protocols supported by AI providers (e.g., Vertex AI for gs://, Bedrock for s3://)\n case 'gs:':\n case 's3:': {\n if (attachment.contentType?.startsWith('image/')) {\n parts.push({ type: 'image', image: url.toString(), mimeType: attachment.contentType });\n } else {\n if (!attachment.contentType) {\n throw new Error('If the attachment is not an image, it must specify a content type');\n }\n\n parts.push({\n type: 'file',\n data: url.toString(),\n mimeType: attachment.contentType,\n });\n }\n break;\n }\n\n case 'data:': {\n if (attachment.contentType?.startsWith('image/')) {\n parts.push({\n type: 'image',\n image: urlString,\n mimeType: attachment.contentType,\n });\n } else if (attachment.contentType?.startsWith('text/')) {\n parts.push({\n type: 'file',\n data: urlString,\n mimeType: attachment.contentType,\n });\n } else {\n if (!attachment.contentType) {\n throw new Error('If the attachment is not an image or text, it must specify a content type');\n }\n\n parts.push({\n type: 'file',\n data: urlString,\n mimeType: attachment.contentType,\n });\n }\n\n break;\n }\n\n default: {\n throw new Error(`Unsupported URL protocol: ${url.protocol}`);\n }\n }\n }\n\n return parts;\n}\n","/**\n * This file is an adaptation of https://github.com/vercel/ai/blob/e14c066bf4d02c5ee2180c56a01fa0e5216bc582/packages/ai/core/prompt/convert-to-core-messages.ts\n * But has been modified to work with Mastra storage adapter messages (MastraMessageV1)\n */\nimport type { AssistantContent, ToolResultPart } from '@internal/ai-sdk-v4';\nimport type { MastraMessageV1 } from '../../../memory/types';\nimport type { MastraMessageContentV2, MastraDBMessage } from '../../message-list';\nimport { attachmentsToParts } from './attachments-to-parts';\n\nconst makePushOrCombine = (v1Messages: MastraMessageV1[]) => {\n // Track how many times each ID has been used to create unique IDs for split messages\n const idUsageCount = new Map<string, number>();\n\n // Pattern to detect if an ID already has our split suffix\n const SPLIT_SUFFIX_PATTERN = /__split-\\d+$/;\n\n return (msg: MastraMessageV1) => {\n const previousMessage = v1Messages.at(-1);\n if (\n msg.role === previousMessage?.role &&\n Array.isArray(previousMessage.content) &&\n Array.isArray(msg.content) &&\n // we were creating new messages for tool calls before and not appending to the assistant message\n // so don't append here so everything works as before\n (msg.role !== `assistant` || (msg.role === `assistant` && msg.content.at(-1)?.type !== `tool-call`))\n ) {\n for (const part of msg.content) {\n // @ts-expect-error needs type gymnastics? msg.content and previousMessage.content are the same type here since both are arrays\n previousMessage.content.push(part);\n }\n } else {\n // When pushing a new message, check if we need to deduplicate the ID\n let baseId = msg.id;\n\n // Check if this ID already has a split suffix and extract the base ID\n const hasSplitSuffix = SPLIT_SUFFIX_PATTERN.test(baseId);\n if (hasSplitSuffix) {\n // This ID already has a split suffix, don't add another one\n v1Messages.push(msg);\n return;\n }\n\n const currentCount = idUsageCount.get(baseId) || 0;\n\n // If we've seen this ID before, append our unique split suffix\n if (currentCount > 0) {\n msg.id = `${baseId}__split-${currentCount}`;\n }\n\n // Increment the usage count for this base ID\n idUsageCount.set(baseId, currentCount + 1);\n\n v1Messages.push(msg);\n }\n };\n};\nexport function convertToV1Messages(messages: Array<MastraDBMessage>) {\n const v1Messages: MastraMessageV1[] = [];\n const pushOrCombine = makePushOrCombine(v1Messages);\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n const isLastMessage = i === messages.length - 1;\n if (!message?.content) continue;\n const { content, experimental_attachments: inputAttachments = [], parts: inputParts } = message.content;\n const { role } = message;\n\n const fields = {\n id: message.id,\n createdAt: message.createdAt,\n resourceId: message.resourceId!,\n threadId: message.threadId!,\n };\n\n const experimental_attachments = [...inputAttachments];\n const parts: typeof inputParts = [];\n for (const part of inputParts) {\n if (part.type === 'file') {\n experimental_attachments.push({\n url: part.data,\n contentType: part.mimeType,\n });\n } else {\n parts.push(part);\n }\n }\n\n switch (role) {\n case 'user': {\n if (parts == null) {\n const userContent = experimental_attachments\n ? [{ type: 'text', text: content || '' }, ...attachmentsToParts(experimental_attachments)]\n : { type: 'text', text: content || '' };\n pushOrCombine({\n role: 'user',\n ...fields,\n type: 'text',\n // @ts-expect-error - content type mismatch in conversion\n content: userContent,\n });\n } else {\n const textParts = message.content.parts\n .filter(part => part.type === 'text')\n .map(part => ({\n type: 'text' as const,\n text: part.text,\n }));\n\n const userContent = experimental_attachments\n ? [...textParts, ...attachmentsToParts(experimental_attachments)]\n : textParts;\n pushOrCombine({\n role: 'user',\n ...fields,\n type: 'text',\n content:\n Array.isArray(userContent) &&\n userContent.length === 1 &&\n userContent[0]?.type === `text` &&\n typeof content !== `undefined`\n ? content\n : userContent,\n });\n }\n break;\n }\n\n case 'assistant': {\n if (message.content.parts != null) {\n let currentStep = 0;\n let blockHasToolInvocations = false;\n let block: MastraMessageContentV2['parts'] = [];\n\n function processBlock() {\n const content: AssistantContent = [];\n\n for (const part of block) {\n switch (part.type) {\n case 'file':\n case 'text': {\n content.push(part);\n break;\n }\n case 'reasoning': {\n for (const detail of part.details) {\n switch (detail.type) {\n case 'text':\n content.push({\n type: 'reasoning' as const,\n text: detail.text,\n signature: detail.signature,\n });\n break;\n case 'redacted':\n content.push({\n type: 'redacted-reasoning' as const,\n data: detail.data,\n });\n break;\n }\n }\n break;\n }\n case 'tool-invocation':\n // Skip updateWorkingMemory tool calls as they should not be visible in history\n if (part.toolInvocation.toolName !== 'updateWorkingMemory') {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.toolInvocation.toolCallId,\n toolName: part.toolInvocation.toolName,\n args: part.toolInvocation.args,\n });\n }\n break;\n }\n }\n\n pushOrCombine({\n role: 'assistant',\n ...fields,\n type: content.some(c => c.type === `tool-call`) ? 'tool-call' : 'text',\n content:\n typeof content !== `string` &&\n Array.isArray(content) &&\n content.length === 1 &&\n content[0]?.type === `text`\n ? content[0].text\n : content,\n });\n\n // check if there are tool invocations with results in the block\n const stepInvocations = block\n .filter(part => `type` in part && part.type === 'tool-invocation')\n .map(part => part.toolInvocation)\n .filter(ti => ti.toolName !== 'updateWorkingMemory');\n\n // Only create tool-result message if there are actual results\n const invocationsWithResults = stepInvocations.filter(ti => ti.state === 'result' && 'result' in ti);\n\n if (invocationsWithResults.length > 0) {\n pushOrCombine({\n role: 'tool',\n ...fields,\n type: 'tool-result',\n content: invocationsWithResults.map((toolInvocation): ToolResultPart => {\n const { toolCallId, toolName, result } = toolInvocation;\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n result,\n };\n }),\n });\n }\n\n // updates for next block\n block = [];\n blockHasToolInvocations = false;\n currentStep++;\n }\n\n for (const part of message.content.parts) {\n switch (part.type) {\n case 'text': {\n if (blockHasToolInvocations) {\n processBlock(); // text must come after tool invocations\n }\n block.push(part);\n break;\n }\n case 'file':\n case 'reasoning': {\n block.push(part);\n break;\n }\n case 'tool-invocation': {\n // If we have non-tool content (text/file/reasoning) in the block, process it first\n const hasNonToolContent = block.some(\n p => p.type === 'text' || p.type === 'file' || p.type === 'reasoning',\n );\n if (hasNonToolContent || (part.toolInvocation.step ?? 0) !== currentStep) {\n processBlock();\n }\n block.push(part);\n blockHasToolInvocations = true;\n break;\n }\n }\n }\n\n processBlock();\n\n // Check if there are toolInvocations that weren't processed from parts\n const toolInvocations = message.content.toolInvocations;\n if (toolInvocations && toolInvocations.length > 0) {\n // Find tool invocations that weren't already processed from parts\n const processedToolCallIds = new Set<string>();\n for (const part of message.content.parts) {\n if (part.type === 'tool-invocation' && part.toolInvocation.toolCallId) {\n processedToolCallIds.add(part.toolInvocation.toolCallId);\n }\n }\n\n const unprocessedToolInvocations = toolInvocations.filter(\n ti => !processedToolCallIds.has(ti.toolCallId) && ti.toolName !== 'updateWorkingMemory',\n );\n\n if (unprocessedToolInvocations.length > 0) {\n // Group by step, handling undefined steps\n const invocationsByStep = new Map<number, typeof unprocessedToolInvocations>();\n\n for (const inv of unprocessedToolInvocations) {\n const step = inv.step ?? 0;\n if (!invocationsByStep.has(step)) {\n invocationsByStep.set(step, []);\n }\n invocationsByStep.get(step)!.push(inv);\n }\n\n // Process each step\n const sortedSteps = Array.from(invocationsByStep.keys()).sort((a, b) => a - b);\n\n for (const step of sortedSteps) {\n const stepInvocations = invocationsByStep.get(step)!;\n\n // Create tool-call message for all invocations (calls and results)\n pushOrCombine({\n role: 'assistant',\n ...fields,\n type: 'tool-call',\n content: [\n ...stepInvocations.map(({ toolCallId, toolName, args }) => ({\n type: 'tool-call' as const,\n toolCallId,\n toolName,\n args,\n })),\n ],\n });\n\n // Only create tool-result message if there are actual results\n const invocationsWithResults = stepInvocations.filter(ti => ti.state === 'result' && 'result' in ti);\n\n if (invocationsWithResults.length > 0) {\n pushOrCombine({\n role: 'tool',\n ...fields,\n type: 'tool-result',\n content: invocationsWithResults.map((toolInvocation): ToolResultPart => {\n const { toolCallId, toolName, result } = toolInvocation;\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n result,\n };\n }),\n });\n }\n }\n }\n }\n\n break;\n }\n\n const toolInvocations = message.content.toolInvocations;\n\n if (toolInvocations == null || toolInvocations.length === 0) {\n pushOrCombine({ role: 'assistant', ...fields, content: content || '', type: 'text' });\n break;\n }\n\n const maxStep = toolInvocations.reduce((max, toolInvocation) => {\n return Math.max(max, toolInvocation.step ?? 0);\n }, 0);\n\n for (let i = 0; i <= maxStep; i++) {\n const stepInvocations = toolInvocations.filter(\n toolInvocation => (toolInvocation.step ?? 0) === i && toolInvocation.toolName !== 'updateWorkingMemory',\n );\n\n if (stepInvocations.length === 0) {\n continue;\n }\n\n // assistant message with tool calls\n pushOrCombine({\n role: 'assistant',\n ...fields,\n type: 'tool-call',\n content: [\n ...(isLastMessage && content && i === 0 ? [{ type: 'text' as const, text: content }] : []),\n ...stepInvocations.map(({ toolCallId, toolName, args }) => ({\n type: 'tool-call' as const,\n toolCallId,\n toolName,\n args,\n })),\n ],\n });\n\n // Only create tool-result message if there are actual results\n const invocationsWithResults = stepInvocations.filter(ti => ti.state === 'result' && 'result' in ti);\n\n if (invocationsWithResults.length > 0) {\n pushOrCombine({\n role: 'tool',\n ...fields,\n type: 'tool-result',\n content: invocationsWithResults.map((toolInvocation): ToolResultPart => {\n const { toolCallId, toolName, result } = toolInvocation;\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n result,\n };\n }),\n });\n }\n }\n\n if (content && !isLastMessage) {\n pushOrCombine({ role: 'assistant', ...fields, type: 'text', content: content || '' });\n }\n\n break;\n }\n }\n }\n\n return v1Messages;\n}\n","/**\n * Fetches a URL with retry logic\n * @param url The URL to fetch\n * @param options Fetch options\n * @param maxRetries Maximum number of retry attempts\n * @returns The fetch Response if successful\n */\nexport async function fetchWithRetry(\n url: string,\n options: RequestInit = {},\n maxRetries: number = 3,\n): Promise<Response> {\n let retryCount = 0;\n let lastError: Error | null = null;\n\n while (retryCount < maxRetries) {\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n // Only retry on server errors (5xx) or network failures\n // Don't retry on client errors (4xx)\n if (response.status >= 400 && response.status < 500) {\n throw new Error(`Request failed with status: ${response.status} ${response.statusText}`);\n }\n\n lastError = new Error(`Request failed with status: ${response.status} ${response.statusText}`);\n retryCount++;\n\n if (retryCount >= maxRetries) {\n throw lastError;\n }\n\n const delay = Math.min(1000 * Math.pow(2, retryCount), 10000);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n return response;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // If it's a client error (4xx), don't retry\n if (lastError.message.includes('status: 4')) {\n throw lastError;\n }\n\n retryCount++;\n\n if (retryCount >= maxRetries) {\n break;\n }\n\n const delay = Math.min(1000 * Math.pow(2, retryCount), 10000);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError || new Error('Request failed after multiple retry attempts');\n}\n","import { isUrlSupported } from '@ai-sdk/provider-utils-v5';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { fetchWithRetry } from '../../../utils/fetchWithRetry';\nimport type { AIV5Type } from '../types';\n\nexport const downloadFromUrl = async ({ url, downloadRetries }: { url: URL; downloadRetries: number }) => {\n const urlText = url.toString();\n\n try {\n const response = await fetchWithRetry(\n urlText,\n {\n method: 'GET',\n },\n downloadRetries,\n );\n\n if (!response.ok) {\n throw new MastraError({\n id: 'DOWNLOAD_ASSETS_FAILED',\n text: 'Failed to download asset',\n domain: ErrorDomain.LLM,\n category: ErrorCategory.USER,\n });\n }\n return {\n data: new Uint8Array(await response.arrayBuffer()),\n mediaType: response.headers.get('content-type') ?? undefined,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'DOWNLOAD_ASSETS_FAILED',\n text: 'Failed to download asset',\n domain: ErrorDomain.LLM,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n};\n\nexport async function downloadAssetsFromMessages({\n messages,\n downloadConcurrency = 10,\n downloadRetries = 3,\n supportedUrls,\n}: {\n messages: AIV5Type.ModelMessage[];\n downloadConcurrency?: number;\n downloadRetries?: number;\n supportedUrls?: Record<string, RegExp[]>;\n}) {\n const pMap = (await import('p-map')).default;\n\n const filesToDownload = messages\n .filter(message => message.role === 'user')\n .map(message => message.content)\n .filter(content => Array.isArray(content))\n .flat()\n .filter(part => part.type === 'image' || part.type === 'file')\n .map(part => {\n const mediaType = part.mediaType ?? (part.type === 'image' ? 'image/*' : undefined);\n\n let data = part.type === 'image' ? part.image : part.data;\n if (typeof data === 'string') {\n try {\n data = new URL(data);\n } catch {}\n }\n\n return { mediaType, data };\n })\n\n .filter((part): part is { mediaType: string | undefined; data: URL } => part.data instanceof URL)\n .map(part => {\n return {\n url: part.data,\n isUrlSupportedByModel:\n part.mediaType != null &&\n isUrlSupported({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls: supportedUrls ?? {},\n }),\n };\n });\n\n const downloadedFiles = await pMap(\n filesToDownload,\n async fileItem => {\n if (fileItem.isUrlSupportedByModel) {\n return null;\n }\n return {\n url: fileItem.url.toString(),\n ...(await downloadFromUrl({ url: fileItem.url, downloadRetries })),\n };\n },\n {\n concurrency: downloadConcurrency,\n },\n );\n\n const downloadFileList = downloadedFiles\n .filter(\n (\n downloadedFile,\n ): downloadedFile is {\n url: string;\n mediaType: string | undefined;\n data: Uint8Array<ArrayBuffer>;\n } => downloadedFile?.data != null,\n )\n .map(({ url, data, mediaType }) => [url, { data, mediaType }]);\n\n return Object.fromEntries(downloadFileList);\n}\n","import type { MastraDBMessage } from './types';\n\n/**\n * Serialized form of a MastraDBMessage where Date is converted to string\n */\nexport type SerializedMessage = Omit<MastraDBMessage, 'createdAt'> & {\n createdAt: string;\n};\n\n/**\n * Serialize a message by converting Date to string\n */\nexport function serializeMessage(message: MastraDBMessage): SerializedMessage {\n return {\n ...message,\n createdAt: message.createdAt.toUTCString(),\n };\n}\n\n/**\n * Deserialize a message by converting string back to Date\n */\nexport function deserializeMessage(message: SerializedMessage): MastraDBMessage {\n return {\n ...message,\n createdAt: new Date(message.createdAt),\n } as MastraDBMessage;\n}\n\n/**\n * Serialize an array of messages\n */\nexport function serializeMessages(messages: MastraDBMessage[]): SerializedMessage[] {\n return messages.map(serializeMessage);\n}\n\n/**\n * Deserialize an array of messages\n */\nexport function deserializeMessages(messages: SerializedMessage[]): MastraDBMessage[] {\n return messages.map(deserializeMessage);\n}\n","import type { CoreSystemMessage } from '@internal/ai-sdk-v4';\n\nimport { serializeMessages, deserializeMessages } from './serialization';\nimport type { SerializedMessage } from './serialization';\nimport type { MastraDBMessage, MessageSource, MemoryInfo } from './types';\n\n// Re-export for backward compatibility\nexport type { MessageSource };\n\n/**\n * MessageStateManager - Manages the state of messages in a MessageList\n *\n * Handles:\n * - Tracking messages by their source (memory, input, response, context)\n * - Tracking which messages have been persisted\n * - Providing efficient lookups for message categorization\n *\n * This replaces the 8 Sets in the original MessageList with a more manageable interface.\n */\nexport class MessageStateManager {\n // Messages tracked by source\n private memoryMessages = new Set<MastraDBMessage>();\n private newUserMessages = new Set<MastraDBMessage>();\n private newResponseMessages = new Set<MastraDBMessage>();\n private userContextMessages = new Set<MastraDBMessage>();\n\n // Persisted message tracking\n private memoryMessagesPersisted = new Set<MastraDBMessage>();\n private newUserMessagesPersisted = new Set<MastraDBMessage>();\n private newResponseMessagesPersisted = new Set<MastraDBMessage>();\n private userContextMessagesPersisted = new Set<MastraDBMessage>();\n\n /**\n * Add a message to the appropriate source set and persisted set\n */\n addToSource(message: MastraDBMessage, source: MessageSource): void {\n switch (source) {\n case 'memory':\n this.memoryMessages.add(message);\n this.memoryMessagesPersisted.add(message);\n break;\n case 'response':\n this.newResponseMessages.add(message);\n this.newResponseMessagesPersisted.add(message);\n // Handle case where a client-side tool response was added as user input\n if (this.newUserMessages.has(message)) {\n this.newUserMessages.delete(message);\n }\n break;\n case 'input':\n case 'user': // deprecated alias for input\n this.newUserMessages.add(message);\n this.newUserMessagesPersisted.add(message);\n break;\n case 'context':\n this.userContextMessages.add(message);\n this.userContextMessagesPersisted.add(message);\n break;\n default:\n throw new Error(`Missing message source for message ${message}`);\n }\n }\n\n /**\n * Check if a message belongs to the memory source\n */\n isMemoryMessage(message: MastraDBMessage): boolean {\n return this.memoryMessages.has(message);\n }\n\n /**\n * Check if a message belongs to the input source\n */\n isUserMessage(message: MastraDBMessage): boolean {\n return this.newUserMessages.has(message);\n }\n\n /**\n * Check if a message belongs to the response source\n */\n isResponseMessage(message: MastraDBMessage): boolean {\n return this.newResponseMessages.has(message);\n }\n\n /**\n * Check if a message belongs to the context source\n */\n isContextMessage(message: MastraDBMessage): boolean {\n return this.userContextMessages.has(message);\n }\n\n /**\n * Get all memory messages\n */\n getMemoryMessages(): Set<MastraDBMessage> {\n return this.memoryMessages;\n }\n\n /**\n * Get all user/input messages\n */\n getUserMessages(): Set<MastraDBMessage> {\n return this.newUserMessages;\n }\n\n /**\n * Get all response messages\n */\n getResponseMessages(): Set<MastraDBMessage> {\n return this.newResponseMessages;\n }\n\n /**\n * Get all context messages\n */\n getContextMessages(): Set<MastraDBMessage> {\n return this.userContextMessages;\n }\n\n /**\n * Get persisted memory messages\n */\n getMemoryMessagesPersisted(): Set<MastraDBMessage> {\n return this.memoryMessagesPersisted;\n }\n\n /**\n * Get persisted user/input messages\n */\n getUserMessagesPersisted(): Set<MastraDBMessage> {\n return this.newUserMessagesPersisted;\n }\n\n /**\n * Get persisted response messages\n */\n getResponseMessagesPersisted(): Set<MastraDBMessage> {\n return this.newResponseMessagesPersisted;\n }\n\n /**\n * Get persisted context messages\n */\n getContextMessagesPersisted(): Set<MastraDBMessage> {\n return this.userContextMessagesPersisted;\n }\n\n /**\n * Remove a message from all source sets\n */\n removeMessage(message: MastraDBMessage): void {\n this.memoryMessages.delete(message);\n this.newUserMessages.delete(message);\n this.newResponseMessages.delete(message);\n this.userContextMessages.delete(message);\n }\n\n /**\n * Clear all user messages\n */\n clearUserMessages(): void {\n this.newUserMessages.clear();\n }\n\n /**\n * Clear all response messages\n */\n clearResponseMessages(): void {\n this.newResponseMessages.clear();\n }\n\n /**\n * Clear all context messages\n */\n clearContextMessages(): void {\n this.userContextMessages.clear();\n }\n\n /**\n * Clear all messages from all sources (but not persisted tracking)\n */\n clearAll(): void {\n this.newUserMessages.clear();\n this.newResponseMessages.clear();\n this.userContextMessages.clear();\n }\n\n /**\n * Create a lookup function to determine message source\n */\n createSourceChecker(): {\n memory: Set<string>;\n input: Set<string>;\n output: Set<string>;\n context: Set<string>;\n getSource: (message: MastraDBMessage) => MessageSource | null;\n } {\n const sources = {\n memory: new Set(Array.from(this.memoryMessages.values()).map(m => m.id)),\n output: new Set(Array.from(this.newResponseMessages.values()).map(m => m.id)),\n input: new Set(Array.from(this.newUserMessages.values()).map(m => m.id)),\n context: new Set(Array.from(this.userContextMessages.values()).map(m => m.id)),\n };\n\n return {\n ...sources,\n getSource: (msg: MastraDBMessage): MessageSource | null => {\n if (sources.memory.has(msg.id)) return 'memory';\n if (sources.input.has(msg.id)) return 'input';\n if (sources.output.has(msg.id)) return 'response';\n if (sources.context.has(msg.id)) return 'context';\n return null;\n },\n };\n }\n\n /**\n * Check if a message is a new (unsaved) user or response message by ID\n */\n isNewMessage(messageOrId: MastraDBMessage | string): boolean {\n const id = typeof messageOrId === 'string' ? messageOrId : messageOrId.id;\n\n // Check by object reference first (fast path)\n if (typeof messageOrId !== 'string') {\n if (this.newUserMessages.has(messageOrId) || this.newResponseMessages.has(messageOrId)) {\n return true;\n }\n }\n\n // Check by ID (handles copies)\n return (\n Array.from(this.newUserMessages).some(m => m.id === id) ||\n Array.from(this.newResponseMessages).some(m => m.id === id)\n );\n }\n\n /**\n * Serialize source tracking state (message IDs only)\n */\n private serializeSourceTracking(): {\n memoryMessages: string[];\n newUserMessages: string[];\n newResponseMessages: string[];\n userContextMessages: string[];\n memoryMessagesPersisted: string[];\n newUserMessagesPersisted: string[];\n newResponseMessagesPersisted: string[];\n userContextMessagesPersisted: string[];\n } {\n const serializeSet = (set: Set<MastraDBMessage>) => Array.from(set).map(value => value.id);\n\n return {\n memoryMessages: serializeSet(this.memoryMessages),\n newUserMessages: serializeSet(this.newUserMessages),\n newResponseMessages: serializeSet(this.newResponseMessages),\n userContextMessages: serializeSet(this.userContextMessages),\n memoryMessagesPersisted: serializeSet(this.memoryMessagesPersisted),\n newUserMessagesPersisted: serializeSet(this.newUserMessagesPersisted),\n newResponseMessagesPersisted: serializeSet(this.newResponseMessagesPersisted),\n userContextMessagesPersisted: serializeSet(this.userContextMessagesPersisted),\n };\n }\n\n /**\n * Deserialize source tracking state from message IDs\n */\n private deserializeSourceTracking(\n state: ReturnType<typeof this.serializeSourceTracking>,\n messages: MastraDBMessage[],\n ): void {\n const deserializeSet = (ids: string[]) =>\n new Set(ids.map(id => messages.find(m => m.id === id)).filter(Boolean) as MastraDBMessage[]);\n\n this.memoryMessages = deserializeSet(state.memoryMessages);\n this.newUserMessages = deserializeSet(state.newUserMessages);\n this.newResponseMessages = deserializeSet(state.newResponseMessages);\n this.userContextMessages = deserializeSet(state.userContextMessages);\n this.memoryMessagesPersisted = deserializeSet(state.memoryMessagesPersisted);\n this.newUserMessagesPersisted = deserializeSet(state.newUserMessagesPersisted);\n this.newResponseMessagesPersisted = deserializeSet(state.newResponseMessagesPersisted);\n this.userContextMessagesPersisted = deserializeSet(state.userContextMessagesPersisted);\n }\n\n /**\n * Serialize all MessageList state for workflow suspend/resume\n */\n serializeAll(data: {\n messages: MastraDBMessage[];\n systemMessages: CoreSystemMessage[];\n taggedSystemMessages: Record<string, CoreSystemMessage[]>;\n memoryInfo: MemoryInfo | null;\n agentNetworkAppend: boolean;\n }): SerializedMessageListState {\n return {\n messages: serializeMessages(data.messages),\n systemMessages: data.systemMessages,\n taggedSystemMessages: data.taggedSystemMessages,\n memoryInfo: data.memoryInfo,\n _agentNetworkAppend: data.agentNetworkAppend,\n ...this.serializeSourceTracking(),\n };\n }\n\n /**\n * Deserialize all MessageList state from workflow suspend/resume\n */\n deserializeAll(state: SerializedMessageListState): {\n messages: MastraDBMessage[];\n systemMessages: CoreSystemMessage[];\n taggedSystemMessages: Record<string, CoreSystemMessage[]>;\n memoryInfo: MemoryInfo | null;\n agentNetworkAppend: boolean;\n } {\n const messages = deserializeMessages(state.messages);\n\n this.deserializeSourceTracking(\n {\n memoryMessages: state.memoryMessages,\n newUserMessages: state.newUserMessages,\n newResponseMessages: state.newResponseMessages,\n userContextMessages: state.userContextMessages,\n memoryMessagesPersisted: state.memoryMessagesPersisted,\n newUserMessagesPersisted: state.newUserMessagesPersisted,\n newResponseMessagesPersisted: state.newResponseMessagesPersisted,\n userContextMessagesPersisted: state.userContextMessagesPersisted,\n },\n messages,\n );\n\n return {\n messages,\n systemMessages: state.systemMessages,\n taggedSystemMessages: state.taggedSystemMessages,\n memoryInfo: state.memoryInfo,\n agentNetworkAppend: state._agentNetworkAppend,\n };\n }\n}\n\n/**\n * Serialized form of the complete MessageList state\n */\nexport interface SerializedMessageListState {\n messages: SerializedMessage[];\n systemMessages: CoreSystemMessage[];\n taggedSystemMessages: Record<string, CoreSystemMessage[]>;\n memoryInfo: MemoryInfo | null;\n _agentNetworkAppend: boolean;\n memoryMessages: string[];\n newUserMessages: string[];\n newResponseMessages: string[];\n userContextMessages: string[];\n memoryMessagesPersisted: string[];\n newUserMessagesPersisted: string[];\n newResponseMessagesPersisted: string[];\n userContextMessagesPersisted: string[];\n}\n","import type { LanguageModelV2Prompt } from '@ai-sdk/provider-v5';\nimport type { LanguageModelV1Prompt, CoreMessage as CoreMessageV4 } from '@internal/ai-sdk-v4';\nimport type * as AIV4Type from '@internal/ai-sdk-v4';\nimport { v4 as randomUUID } from '@lukeed/uuid';\n\nimport { MastraError, ErrorDomain, ErrorCategory } from '../../error';\nimport type { IdGeneratorContext } from '../../types';\nimport { AIV4Adapter, AIV5Adapter } from './adapters';\nimport { CacheKeyGenerator } from './cache/CacheKeyGenerator';\nimport {\n aiV4CoreMessageToV1PromptMessage,\n aiV5ModelMessageToV2PromptMessage,\n coreContentToString,\n messagesAreEqual,\n inputToMastraDBMessage as convertInputToMastraDBMessage,\n aiV4UIMessagesToAIV4CoreMessages,\n aiV5UIMessagesToAIV5ModelMessages as convertAIV5UIToModelMessages,\n aiV4CoreMessagesToAIV5ModelMessages as convertAIV4CoreToAIV5ModelMessages,\n systemMessageToAIV4Core,\n StepContentExtractor,\n} from './conversion';\nimport { TypeDetector } from './detection/TypeDetector';\nimport { MessageMerger } from './merge';\nimport { convertImageFilePart } from './prompt/convert-file';\nimport { convertToV1Messages } from './prompt/convert-to-mastra-v1';\nimport { downloadAssetsFromMessages } from './prompt/download-assets';\nimport { MessageStateManager } from './state';\nimport type {\n MastraDBMessage,\n MastraMessageV1,\n MessageSource,\n MemoryInfo,\n UIMessageWithMetadata,\n SerializedMessageListState,\n} from './state';\nimport type { AIV5Type, AIV5ResponseMessage, MessageInput, MessageListInput } from './types';\nimport { ensureGeminiCompatibleMessages } from './utils/provider-compat';\n\nexport class MessageList {\n private messages: MastraDBMessage[] = [];\n\n // passed in by dev in input or context\n private systemMessages: AIV4Type.CoreSystemMessage[] = [];\n // passed in by us for a specific purpose, eg memory system message\n private taggedSystemMessages: Record<string, AIV4Type.CoreSystemMessage[]> = {};\n\n private memoryInfo: null | MemoryInfo = null;\n\n // Centralized state management for message tracking\n private stateManager = new MessageStateManager();\n\n // Legacy getters for backward compatibility - delegate to stateManager\n private get memoryMessages() {\n return this.stateManager.getMemoryMessages();\n }\n private get newUserMessages() {\n return this.stateManager.getUserMessages();\n }\n private get newResponseMessages() {\n return this.stateManager.getResponseMessages();\n }\n private get userContextMessages() {\n return this.stateManager.getContextMessages();\n }\n private get memoryMessagesPersisted() {\n return this.stateManager.getMemoryMessagesPersisted();\n }\n private get newUserMessagesPersisted() {\n return this.stateManager.getUserMessagesPersisted();\n }\n private get newResponseMessagesPersisted() {\n return this.stateManager.getResponseMessagesPersisted();\n }\n private get userContextMessagesPersisted() {\n return this.stateManager.getContextMessagesPersisted();\n }\n\n private generateMessageId?: (context?: IdGeneratorContext) => string;\n private _agentNetworkAppend = false;\n\n // Event recording for observability\n private isRecording = false;\n private recordedEvents: Array<{\n type: 'add' | 'addSystem' | 'removeByIds' | 'clear';\n source?: MessageSource;\n count?: number;\n ids?: string[];\n text?: string;\n tag?: string;\n message?: CoreMessageV4;\n }> = [];\n\n constructor({\n threadId,\n resourceId,\n generateMessageId,\n // @ts-expect-error Flag for agent network messages\n _agentNetworkAppend,\n }: { threadId?: string; resourceId?: string; generateMessageId?: (context?: IdGeneratorContext) => string } = {}) {\n if (threadId) {\n this.memoryInfo = { threadId, resourceId };\n }\n this.generateMessageId = generateMessageId;\n this._agentNetworkAppend = _agentNetworkAppend || false;\n }\n\n /**\n * Start recording mutations to the MessageList for observability/tracing\n */\n public startRecording(): void {\n this.isRecording = true;\n this.recordedEvents = [];\n }\n\n public hasRecordedEvents(): boolean {\n return this.recordedEvents.length > 0;\n }\n\n public getRecordedEvents(): Array<{\n type: 'add' | 'addSystem' | 'removeByIds' | 'clear';\n source?: MessageSource;\n count?: number;\n ids?: string[];\n text?: string;\n tag?: string;\n message?: CoreMessageV4;\n }> {\n const events = [...this.recordedEvents];\n return events;\n }\n\n /**\n * Stop recording and return the list of recorded events\n */\n public stopRecording(): Array<{\n type: 'add' | 'addSystem' | 'removeByIds' | 'clear';\n source?: MessageSource;\n count?: number;\n ids?: string[];\n text?: string;\n tag?: string;\n message?: CoreMessageV4;\n }> {\n this.isRecording = false;\n const events = this.getRecordedEvents();\n this.recordedEvents = [];\n return events;\n }\n\n public add(messages: MessageListInput, messageSource: MessageSource) {\n if (messageSource === `user`) messageSource = `input`;\n\n if (!messages) return this;\n const messageArray = Array.isArray(messages) ? messages : [messages];\n\n // Record event if recording is enabled\n if (this.isRecording) {\n this.recordedEvents.push({\n type: 'add',\n source: messageSource,\n count: messageArray.length,\n });\n }\n\n for (const message of messageArray) {\n this.addOne(\n typeof message === `string`\n ? {\n role: 'user',\n content: message,\n }\n : message,\n messageSource,\n );\n }\n return this;\n }\n\n public serialize(): SerializedMessageListState {\n return this.stateManager.serializeAll({\n messages: this.messages,\n systemMessages: this.systemMessages,\n taggedSystemMessages: this.taggedSystemMessages,\n memoryInfo: this.memoryInfo,\n agentNetworkAppend: this._agentNetworkAppend,\n });\n }\n\n /**\n * Custom serialization for tracing/observability spans.\n * Returns a clean representation with just the essential data,\n * excluding internal state tracking, methods, and implementation details.\n *\n * This is automatically called by the span serialization system when\n * a MessageList instance appears in span input/output/attributes.\n */\n public serializeForSpan(): {\n messages: Array<{ role: string; content: unknown }>;\n systemMessages: Array<{ role: string; content: unknown; tag?: string }>;\n } {\n const coreMessages = this.all.aiV4.core();\n\n return {\n messages: coreMessages.map(msg => ({\n role: msg.role,\n content: msg.content,\n })),\n systemMessages: [\n // Untagged first (base instructions)\n ...this.systemMessages.map(m => ({ role: m.role, content: m.content })),\n // Tagged after (contextual additions)\n ...Object.entries(this.taggedSystemMessages).flatMap(([tag, msgs]) =>\n msgs.map(m => ({ role: m.role, content: m.content, tag })),\n ),\n ],\n };\n }\n\n public deserialize(state: SerializedMessageListState) {\n const data = this.stateManager.deserializeAll(state);\n this.messages = data.messages;\n this.systemMessages = data.systemMessages;\n this.taggedSystemMessages = data.taggedSystemMessages;\n this.memoryInfo = data.memoryInfo;\n this._agentNetworkAppend = data.agentNetworkAppend;\n return this;\n }\n\n public makeMessageSourceChecker(): {\n memory: Set<string>;\n input: Set<string>;\n output: Set<string>;\n context: Set<string>;\n getSource: (message: MastraDBMessage) => MessageSource | null;\n } {\n return this.stateManager.createSourceChecker();\n }\n\n public getLatestUserContent(): string | null {\n const currentUserMessages = this.all.core().filter(m => m.role === 'user');\n const content = currentUserMessages.at(-1)?.content;\n if (!content) return null;\n return coreContentToString(content);\n }\n\n public get get() {\n return {\n all: this.all,\n remembered: this.remembered,\n input: this.input,\n response: this.response,\n };\n }\n public get getPersisted() {\n return {\n remembered: this.rememberedPersisted,\n input: this.inputPersisted,\n taggedSystemMessages: this.taggedSystemMessages,\n response: this.responsePersisted,\n };\n }\n\n public get clear() {\n return {\n all: {\n db: (): MastraDBMessage[] => {\n const allMessages = [...this.messages];\n this.messages = [];\n this.stateManager.clearAll();\n if (this.isRecording && allMessages.length > 0) {\n this.recordedEvents.push({\n type: 'clear',\n count: allMessages.length,\n });\n }\n return allMessages;\n },\n },\n input: {\n db: (): MastraDBMessage[] => {\n const userMessages = Array.from(this.stateManager.getUserMessages());\n this.messages = this.messages.filter(m => !this.stateManager.isUserMessage(m));\n this.stateManager.clearUserMessages();\n if (this.isRecording && userMessages.length > 0) {\n this.recordedEvents.push({\n type: 'clear',\n source: 'input',\n count: userMessages.length,\n });\n }\n return userMessages;\n },\n },\n response: {\n db: () => {\n const responseMessages = Array.from(this.stateManager.getResponseMessages());\n this.messages = this.messages.filter(m => !this.stateManager.isResponseMessage(m));\n this.stateManager.clearResponseMessages();\n if (this.isRecording && responseMessages.length > 0) {\n this.recordedEvents.push({\n type: 'clear',\n source: 'response',\n count: responseMessages.length,\n });\n }\n return responseMessages;\n },\n },\n };\n }\n\n /**\n * Remove messages by ID\n * @param ids - Array of message IDs to remove\n * @returns Array of removed messages\n */\n public removeByIds(ids: string[]): MastraDBMessage[] {\n const idsSet = new Set(ids);\n const removed: MastraDBMessage[] = [];\n this.messages = this.messages.filter(m => {\n if (idsSet.has(m.id)) {\n removed.push(m);\n this.stateManager.removeMessage(m);\n return false;\n }\n return true;\n });\n if (this.isRecording && removed.length > 0) {\n this.recordedEvents.push({\n type: 'removeByIds',\n ids,\n count: removed.length,\n });\n }\n return removed;\n }\n\n private all = {\n db: (): MastraDBMessage[] => this.messages,\n v1: (): MastraMessageV1[] => convertToV1Messages(this.all.db()),\n\n aiV5: {\n model: (): AIV5Type.ModelMessage[] => convertAIV5UIToModelMessages(this.all.aiV5.ui(), this.messages),\n ui: (): AIV5Type.UIMessage[] => this.all.db().map(AIV5Adapter.toUIMessage),\n\n // Used when calling AI SDK streamText/generateText\n prompt: (): AIV5Type.ModelMessage[] => {\n const systemMessages = convertAIV4CoreToAIV5ModelMessages(\n [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()],\n `system`,\n this.createAdapterContext(),\n this.messages,\n );\n // Filter incomplete tool calls when sending messages TO the LLM\n const modelMessages = convertAIV5UIToModelMessages(this.all.aiV5.ui(), this.messages, true);\n\n const messages = [...systemMessages, ...modelMessages];\n\n return ensureGeminiCompatibleMessages(messages);\n },\n\n // Used for creating LLM prompt messages without AI SDK streamText/generateText\n llmPrompt: async (\n options: {\n downloadConcurrency?: number;\n downloadRetries?: number;\n supportedUrls?: Record<string, RegExp[]>;\n } = {\n downloadConcurrency: 10,\n downloadRetries: 3,\n },\n ): Promise<LanguageModelV2Prompt> => {\n // Filter incomplete tool calls when sending messages TO the LLM\n const modelMessages = convertAIV5UIToModelMessages(this.all.aiV5.ui(), this.messages, true);\n const systemMessages = convertAIV4CoreToAIV5ModelMessages(\n [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()],\n `system`,\n this.createAdapterContext(),\n this.messages,\n );\n\n const downloadedAssets = await downloadAssetsFromMessages({\n messages: modelMessages,\n downloadConcurrency: options?.downloadConcurrency,\n downloadRetries: options?.downloadRetries,\n supportedUrls: options?.supportedUrls,\n });\n\n let messages = [...systemMessages, ...modelMessages];\n\n // Check if any messages have image/file content that needs processing\n const hasImageOrFileContent = modelMessages.some(\n message =>\n message.role === 'user' &&\n typeof message.content !== 'string' &&\n message.content.some(part => part.type === 'image' || part.type === 'file'),\n );\n\n if (hasImageOrFileContent) {\n messages = messages.map(message => {\n if (message.role === 'user') {\n if (typeof message.content === 'string') {\n return {\n role: 'user' as const,\n content: [{ type: 'text' as const, text: message.content }],\n providerOptions: message.providerOptions,\n } as AIV5Type.ModelMessage;\n }\n\n const convertedContent = message.content\n .map(part => {\n if (part.type === 'image' || part.type === 'file') {\n return convertImageFilePart(part, downloadedAssets);\n }\n return part;\n })\n .filter(part => part.type !== 'text' || part.text !== '');\n\n return {\n role: 'user' as const,\n content: convertedContent,\n providerOptions: message.providerOptions,\n } as AIV5Type.ModelMessage;\n }\n\n return message;\n });\n }\n\n messages = ensureGeminiCompatibleMessages(messages);\n\n return messages.map(aiV5ModelMessageToV2PromptMessage);\n },\n },\n\n /* @deprecated use list.get.all.aiV4.prompt() instead */\n prompt: () => this.all.aiV4.prompt(),\n /* @deprecated use list.get.all.aiV4.ui() */\n ui: (): UIMessageWithMetadata[] => this.all.db().map(AIV4Adapter.toUIMessage),\n /* @deprecated use list.get.all.aiV4.core() */\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.all.db().map(AIV4Adapter.toUIMessage),\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n\n // Used when calling AI SDK streamText/generateText\n prompt: () => {\n const coreMessages = this.all.aiV4.core();\n const messages = [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat(), ...coreMessages];\n\n return ensureGeminiCompatibleMessages(messages);\n },\n\n // Used for creating LLM prompt messages without AI SDK streamText/generateText\n llmPrompt: (): LanguageModelV1Prompt => {\n const coreMessages = this.all.aiV4.core();\n\n const systemMessages = [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()];\n let messages = [...systemMessages, ...coreMessages];\n\n messages = ensureGeminiCompatibleMessages(messages);\n\n return messages.map(aiV4CoreMessageToV1PromptMessage);\n },\n },\n };\n\n private remembered = {\n db: () => this.messages.filter(m => this.memoryMessages.has(m)),\n v1: () => convertToV1Messages(this.remembered.db()),\n\n aiV5: {\n model: () => convertAIV5UIToModelMessages(this.remembered.aiV5.ui(), this.messages),\n ui: (): AIV5Type.UIMessage[] => this.remembered.db().map(AIV5Adapter.toUIMessage),\n },\n\n /* @deprecated use list.get.remembered.aiV4.ui() */\n ui: (): UIMessageWithMetadata[] => this.remembered.db().map(AIV4Adapter.toUIMessage),\n /* @deprecated use list.get.remembered.aiV4.core() */\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.remembered.db().map(AIV4Adapter.toUIMessage),\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n },\n };\n private rememberedPersisted = {\n db: () => this.all.db().filter(m => this.memoryMessagesPersisted.has(m)),\n v1: () => convertToV1Messages(this.rememberedPersisted.db()),\n\n aiV5: {\n model: () => convertAIV5UIToModelMessages(this.rememberedPersisted.aiV5.ui(), this.messages),\n ui: (): AIV5Type.UIMessage[] => this.rememberedPersisted.db().map(AIV5Adapter.toUIMessage),\n },\n\n /* @deprecated use list.getPersisted.remembered.aiV4.ui() */\n ui: () => this.rememberedPersisted.db().map(AIV4Adapter.toUIMessage),\n /* @deprecated use list.getPersisted.remembered.aiV4.core() */\n core: () => aiV4UIMessagesToAIV4CoreMessages(this.rememberedPersisted.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.rememberedPersisted.db().map(AIV4Adapter.toUIMessage),\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.rememberedPersisted.aiV4.ui()),\n },\n };\n\n private input = {\n db: () => this.messages.filter(m => this.newUserMessages.has(m)),\n v1: () => convertToV1Messages(this.input.db()),\n\n aiV5: {\n model: () => convertAIV5UIToModelMessages(this.input.aiV5.ui(), this.messages),\n ui: (): AIV5Type.UIMessage[] => this.input.db().map(AIV5Adapter.toUIMessage),\n },\n\n /* @deprecated use list.get.input.aiV4.ui() instead */\n ui: () => this.input.db().map(AIV4Adapter.toUIMessage),\n /* @deprecated use list.get.core.aiV4.ui() instead */\n core: () => aiV4UIMessagesToAIV4CoreMessages(this.input.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.input.db().map(AIV4Adapter.toUIMessage),\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.input.aiV4.ui()),\n },\n };\n private inputPersisted = {\n db: (): MastraDBMessage[] => this.messages.filter(m => this.newUserMessagesPersisted.has(m)),\n v1: (): MastraMessageV1[] => convertToV1Messages(this.inputPersisted.db()),\n\n aiV5: {\n model: () => convertAIV5UIToModelMessages(this.inputPersisted.aiV5.ui(), this.messages),\n ui: (): AIV5Type.UIMessage[] => this.inputPersisted.db().map(AIV5Adapter.toUIMessage),\n },\n\n /* @deprecated use list.getPersisted.input.aiV4.ui() */\n ui: (): UIMessageWithMetadata[] => this.inputPersisted.db().map(AIV4Adapter.toUIMessage),\n /* @deprecated use list.getPersisted.input.aiV4.core() */\n core: () => aiV4UIMessagesToAIV4CoreMessages(this.inputPersisted.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.inputPersisted.db().map(AIV4Adapter.toUIMessage),\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.inputPersisted.aiV4.ui()),\n },\n };\n\n private response = {\n db: (): MastraDBMessage[] => this.messages.filter(m => this.newResponseMessages.has(m)),\n v1: (): MastraMessageV1[] => convertToV1Messages(this.response.db()),\n\n aiV5: {\n ui: (): AIV5Type.UIMessage[] => this.response.db().map(AIV5Adapter.toUIMessage),\n model: (): AIV5ResponseMessage[] =>\n convertAIV5UIToModelMessages(this.response.aiV5.ui(), this.messages).filter(\n m => m.role === `tool` || m.role === `assistant`,\n ),\n modelContent: (stepNumber?: number): AIV5Type.StepResult<any>['content'] => {\n if (typeof stepNumber === 'number') {\n // Delegate to StepContentExtractor for step-specific content extraction\n return StepContentExtractor.extractStepContent(\n this.response.aiV5.ui(),\n stepNumber,\n this.response.aiV5.stepContent,\n );\n }\n\n return this.response.aiV5.model().map(this.response.aiV5.stepContent).flat();\n },\n stepContent: (message?: AIV5Type.ModelMessage): AIV5Type.StepResult<any>['content'] => {\n // Delegate to StepContentExtractor for content conversion\n return StepContentExtractor.convertToStepContent(message, this.messages, () =>\n this.response.aiV5.model().at(-1),\n );\n },\n },\n\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.response.db().map(AIV4Adapter.toUIMessage),\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.response.aiV4.ui()),\n },\n };\n private responsePersisted = {\n db: (): MastraDBMessage[] => this.messages.filter(m => this.newResponseMessagesPersisted.has(m)),\n\n aiV5: {\n model: () => convertAIV5UIToModelMessages(this.responsePersisted.aiV5.ui(), this.messages),\n ui: (): AIV5Type.UIMessage[] => this.responsePersisted.db().map(AIV5Adapter.toUIMessage),\n },\n\n /* @deprecated use list.getPersisted.response.aiV4.ui() */\n ui: (): UIMessageWithMetadata[] => this.responsePersisted.db().map(AIV4Adapter.toUIMessage),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.responsePersisted.db().map(AIV4Adapter.toUIMessage),\n core: (): CoreMessageV4[] => aiV4UIMessagesToAIV4CoreMessages(this.responsePersisted.aiV4.ui()),\n },\n };\n\n public drainUnsavedMessages(): MastraDBMessage[] {\n const messages = this.messages.filter(m => this.newUserMessages.has(m) || this.newResponseMessages.has(m));\n this.newUserMessages.clear();\n this.newResponseMessages.clear();\n return messages;\n }\n\n public getEarliestUnsavedMessageTimestamp(): number | undefined {\n const unsavedMessages = this.messages.filter(m => this.newUserMessages.has(m) || this.newResponseMessages.has(m));\n if (unsavedMessages.length === 0) return undefined;\n // Find the earliest createdAt among unsaved messages\n return Math.min(...unsavedMessages.map(m => new Date(m.createdAt).getTime()));\n }\n\n /**\n * Check if a message is a new user or response message that should be saved.\n * Checks by message ID to handle cases where the message object may be a copy.\n */\n public isNewMessage(messageOrId: MastraDBMessage | string): boolean {\n return this.stateManager.isNewMessage(messageOrId);\n }\n\n public getSystemMessages(tag?: string): CoreMessageV4[] {\n if (tag) {\n return this.taggedSystemMessages[tag] || [];\n }\n return this.systemMessages;\n }\n\n /**\n * Get all system messages (both tagged and untagged)\n * @returns Array of all system messages\n */\n public getAllSystemMessages(): CoreMessageV4[] {\n return [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()];\n }\n\n /**\n * Clear system messages, optionally for a specific tag\n * @param tag - If provided, only clears messages with this tag. Otherwise clears untagged messages.\n */\n public clearSystemMessages(tag?: string): this {\n if (tag) {\n delete this.taggedSystemMessages[tag];\n } else {\n this.systemMessages = [];\n }\n return this;\n }\n\n /**\n * Replace all system messages with new ones\n * This clears both tagged and untagged system messages and replaces them with the provided array\n * @param messages - Array of system messages to set\n */\n public replaceAllSystemMessages(messages: CoreMessageV4[]): this {\n // Clear existing system messages\n this.systemMessages = [];\n this.taggedSystemMessages = {};\n\n // Add all new messages as untagged (processors don't need to preserve tags)\n for (const message of messages) {\n if (message.role === 'system') {\n this.systemMessages.push(message);\n }\n }\n\n return this;\n }\n\n public addSystem(\n messages:\n | CoreMessageV4\n | CoreMessageV4[]\n | AIV5Type.ModelMessage\n | AIV5Type.ModelMessage[]\n | MastraDBMessage\n | MastraDBMessage[]\n | string\n | string[]\n | null,\n tag?: string,\n ) {\n if (!messages) return this;\n for (const message of Array.isArray(messages) ? messages : [messages]) {\n this.addOneSystem(message, tag);\n }\n return this;\n }\n\n private addOneSystem(message: CoreMessageV4 | AIV5Type.ModelMessage | MastraDBMessage | string, tag?: string) {\n const coreMessage = systemMessageToAIV4Core(message);\n\n if (coreMessage.role !== `system`) {\n throw new Error(\n `Expected role \"system\" but saw ${coreMessage.role} for message ${JSON.stringify(coreMessage, null, 2)}`,\n );\n }\n\n if (tag && !this.isDuplicateSystem(coreMessage, tag)) {\n this.taggedSystemMessages[tag] ||= [];\n this.taggedSystemMessages[tag].push(coreMessage);\n if (this.isRecording) {\n this.recordedEvents.push({\n type: 'addSystem',\n tag,\n message: coreMessage,\n });\n }\n } else if (!tag && !this.isDuplicateSystem(coreMessage)) {\n this.systemMessages.push(coreMessage);\n if (this.isRecording) {\n this.recordedEvents.push({\n type: 'addSystem',\n message: coreMessage,\n });\n }\n }\n }\n\n private isDuplicateSystem(message: CoreMessageV4, tag?: string) {\n if (tag) {\n if (!this.taggedSystemMessages[tag]) return false;\n return this.taggedSystemMessages[tag].some(\n m =>\n CacheKeyGenerator.fromAIV4CoreMessageContent(m.content) ===\n CacheKeyGenerator.fromAIV4CoreMessageContent(message.content),\n );\n }\n return this.systemMessages.some(\n m =>\n CacheKeyGenerator.fromAIV4CoreMessageContent(m.content) ===\n CacheKeyGenerator.fromAIV4CoreMessageContent(message.content),\n );\n }\n\n private getMessageById(id: string) {\n return this.messages.find(m => m.id === id);\n }\n\n private shouldReplaceMessage(message: MastraDBMessage): { exists: boolean; shouldReplace?: boolean; id?: string } {\n if (!this.messages.length) return { exists: false };\n\n if (!(`id` in message) || !message?.id) {\n return { exists: false };\n }\n\n const existingMessage = this.getMessageById(message.id);\n if (!existingMessage) return { exists: false };\n\n return {\n exists: true,\n shouldReplace: !messagesAreEqual(existingMessage, message),\n id: existingMessage.id,\n };\n }\n\n private addOne(message: MessageInput, messageSource: MessageSource) {\n if (\n (!(`content` in message) ||\n (!message.content &&\n // allow empty strings\n typeof message.content !== 'string')) &&\n (!(`parts` in message) || !message.parts)\n ) {\n throw new MastraError({\n id: 'INVALID_MESSAGE_CONTENT',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: `Message with role \"${message.role}\" must have either a 'content' property (string or array) or a 'parts' property (array) that is not empty, null, or undefined. Received message: ${JSON.stringify(message, null, 2)}`,\n details: {\n role: message.role as string,\n messageSource,\n hasContent: 'content' in message,\n hasParts: 'parts' in message,\n },\n });\n }\n\n if (message.role === `system`) {\n // In the past system messages were accidentally stored in the db. these should be ignored because memory is not supposed to store system messages.\n if (messageSource === `memory`) return null;\n\n // Check if the message is in a supported format for system messages\n const isSupportedSystemFormat =\n TypeDetector.isAIV4CoreMessage(message) ||\n TypeDetector.isAIV5CoreMessage(message) ||\n TypeDetector.isMastraDBMessage(message);\n\n if (isSupportedSystemFormat) {\n return this.addSystem(message);\n }\n\n // if we didn't add the message and we didn't ignore this intentionally, then it's a problem!\n throw new MastraError({\n id: 'INVALID_SYSTEM_MESSAGE_FORMAT',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: `Invalid system message format. System messages must be CoreMessage format with 'role' and 'content' properties. The content should be a string or valid content array.`,\n details: {\n messageSource,\n receivedMessage: JSON.stringify(message, null, 2),\n },\n });\n }\n\n const messageV2 = convertInputToMastraDBMessage(message, messageSource, this.createAdapterContext());\n\n const { exists, shouldReplace, id } = this.shouldReplaceMessage(messageV2);\n\n const latestMessage = this.messages.at(-1);\n\n if (messageSource === `memory`) {\n for (const existingMessage of this.messages) {\n // don't double store any messages\n if (messagesAreEqual(existingMessage, messageV2)) {\n return;\n }\n }\n }\n // If the last message is an assistant message and the new message is also an assistant message, merge them together and update tool calls with results\n // Use MessageMerger to handle the complex merge logic\n const isLatestFromMemory = latestMessage ? this.memoryMessages.has(latestMessage) : false;\n const shouldMerge = MessageMerger.shouldMerge(\n latestMessage,\n messageV2,\n messageSource,\n isLatestFromMemory,\n this._agentNetworkAppend,\n );\n\n if (shouldMerge && latestMessage) {\n // Delegate merge logic to MessageMerger\n MessageMerger.merge(latestMessage, messageV2);\n\n // If latest message gets appended to, it should be added to the proper source\n this.pushMessageToSource(latestMessage, messageSource);\n }\n // Else the last message and this message are not both assistant messages OR an existing message has been updated and should be replaced. add a new message to the array or update an existing one.\n else {\n let existingIndex = -1;\n if (shouldReplace) {\n existingIndex = this.messages.findIndex(m => m.id === id);\n }\n const existingMessage = existingIndex !== -1 && this.messages[existingIndex];\n\n if (shouldReplace && existingMessage) {\n // If the existing message is sealed (e.g., after observation), don't replace it.\n // Instead, generate a new ID for the incoming message and add it as a new message.\n if (MessageMerger.isSealed(existingMessage)) {\n // Find the last part with sealedAt metadata in the EXISTING message.\n // The existing message has the seal boundary marker from insertObservationMarker.\n const existingParts = existingMessage.content?.parts || [];\n let sealedPartCount = 0;\n\n for (let i = existingParts.length - 1; i >= 0; i--) {\n const part = existingParts[i] as { metadata?: { mastra?: { sealedAt?: number } } };\n if (part?.metadata?.mastra?.sealedAt) {\n // The seal is at index i, so sealed content is parts 0 through i (inclusive)\n sealedPartCount = i + 1;\n break;\n }\n }\n\n // If no sealedAt found, use the entire existing message length as the boundary\n if (sealedPartCount === 0) {\n sealedPartCount = existingParts.length;\n }\n\n // Get parts from incoming message that are beyond the sealed boundary\n const incomingParts = messageV2.content.parts;\n\n let newParts: typeof incomingParts;\n\n if (incomingParts.length <= sealedPartCount) {\n // Incoming message has fewer or equal parts than the sealed boundary.\n // Check if these are truly stale (same content as the sealed message) or\n // new content flushed independently (e.g., text deltas flushed with the\n // same messageId but only containing a text part).\n if (messagesAreEqual(existingMessage, messageV2)) {\n // Stale message, ignore - don't replace, don't create new\n return this;\n }\n // Not stale — these are fresh parts (e.g., a text flush). Treat all as new.\n newParts = incomingParts;\n } else {\n newParts = incomingParts.slice(sealedPartCount);\n }\n\n // Only create a new message if there are actually new parts\n if (newParts.length > 0) {\n // Generate a new ID for the incoming message\n messageV2.id = this.generateMessageId?.({ idType: 'message', source: 'memory' }) ?? randomUUID();\n // Replace the parts with only the new ones\n messageV2.content.parts = newParts;\n // Ensure the new message has a timestamp after the sealed message\n if (messageV2.createdAt <= existingMessage.createdAt) {\n messageV2.createdAt = new Date(existingMessage.createdAt.getTime() + 1);\n }\n this.messages.push(messageV2);\n }\n // If no new parts, don't add anything (the sealed message already has all the content)\n } else {\n this.messages[existingIndex] = messageV2;\n }\n } else if (!exists) {\n this.messages.push(messageV2);\n }\n\n this.pushMessageToSource(messageV2, messageSource);\n }\n\n // make sure messages are always stored in order of when they were created!\n this.messages.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n\n return this;\n }\n\n private pushMessageToSource(messageV2: MastraDBMessage, messageSource: MessageSource) {\n this.stateManager.addToSource(messageV2, messageSource);\n }\n\n private lastCreatedAt?: number;\n // this makes sure messages added in order will always have a date atleast 1ms apart.\n private generateCreatedAt(messageSource: MessageSource, start?: unknown): Date {\n // Normalize timestamp\n const startDate: Date | undefined =\n start instanceof Date\n ? start\n : typeof start === 'string' || typeof start === 'number'\n ? new Date(start)\n : undefined;\n\n if (startDate && !this.lastCreatedAt) {\n this.lastCreatedAt = startDate.getTime();\n return startDate;\n }\n\n if (startDate && messageSource === `memory`) {\n // Preserve user-provided timestamps for memory messages to avoid re-ordering\n // Messages without timestamps will fall through to get generated incrementing timestamps\n return startDate;\n }\n\n const now = new Date();\n const nowTime = startDate?.getTime() || now.getTime();\n // find the latest createdAt in all stored messages\n const lastTime = this.messages.reduce((p, m) => {\n if (m.createdAt.getTime() > p) return m.createdAt.getTime();\n return p;\n }, this.lastCreatedAt || 0);\n\n // make sure our new message is created later than the latest known message time\n // it's expected that messages are added to the list in order if they don't have a createdAt date on them\n if (nowTime <= lastTime) {\n const newDate = new Date(lastTime + 1);\n this.lastCreatedAt = newDate.getTime();\n return newDate;\n }\n\n this.lastCreatedAt = nowTime;\n return now;\n }\n\n private newMessageId(role?: string): string {\n if (this.generateMessageId) {\n return this.generateMessageId({\n idType: 'message',\n source: 'agent',\n threadId: this.memoryInfo?.threadId,\n resourceId: this.memoryInfo?.resourceId,\n role,\n });\n }\n return randomUUID();\n }\n\n private createAdapterContext() {\n return {\n memoryInfo: this.memoryInfo,\n newMessageId: () => this.newMessageId(),\n generateCreatedAt: (messageSource: MessageSource, start?: unknown) =>\n this.generateCreatedAt(messageSource, start),\n dbMessages: this.messages,\n };\n }\n}\n","import type * as AIV4 from '@internal/ai-sdk-v4';\nimport type * as AIV5 from '@internal/ai-sdk-v5';\n\nimport type { MastraDBMessage, UIMessageWithMetadata, MessageListInput } from '../index';\n\nimport { MessageList } from '../index';\n\n/**\n * Available output formats for message conversion.\n *\n * @remarks\n * - `Mastra.V2` - Current database storage format, compatible with AI SDK v4\n * - `AIV4.UI` - AI SDK v4 UIMessage format (for frontend components)\n * - `AIV4.Core` - AI SDK v4 CoreMessage format (for LLM API calls)\n * - `AIV5.UI` - AI SDK v5 UIMessage format (for frontend components)\n * - `AIV5.Model` - AI SDK v5 ModelMessage format (for LLM API calls)\n */\nexport type OutputFormat = 'Mastra.V2' | 'AIV4.UI' | 'AIV4.Core' | 'AIV5.UI' | 'AIV5.Model';\n\nclass MessageConverter {\n private messageList: MessageList;\n\n constructor(messages: MessageListInput) {\n this.messageList = new MessageList();\n // Use 'memory' source to preserve messages exactly as provided\n // without any transformations or combinations\n this.messageList.add(messages, 'memory');\n }\n\n /**\n * Convert messages to Mastra V2 format (current database format).\n * @param format - The format 'Mastra.V2'\n * @returns Array of messages in Mastra V2 format, used for database storage\n */\n to(format: 'Mastra.V2'): MastraDBMessage[];\n /**\n * Convert messages to AI SDK v4 UIMessage format.\n * @param format - The format 'AIV4.UI'\n * @returns Array of UIMessages for use with AI SDK v4 frontend components\n */\n to(format: 'AIV4.UI'): UIMessageWithMetadata[] | AIV4.UIMessage[];\n /**\n * Convert messages to AI SDK v4 CoreMessage format.\n * @param format - The format 'AIV4.Core'\n * @returns Array of CoreMessages for AI SDK v4 LLM API calls\n */\n to(format: 'AIV4.Core'): AIV4.CoreMessage[];\n /**\n * Convert messages to AI SDK v5 UIMessage format.\n * @param format - The format 'AIV5.UI'\n * @returns Array of UIMessages for use with AI SDK v5 frontend components\n */\n to(format: 'AIV5.UI'): AIV5.UIMessage[];\n /**\n * Convert messages to AI SDK v5 ModelMessage format.\n * @param format - The format 'AIV5.Model'\n * @returns Array of ModelMessages for AI SDK v5 LLM API calls\n */\n to(format: 'AIV5.Model'): AIV5.ModelMessage[];\n to(format: OutputFormat): unknown[] {\n switch (format) {\n // Old format keys (backward compatibility)\n case 'Mastra.V2':\n return this.messageList.get.all.db();\n case 'AIV4.UI':\n return this.messageList.get.all.aiV4.ui();\n case 'AIV4.Core':\n return this.messageList.get.all.aiV4.core();\n case 'AIV5.UI':\n return this.messageList.get.all.aiV5.ui();\n case 'AIV5.Model':\n return this.messageList.get.all.aiV5.model();\n default:\n throw new Error(`Unsupported output format: ${format}`);\n }\n }\n}\n\n/**\n * Convert messages from any supported format to another format.\n *\n * @param messages - Input messages in any supported format. Accepts:\n * - AI SDK v4 formats: UIMessage, CoreMessage, Message\n * - AI SDK v5 formats: UIMessage, ModelMessage\n * - Mastra formats: MastraMessageV1 (input only), MastraDBMessage\n * - Simple strings (will be converted to user messages)\n * - Arrays of any of the above\n *\n * @returns A converter object with a `.to()` method to specify the output format\n *\n * @example\n * ```typescript\n * import { convertMessages } from '@mastra/core/agent';\n *\n * // Convert AI SDK v5 UI messages to v4 Core messages\n * const v4CoreMessages = convertMessages(v5UIMessages).to('AIV4.Core');\n *\n * // Convert database messages (Mastra V2) to AI SDK v5 UI messages for frontend\n * const v5UIMessages = convertMessages(dbMessages).to('AIV5.UI');\n *\n * // Convert any format to Mastra's V2 format for database storage\n * const mastraV2Messages = convertMessages(anyMessages).to('Mastra.V2');\n *\n * // Convert simple strings to formatted messages\n * const messages = convertMessages(['Hello', 'How are you?']).to('AIV5.UI');\n *\n * // Convert v4 UI messages to v5 Model messages for LLM calls\n * const modelMessages = convertMessages(v4UIMessages).to('AIV5.Model');\n * ```\n *\n * @remarks\n * This utility handles all message format conversions internally, including:\n * - Tool invocations and results\n * - File attachments\n * - Multi-part messages\n * - System messages\n * - Metadata preservation where possible\n */\nexport function convertMessages(messages: MessageListInput): MessageConverter {\n return new MessageConverter(messages);\n}\n"]}
|