@mastra/core 1.0.0-beta.18 → 1.0.0-beta.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/agent/agent.d.ts.map +1 -1
  3. package/dist/agent/index.cjs +11 -11
  4. package/dist/agent/index.js +2 -2
  5. package/dist/agent/message-list/index.cjs +3 -3
  6. package/dist/agent/message-list/index.d.ts +8 -0
  7. package/dist/agent/message-list/index.d.ts.map +1 -1
  8. package/dist/agent/message-list/index.js +1 -1
  9. package/dist/{chunk-ZSQ7L6AW.cjs → chunk-3LVC2TGA.cjs} +7 -7
  10. package/dist/{chunk-ZSQ7L6AW.cjs.map → chunk-3LVC2TGA.cjs.map} +1 -1
  11. package/dist/{chunk-JBEKXEX6.js → chunk-43VR5ZNS.js} +3 -3
  12. package/dist/{chunk-JBEKXEX6.js.map → chunk-43VR5ZNS.js.map} +1 -1
  13. package/dist/{chunk-G6YCU7HJ.cjs → chunk-4BYMMTK6.cjs} +5 -5
  14. package/dist/{chunk-G6YCU7HJ.cjs.map → chunk-4BYMMTK6.cjs.map} +1 -1
  15. package/dist/{chunk-CHVWQDMP.js → chunk-5ABMEQEN.js} +86 -44
  16. package/dist/chunk-5ABMEQEN.js.map +1 -0
  17. package/dist/{chunk-XIYLL4DN.cjs → chunk-5ISEMRYZ.cjs} +87 -45
  18. package/dist/chunk-5ISEMRYZ.cjs.map +1 -0
  19. package/dist/{chunk-6R4744NH.js → chunk-6CJM5Y6Z.js} +4 -4
  20. package/dist/{chunk-6R4744NH.js.map → chunk-6CJM5Y6Z.js.map} +1 -1
  21. package/dist/{chunk-O4YSWWLB.cjs → chunk-ABHX6L4P.cjs} +20 -3
  22. package/dist/chunk-ABHX6L4P.cjs.map +1 -0
  23. package/dist/{chunk-IY5QWADY.cjs → chunk-DE4ZHUSC.cjs} +14 -14
  24. package/dist/{chunk-IY5QWADY.cjs.map → chunk-DE4ZHUSC.cjs.map} +1 -1
  25. package/dist/{chunk-SDR22R4D.cjs → chunk-E77HNO5E.cjs} +14 -14
  26. package/dist/{chunk-SDR22R4D.cjs.map → chunk-E77HNO5E.cjs.map} +1 -1
  27. package/dist/{chunk-QXL3F3T2.js → chunk-HUHM6BXV.js} +50 -6
  28. package/dist/chunk-HUHM6BXV.js.map +1 -0
  29. package/dist/{chunk-BWZ6UOBF.cjs → chunk-I7HSIQRP.cjs} +15 -15
  30. package/dist/{chunk-BWZ6UOBF.cjs.map → chunk-I7HSIQRP.cjs.map} +1 -1
  31. package/dist/{chunk-RC7RN5MY.js → chunk-IIGB2Z6S.js} +3 -3
  32. package/dist/{chunk-RC7RN5MY.js.map → chunk-IIGB2Z6S.js.map} +1 -1
  33. package/dist/{chunk-4DFWV4IR.js → chunk-ILOI5OB3.js} +3 -3
  34. package/dist/chunk-ILOI5OB3.js.map +1 -0
  35. package/dist/{chunk-AAX7ZOM7.cjs → chunk-IMMRWP4F.cjs} +3 -3
  36. package/dist/chunk-IMMRWP4F.cjs.map +1 -0
  37. package/dist/{chunk-5YYAQUEF.js → chunk-M55RALU2.js} +20 -3
  38. package/dist/chunk-M55RALU2.js.map +1 -0
  39. package/dist/{chunk-P3XQ3TNY.cjs → chunk-MV7R7B6Z.cjs} +30 -30
  40. package/dist/{chunk-P3XQ3TNY.cjs.map → chunk-MV7R7B6Z.cjs.map} +1 -1
  41. package/dist/{chunk-EMLEZXTQ.cjs → chunk-MVLOJX6I.cjs} +50 -6
  42. package/dist/chunk-MVLOJX6I.cjs.map +1 -0
  43. package/dist/{chunk-SGRMJZMJ.cjs → chunk-N55KRGVI.cjs} +6 -6
  44. package/dist/{chunk-SGRMJZMJ.cjs.map → chunk-N55KRGVI.cjs.map} +1 -1
  45. package/dist/{chunk-2XX35XRX.js → chunk-O3DUSIUY.js} +35 -20
  46. package/dist/chunk-O3DUSIUY.js.map +1 -0
  47. package/dist/{chunk-Y52PV3W4.js → chunk-OSXQXATR.js} +4 -4
  48. package/dist/{chunk-Y52PV3W4.js.map → chunk-OSXQXATR.js.map} +1 -1
  49. package/dist/{chunk-GFALVOBW.cjs → chunk-S6HUG6SH.cjs} +82 -67
  50. package/dist/chunk-S6HUG6SH.cjs.map +1 -0
  51. package/dist/{chunk-NGRUGDFP.cjs → chunk-TRSSKBDY.cjs} +18 -18
  52. package/dist/{chunk-NGRUGDFP.cjs.map → chunk-TRSSKBDY.cjs.map} +1 -1
  53. package/dist/{chunk-2OOMJRXZ.cjs → chunk-UT6MASE5.cjs} +3 -3
  54. package/dist/{chunk-2OOMJRXZ.cjs.map → chunk-UT6MASE5.cjs.map} +1 -1
  55. package/dist/{chunk-AR5CF3IN.js → chunk-WDXYPI3P.js} +3 -3
  56. package/dist/{chunk-AR5CF3IN.js.map → chunk-WDXYPI3P.js.map} +1 -1
  57. package/dist/{chunk-TI6D7CAN.js → chunk-XUQY6EIK.js} +4 -4
  58. package/dist/{chunk-TI6D7CAN.js.map → chunk-XUQY6EIK.js.map} +1 -1
  59. package/dist/{chunk-IHPCE24V.js → chunk-Y3PUB5GS.js} +7 -7
  60. package/dist/{chunk-IHPCE24V.js.map → chunk-Y3PUB5GS.js.map} +1 -1
  61. package/dist/{chunk-ABMWK6JU.js → chunk-Z2JFMLEA.js} +3 -3
  62. package/dist/{chunk-ABMWK6JU.js.map → chunk-Z2JFMLEA.js.map} +1 -1
  63. package/dist/{chunk-POSO2X6D.js → chunk-ZKE2ZPHB.js} +7 -7
  64. package/dist/{chunk-POSO2X6D.js.map → chunk-ZKE2ZPHB.js.map} +1 -1
  65. package/dist/evals/index.cjs +4 -4
  66. package/dist/evals/index.js +1 -1
  67. package/dist/evals/scoreTraces/index.cjs +3 -3
  68. package/dist/evals/scoreTraces/index.js +1 -1
  69. package/dist/index.cjs +2 -2
  70. package/dist/index.js +1 -1
  71. package/dist/integration/index.cjs +2 -2
  72. package/dist/integration/index.js +1 -1
  73. package/dist/llm/index.cjs +13 -13
  74. package/dist/llm/index.js +4 -4
  75. package/dist/llm/model/gateways/models-dev.d.ts.map +1 -1
  76. package/dist/llm/model/provider-types.generated.d.ts +37 -20
  77. package/dist/loop/index.cjs +2 -2
  78. package/dist/loop/index.js +1 -1
  79. package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts.map +1 -1
  80. package/dist/mastra/index.cjs +2 -2
  81. package/dist/mastra/index.js +1 -1
  82. package/dist/memory/index.cjs +11 -11
  83. package/dist/memory/index.js +1 -1
  84. package/dist/memory/memory.d.ts +1 -1
  85. package/dist/memory/memory.d.ts.map +1 -1
  86. package/dist/memory/types.d.ts +19 -1
  87. package/dist/memory/types.d.ts.map +1 -1
  88. package/dist/models-dev-FHJWQQO5.cjs +12 -0
  89. package/dist/{models-dev-26XLUKVK.cjs.map → models-dev-FHJWQQO5.cjs.map} +1 -1
  90. package/dist/models-dev-JMCO6M5W.js +3 -0
  91. package/dist/{models-dev-HUFLQFPB.js.map → models-dev-JMCO6M5W.js.map} +1 -1
  92. package/dist/netlify-3MHHJG2E.js +3 -0
  93. package/dist/{netlify-J4QPOROO.js.map → netlify-3MHHJG2E.js.map} +1 -1
  94. package/dist/netlify-5Y33S7WL.cjs +12 -0
  95. package/dist/{netlify-CUYK2MZ2.cjs.map → netlify-5Y33S7WL.cjs.map} +1 -1
  96. package/dist/processors/index.cjs +37 -37
  97. package/dist/processors/index.js +1 -1
  98. package/dist/processors/memory/semantic-recall.d.ts +19 -1
  99. package/dist/processors/memory/semantic-recall.d.ts.map +1 -1
  100. package/dist/provider-registry-IZPSWLPV.js +3 -0
  101. package/dist/{provider-registry-IGILEKIM.js.map → provider-registry-IZPSWLPV.js.map} +1 -1
  102. package/dist/provider-registry-OZWLA7RR.cjs +40 -0
  103. package/dist/{provider-registry-XNQEGR56.cjs.map → provider-registry-OZWLA7RR.cjs.map} +1 -1
  104. package/dist/provider-registry.json +82 -40
  105. package/dist/relevance/index.cjs +3 -3
  106. package/dist/relevance/index.js +1 -1
  107. package/dist/storage/index.cjs +30 -30
  108. package/dist/storage/index.js +1 -1
  109. package/dist/stream/base/output-format-handlers.d.ts.map +1 -1
  110. package/dist/stream/base/schema.d.ts.map +1 -1
  111. package/dist/stream/index.cjs +12 -12
  112. package/dist/stream/index.js +2 -2
  113. package/dist/test-utils/llm-mock.cjs +4 -4
  114. package/dist/test-utils/llm-mock.js +1 -1
  115. package/dist/tool-loop-agent/index.cjs +4 -4
  116. package/dist/tool-loop-agent/index.js +1 -1
  117. package/dist/tools/index.cjs +4 -4
  118. package/dist/tools/index.js +1 -1
  119. package/dist/tools/is-vercel-tool.cjs +2 -2
  120. package/dist/tools/is-vercel-tool.js +1 -1
  121. package/dist/tools/validation.d.ts.map +1 -1
  122. package/dist/utils.cjs +22 -22
  123. package/dist/utils.js +1 -1
  124. package/dist/workflows/evented/index.cjs +10 -10
  125. package/dist/workflows/evented/index.js +1 -1
  126. package/dist/workflows/index.cjs +23 -23
  127. package/dist/workflows/index.js +1 -1
  128. package/package.json +4 -4
  129. package/src/llm/model/provider-types.generated.d.ts +37 -20
  130. package/dist/chunk-2XX35XRX.js.map +0 -1
  131. package/dist/chunk-4DFWV4IR.js.map +0 -1
  132. package/dist/chunk-5YYAQUEF.js.map +0 -1
  133. package/dist/chunk-AAX7ZOM7.cjs.map +0 -1
  134. package/dist/chunk-CHVWQDMP.js.map +0 -1
  135. package/dist/chunk-EMLEZXTQ.cjs.map +0 -1
  136. package/dist/chunk-GFALVOBW.cjs.map +0 -1
  137. package/dist/chunk-O4YSWWLB.cjs.map +0 -1
  138. package/dist/chunk-QXL3F3T2.js.map +0 -1
  139. package/dist/chunk-XIYLL4DN.cjs.map +0 -1
  140. package/dist/models-dev-26XLUKVK.cjs +0 -12
  141. package/dist/models-dev-HUFLQFPB.js +0 -3
  142. package/dist/netlify-CUYK2MZ2.cjs +0 -12
  143. package/dist/netlify-J4QPOROO.js +0 -3
  144. package/dist/provider-registry-IGILEKIM.js +0 -3
  145. package/dist/provider-registry-XNQEGR56.cjs +0 -40
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mastra/hooks.ts","../src/mastra/index.ts"],"names":[],"mappings":"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","file":"chunk-IHPCE24V.js","sourcesContent":["import pMap from 'p-map';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../error';\nimport { saveScorePayloadSchema } from '../evals';\nimport type { ScoringHookInput } from '../evals/types';\nimport type { Mastra } from '../mastra';\nimport type { MastraStorage } from '../storage';\n\nexport function createOnScorerHook(mastra: Mastra) {\n return async (hookData: ScoringHookInput) => {\n const storage = mastra.getStorage();\n\n if (!storage) {\n mastra.getLogger()?.warn('Storage not found, skipping score validation and saving');\n return;\n }\n\n const entityId = hookData.entity.id as string;\n const entityType = hookData.entityType;\n const scorer = hookData.scorer;\n const scorerId = scorer.id as string;\n\n if (!scorerId) {\n mastra.getLogger()?.warn('Scorer ID not found, skipping score validation and saving');\n return;\n }\n\n try {\n const scorerToUse = await findScorer(mastra, entityId, entityType, scorerId);\n\n if (!scorerToUse) {\n throw new MastraError({\n id: 'MASTRA_SCORER_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Scorer with ID ${scorerId} not found`,\n });\n }\n\n let input = hookData.input;\n let output = hookData.output;\n\n const { structuredOutput, ...rest } = hookData;\n\n const runResult = await scorerToUse.scorer.run({\n ...rest,\n input,\n output,\n });\n\n let spanId;\n let traceId;\n const currentSpan = hookData.tracingContext?.currentSpan;\n if (currentSpan && currentSpan.isValid) {\n spanId = currentSpan.id;\n traceId = currentSpan.traceId;\n }\n\n const payload = {\n ...rest,\n ...runResult,\n entityId,\n scorerId: scorerId,\n spanId,\n traceId,\n metadata: {\n structuredOutput: !!structuredOutput,\n },\n };\n await validateAndSaveScore(storage, payload);\n\n if (currentSpan && spanId && traceId) {\n await pMap(\n currentSpan.observabilityInstance.getExporters(),\n async exporter => {\n if (exporter.addScoreToTrace) {\n try {\n await exporter.addScoreToTrace({\n traceId: traceId,\n spanId: spanId,\n score: runResult.score as number,\n reason: runResult.reason as string,\n scorerName: scorerToUse.scorer.id,\n metadata: {\n ...(currentSpan.metadata ?? {}),\n },\n });\n } catch (error) {\n // Log error but don't fail the hook if exporter fails\n mastra.getLogger()?.error(`Failed to add score to trace via exporter: ${error}`);\n }\n }\n },\n { concurrency: 3 },\n );\n }\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'MASTRA_SCORER_FAILED_TO_RUN_HOOK',\n domain: ErrorDomain.SCORER,\n category: ErrorCategory.USER,\n details: {\n scorerId,\n entityId,\n entityType,\n },\n },\n error,\n );\n\n mastra.getLogger()?.trackException(mastraError);\n mastra.getLogger()?.error(mastraError.toString());\n }\n };\n}\n\nexport async function validateAndSaveScore(storage: MastraStorage, payload: unknown) {\n const scoresStore = await storage.getStore('scores');\n if (!scoresStore) {\n throw new MastraError({\n id: 'MASTRA_SCORES_STORAGE_NOT_AVAILABLE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Scores storage domain is not available',\n });\n }\n const payloadToSave = saveScorePayloadSchema.parse(payload);\n await scoresStore.saveScore(payloadToSave);\n}\n\nasync function findScorer(mastra: Mastra, entityId: string, entityType: string, scorerId: string) {\n let scorerToUse;\n if (entityType === 'AGENT') {\n const scorers = await mastra.getAgentById(entityId).listScorers();\n for (const [_, scorer] of Object.entries(scorers)) {\n if (scorer.scorer.id === scorerId) {\n scorerToUse = scorer;\n break;\n }\n }\n } else if (entityType === 'WORKFLOW') {\n const scorers = await mastra.getWorkflowById(entityId).listScorers();\n for (const [_, scorer] of Object.entries(scorers)) {\n if (scorer.scorer.id === scorerId) {\n scorerToUse = scorer;\n break;\n }\n }\n }\n\n // Fallback to mastra-registered scorer\n if (!scorerToUse) {\n const mastraRegisteredScorer = mastra.getScorerById(scorerId);\n scorerToUse = mastraRegisteredScorer ? { scorer: mastraRegisteredScorer } : undefined;\n }\n\n return scorerToUse;\n}\n","import { randomUUID } from 'node:crypto';\nimport { Agent } from '../agent';\nimport type { BundlerConfig } from '../bundler/types';\nimport { InMemoryServerCache } from '../cache';\nimport type { MastraServerCache } from '../cache';\nimport type { MastraDeployer } from '../deployer';\nimport { MastraError, ErrorDomain, ErrorCategory } from '../error';\nimport type { MastraScorer, MastraScorers, ScoringSamplingConfig } from '../evals';\nimport { EventEmitterPubSub } from '../events/event-emitter';\nimport type { PubSub } from '../events/pubsub';\nimport type { Event } from '../events/types';\nimport { AvailableHooks, registerHook } from '../hooks';\nimport type { MastraModelGateway } from '../llm/model/gateways';\nimport { LogLevel, noopLogger, ConsoleLogger } from '../logger';\nimport type { IMastraLogger } from '../logger';\nimport type { MCPServerBase } from '../mcp';\nimport type { MastraMemory } from '../memory';\nimport type { ObservabilityEntrypoint } from '../observability';\nimport { NoOpObservability } from '../observability';\nimport type { Processor } from '../processors';\nimport type { MastraServerBase } from '../server/base';\nimport type { Middleware, ServerConfig } from '../server/types';\nimport type { MastraStorage, WorkflowRuns, StorageAgentType, StorageScorerConfig } from '../storage';\nimport { augmentWithInit } from '../storage/storageWithInit';\nimport type { ToolLoopAgentLike } from '../tool-loop-agent';\nimport { isToolLoopAgentLike, toolLoopAgentToMastraAgent } from '../tool-loop-agent';\nimport type { ToolAction } from '../tools';\nimport type { MastraTTS } from '../tts';\nimport type { MastraIdGenerator } from '../types';\nimport type { MastraVector } from '../vector';\nimport type { Workflow } from '../workflows';\nimport { WorkflowEventProcessor } from '../workflows/evented/workflow-event-processor';\nimport { createOnScorerHook } from './hooks';\n\n/**\n * Creates an error for when a null/undefined value is passed to an add* method.\n * This commonly occurs when config is spread ({ ...config }) and the original\n * object had getters or non-enumerable properties.\n */\nfunction createUndefinedPrimitiveError(\n type: 'agent' | 'tool' | 'processor' | 'vector' | 'scorer' | 'workflow' | 'mcp-server' | 'gateway' | 'memory',\n value: null | undefined,\n key?: string,\n): MastraError {\n const typeLabel = type === 'mcp-server' ? 'MCP server' : type;\n const errorId = `MASTRA_ADD_${type.toUpperCase().replace('-', '_')}_UNDEFINED` as Uppercase<string>;\n return new MastraError({\n id: errorId,\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Cannot add ${typeLabel}: ${typeLabel} is ${value === null ? 'null' : 'undefined'}. This may occur if config was spread ({ ...config }) and the original object had getters or non-enumerable properties.`,\n details: { status: 400, ...(key && { key }) },\n });\n}\n\n/**\n * Configuration interface for initializing a Mastra instance.\n *\n * The Config interface defines all the optional components that can be registered\n * with a Mastra instance, including agents, workflows, storage, logging, and more.\n *\n * @template TAgents - Record of agent instances keyed by their names\n * @template TWorkflows - Record of workflow instances\n * @template TVectors - Record of vector store instances\n * @template TTTS - Record of text-to-speech instances\n * @template TLogger - Logger implementation type\n * @template TVNextNetworks - Record of agent network instances\n * @template TMCPServers - Record of MCP server instances\n * @template TScorers - Record of scorer instances\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({\n * id: 'weather-agent',\n * name: 'Weather Agent',\n * instructions: 'You help with weather information',\n * model: 'openai/gpt-5'\n * })\n * },\n * storage: new LibSQLStore({ id: 'mastra-storage', url: ':memory:' }),\n * logger: new PinoLogger({ name: 'MyApp' })\n * });\n * ```\n */\nexport interface Config<\n TAgents extends Record<string, Agent<any>> = Record<string, Agent<any>>,\n TWorkflows extends Record<string, Workflow<any, any, any, any, any, any>> = Record<\n string,\n Workflow<any, any, any, any, any, any>\n >,\n TVectors extends Record<string, MastraVector<any>> = Record<string, MastraVector<any>>,\n TTTS extends Record<string, MastraTTS> = Record<string, MastraTTS>,\n TLogger extends IMastraLogger = IMastraLogger,\n TMCPServers extends Record<string, MCPServerBase<any>> = Record<string, MCPServerBase<any>>,\n TScorers extends Record<string, MastraScorer<any, any, any, any>> = Record<string, MastraScorer<any, any, any, any>>,\n TTools extends Record<string, ToolAction<any, any, any, any, any, any>> = Record<\n string,\n ToolAction<any, any, any, any, any, any>\n >,\n TProcessors extends Record<string, Processor<any>> = Record<string, Processor<any>>,\n TMemory extends Record<string, MastraMemory> = Record<string, MastraMemory>,\n> {\n /**\n * Agents are autonomous systems that can make decisions and take actions.\n * Accepts both Mastra Agent instances and AI SDK v6 ToolLoopAgent instances.\n * ToolLoopAgent instances are automatically converted to Mastra Agents.\n */\n agents?: { [K in keyof TAgents]: TAgents[K] | ToolLoopAgentLike };\n\n /**\n * Storage provider for persisting data, conversation history, and workflow state.\n * Required for agent memory and workflow persistence.\n */\n storage?: MastraStorage;\n\n /**\n * Vector stores for semantic search and retrieval-augmented generation (RAG).\n * Used for storing and querying embeddings.\n */\n vectors?: TVectors;\n\n /**\n * Logger implementation for application logging and debugging.\n * Set to `false` to disable logging entirely.\n * @default `INFO` level in development, `WARN` in production.\n */\n logger?: TLogger | false;\n\n /**\n * Workflows provide type-safe, composable task execution with built-in error handling.\n */\n workflows?: TWorkflows;\n\n /**\n * Text-to-speech providers for voice synthesis capabilities.\n */\n tts?: TTTS;\n\n /**\n * Observability entrypoint for tracking model interactions and tracing.\n * Pass an instance of the Observability class from @mastra/observability.\n *\n * @example\n * ```typescript\n * import { Observability } from '@mastra/observability';\n *\n * new Mastra({\n * observability: new Observability({\n * default: { enabled: true }\n * })\n * })\n * ```\n */\n observability?: ObservabilityEntrypoint;\n\n /**\n * Custom ID generator function for creating unique identifiers.\n * @default `crypto.randomUUID()`\n */\n idGenerator?: MastraIdGenerator;\n\n /**\n * Deployment provider for publishing applications to cloud platforms.\n */\n deployer?: MastraDeployer;\n\n /**\n * Server configuration for HTTP endpoints and middleware.\n */\n server?: ServerConfig;\n\n /**\n * MCP servers provide tools and resources that agents can use.\n */\n mcpServers?: TMCPServers;\n\n /**\n * Bundler configuration for packaging and deployment.\n */\n bundler?: BundlerConfig;\n\n /**\n * Pub/sub system for event-driven communication between components.\n * @default EventEmitterPubSub\n */\n pubsub?: PubSub;\n\n /**\n * Scorers help assess the quality of agent responses and workflow outputs.\n */\n scorers?: TScorers;\n\n /**\n * Tools are reusable functions that agents can use to interact with external systems.\n */\n tools?: TTools;\n\n /**\n * Processors transform inputs and outputs for agents and workflows.\n */\n processors?: TProcessors;\n\n /**\n * Memory instances that can be referenced by stored agents.\n * Keys are used to look up memory instances when resolving stored agent configurations.\n */\n memory?: TMemory;\n\n /**\n * Custom model router gateways for accessing LLM providers.\n * Gateways handle provider-specific authentication, URL construction, and model resolution.\n */\n gateways?: Record<string, MastraModelGateway>;\n\n /**\n * Event handlers for custom application events.\n * Maps event topics to handler functions for event-driven architectures.\n */\n events?: {\n [topic: string]: (\n event: Event,\n cb?: () => Promise<void>,\n ) => Promise<void> | ((event: Event, cb?: () => Promise<void>) => Promise<void>)[];\n };\n}\n\n/**\n * The central orchestrator for Mastra applications, managing agents, workflows, storage, logging, observability, and more.\n *\n * The `Mastra` class serves as the main entry point and registry for all components in a Mastra application.\n * It coordinates the interaction between agents, workflows, storage systems, and other services.\n\n * @template TAgents - Record of agent instances keyed by their names\n * @template TWorkflows - Record of modern workflow instances\n * @template TVectors - Record of vector store instances for semantic search and RAG\n * @template TTTS - Record of text-to-speech provider instances\n * @template TLogger - Logger implementation type for application logging\n * @template TVNextNetworks - Record of next-generation agent network instances\n * @template TMCPServers - Record of Model Context Protocol server instances\n * @template TScorers - Record of evaluation scorer instances for measuring AI performance\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({\n * id: 'weather-agent',\n * name: 'Weather Agent',\n * instructions: 'You provide weather information',\n * model: 'openai/gpt-5',\n * tools: [getWeatherTool]\n * })\n * },\n * workflows: { dataWorkflow },\n * storage: new LibSQLStore({ id: 'mastra-storage', url: ':memory:' }),\n * logger: new PinoLogger({ name: 'MyApp' })\n * });\n * ```\n */\nexport class Mastra<\n TAgents extends Record<string, Agent<any>> = Record<string, Agent<any>>,\n TWorkflows extends Record<string, Workflow<any, any, any, any, any, any>> = Record<\n string,\n Workflow<any, any, any, any, any, any>\n >,\n TVectors extends Record<string, MastraVector<any>> = Record<string, MastraVector<any>>,\n TTTS extends Record<string, MastraTTS> = Record<string, MastraTTS>,\n TLogger extends IMastraLogger = IMastraLogger,\n TMCPServers extends Record<string, MCPServerBase<any>> = Record<string, MCPServerBase<any>>,\n TScorers extends Record<string, MastraScorer<any, any, any, any>> = Record<string, MastraScorer<any, any, any, any>>,\n TTools extends Record<string, ToolAction<any, any, any, any, any, any>> = Record<\n string,\n ToolAction<any, any, any, any, any, any>\n >,\n TProcessors extends Record<string, Processor<any>> = Record<string, Processor<any>>,\n TMemory extends Record<string, MastraMemory> = Record<string, MastraMemory>,\n> {\n #vectors?: TVectors;\n #agents: TAgents;\n #logger: TLogger;\n #workflows: TWorkflows;\n #observability: ObservabilityEntrypoint;\n #tts?: TTTS;\n #deployer?: MastraDeployer;\n #serverMiddleware: Array<{\n handler: (c: any, next: () => Promise<void>) => Promise<Response | void>;\n path: string;\n }> = [];\n\n #storage?: MastraStorage;\n #scorers?: TScorers;\n #tools?: TTools;\n #processors?: TProcessors;\n #memory?: TMemory;\n #server?: ServerConfig;\n #serverAdapter?: MastraServerBase;\n #mcpServers?: TMCPServers;\n #bundler?: BundlerConfig;\n #idGenerator?: MastraIdGenerator;\n #pubsub: PubSub;\n #gateways?: Record<string, MastraModelGateway>;\n #events: {\n [topic: string]: ((event: Event, cb?: () => Promise<void>) => Promise<void>)[];\n } = {};\n #internalMastraWorkflows: Record<string, Workflow> = {};\n // This is only used internally for server handlers that require temporary persistence\n #serverCache: MastraServerCache;\n\n get pubsub() {\n return this.#pubsub;\n }\n\n /**\n * Gets the currently configured ID generator function.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * idGenerator: () => `custom-${Date.now()}`\n * });\n * const generator = mastra.getIdGenerator();\n * console.log(generator?.()); // \"custom-1234567890\"\n * ```\n */\n public getIdGenerator() {\n return this.#idGenerator;\n }\n\n /**\n * Generates a unique identifier using the configured generator or defaults to `crypto.randomUUID()`.\n *\n * This method is used internally by Mastra for creating unique IDs for various entities\n * like workflow runs, agent conversations, and other resources that need unique identification.\n *\n * @throws {MastraError} When the custom ID generator returns an empty string\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const id = mastra.generateId();\n * console.log(id); // \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\n public generateId(): string {\n if (this.#idGenerator) {\n const id = this.#idGenerator();\n if (!id) {\n const error = new MastraError({\n id: 'MASTRA_ID_GENERATOR_RETURNED_EMPTY_STRING',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'ID generator returned an empty string, which is not allowed',\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return id;\n }\n return randomUUID();\n }\n\n /**\n * Sets a custom ID generator function for creating unique identifiers.\n *\n * The ID generator function will be used by `generateId()` instead of the default\n * `crypto.randomUUID()`. This is useful for creating application-specific ID formats\n * or integrating with existing ID generation systems.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * mastra.setIdGenerator(() => `custom-${Date.now()}`);\n * const id = mastra.generateId();\n * console.log(id); // \"custom-1234567890\"\n * ```\n */\n public setIdGenerator(idGenerator: MastraIdGenerator) {\n this.#idGenerator = idGenerator;\n }\n\n /**\n * Creates a new Mastra instance with the provided configuration.\n *\n * The constructor initializes all the components specified in the config, sets up\n * internal systems like logging and observability, and registers components with each other.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * assistant: new Agent({\n * id: 'assistant',\n * name: 'Assistant',\n * instructions: 'You are a helpful assistant',\n * model: 'openai/gpt-5'\n * })\n * },\n * storage: new PostgresStore({\n * connectionString: process.env.DATABASE_URL\n * }),\n * logger: new PinoLogger({ name: 'MyApp' }),\n * observability: { default: { enabled: true }},\n * });\n * ```\n */\n constructor(\n config?: Config<TAgents, TWorkflows, TVectors, TTTS, TLogger, TMCPServers, TScorers, TTools, TProcessors, TMemory>,\n ) {\n // This is only used internally for server handlers that require temporary persistence\n this.#serverCache = new InMemoryServerCache();\n\n if (config?.pubsub) {\n this.#pubsub = config.pubsub;\n } else {\n this.#pubsub = new EventEmitterPubSub();\n }\n\n this.#events = {};\n for (const topic in config?.events ?? {}) {\n if (!Array.isArray(config?.events?.[topic])) {\n this.#events[topic] = [config?.events?.[topic] as any];\n } else {\n this.#events[topic] = config?.events?.[topic] ?? [];\n }\n }\n\n const workflowEventProcessor = new WorkflowEventProcessor({ mastra: this });\n const workflowEventCb = async (event: Event, cb?: () => Promise<void>): Promise<void> => {\n try {\n await workflowEventProcessor.process(event, cb);\n } catch (e) {\n this.getLogger()?.error('Error processing event', e);\n }\n };\n if (this.#events.workflows) {\n this.#events.workflows.push(workflowEventCb);\n } else {\n this.#events.workflows = [workflowEventCb];\n }\n\n let logger: TLogger;\n if (config?.logger === false) {\n logger = noopLogger as unknown as TLogger;\n } else {\n if (config?.logger) {\n logger = config.logger;\n } else {\n const levelOnEnv =\n process.env.NODE_ENV === 'production' && process.env.MASTRA_DEV !== 'true' ? LogLevel.WARN : LogLevel.INFO;\n logger = new ConsoleLogger({ name: 'Mastra', level: levelOnEnv }) as unknown as TLogger;\n }\n }\n this.#logger = logger;\n\n this.#idGenerator = config?.idGenerator;\n\n let storage = config?.storage;\n\n if (storage) {\n storage = augmentWithInit(storage);\n }\n\n // Validate and assign observability instance\n if (config?.observability) {\n if (typeof config.observability.getDefaultInstance === 'function') {\n this.#observability = config.observability;\n // Set logger early\n this.#observability.setLogger({ logger: this.#logger });\n } else {\n this.#logger?.warn(\n 'Observability configuration error: Expected an Observability instance, but received a config object. ' +\n 'Import and instantiate: import { Observability } from \"@mastra/observability\"; ' +\n 'then pass: observability: new Observability({ default: { enabled: true } }). ' +\n 'Observability has been disabled.',\n );\n this.#observability = new NoOpObservability();\n }\n } else {\n this.#observability = new NoOpObservability();\n }\n\n this.#storage = storage;\n\n // Initialize all primitive storage objects first, we need to do this before adding primitives to avoid circular dependencies\n this.#vectors = {} as TVectors;\n this.#mcpServers = {} as TMCPServers;\n this.#tts = {} as TTTS;\n this.#agents = {} as TAgents;\n this.#scorers = {} as TScorers;\n this.#tools = {} as TTools;\n this.#processors = {} as TProcessors;\n this.#memory = {} as TMemory;\n this.#workflows = {} as TWorkflows;\n this.#gateways = {} as Record<string, MastraModelGateway>;\n\n // Now add primitives - order matters for auto-registration\n // Tools and processors should be added before agents and MCP servers that might use them\n // Note: We validate each entry to handle cases where config was spread ({ ...config })\n // which can cause undefined values if the source object had getters or non-enumerable properties\n if (config?.tools) {\n Object.entries(config.tools).forEach(([key, tool]) => {\n if (tool != null) {\n this.addTool(tool, key);\n }\n });\n }\n\n if (config?.processors) {\n Object.entries(config.processors).forEach(([key, processor]) => {\n if (processor != null) {\n this.addProcessor(processor, key);\n }\n });\n }\n\n if (config?.memory) {\n Object.entries(config.memory).forEach(([key, memory]) => {\n if (memory != null) {\n this.addMemory(memory, key);\n }\n });\n }\n\n if (config?.vectors) {\n Object.entries(config.vectors).forEach(([key, vector]) => {\n if (vector != null) {\n this.addVector(vector, key);\n }\n });\n }\n\n if (config?.scorers) {\n Object.entries(config.scorers).forEach(([key, scorer]) => {\n if (scorer != null) {\n this.addScorer(scorer, key);\n }\n });\n }\n\n if (config?.workflows) {\n Object.entries(config.workflows).forEach(([key, workflow]) => {\n if (workflow != null) {\n this.addWorkflow(workflow, key);\n }\n });\n }\n\n if (config?.gateways) {\n Object.entries(config.gateways).forEach(([key, gateway]) => {\n if (gateway != null) {\n this.addGateway(gateway, key);\n }\n });\n }\n\n // Add MCP servers and agents last since they might reference other primitives\n if (config?.mcpServers) {\n Object.entries(config.mcpServers).forEach(([key, server]) => {\n if (server != null) {\n this.addMCPServer(server, key);\n }\n });\n }\n\n if (config?.agents) {\n Object.entries(config.agents).forEach(([key, agent]) => {\n if (agent != null) {\n this.addAgent(agent, key);\n }\n });\n }\n\n if (config?.tts) {\n Object.entries(config.tts).forEach(([key, tts]) => {\n if (tts != null) {\n (this.#tts as Record<string, MastraTTS>)[key] = tts;\n }\n });\n }\n\n if (config?.server) {\n this.#server = config.server;\n }\n\n registerHook(AvailableHooks.ON_SCORER_RUN, createOnScorerHook(this));\n\n /*\n Initialize observability with Mastra context (after storage configured)\n */\n this.#observability.setMastraContext({ mastra: this });\n\n this.setLogger({ logger });\n }\n\n /**\n * Retrieves a registered agent by its name.\n *\n * @template TAgentName - The specific agent name type from the registered agents\n * @throws {MastraError} When the agent with the specified name is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({\n * id: 'weather-agent',\n * name: 'weather-agent',\n * instructions: 'You provide weather information',\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n * const agent = mastra.getAgent('weatherAgent');\n * const response = await agent.generate('What is the weather?');\n * ```\n */\n public getAgent<TAgentName extends keyof TAgents>(name: TAgentName): TAgents[TAgentName] {\n const agent = this.#agents?.[name];\n if (!agent) {\n const error = new MastraError({\n id: 'MASTRA_GET_AGENT_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Agent with name ${String(name)} not found`,\n details: {\n status: 404,\n agentName: String(name),\n agents: Object.keys(this.#agents ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#agents[name];\n }\n\n /**\n * Retrieves a registered agent by its unique ID.\n *\n * This method searches for an agent using its internal ID property. If no agent\n * is found with the given ID, it also attempts to find an agent using the ID as\n * a name.\n *\n * @throws {MastraError} When no agent is found with the specified ID\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * assistant: new Agent({\n * id: 'assistant',\n * name: 'assistant',\n * instructions: 'You are a helpful assistant',\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n *\n * const assistant = mastra.getAgent('assistant');\n * const sameAgent = mastra.getAgentById(assistant.id);\n * ```\n */\n public getAgentById<TAgentName extends keyof TAgents>(id: TAgents[TAgentName]['id']): TAgents[TAgentName] {\n let agent = Object.values(this.#agents).find(a => a.id === id);\n\n if (!agent) {\n try {\n agent = this.getAgent(id);\n } catch {\n // do nothing\n }\n }\n\n if (!agent) {\n const error = new MastraError({\n id: 'MASTRA_GET_AGENT_BY_AGENT_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Agent with id ${String(id)} not found`,\n details: {\n status: 404,\n agentId: String(id),\n agents: Object.keys(this.#agents ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n return agent as TAgents[TAgentName];\n }\n\n /**\n * Returns all registered agents as a record keyed by their names.\n *\n * This method provides access to the complete registry of agents, allowing you to\n * iterate over them, check what agents are available, or perform bulk operations.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({ id: 'weather-agent', name: 'weather', model: 'openai/gpt-4o' }),\n * supportAgent: new Agent({ id: 'support-agent', name: 'support', model: 'openai/gpt-4o' })\n * }\n * });\n *\n * const allAgents = mastra.listAgents();\n * console.log(Object.keys(allAgents)); // ['weatherAgent', 'supportAgent']\n * ```\n */\n public listAgents() {\n return this.#agents;\n }\n\n /**\n * Retrieves a stored agent from the database by its unique identifier.\n *\n * By default, returns an executable Agent instance. Set `raw: true` to get\n * the raw stored configuration data instead.\n *\n * @param id - The unique identifier of the stored agent\n * @param options - Options for the query\n * @param options.raw - If true, returns raw stored data instead of Agent instance\n *\n * @throws {MastraError} When storage is not configured or doesn't support agents\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * storage: new PostgresStore({ connectionString: process.env.DATABASE_URL })\n * });\n *\n * // Get as executable Agent instance (default)\n * const agent = await mastra.getStoredAgentById('my-agent-id');\n * if (agent) {\n * const response = await agent.generate('Hello!');\n * console.log(response.text);\n * }\n *\n * // Get raw stored configuration\n * const rawConfig = await mastra.getStoredAgentById('my-agent-id', { raw: true });\n * if (rawConfig) {\n * console.log(rawConfig.instructions);\n * }\n * ```\n */\n public async getStoredAgentById(id: string, options?: { raw?: false }): Promise<Agent | null>;\n public async getStoredAgentById(id: string, options: { raw: true }): Promise<StorageAgentType | null>;\n public async getStoredAgentById(id: string, options?: { raw?: boolean }): Promise<Agent | StorageAgentType | null> {\n const storage = this.#storage;\n\n if (!storage) {\n const error = new MastraError({\n id: 'MASTRA_GET_STORED_AGENT_STORAGE_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Storage is not configured',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const agentsStore = await storage.getStore('agents');\n if (!agentsStore) {\n const error = new MastraError({\n id: 'MASTRA_GET_STORED_AGENT_NOT_SUPPORTED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Agents storage is not available',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const storedAgent = await agentsStore.getAgentById({ id });\n\n if (!storedAgent) {\n return null;\n }\n\n if (options?.raw) {\n return storedAgent;\n }\n\n return this.#createAgentFromStoredConfig(storedAgent);\n }\n\n /**\n * Lists all stored agents from the database with optional pagination.\n *\n * By default, returns executable Agent instances. Set `raw: true` to get\n * the raw stored configuration data instead.\n *\n * @param args - Options for pagination and output format\n * @param args.page - Zero-indexed page number (default: 0)\n * @param args.perPage - Items per page, or false for all (default: 100)\n * @param args.orderBy - Sort order configuration\n * @param args.raw - If true, returns raw stored data instead of Agent instances\n *\n * @throws {MastraError} When storage is not configured or doesn't support agents\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * storage: new PostgresStore({ connectionString: process.env.DATABASE_URL })\n * });\n *\n * // List as executable Agent instances (default)\n * const result = await mastra.listStoredAgents();\n * for (const agent of result.agents) {\n * const response = await agent.generate('Hello!');\n * }\n *\n * // List raw stored configurations\n * const rawResult = await mastra.listStoredAgents({ raw: true });\n * for (const config of rawResult.agents) {\n * console.log(config.instructions, config.createdAt);\n * }\n *\n * // With pagination\n * const paginated = await mastra.listStoredAgents({\n * page: 0,\n * perPage: 10,\n * orderBy: { field: 'createdAt', direction: 'DESC' }\n * });\n * ```\n */\n public async listStoredAgents(args?: {\n page?: number;\n perPage?: number | false;\n orderBy?: { field: 'createdAt' | 'updatedAt'; direction: 'ASC' | 'DESC' };\n raw?: false;\n }): Promise<{\n agents: Agent[];\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }>;\n public async listStoredAgents(args: {\n page?: number;\n perPage?: number | false;\n orderBy?: { field: 'createdAt' | 'updatedAt'; direction: 'ASC' | 'DESC' };\n raw: true;\n }): Promise<{\n agents: StorageAgentType[];\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }>;\n public async listStoredAgents(args?: {\n page?: number;\n perPage?: number | false;\n orderBy?: { field: 'createdAt' | 'updatedAt'; direction: 'ASC' | 'DESC' };\n raw?: boolean;\n }): Promise<{\n agents: Agent[] | StorageAgentType[];\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }> {\n const storage = this.#storage;\n\n if (!storage) {\n const error = new MastraError({\n id: 'MASTRA_LIST_STORED_AGENTS_STORAGE_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Storage is not configured',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const agentsStore = await storage.getStore('agents');\n if (!agentsStore) {\n const error = new MastraError({\n id: 'MASTRA_LIST_STORED_AGENTS_NOT_SUPPORTED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Agents storage is not available',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const result = await agentsStore.listAgents({\n page: args?.page,\n perPage: args?.perPage,\n orderBy: args?.orderBy,\n });\n\n if (args?.raw) {\n return result;\n }\n\n // Transform stored configs into Agent instances\n const agents = result.agents.map(storedAgent => this.#createAgentFromStoredConfig(storedAgent));\n\n return {\n agents,\n total: result.total,\n page: result.page,\n perPage: result.perPage,\n hasMore: result.hasMore,\n };\n }\n\n /**\n * Creates an Agent instance from a stored agent configuration.\n * @private\n */\n #createAgentFromStoredConfig(storedAgent: StorageAgentType): Agent {\n // Build model config from stored data\n // The model field stores { provider, name, ...otherConfig }\n const modelConfig = storedAgent.model as { provider?: string; name?: string; [key: string]: unknown };\n\n // Build the model string in \"provider/modelName\" format\n if (!modelConfig.provider || !modelConfig.name) {\n throw new MastraError({\n id: 'MASTRA_STORED_AGENT_INVALID_MODEL',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Stored agent \"${storedAgent.id}\" has invalid model configuration. Both provider and name are required.`,\n details: { agentId: storedAgent.id, model: JSON.stringify(storedAgent.model) },\n });\n }\n\n // Use model router format: \"provider/modelName\"\n const model = `${modelConfig.provider}/${modelConfig.name}`;\n\n // Resolve tools from the stored tool references\n const tools = this.#resolveStoredTools(storedAgent.tools);\n\n // Resolve workflows from the stored workflow references\n const workflows = this.#resolveStoredWorkflows(storedAgent.workflows);\n\n // Resolve sub-agents from the stored agent references\n const agents = this.#resolveStoredAgents(storedAgent.agents);\n\n // Resolve memory from the stored memory reference\n const memory = this.#resolveStoredMemory(storedAgent.memory);\n\n // Resolve scorers from the stored scorer references\n const scorers = this.#resolveStoredScorers(storedAgent.scorers);\n\n // Create the agent instance\n const agent = new Agent({\n id: storedAgent.id,\n name: storedAgent.name,\n description: storedAgent.description,\n instructions: storedAgent.instructions,\n model,\n tools,\n workflows,\n agents,\n memory,\n scorers,\n defaultOptions: storedAgent.defaultOptions,\n });\n\n // Register the agent with Mastra\n agent.__setLogger(this.#logger);\n agent.__registerMastra(this);\n agent.__registerPrimitives({\n logger: this.getLogger(),\n storage: this.getStorage(),\n agents: this.#agents as Record<string, Agent<any>>,\n tts: this.#tts,\n vectors: this.#vectors,\n });\n\n return agent;\n }\n\n /**\n * Resolves tool references from stored configuration to actual tool instances.\n * @private\n */\n #resolveStoredTools(storedTools?: string[]): Record<string, ToolAction<any, any, any, any, any, any>> {\n if (!storedTools || storedTools.length === 0) {\n return {};\n }\n\n const resolvedTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n const registeredTools = this.#tools;\n\n for (const toolKey of storedTools) {\n // Try to find the tool in registered tools\n if (registeredTools && registeredTools[toolKey]) {\n resolvedTools[toolKey] = registeredTools[toolKey];\n } else {\n // Tool reference exists but tool is not registered - log warning\n this.#logger?.warn(`Tool \"${toolKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n\n return resolvedTools;\n }\n\n /**\n * Resolves workflow references from stored configuration to actual workflow instances.\n * @private\n */\n #resolveStoredWorkflows(storedWorkflows?: string[]): Record<string, Workflow<any, any, any, any, any, any>> {\n if (!storedWorkflows || storedWorkflows.length === 0) {\n return {};\n }\n\n const resolvedWorkflows: Record<string, Workflow<any, any, any, any, any, any>> = {};\n\n for (const workflowKey of storedWorkflows) {\n // Try to find the workflow in registered workflows\n try {\n const workflow = this.getWorkflow(workflowKey);\n resolvedWorkflows[workflowKey] = workflow;\n } catch {\n // Try by ID\n try {\n const workflow = this.getWorkflowById(workflowKey);\n resolvedWorkflows[workflowKey] = workflow;\n } catch {\n this.#logger?.warn(`Workflow \"${workflowKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n\n return resolvedWorkflows;\n }\n\n /**\n * Resolves agent references from stored configuration to actual agent instances.\n * @private\n */\n #resolveStoredAgents(storedAgents?: string[]): Record<string, Agent<any>> {\n if (!storedAgents || storedAgents.length === 0) {\n return {};\n }\n\n const resolvedAgents: Record<string, Agent<any>> = {};\n\n for (const agentKey of storedAgents) {\n // Try to find the agent in registered agents\n try {\n const agent = this.getAgent(agentKey as keyof TAgents);\n resolvedAgents[agentKey] = agent;\n } catch {\n // Try by ID\n try {\n const agent = this.getAgentById(agentKey as TAgents[keyof TAgents]['id']);\n resolvedAgents[agentKey] = agent;\n } catch {\n this.#logger?.warn(`Agent \"${agentKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n\n return resolvedAgents;\n }\n\n /**\n * Resolves memory reference from stored configuration to actual memory instance.\n * @private\n */\n #resolveStoredMemory(storedMemory?: string): MastraMemory | undefined {\n if (!storedMemory) {\n return undefined;\n }\n\n // Try by key first\n try {\n return this.getMemory(storedMemory as keyof TMemory);\n } catch {\n // Try by id\n try {\n return this.getMemoryById(storedMemory);\n } catch {\n this.#logger?.warn(`Memory \"${storedMemory}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n\n return undefined;\n }\n\n /**\n * Resolves scorer references from stored configuration to actual scorer instances.\n * @private\n */\n #resolveStoredScorers(storedScorers?: Record<string, StorageScorerConfig>): MastraScorers | undefined {\n if (!storedScorers) {\n return undefined;\n }\n\n const resolvedScorers: MastraScorers = {};\n\n for (const [scorerKey, scorerConfig] of Object.entries(storedScorers)) {\n // Try to find the scorer in registered scorers by key\n try {\n const scorer = this.getScorer(scorerKey as keyof TScorers);\n resolvedScorers[scorerKey] = {\n scorer,\n sampling: scorerConfig.sampling as ScoringSamplingConfig | undefined,\n };\n } catch {\n // Try by ID\n try {\n const scorer = this.getScorerById(scorerKey);\n resolvedScorers[scorerKey] = {\n scorer,\n sampling: scorerConfig.sampling as ScoringSamplingConfig | undefined,\n };\n } catch {\n this.#logger?.warn(`Scorer \"${scorerKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n\n return Object.keys(resolvedScorers).length > 0 ? resolvedScorers : undefined;\n }\n\n /**\n * Adds a new agent to the Mastra instance.\n *\n * This method allows dynamic registration of agents after the Mastra instance\n * has been created. The agent will be initialized with the current logger.\n *\n * @throws {MastraError} When an agent with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newAgent = new Agent({\n * id: 'chat-agent',\n * name: 'Chat Assistant',\n * model: 'openai/gpt-4o'\n * });\n * mastra.addAgent(newAgent); // Uses agent.id as key\n * // or\n * mastra.addAgent(newAgent, 'customKey'); // Uses custom key\n * ```\n */\n public addAgent<A extends Agent<any> | ToolLoopAgentLike>(agent: A, key?: string): void {\n if (!agent) {\n throw createUndefinedPrimitiveError('agent', agent, key);\n }\n let mastraAgent: Agent<any>;\n if (isToolLoopAgentLike(agent)) {\n // Pass the config key as the name if the ToolLoopAgent doesn't have an id\n mastraAgent = toolLoopAgentToMastraAgent(agent, { fallbackName: key });\n } else {\n mastraAgent = agent;\n }\n const agentKey = key || mastraAgent.id;\n const agents = this.#agents as Record<string, Agent<any>>;\n if (agents[agentKey]) {\n const logger = this.getLogger();\n logger.debug(`Agent with key ${agentKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the agent\n mastraAgent.__setLogger(this.#logger);\n mastraAgent.__registerMastra(this);\n mastraAgent.__registerPrimitives({\n logger: this.getLogger(),\n storage: this.getStorage(),\n agents: agents,\n tts: this.#tts,\n vectors: this.#vectors,\n });\n agents[agentKey] = mastraAgent;\n\n // Register configured processor workflows from the agent\n // Use .then() to handle async resolution without blocking the constructor\n // This excludes memory-derived processors to avoid triggering memory factory functions\n mastraAgent\n .getConfiguredProcessorWorkflows()\n .then(processorWorkflows => {\n for (const workflow of processorWorkflows) {\n this.addWorkflow(workflow, workflow.id);\n }\n })\n .catch(err => {\n this.#logger?.debug(`Failed to register processor workflows for agent ${agentKey}:`, err);\n });\n }\n\n /**\n * Retrieves a registered vector store by its name.\n *\n * @template TVectorName - The specific vector store name type from the registered vectors\n * @throws {MastraError} When the vector store with the specified name is not found\n *\n * @example Using a vector store for semantic search\n * ```typescript\n * import { PineconeVector } from '@mastra/pinecone';\n * import { OpenAIEmbedder } from '@mastra/embedders';\n *\n * const mastra = new Mastra({\n * vectors: {\n * knowledge: new PineconeVector({\n * apiKey: process.env.PINECONE_API_KEY,\n * indexName: 'knowledge-base',\n * embedder: new OpenAIEmbedder({\n * apiKey: process.env.OPENAI_API_KEY,\n * model: 'text-embedding-3-small'\n * })\n * }),\n * products: new PineconeVector({\n * apiKey: process.env.PINECONE_API_KEY,\n * indexName: 'product-catalog'\n * })\n * }\n * });\n *\n * // Get a vector store and perform semantic search\n * const knowledgeBase = mastra.getVector('knowledge');\n * const results = await knowledgeBase.query({\n * query: 'How to reset password?',\n * topK: 5\n * });\n *\n * console.log('Relevant documents:', results);\n * ```\n */\n public getVector<TVectorName extends keyof TVectors>(name: TVectorName): TVectors[TVectorName] {\n const vector = this.#vectors?.[name];\n if (!vector) {\n const error = new MastraError({\n id: 'MASTRA_GET_VECTOR_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Vector with name ${String(name)} not found`,\n details: {\n status: 404,\n vectorName: String(name),\n vectors: Object.keys(this.#vectors ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return vector;\n }\n\n /**\n * Retrieves a specific vector store instance by its ID.\n *\n * This method searches for a vector store by its internal ID property.\n * If not found by ID, it falls back to searching by registration key.\n *\n * @throws {MastraError} When the specified vector store is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * vectors: {\n * embeddings: chromaVector\n * }\n * });\n *\n * const vectorStore = mastra.getVectorById('chroma-123');\n * ```\n */\n public getVectorById<TVectorName extends keyof TVectors>(id: TVectors[TVectorName]['id']): TVectors[TVectorName] {\n const allVectors = this.#vectors ?? ({} as Record<string, MastraVector>);\n\n // First try to find by internal ID\n for (const vector of Object.values(allVectors)) {\n if (vector.id === id) {\n return vector as TVectors[TVectorName];\n }\n }\n\n // Fallback to searching by registration key\n const vectorByKey = allVectors[id];\n if (vectorByKey) {\n return vectorByKey as TVectors[TVectorName];\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_VECTOR_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Vector store with id ${id} not found`,\n details: {\n status: 404,\n vectorId: String(id),\n vectors: Object.keys(allVectors).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Returns all registered vector stores as a record keyed by their names.\n *\n * @example Listing all vector stores\n * ```typescript\n * const mastra = new Mastra({\n * vectors: {\n * documents: new PineconeVector({ indexName: 'docs' }),\n * images: new PineconeVector({ indexName: 'images' }),\n * products: new ChromaVector({ collectionName: 'products' })\n * }\n * });\n *\n * const allVectors = mastra.getVectors();\n * console.log(Object.keys(allVectors)); // ['documents', 'images', 'products']\n *\n * // Check vector store types and configurations\n * for (const [name, vectorStore] of Object.entries(allVectors)) {\n * console.log(`Vector store ${name}:`, vectorStore.constructor.name);\n * }\n * ```\n */\n public listVectors(): TVectors | undefined {\n return this.#vectors;\n }\n\n /**\n * Adds a new vector store to the Mastra instance.\n *\n * This method allows dynamic registration of vector stores after the Mastra instance\n * has been created. The vector store will be initialized with the current logger.\n *\n * @throws {MastraError} When a vector store with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newVector = new ChromaVector({ id: 'chroma-embeddings' });\n * mastra.addVector(newVector); // Uses vector.id as key\n * // or\n * mastra.addVector(newVector, 'customKey'); // Uses custom key\n * ```\n */\n public addVector<V extends MastraVector>(vector: V, key?: string): void {\n if (!vector) {\n throw createUndefinedPrimitiveError('vector', vector, key);\n }\n const vectorKey = key || vector.id;\n const vectors = this.#vectors as Record<string, MastraVector>;\n if (vectors[vectorKey]) {\n const logger = this.getLogger();\n logger.debug(`Vector with key ${vectorKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the vector with the logger\n vector.__setLogger(this.#logger || this.getLogger());\n vectors[vectorKey] = vector;\n }\n\n /**\n * @deprecated Use listVectors() instead\n */\n public getVectors(): TVectors | undefined {\n console.warn('getVectors() is deprecated. Use listVectors() instead.');\n return this.listVectors();\n }\n\n /**\n * Gets the currently configured deployment provider.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * deployer: new VercelDeployer({\n * token: process.env.VERCEL_TOKEN,\n * projectId: process.env.VERCEL_PROJECT_ID\n * })\n * });\n *\n * const deployer = mastra.getDeployer();\n * if (deployer) {\n * await deployer.deploy({\n * name: 'my-mastra-app',\n * environment: 'production'\n * });\n * }\n * ```\n */\n public getDeployer() {\n return this.#deployer;\n }\n\n /**\n * Retrieves a registered workflow by its ID.\n *\n * @template TWorkflowId - The specific workflow ID type from the registered workflows\n * @throws {MastraError} When the workflow with the specified ID is not found\n *\n * @example Getting and executing a workflow\n * ```typescript\n * import { createWorkflow, createStep } from '@mastra/core/workflows';\n * import { z } from 'zod';\n *\n * const processDataWorkflow = createWorkflow({\n * name: 'process-data',\n * triggerSchema: z.object({ input: z.string() })\n * })\n * .then(validateStep)\n * .then(transformStep)\n * .then(saveStep)\n * .commit();\n *\n * const mastra = new Mastra({\n * workflows: {\n * dataProcessor: processDataWorkflow\n * }\n * });\n * ```\n */\n public getWorkflow<TWorkflowId extends keyof TWorkflows>(\n id: TWorkflowId,\n { serialized }: { serialized?: boolean } = {},\n ): TWorkflows[TWorkflowId] {\n const workflow = this.#workflows?.[id];\n if (!workflow) {\n const error = new MastraError({\n id: 'MASTRA_GET_WORKFLOW_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Workflow with ID ${String(id)} not found`,\n details: {\n status: 404,\n workflowId: String(id),\n workflows: Object.keys(this.#workflows ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n if (serialized) {\n return { name: workflow.name } as TWorkflows[TWorkflowId];\n }\n\n return workflow;\n }\n\n __registerInternalWorkflow(workflow: Workflow) {\n workflow.__registerMastra(this);\n workflow.__registerPrimitives({\n logger: this.getLogger(),\n });\n this.#internalMastraWorkflows[workflow.id] = workflow;\n }\n\n __hasInternalWorkflow(id: string): boolean {\n return Object.values(this.#internalMastraWorkflows).some(workflow => workflow.id === id);\n }\n\n __getInternalWorkflow(id: string): Workflow {\n const workflow = Object.values(this.#internalMastraWorkflows).find(a => a.id === id);\n if (!workflow) {\n throw new MastraError({\n id: 'MASTRA_GET_INTERNAL_WORKFLOW_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.SYSTEM,\n text: `Workflow with id ${String(id)} not found`,\n details: {\n status: 404,\n workflowId: String(id),\n },\n });\n }\n\n return workflow;\n }\n\n /**\n * Retrieves a registered workflow by its unique ID.\n *\n * This method searches for a workflow using its internal ID property. If no workflow\n * is found with the given ID, it also attempts to find a workflow using the ID as\n * a name.\n *\n * @throws {MastraError} When no workflow is found with the specified ID\n *\n * @example Finding a workflow by ID\n * ```typescript\n * const mastra = new Mastra({\n * workflows: {\n * dataProcessor: createWorkflow({\n * name: 'process-data',\n * triggerSchema: z.object({ input: z.string() })\n * }).commit()\n * }\n * });\n *\n * // Get the workflow's ID\n * const workflow = mastra.getWorkflow('dataProcessor');\n * const workflowId = workflow.id;\n *\n * // Later, retrieve the workflow by ID\n * const sameWorkflow = mastra.getWorkflowById(workflowId);\n * console.log(sameWorkflow.name); // \"process-data\"\n * ```\n */\n public getWorkflowById<TWorkflowName extends keyof TWorkflows>(\n id: TWorkflows[TWorkflowName]['id'],\n ): TWorkflows[TWorkflowName] {\n let workflow = Object.values(this.#workflows).find(a => a.id === id);\n\n if (!workflow) {\n try {\n workflow = this.getWorkflow(id);\n } catch {\n // do nothing\n }\n }\n\n if (!workflow) {\n const error = new MastraError({\n id: 'MASTRA_GET_WORKFLOW_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Workflow with id ${String(id)} not found`,\n details: {\n status: 404,\n workflowId: String(id),\n workflows: Object.keys(this.#workflows ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n return workflow as TWorkflows[TWorkflowName];\n }\n\n public async listActiveWorkflowRuns(): Promise<WorkflowRuns> {\n const storage = this.#storage;\n if (!storage) {\n this.#logger.debug('Cannot get active workflow runs. Mastra storage is not initialized');\n return { runs: [], total: 0 };\n }\n\n // Get all workflows with default engine type\n const defaultEngineWorkflows = Object.values(this.#workflows).filter(workflow => workflow.engineType === 'default');\n\n // Collect all active runs for workflows with default engine type\n const allRuns: WorkflowRuns['runs'] = [];\n let allTotal = 0;\n\n for (const workflow of defaultEngineWorkflows) {\n const runningRuns = await workflow.listWorkflowRuns({ status: 'running' });\n const waitingRuns = await workflow.listWorkflowRuns({ status: 'waiting' });\n\n allRuns.push(...runningRuns.runs, ...waitingRuns.runs);\n allTotal += runningRuns.total + waitingRuns.total;\n }\n\n return {\n runs: allRuns,\n total: allTotal,\n };\n }\n\n public async restartAllActiveWorkflowRuns(): Promise<void> {\n const activeRuns = await this.listActiveWorkflowRuns();\n if (activeRuns.runs.length > 0) {\n this.#logger.debug(\n `Restarting ${activeRuns.runs.length} active workflow run${activeRuns.runs.length > 1 ? 's' : ''}`,\n );\n }\n for (const runSnapshot of activeRuns.runs) {\n const workflow = this.getWorkflowById(runSnapshot.workflowName);\n try {\n const run = await workflow.createRun({ runId: runSnapshot.runId });\n await run.restart();\n this.#logger.debug(`Restarted ${runSnapshot.workflowName} workflow run ${runSnapshot.runId}`);\n } catch (error) {\n this.#logger.error(`Failed to restart ${runSnapshot.workflowName} workflow run ${runSnapshot.runId}: ${error}`);\n }\n }\n }\n\n /**\n * Returns all registered scorers as a record keyed by their IDs.\n *\n * @example Listing all scorers\n * ```typescript\n * import { HelpfulnessScorer, AccuracyScorer, RelevanceScorer } from '@mastra/scorers';\n *\n * const mastra = new Mastra({\n * scorers: {\n * helpfulness: new HelpfulnessScorer(),\n * accuracy: new AccuracyScorer(),\n * relevance: new RelevanceScorer()\n * }\n * });\n *\n * const allScorers = mastra.listScorers();\n * console.log(Object.keys(allScorers)); // ['helpfulness', 'accuracy', 'relevance']\n *\n * // Check scorer configurations\n * for (const [id, scorer] of Object.entries(allScorers)) {\n * console.log(`Scorer ${id}:`, scorer.id, scorer.name, scorer.description);\n * }\n * ```\n */\n public listScorers() {\n return this.#scorers;\n }\n\n /**\n * Adds a new scorer to the Mastra instance.\n *\n * This method allows dynamic registration of scorers after the Mastra instance\n * has been created.\n *\n * @throws {MastraError} When a scorer with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newScorer = new MastraScorer({\n * id: 'quality-scorer',\n * name: 'Quality Scorer'\n * });\n * mastra.addScorer(newScorer); // Uses scorer.id as key\n * // or\n * mastra.addScorer(newScorer, 'customKey'); // Uses custom key\n * ```\n */\n public addScorer<S extends MastraScorer<any, any, any, any>>(scorer: S, key?: string): void {\n if (!scorer) {\n throw createUndefinedPrimitiveError('scorer', scorer, key);\n }\n const scorerKey = key || scorer.id;\n const scorers = this.#scorers as Record<string, MastraScorer<any, any, any, any>>;\n if (scorers[scorerKey]) {\n const logger = this.getLogger();\n logger.debug(`Scorer with key ${scorerKey} already exists. Skipping addition.`);\n return;\n }\n\n // Register Mastra instance with scorer to enable custom gateway access\n scorer.__registerMastra(this);\n\n scorers[scorerKey] = scorer;\n }\n\n /**\n * Retrieves a registered scorer by its key.\n *\n * @template TScorerKey - The specific scorer key type from the registered scorers\n * @throws {MastraError} When the scorer with the specified key is not found\n *\n * @example Getting and using a scorer\n * ```typescript\n * import { HelpfulnessScorer, AccuracyScorer } from '@mastra/scorers';\n *\n * const mastra = new Mastra({\n * scorers: {\n * helpfulness: new HelpfulnessScorer({\n * model: 'openai/gpt-4o',\n * criteria: 'Rate how helpful this response is'\n * }),\n * accuracy: new AccuracyScorer({\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n *\n * // Get a specific scorer\n * const helpfulnessScorer = mastra.getScorer('helpfulness');\n * const score = await helpfulnessScorer.score({\n * input: 'How do I reset my password?',\n * output: 'You can reset your password by clicking the forgot password link.',\n * expected: 'Detailed password reset instructions'\n * });\n *\n * console.log('Helpfulness score:', score);\n * ```\n */\n public getScorer<TScorerKey extends keyof TScorers>(key: TScorerKey): TScorers[TScorerKey] {\n const scorer = this.#scorers?.[key];\n if (!scorer) {\n const error = new MastraError({\n id: 'MASTRA_GET_SCORER_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Scorer with ${String(key)} not found`,\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return scorer;\n }\n\n /**\n * Retrieves a registered scorer by its name.\n *\n * This method searches through all registered scorers to find one with the specified name.\n * Unlike `getScorer()` which uses the registration key, this method uses the scorer's\n * internal name property.\n *\n * @throws {MastraError} When no scorer is found with the specified name\n *\n * @example Finding a scorer by name\n * ```typescript\n * import { HelpfulnessScorer } from '@mastra/scorers';\n *\n * const mastra = new Mastra({\n * scorers: {\n * myHelpfulnessScorer: new HelpfulnessScorer({\n * name: 'helpfulness-evaluator',\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n *\n * // Find scorer by its internal name, not the registration key\n * const scorer = mastra.getScorerById('helpfulness-evaluator');\n * const score = await scorer.score({\n * input: 'question',\n * output: 'answer'\n * });\n * ```\n */\n public getScorerById<TScorerName extends keyof TScorers>(id: TScorers[TScorerName]['id']): TScorers[TScorerName] {\n for (const [_key, value] of Object.entries(this.#scorers ?? {})) {\n if (value.id === id || value?.name === id) {\n return value as TScorers[TScorerName];\n }\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_SCORER_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Scorer with id ${String(id)} not found`,\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Retrieves a specific tool by registration key.\n *\n * @throws {MastraError} When the specified tool is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tools: {\n * calculator: calculatorTool,\n * weather: weatherTool\n * }\n * });\n *\n * const tool = mastra.getTool('calculator');\n * ```\n */\n public getTool<TToolName extends keyof TTools>(name: TToolName): TTools[TToolName] {\n if (!this.#tools || !this.#tools[name]) {\n const error = new MastraError({\n id: 'MASTRA_GET_TOOL_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Tool with name ${String(name)} not found`,\n details: {\n status: 404,\n toolName: String(name),\n tools: Object.keys(this.#tools ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#tools[name];\n }\n\n /**\n * Retrieves a specific tool by its ID.\n *\n * @throws {MastraError} When the specified tool is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tools: {\n * calculator: calculatorTool\n * }\n * });\n *\n * const tool = mastra.getToolById('calculator-tool-id');\n * ```\n */\n public getToolById<TToolName extends keyof TTools>(id: TTools[TToolName]['id']): TTools[TToolName] {\n const allTools = this.#tools;\n\n if (!allTools) {\n throw new MastraError({\n id: 'MASTRA_GET_TOOL_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Tool with id ${id} not found`,\n });\n }\n // First try to find by internal ID\n for (const tool of Object.values(allTools)) {\n if (tool.id === id) {\n return tool as TTools[TToolName];\n }\n }\n\n // Fallback to searching by registration key\n const toolByKey = allTools[id];\n if (toolByKey) {\n return toolByKey as TTools[TToolName];\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_TOOL_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Tool with id ${id} not found`,\n details: {\n status: 404,\n toolId: String(id),\n tools: Object.keys(allTools).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Lists all configured tools.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tools: {\n * calculator: calculatorTool,\n * weather: weatherTool\n * }\n * });\n *\n * const tools = mastra.listTools();\n * Object.entries(tools || {}).forEach(([name, tool]) => {\n * console.log(`Tool \"${name}\":`, tool.id);\n * });\n * ```\n */\n public listTools(): TTools | undefined {\n return this.#tools;\n }\n\n /**\n * Adds a new tool to the Mastra instance.\n *\n * This method allows dynamic registration of tools after the Mastra instance\n * has been created.\n *\n * @throws {MastraError} When a tool with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newTool = createTool({\n * id: 'calculator-tool',\n * description: 'Performs calculations'\n * });\n * mastra.addTool(newTool); // Uses tool.id as key\n * // or\n * mastra.addTool(newTool, 'customKey'); // Uses custom key\n * ```\n */\n public addTool<T extends ToolAction<any, any, any, any>>(tool: T, key?: string): void {\n if (!tool) {\n throw createUndefinedPrimitiveError('tool', tool, key);\n }\n const toolKey = key || tool.id;\n const tools = this.#tools as Record<string, ToolAction<any, any, any, any>>;\n if (tools[toolKey]) {\n const logger = this.getLogger();\n logger.debug(`Tool with key ${toolKey} already exists. Skipping addition.`);\n return;\n }\n\n tools[toolKey] = tool;\n }\n\n /**\n * Retrieves a specific processor by registration key.\n *\n * @throws {MastraError} When the specified processor is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * processors: {\n * validator: validatorProcessor,\n * transformer: transformerProcessor\n * }\n * });\n *\n * const processor = mastra.getProcessor('validator');\n * ```\n */\n public getProcessor<TProcessorName extends keyof TProcessors>(name: TProcessorName): TProcessors[TProcessorName] {\n if (!this.#processors || !this.#processors[name]) {\n const error = new MastraError({\n id: 'MASTRA_GET_PROCESSOR_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Processor with name ${String(name)} not found`,\n details: {\n status: 404,\n processorName: String(name),\n processors: Object.keys(this.#processors ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#processors[name];\n }\n\n /**\n * Retrieves a specific processor by its ID.\n *\n * @throws {MastraError} When the specified processor is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * processors: {\n * validator: validatorProcessor\n * }\n * });\n *\n * const processor = mastra.getProcessorById('validator-processor-id');\n * ```\n */\n public getProcessorById<TProcessorName extends keyof TProcessors>(\n id: TProcessors[TProcessorName]['id'],\n ): TProcessors[TProcessorName] {\n const allProcessors = this.#processors;\n\n if (!allProcessors) {\n throw new MastraError({\n id: 'MASTRA_GET_PROCESSOR_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Processor with id ${id} not found`,\n });\n }\n\n // First try to find by internal ID\n for (const processor of Object.values(allProcessors)) {\n if (processor.id === id) {\n return processor as TProcessors[TProcessorName];\n }\n }\n\n // Fallback to searching by registration key\n const processorByKey = allProcessors[id];\n if (processorByKey) {\n return processorByKey as TProcessors[TProcessorName];\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_PROCESSOR_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Processor with id ${id} not found`,\n details: {\n status: 404,\n processorId: String(id),\n processors: Object.keys(allProcessors).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Lists all configured processors.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * processors: {\n * validator: validatorProcessor,\n * transformer: transformerProcessor\n * }\n * });\n *\n * const processors = mastra.listProcessors();\n * Object.entries(processors || {}).forEach(([name, processor]) => {\n * console.log(`Processor \"${name}\":`, processor.id);\n * });\n * ```\n */\n public listProcessors(): TProcessors | undefined {\n return this.#processors;\n }\n\n /**\n * Adds a new processor to the Mastra instance.\n *\n * This method allows dynamic registration of processors after the Mastra instance\n * has been created.\n *\n * @throws {MastraError} When a processor with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newProcessor = {\n * id: 'text-processor',\n * processInput: async (messages) => messages\n * };\n * mastra.addProcessor(newProcessor); // Uses processor.id as key\n * // or\n * mastra.addProcessor(newProcessor, 'customKey'); // Uses custom key\n * ```\n */\n public addProcessor<P extends Processor>(processor: P, key?: string): void {\n if (!processor) {\n throw createUndefinedPrimitiveError('processor', processor, key);\n }\n const processorKey = key || processor.id;\n const processors = this.#processors as Record<string, Processor>;\n if (processors[processorKey]) {\n const logger = this.getLogger();\n logger.debug(`Processor with key ${processorKey} already exists. Skipping addition.`);\n return;\n }\n\n processors[processorKey] = processor;\n }\n\n /**\n * Retrieves a registered memory instance by its registration key.\n *\n * @throws {MastraError} When the memory instance with the specified key is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * memory: {\n * chat: new Memory({ storage })\n * }\n * });\n *\n * const chatMemory = mastra.getMemory('chat');\n * ```\n */\n public getMemory<TMemoryName extends keyof TMemory>(name: TMemoryName): TMemory[TMemoryName] {\n if (!this.#memory || !this.#memory[name]) {\n const error = new MastraError({\n id: 'MASTRA_GET_MEMORY_BY_KEY_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Memory with key ${String(name)} not found`,\n details: {\n status: 404,\n memoryKey: String(name),\n memory: Object.keys(this.#memory ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#memory[name];\n }\n\n /**\n * Retrieves a registered memory instance by its ID.\n *\n * Searches through all registered memory instances and returns the one whose ID matches.\n *\n * @throws {MastraError} When no memory instance with the specified ID is found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * memory: {\n * chat: new Memory({ id: 'chat-memory', storage })\n * }\n * });\n *\n * const memory = mastra.getMemoryById('chat-memory');\n * ```\n */\n public getMemoryById(id: string): MastraMemory {\n const allMemory = this.#memory;\n if (allMemory) {\n for (const [, memory] of Object.entries(allMemory)) {\n if (memory.id === id) {\n return memory;\n }\n }\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_MEMORY_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Memory with id ${id} not found`,\n details: {\n status: 404,\n memoryId: id,\n availableIds: Object.values(allMemory ?? {})\n .map(m => m.id)\n .join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Returns all registered memory instances as a record keyed by their names.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * memory: {\n * chat: new Memory({ storage }),\n * longTerm: new Memory({ storage })\n * }\n * });\n *\n * const allMemory = mastra.listMemory();\n * console.log(Object.keys(allMemory)); // ['chat', 'longTerm']\n * ```\n */\n public listMemory(): TMemory | undefined {\n return this.#memory;\n }\n\n /**\n * Adds a new memory instance to the Mastra instance.\n *\n * This method allows dynamic registration of memory instances after the Mastra instance\n * has been created.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const chatMemory = new Memory({\n * id: 'chat-memory',\n * storage: mastra.getStorage()\n * });\n * mastra.addMemory(chatMemory); // Uses memory.id as key\n * // or\n * mastra.addMemory(chatMemory, 'customKey'); // Uses custom key\n * ```\n */\n public addMemory<M extends MastraMemory>(memory: M, key?: string): void {\n if (!memory) {\n throw createUndefinedPrimitiveError('memory', memory, key);\n }\n const memoryKey = key || memory.id;\n const memoryRegistry = this.#memory as Record<string, MastraMemory>;\n if (memoryRegistry[memoryKey]) {\n const logger = this.getLogger();\n logger.debug(`Memory with key ${memoryKey} already exists. Skipping addition.`);\n return;\n }\n\n memoryRegistry[memoryKey] = memory;\n }\n\n /**\n * Returns all registered workflows as a record keyed by their IDs.\n *\n * @example Listing all workflows\n * ```typescript\n * const mastra = new Mastra({\n * workflows: {\n * dataProcessor: createWorkflow({...}).commit(),\n * emailSender: createWorkflow({...}).commit(),\n * reportGenerator: createWorkflow({...}).commit()\n * }\n * });\n *\n * const allWorkflows = mastra.listWorkflows();\n * console.log(Object.keys(allWorkflows)); // ['dataProcessor', 'emailSender', 'reportGenerator']\n *\n * // Execute all workflows with sample data\n * for (const [id, workflow] of Object.entries(allWorkflows)) {\n * console.log(`Workflow ${id}:`, workflow.name);\n * // const result = await workflow.execute(sampleData);\n * }\n * ```\n */\n public listWorkflows(props: { serialized?: boolean } = {}): Record<string, Workflow> {\n if (props.serialized) {\n return Object.entries(this.#workflows).reduce((acc, [k, v]) => {\n return {\n ...acc,\n [k]: { name: v.name },\n };\n }, {});\n }\n return this.#workflows;\n }\n\n /**\n * Adds a new workflow to the Mastra instance.\n *\n * This method allows dynamic registration of workflows after the Mastra instance\n * has been created. The workflow will be initialized with Mastra and primitives.\n *\n * @throws {MastraError} When a workflow with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newWorkflow = createWorkflow({\n * id: 'data-pipeline',\n * name: 'Data Pipeline'\n * }).commit();\n * mastra.addWorkflow(newWorkflow); // Uses workflow.id as key\n * // or\n * mastra.addWorkflow(newWorkflow, 'customKey'); // Uses custom key\n * ```\n */\n public addWorkflow<W extends Workflow<any, any, any, any, any, any>>(workflow: W, key?: string): void {\n if (!workflow) {\n throw createUndefinedPrimitiveError('workflow', workflow, key);\n }\n const workflowKey = key || workflow.id;\n const workflows = this.#workflows as Record<string, Workflow<any, any, any, any, any, any>>;\n if (workflows[workflowKey]) {\n const logger = this.getLogger();\n logger.debug(`Workflow with key ${workflowKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the workflow with Mastra and primitives\n workflow.__registerMastra(this);\n workflow.__registerPrimitives({\n logger: this.getLogger(),\n storage: this.getStorage(),\n });\n if (!workflow.committed) {\n workflow.commit();\n }\n workflows[workflowKey] = workflow;\n }\n\n /**\n * Sets the storage provider for the Mastra instance.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n *\n * // Set PostgreSQL storage\n * mastra.setStorage(new PostgresStore({\n * connectionString: process.env.DATABASE_URL\n * }));\n *\n * // Now agents can use memory with the storage\n * const agent = new Agent({\n * id: 'assistant',\n * name: 'assistant',\n * memory: new Memory({ storage: mastra.getStorage() })\n * });\n * ```\n */\n public setStorage(storage: MastraStorage) {\n this.#storage = augmentWithInit(storage);\n }\n\n public setLogger({ logger }: { logger: TLogger }) {\n this.#logger = logger;\n\n if (this.#agents) {\n Object.keys(this.#agents).forEach(key => {\n this.#agents?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#deployer) {\n this.#deployer.__setLogger(this.#logger);\n }\n\n if (this.#tts) {\n Object.keys(this.#tts).forEach(key => {\n this.#tts?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#storage) {\n this.#storage.__setLogger(this.#logger);\n }\n\n if (this.#vectors) {\n Object.keys(this.#vectors).forEach(key => {\n this.#vectors?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#mcpServers) {\n Object.keys(this.#mcpServers).forEach(key => {\n this.#mcpServers?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#serverAdapter) {\n this.#serverAdapter.__setLogger(this.#logger);\n }\n\n this.#observability.setLogger({ logger: this.#logger });\n }\n\n /**\n * Gets all registered text-to-speech (TTS) providers.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tts: {\n * openai: new OpenAITTS({\n * apiKey: process.env.OPENAI_API_KEY,\n * voice: 'alloy'\n * })\n * }\n * });\n *\n * const ttsProviders = mastra.getTTS();\n * const openaiTTS = ttsProviders?.openai;\n * if (openaiTTS) {\n * const audioBuffer = await openaiTTS.synthesize('Hello, world!');\n * }\n * ```\n */\n public getTTS() {\n return this.#tts;\n }\n\n /**\n * Gets the currently configured logger instance.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * logger: new PinoLogger({\n * name: 'MyApp',\n * level: 'info'\n * })\n * });\n *\n * const logger = mastra.getLogger();\n * logger.info('Application started');\n * logger.error('An error occurred', { error: 'details' });\n * ```\n */\n public getLogger() {\n return this.#logger;\n }\n\n /**\n * Gets the currently configured storage provider.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * storage: new LibSQLStore({ id: 'mastra-storage', url: 'file:./data.db' })\n * });\n *\n * // Use the storage in agent memory\n * const agent = new Agent({\n * id: 'assistant',\n * name: 'assistant',\n * memory: new Memory({\n * storage: mastra.getStorage()\n * })\n * });\n * ```\n */\n public getStorage() {\n return this.#storage;\n }\n\n get observability(): ObservabilityEntrypoint {\n return this.#observability;\n }\n\n public getServerMiddleware() {\n return this.#serverMiddleware;\n }\n\n public getServerCache() {\n return this.#serverCache;\n }\n\n public setServerMiddleware(serverMiddleware: Middleware | Middleware[]) {\n if (typeof serverMiddleware === 'function') {\n this.#serverMiddleware = [\n {\n handler: serverMiddleware,\n path: '/api/*',\n },\n ];\n return;\n }\n\n if (!Array.isArray(serverMiddleware)) {\n const error = new MastraError({\n id: 'MASTRA_SET_SERVER_MIDDLEWARE_INVALID_TYPE',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Invalid middleware: expected a function or array, received ${typeof serverMiddleware}`,\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n this.#serverMiddleware = serverMiddleware.map(m => {\n if (typeof m === 'function') {\n return {\n handler: m,\n path: '/api/*',\n };\n }\n return {\n handler: m.handler,\n path: m.path || '/api/*',\n };\n });\n }\n\n public getServer() {\n return this.#server;\n }\n\n /**\n * Sets the server adapter for this Mastra instance.\n *\n * The server adapter provides access to the underlying server app (e.g., Hono, Express)\n * and allows users to call routes directly via `app.fetch()` instead of making HTTP requests.\n *\n * This is typically called by `createHonoServer` or similar factory functions during\n * server initialization.\n *\n * @param adapter - The server adapter instance (e.g., MastraServer from @mastra/hono or @mastra/express)\n *\n * @example\n * ```typescript\n * const app = new Hono();\n * const adapter = new MastraServer({ app, mastra });\n * mastra.setMastraServer(adapter);\n * ```\n */\n public setMastraServer(adapter: MastraServerBase): void {\n if (this.#serverAdapter) {\n this.#logger?.debug(\n 'Replacing existing server adapter. Only one adapter should be registered per Mastra instance.',\n );\n }\n this.#serverAdapter = adapter;\n // Inject the logger into the adapter\n if (this.#logger) {\n adapter.__setLogger(this.#logger);\n }\n }\n\n /**\n * Gets the server adapter for this Mastra instance.\n *\n * @returns The server adapter, or undefined if not set\n *\n * @example\n * ```typescript\n * const adapter = mastra.getMastraServer();\n * if (adapter) {\n * const app = adapter.getApp<Hono>();\n * }\n * ```\n */\n public getMastraServer(): MastraServerBase | undefined {\n return this.#serverAdapter;\n }\n\n /**\n * Gets the server app from the server adapter.\n *\n * This is a convenience method that calls `getMastraServer()?.getApp<T>()`.\n * Use this to access the underlying server framework's app instance (e.g., Hono, Express)\n * for direct operations like calling routes via `app.fetch()`.\n *\n * @template T - The expected type of the app (e.g., Hono, Express Application)\n * @returns The server app, or undefined if no adapter is set\n *\n * @example\n * ```typescript\n * // After createHonoServer() is called:\n * const app = mastra.getServerApp<Hono>();\n *\n * // Call routes directly without HTTP overhead\n * const response = await app?.fetch(new Request('http://localhost/health'));\n * const data = await response?.json();\n * ```\n */\n public getServerApp<T = unknown>(): T | undefined {\n return this.#serverAdapter?.getApp<T>();\n }\n\n public getBundlerConfig() {\n return this.#bundler;\n }\n\n public async listLogsByRunId({\n runId,\n transportId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n }: {\n runId: string;\n transportId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }) {\n if (!transportId) {\n const error = new MastraError({\n id: 'MASTRA_LIST_LOGS_BY_RUN_ID_MISSING_TRANSPORT',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Transport ID is required',\n details: {\n runId,\n transportId,\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n if (!this.#logger?.listLogsByRunId) {\n const error = new MastraError({\n id: 'MASTRA_GET_LOGS_BY_RUN_ID_LOGGER_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.SYSTEM,\n text: 'Logger is not configured or does not support listLogsByRunId operation',\n details: {\n runId,\n transportId,\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n return await this.#logger.listLogsByRunId({\n runId,\n transportId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n });\n }\n\n public async listLogs(\n transportId: string,\n params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n },\n ) {\n if (!transportId) {\n const error = new MastraError({\n id: 'MASTRA_GET_LOGS_MISSING_TRANSPORT',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Transport ID is required',\n details: {\n transportId,\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n if (!this.#logger) {\n const error = new MastraError({\n id: 'MASTRA_GET_LOGS_LOGGER_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.SYSTEM,\n text: 'Logger is not set',\n details: {\n transportId,\n },\n });\n throw error;\n }\n\n return await this.#logger.listLogs(transportId, params);\n }\n\n /**\n * Gets all registered Model Context Protocol (MCP) server instances.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * mcpServers: {\n * filesystem: new FileSystemMCPServer({\n * rootPath: '/app/data'\n * })\n * }\n * });\n *\n * const mcpServers = mastra.getMCPServers();\n * if (mcpServers) {\n * const fsServer = mcpServers.filesystem;\n * const tools = await fsServer.listTools();\n * }\n * ```\n */\n public listMCPServers(): Record<string, MCPServerBase> | undefined {\n return this.#mcpServers;\n }\n\n /**\n * Adds a new MCP server to the Mastra instance.\n *\n * This method allows dynamic registration of MCP servers after the Mastra instance\n * has been created. The server will be initialized with ID, Mastra instance, and logger.\n *\n * @throws {MastraError} When an MCP server with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newServer = new FileSystemMCPServer({\n * rootPath: '/data'\n * });\n * mastra.addMCPServer(newServer); // Uses server.id as key\n * // or\n * mastra.addMCPServer(newServer, 'customKey'); // Uses custom key\n * ```\n */\n public addMCPServer<M extends MCPServerBase>(server: M, key?: string): void {\n if (!server) {\n throw createUndefinedPrimitiveError('mcp-server', server, key);\n }\n // If a key is provided, try to set it as the ID\n // The setId method will only update if the ID wasn't explicitly set by the user\n if (key) {\n server.setId(key);\n }\n\n // Now resolve the ID after potentially setting it\n const resolvedId = server.id;\n if (!resolvedId) {\n const error = new MastraError({\n id: 'MASTRA_ADD_MCP_SERVER_MISSING_ID',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'MCP server must expose an id or be registered under one',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const serverKey = key ?? resolvedId;\n const servers = this.#mcpServers as Record<string, MCPServerBase>;\n if (servers[serverKey]) {\n const logger = this.getLogger();\n logger.debug(`MCP server with key ${serverKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the server\n server.__registerMastra(this);\n server.__setLogger(this.getLogger());\n servers[serverKey] = server;\n }\n\n /**\n * Retrieves a specific MCP server instance by registration key.\n *\n * @throws {MastraError} When the specified MCP server is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * mcpServers: {\n * filesystem: new FileSystemMCPServer({...})\n * }\n * });\n *\n * const fsServer = mastra.getMCPServer('filesystem');\n * const tools = await fsServer.listTools();\n * ```\n */\n public getMCPServer<TMCPServerName extends keyof TMCPServers>(\n name: TMCPServerName,\n ): TMCPServers[TMCPServerName] | undefined {\n if (!this.#mcpServers || !this.#mcpServers[name]) {\n this.#logger?.debug(`MCP server with name ${String(name)} not found`);\n return undefined as TMCPServers[TMCPServerName] | undefined;\n }\n return this.#mcpServers[name];\n }\n\n /**\n * Retrieves a specific Model Context Protocol (MCP) server instance by its logical ID.\n *\n * This method searches for an MCP server using its logical ID. If a version is specified,\n * it returns the exact version match. If no version is provided, it returns the server\n * with the most recent release date.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * mcpServers: {\n * filesystem: new FileSystemMCPServer({\n * id: 'fs-server',\n * version: '1.0.0',\n * rootPath: '/app/data'\n * })\n * }\n * });\n *\n * const fsServer = mastra.getMCPServerById('fs-server');\n * if (fsServer) {\n * const tools = await fsServer.listTools();\n * }\n * ```\n */\n public getMCPServerById<TMCPServerName extends keyof TMCPServers>(\n serverId: TMCPServers[TMCPServerName]['id'],\n version?: string,\n ): TMCPServers[TMCPServerName] | undefined {\n if (!this.#mcpServers) {\n return undefined;\n }\n\n const allRegisteredServers = Object.values(this.#mcpServers || {});\n\n const matchingLogicalIdServers = allRegisteredServers.filter(server => server.id === serverId);\n\n if (matchingLogicalIdServers.length === 0) {\n this.#logger?.debug(`No MCP servers found with logical ID: ${serverId}`);\n return undefined;\n }\n\n if (version) {\n const specificVersionServer = matchingLogicalIdServers.find(server => server.version === version);\n if (!specificVersionServer) {\n this.#logger?.debug(`MCP server with logical ID '${serverId}' found, but not version '${version}'.`);\n }\n return specificVersionServer as TMCPServers[TMCPServerName] | undefined;\n } else {\n // No version specified, find the one with the most recent releaseDate\n if (matchingLogicalIdServers.length === 1) {\n return matchingLogicalIdServers[0] as TMCPServers[TMCPServerName];\n }\n\n matchingLogicalIdServers.sort((a, b) => {\n // Ensure releaseDate exists and is a string before creating a Date object\n const dateAVal = a.releaseDate && typeof a.releaseDate === 'string' ? new Date(a.releaseDate).getTime() : NaN;\n const dateBVal = b.releaseDate && typeof b.releaseDate === 'string' ? new Date(b.releaseDate).getTime() : NaN;\n\n if (isNaN(dateAVal) && isNaN(dateBVal)) return 0;\n if (isNaN(dateAVal)) return 1; // Treat invalid/missing dates as older\n if (isNaN(dateBVal)) return -1; // Treat invalid/missing dates as older\n\n return dateBVal - dateAVal; // Sorts in descending order of time (latest first)\n });\n\n // After sorting, the first element should be the latest if its date is valid\n if (matchingLogicalIdServers.length > 0) {\n const latestServer = matchingLogicalIdServers[0];\n if (\n latestServer &&\n latestServer.releaseDate &&\n typeof latestServer.releaseDate === 'string' &&\n !isNaN(new Date(latestServer.releaseDate).getTime())\n ) {\n return latestServer as TMCPServers[TMCPServerName];\n }\n }\n this.#logger?.warn(\n `Could not determine the latest server for logical ID '${serverId}' due to invalid or missing release dates, or no servers left after filtering.`,\n );\n return undefined;\n }\n }\n\n public async addTopicListener(topic: string, listener: (event: any) => Promise<void>) {\n await this.#pubsub.subscribe(topic, listener);\n }\n\n public async removeTopicListener(topic: string, listener: (event: any) => Promise<void>) {\n await this.#pubsub.unsubscribe(topic, listener);\n }\n\n public async startEventEngine() {\n for (const topic in this.#events) {\n if (!this.#events[topic]) {\n continue;\n }\n\n const listeners = Array.isArray(this.#events[topic]) ? this.#events[topic] : [this.#events[topic]];\n for (const listener of listeners) {\n await this.#pubsub.subscribe(topic, listener);\n }\n }\n }\n\n public async stopEventEngine() {\n for (const topic in this.#events) {\n if (!this.#events[topic]) {\n continue;\n }\n\n const listeners = Array.isArray(this.#events[topic]) ? this.#events[topic] : [this.#events[topic]];\n for (const listener of listeners) {\n await this.#pubsub.unsubscribe(topic, listener);\n }\n }\n\n await this.#pubsub.flush();\n }\n\n /**\n * Retrieves a registered gateway by its key.\n *\n * @throws {MastraError} When the gateway with the specified key is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * gateways: {\n * myGateway: new CustomGateway()\n * }\n * });\n *\n * const gateway = mastra.getGateway('myGateway');\n * ```\n */\n public getGateway(key: string): MastraModelGateway {\n const gateway = this.#gateways?.[key];\n if (!gateway) {\n const error = new MastraError({\n id: 'MASTRA_GET_GATEWAY_BY_KEY_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Gateway with key ${key} not found`,\n details: {\n status: 404,\n gatewayKey: key,\n gateways: Object.keys(this.#gateways ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return gateway;\n }\n\n /**\n * Retrieves a registered gateway by its ID.\n *\n * Searches through all registered gateways and returns the one whose ID matches.\n * If a gateway doesn't have an explicit ID, its name is used as the ID.\n *\n * @throws {MastraError} When no gateway with the specified ID is found\n *\n * @example\n * ```typescript\n * class CustomGateway extends MastraModelGateway {\n * readonly id = 'custom-gateway-v1';\n * readonly name = 'Custom Gateway';\n * // ...\n * }\n *\n * const mastra = new Mastra({\n * gateways: {\n * myGateway: new CustomGateway()\n * }\n * });\n *\n * const gateway = mastra.getGatewayById('custom-gateway-v1');\n * ```\n */\n public getGatewayById(id: string): MastraModelGateway {\n const gateways = this.#gateways ?? {};\n for (const gateway of Object.values(gateways)) {\n if (gateway.getId() === id) {\n return gateway;\n }\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_GATEWAY_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Gateway with ID ${id} not found`,\n details: {\n status: 404,\n gatewayId: id,\n availableIds: Object.values(gateways)\n .map(g => g.getId())\n .join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Returns all registered gateways as a record keyed by their names.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * gateways: {\n * netlify: new NetlifyGateway(),\n * custom: new CustomGateway()\n * }\n * });\n *\n * const allGateways = mastra.listGateways();\n * console.log(Object.keys(allGateways)); // ['netlify', 'custom']\n * ```\n */\n public listGateways(): Record<string, MastraModelGateway> | undefined {\n return this.#gateways;\n }\n\n /**\n * Adds a new gateway to the Mastra instance.\n *\n * This method allows dynamic registration of gateways after the Mastra instance\n * has been created. Gateways enable access to LLM providers through custom\n * authentication and routing logic.\n *\n * If no key is provided, the gateway's ID (or name if no ID is set) will be used as the key.\n *\n * @example\n * ```typescript\n * import { MastraModelGateway } from '@mastra/core';\n *\n * class CustomGateway extends MastraModelGateway {\n * readonly id = 'custom-gateway-v1'; // Optional, defaults to name\n * readonly name = 'custom';\n * readonly prefix = 'custom';\n *\n * async fetchProviders() {\n * return {\n * myProvider: {\n * name: 'My Provider',\n * models: ['model-1', 'model-2'],\n * apiKeyEnvVar: 'MY_API_KEY',\n * gateway: 'custom'\n * }\n * };\n * }\n *\n * buildUrl(modelId: string) {\n * return 'https://api.myprovider.com/v1';\n * }\n *\n * async getApiKey(modelId: string) {\n * return process.env.MY_API_KEY || '';\n * }\n *\n * async resolveLanguageModel({ modelId, providerId, apiKey }) {\n * const baseURL = this.buildUrl(`${providerId}/${modelId}`);\n * return createOpenAICompatible({\n * name: providerId,\n * apiKey,\n * baseURL,\n * supportsStructuredOutputs: true,\n * }).chatModel(modelId);\n * }\n * }\n *\n * const mastra = new Mastra();\n * const newGateway = new CustomGateway();\n * mastra.addGateway(newGateway); // Uses gateway.getId() as key (gateway.id)\n * // or\n * mastra.addGateway(newGateway, 'customKey'); // Uses custom key\n * ```\n */\n public addGateway(gateway: MastraModelGateway, key?: string): void {\n if (!gateway) {\n throw createUndefinedPrimitiveError('gateway', gateway, key);\n }\n const gatewayKey = key || gateway.getId();\n const gateways = this.#gateways as Record<string, MastraModelGateway>;\n if (gateways[gatewayKey]) {\n const logger = this.getLogger();\n logger.debug(`Gateway with key ${gatewayKey} already exists. Skipping addition.`);\n return;\n }\n\n gateways[gatewayKey] = gateway;\n\n // Register custom gateways with the registry for type generation\n this.#syncGatewayRegistry();\n }\n\n /**\n * Sync custom gateways with the GatewayRegistry for type generation\n * @private\n */\n #syncGatewayRegistry(): void {\n try {\n // Only sync in dev mode (when MASTRA_DEV is set)\n if (process.env.MASTRA_DEV !== 'true' && process.env.MASTRA_DEV !== '1') {\n return;\n }\n\n // Trigger sync immediately (non-blocking, but logs progress)\n import('../llm/model/provider-registry.js')\n .then(async ({ GatewayRegistry }) => {\n const registry = GatewayRegistry.getInstance();\n const customGateways = Object.values(this.#gateways || {});\n registry.registerCustomGateways(customGateways);\n\n // Log that we're syncing\n const logger = this.getLogger();\n logger.info('🔄 Syncing custom gateway types...');\n\n // Trigger a sync to regenerate types\n await registry.syncGateways(true);\n\n logger.info('✅ Custom gateway types synced! Restart your TypeScript server to see autocomplete.');\n })\n .catch(err => {\n const logger = this.getLogger();\n logger.debug('Gateway registry sync skipped:', err);\n });\n } catch (err) {\n // Silent fail - this is a dev-only feature\n const logger = this.getLogger();\n logger.debug('Gateway registry sync failed:', err);\n }\n }\n\n /**\n * Gracefully shuts down the Mastra instance and cleans up all resources.\n *\n * This method performs a clean shutdown of all Mastra components, including:\n * - tracing registry and all tracing instances\n * - Event engine and pub/sub system\n * - All registered components and their resources\n *\n * It's important to call this method when your application is shutting down\n * to ensure proper cleanup and prevent resource leaks.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: { myAgent },\n * workflows: { myWorkflow }\n * });\n *\n * // Graceful shutdown on SIGINT\n * process.on('SIGINT', async () => {\n * await mastra.shutdown();\n * process.exit(0);\n * });\n * ```\n */\n async shutdown(): Promise<void> {\n await this.stopEventEngine();\n // Shutdown observability registry, exporters, etc...\n await this.#observability.shutdown();\n\n this.#logger?.info('Mastra shutdown completed');\n }\n\n // This method is only used internally for server hnadlers that require temporary persistence\n public get serverCache() {\n return this.#serverCache;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/mastra/hooks.ts","../src/mastra/index.ts"],"names":[],"mappings":"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","file":"chunk-Y3PUB5GS.js","sourcesContent":["import pMap from 'p-map';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../error';\nimport { saveScorePayloadSchema } from '../evals';\nimport type { ScoringHookInput } from '../evals/types';\nimport type { Mastra } from '../mastra';\nimport type { MastraStorage } from '../storage';\n\nexport function createOnScorerHook(mastra: Mastra) {\n return async (hookData: ScoringHookInput) => {\n const storage = mastra.getStorage();\n\n if (!storage) {\n mastra.getLogger()?.warn('Storage not found, skipping score validation and saving');\n return;\n }\n\n const entityId = hookData.entity.id as string;\n const entityType = hookData.entityType;\n const scorer = hookData.scorer;\n const scorerId = scorer.id as string;\n\n if (!scorerId) {\n mastra.getLogger()?.warn('Scorer ID not found, skipping score validation and saving');\n return;\n }\n\n try {\n const scorerToUse = await findScorer(mastra, entityId, entityType, scorerId);\n\n if (!scorerToUse) {\n throw new MastraError({\n id: 'MASTRA_SCORER_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Scorer with ID ${scorerId} not found`,\n });\n }\n\n let input = hookData.input;\n let output = hookData.output;\n\n const { structuredOutput, ...rest } = hookData;\n\n const runResult = await scorerToUse.scorer.run({\n ...rest,\n input,\n output,\n });\n\n let spanId;\n let traceId;\n const currentSpan = hookData.tracingContext?.currentSpan;\n if (currentSpan && currentSpan.isValid) {\n spanId = currentSpan.id;\n traceId = currentSpan.traceId;\n }\n\n const payload = {\n ...rest,\n ...runResult,\n entityId,\n scorerId: scorerId,\n spanId,\n traceId,\n metadata: {\n structuredOutput: !!structuredOutput,\n },\n };\n await validateAndSaveScore(storage, payload);\n\n if (currentSpan && spanId && traceId) {\n await pMap(\n currentSpan.observabilityInstance.getExporters(),\n async exporter => {\n if (exporter.addScoreToTrace) {\n try {\n await exporter.addScoreToTrace({\n traceId: traceId,\n spanId: spanId,\n score: runResult.score as number,\n reason: runResult.reason as string,\n scorerName: scorerToUse.scorer.id,\n metadata: {\n ...(currentSpan.metadata ?? {}),\n },\n });\n } catch (error) {\n // Log error but don't fail the hook if exporter fails\n mastra.getLogger()?.error(`Failed to add score to trace via exporter: ${error}`);\n }\n }\n },\n { concurrency: 3 },\n );\n }\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'MASTRA_SCORER_FAILED_TO_RUN_HOOK',\n domain: ErrorDomain.SCORER,\n category: ErrorCategory.USER,\n details: {\n scorerId,\n entityId,\n entityType,\n },\n },\n error,\n );\n\n mastra.getLogger()?.trackException(mastraError);\n mastra.getLogger()?.error(mastraError.toString());\n }\n };\n}\n\nexport async function validateAndSaveScore(storage: MastraStorage, payload: unknown) {\n const scoresStore = await storage.getStore('scores');\n if (!scoresStore) {\n throw new MastraError({\n id: 'MASTRA_SCORES_STORAGE_NOT_AVAILABLE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Scores storage domain is not available',\n });\n }\n const payloadToSave = saveScorePayloadSchema.parse(payload);\n await scoresStore.saveScore(payloadToSave);\n}\n\nasync function findScorer(mastra: Mastra, entityId: string, entityType: string, scorerId: string) {\n let scorerToUse;\n if (entityType === 'AGENT') {\n const scorers = await mastra.getAgentById(entityId).listScorers();\n for (const [_, scorer] of Object.entries(scorers)) {\n if (scorer.scorer.id === scorerId) {\n scorerToUse = scorer;\n break;\n }\n }\n } else if (entityType === 'WORKFLOW') {\n const scorers = await mastra.getWorkflowById(entityId).listScorers();\n for (const [_, scorer] of Object.entries(scorers)) {\n if (scorer.scorer.id === scorerId) {\n scorerToUse = scorer;\n break;\n }\n }\n }\n\n // Fallback to mastra-registered scorer\n if (!scorerToUse) {\n const mastraRegisteredScorer = mastra.getScorerById(scorerId);\n scorerToUse = mastraRegisteredScorer ? { scorer: mastraRegisteredScorer } : undefined;\n }\n\n return scorerToUse;\n}\n","import { randomUUID } from 'node:crypto';\nimport { Agent } from '../agent';\nimport type { BundlerConfig } from '../bundler/types';\nimport { InMemoryServerCache } from '../cache';\nimport type { MastraServerCache } from '../cache';\nimport type { MastraDeployer } from '../deployer';\nimport { MastraError, ErrorDomain, ErrorCategory } from '../error';\nimport type { MastraScorer, MastraScorers, ScoringSamplingConfig } from '../evals';\nimport { EventEmitterPubSub } from '../events/event-emitter';\nimport type { PubSub } from '../events/pubsub';\nimport type { Event } from '../events/types';\nimport { AvailableHooks, registerHook } from '../hooks';\nimport type { MastraModelGateway } from '../llm/model/gateways';\nimport { LogLevel, noopLogger, ConsoleLogger } from '../logger';\nimport type { IMastraLogger } from '../logger';\nimport type { MCPServerBase } from '../mcp';\nimport type { MastraMemory } from '../memory';\nimport type { ObservabilityEntrypoint } from '../observability';\nimport { NoOpObservability } from '../observability';\nimport type { Processor } from '../processors';\nimport type { MastraServerBase } from '../server/base';\nimport type { Middleware, ServerConfig } from '../server/types';\nimport type { MastraStorage, WorkflowRuns, StorageAgentType, StorageScorerConfig } from '../storage';\nimport { augmentWithInit } from '../storage/storageWithInit';\nimport type { ToolLoopAgentLike } from '../tool-loop-agent';\nimport { isToolLoopAgentLike, toolLoopAgentToMastraAgent } from '../tool-loop-agent';\nimport type { ToolAction } from '../tools';\nimport type { MastraTTS } from '../tts';\nimport type { MastraIdGenerator } from '../types';\nimport type { MastraVector } from '../vector';\nimport type { Workflow } from '../workflows';\nimport { WorkflowEventProcessor } from '../workflows/evented/workflow-event-processor';\nimport { createOnScorerHook } from './hooks';\n\n/**\n * Creates an error for when a null/undefined value is passed to an add* method.\n * This commonly occurs when config is spread ({ ...config }) and the original\n * object had getters or non-enumerable properties.\n */\nfunction createUndefinedPrimitiveError(\n type: 'agent' | 'tool' | 'processor' | 'vector' | 'scorer' | 'workflow' | 'mcp-server' | 'gateway' | 'memory',\n value: null | undefined,\n key?: string,\n): MastraError {\n const typeLabel = type === 'mcp-server' ? 'MCP server' : type;\n const errorId = `MASTRA_ADD_${type.toUpperCase().replace('-', '_')}_UNDEFINED` as Uppercase<string>;\n return new MastraError({\n id: errorId,\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Cannot add ${typeLabel}: ${typeLabel} is ${value === null ? 'null' : 'undefined'}. This may occur if config was spread ({ ...config }) and the original object had getters or non-enumerable properties.`,\n details: { status: 400, ...(key && { key }) },\n });\n}\n\n/**\n * Configuration interface for initializing a Mastra instance.\n *\n * The Config interface defines all the optional components that can be registered\n * with a Mastra instance, including agents, workflows, storage, logging, and more.\n *\n * @template TAgents - Record of agent instances keyed by their names\n * @template TWorkflows - Record of workflow instances\n * @template TVectors - Record of vector store instances\n * @template TTTS - Record of text-to-speech instances\n * @template TLogger - Logger implementation type\n * @template TVNextNetworks - Record of agent network instances\n * @template TMCPServers - Record of MCP server instances\n * @template TScorers - Record of scorer instances\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({\n * id: 'weather-agent',\n * name: 'Weather Agent',\n * instructions: 'You help with weather information',\n * model: 'openai/gpt-5'\n * })\n * },\n * storage: new LibSQLStore({ id: 'mastra-storage', url: ':memory:' }),\n * logger: new PinoLogger({ name: 'MyApp' })\n * });\n * ```\n */\nexport interface Config<\n TAgents extends Record<string, Agent<any>> = Record<string, Agent<any>>,\n TWorkflows extends Record<string, Workflow<any, any, any, any, any, any>> = Record<\n string,\n Workflow<any, any, any, any, any, any>\n >,\n TVectors extends Record<string, MastraVector<any>> = Record<string, MastraVector<any>>,\n TTTS extends Record<string, MastraTTS> = Record<string, MastraTTS>,\n TLogger extends IMastraLogger = IMastraLogger,\n TMCPServers extends Record<string, MCPServerBase<any>> = Record<string, MCPServerBase<any>>,\n TScorers extends Record<string, MastraScorer<any, any, any, any>> = Record<string, MastraScorer<any, any, any, any>>,\n TTools extends Record<string, ToolAction<any, any, any, any, any, any>> = Record<\n string,\n ToolAction<any, any, any, any, any, any>\n >,\n TProcessors extends Record<string, Processor<any>> = Record<string, Processor<any>>,\n TMemory extends Record<string, MastraMemory> = Record<string, MastraMemory>,\n> {\n /**\n * Agents are autonomous systems that can make decisions and take actions.\n * Accepts both Mastra Agent instances and AI SDK v6 ToolLoopAgent instances.\n * ToolLoopAgent instances are automatically converted to Mastra Agents.\n */\n agents?: { [K in keyof TAgents]: TAgents[K] | ToolLoopAgentLike };\n\n /**\n * Storage provider for persisting data, conversation history, and workflow state.\n * Required for agent memory and workflow persistence.\n */\n storage?: MastraStorage;\n\n /**\n * Vector stores for semantic search and retrieval-augmented generation (RAG).\n * Used for storing and querying embeddings.\n */\n vectors?: TVectors;\n\n /**\n * Logger implementation for application logging and debugging.\n * Set to `false` to disable logging entirely.\n * @default `INFO` level in development, `WARN` in production.\n */\n logger?: TLogger | false;\n\n /**\n * Workflows provide type-safe, composable task execution with built-in error handling.\n */\n workflows?: TWorkflows;\n\n /**\n * Text-to-speech providers for voice synthesis capabilities.\n */\n tts?: TTTS;\n\n /**\n * Observability entrypoint for tracking model interactions and tracing.\n * Pass an instance of the Observability class from @mastra/observability.\n *\n * @example\n * ```typescript\n * import { Observability } from '@mastra/observability';\n *\n * new Mastra({\n * observability: new Observability({\n * default: { enabled: true }\n * })\n * })\n * ```\n */\n observability?: ObservabilityEntrypoint;\n\n /**\n * Custom ID generator function for creating unique identifiers.\n * @default `crypto.randomUUID()`\n */\n idGenerator?: MastraIdGenerator;\n\n /**\n * Deployment provider for publishing applications to cloud platforms.\n */\n deployer?: MastraDeployer;\n\n /**\n * Server configuration for HTTP endpoints and middleware.\n */\n server?: ServerConfig;\n\n /**\n * MCP servers provide tools and resources that agents can use.\n */\n mcpServers?: TMCPServers;\n\n /**\n * Bundler configuration for packaging and deployment.\n */\n bundler?: BundlerConfig;\n\n /**\n * Pub/sub system for event-driven communication between components.\n * @default EventEmitterPubSub\n */\n pubsub?: PubSub;\n\n /**\n * Scorers help assess the quality of agent responses and workflow outputs.\n */\n scorers?: TScorers;\n\n /**\n * Tools are reusable functions that agents can use to interact with external systems.\n */\n tools?: TTools;\n\n /**\n * Processors transform inputs and outputs for agents and workflows.\n */\n processors?: TProcessors;\n\n /**\n * Memory instances that can be referenced by stored agents.\n * Keys are used to look up memory instances when resolving stored agent configurations.\n */\n memory?: TMemory;\n\n /**\n * Custom model router gateways for accessing LLM providers.\n * Gateways handle provider-specific authentication, URL construction, and model resolution.\n */\n gateways?: Record<string, MastraModelGateway>;\n\n /**\n * Event handlers for custom application events.\n * Maps event topics to handler functions for event-driven architectures.\n */\n events?: {\n [topic: string]: (\n event: Event,\n cb?: () => Promise<void>,\n ) => Promise<void> | ((event: Event, cb?: () => Promise<void>) => Promise<void>)[];\n };\n}\n\n/**\n * The central orchestrator for Mastra applications, managing agents, workflows, storage, logging, observability, and more.\n *\n * The `Mastra` class serves as the main entry point and registry for all components in a Mastra application.\n * It coordinates the interaction between agents, workflows, storage systems, and other services.\n\n * @template TAgents - Record of agent instances keyed by their names\n * @template TWorkflows - Record of modern workflow instances\n * @template TVectors - Record of vector store instances for semantic search and RAG\n * @template TTTS - Record of text-to-speech provider instances\n * @template TLogger - Logger implementation type for application logging\n * @template TVNextNetworks - Record of next-generation agent network instances\n * @template TMCPServers - Record of Model Context Protocol server instances\n * @template TScorers - Record of evaluation scorer instances for measuring AI performance\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({\n * id: 'weather-agent',\n * name: 'Weather Agent',\n * instructions: 'You provide weather information',\n * model: 'openai/gpt-5',\n * tools: [getWeatherTool]\n * })\n * },\n * workflows: { dataWorkflow },\n * storage: new LibSQLStore({ id: 'mastra-storage', url: ':memory:' }),\n * logger: new PinoLogger({ name: 'MyApp' })\n * });\n * ```\n */\nexport class Mastra<\n TAgents extends Record<string, Agent<any>> = Record<string, Agent<any>>,\n TWorkflows extends Record<string, Workflow<any, any, any, any, any, any>> = Record<\n string,\n Workflow<any, any, any, any, any, any>\n >,\n TVectors extends Record<string, MastraVector<any>> = Record<string, MastraVector<any>>,\n TTTS extends Record<string, MastraTTS> = Record<string, MastraTTS>,\n TLogger extends IMastraLogger = IMastraLogger,\n TMCPServers extends Record<string, MCPServerBase<any>> = Record<string, MCPServerBase<any>>,\n TScorers extends Record<string, MastraScorer<any, any, any, any>> = Record<string, MastraScorer<any, any, any, any>>,\n TTools extends Record<string, ToolAction<any, any, any, any, any, any>> = Record<\n string,\n ToolAction<any, any, any, any, any, any>\n >,\n TProcessors extends Record<string, Processor<any>> = Record<string, Processor<any>>,\n TMemory extends Record<string, MastraMemory> = Record<string, MastraMemory>,\n> {\n #vectors?: TVectors;\n #agents: TAgents;\n #logger: TLogger;\n #workflows: TWorkflows;\n #observability: ObservabilityEntrypoint;\n #tts?: TTTS;\n #deployer?: MastraDeployer;\n #serverMiddleware: Array<{\n handler: (c: any, next: () => Promise<void>) => Promise<Response | void>;\n path: string;\n }> = [];\n\n #storage?: MastraStorage;\n #scorers?: TScorers;\n #tools?: TTools;\n #processors?: TProcessors;\n #memory?: TMemory;\n #server?: ServerConfig;\n #serverAdapter?: MastraServerBase;\n #mcpServers?: TMCPServers;\n #bundler?: BundlerConfig;\n #idGenerator?: MastraIdGenerator;\n #pubsub: PubSub;\n #gateways?: Record<string, MastraModelGateway>;\n #events: {\n [topic: string]: ((event: Event, cb?: () => Promise<void>) => Promise<void>)[];\n } = {};\n #internalMastraWorkflows: Record<string, Workflow> = {};\n // This is only used internally for server handlers that require temporary persistence\n #serverCache: MastraServerCache;\n\n get pubsub() {\n return this.#pubsub;\n }\n\n /**\n * Gets the currently configured ID generator function.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * idGenerator: () => `custom-${Date.now()}`\n * });\n * const generator = mastra.getIdGenerator();\n * console.log(generator?.()); // \"custom-1234567890\"\n * ```\n */\n public getIdGenerator() {\n return this.#idGenerator;\n }\n\n /**\n * Generates a unique identifier using the configured generator or defaults to `crypto.randomUUID()`.\n *\n * This method is used internally by Mastra for creating unique IDs for various entities\n * like workflow runs, agent conversations, and other resources that need unique identification.\n *\n * @throws {MastraError} When the custom ID generator returns an empty string\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const id = mastra.generateId();\n * console.log(id); // \"550e8400-e29b-41d4-a716-446655440000\"\n * ```\n */\n public generateId(): string {\n if (this.#idGenerator) {\n const id = this.#idGenerator();\n if (!id) {\n const error = new MastraError({\n id: 'MASTRA_ID_GENERATOR_RETURNED_EMPTY_STRING',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'ID generator returned an empty string, which is not allowed',\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return id;\n }\n return randomUUID();\n }\n\n /**\n * Sets a custom ID generator function for creating unique identifiers.\n *\n * The ID generator function will be used by `generateId()` instead of the default\n * `crypto.randomUUID()`. This is useful for creating application-specific ID formats\n * or integrating with existing ID generation systems.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * mastra.setIdGenerator(() => `custom-${Date.now()}`);\n * const id = mastra.generateId();\n * console.log(id); // \"custom-1234567890\"\n * ```\n */\n public setIdGenerator(idGenerator: MastraIdGenerator) {\n this.#idGenerator = idGenerator;\n }\n\n /**\n * Creates a new Mastra instance with the provided configuration.\n *\n * The constructor initializes all the components specified in the config, sets up\n * internal systems like logging and observability, and registers components with each other.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * assistant: new Agent({\n * id: 'assistant',\n * name: 'Assistant',\n * instructions: 'You are a helpful assistant',\n * model: 'openai/gpt-5'\n * })\n * },\n * storage: new PostgresStore({\n * connectionString: process.env.DATABASE_URL\n * }),\n * logger: new PinoLogger({ name: 'MyApp' }),\n * observability: { default: { enabled: true }},\n * });\n * ```\n */\n constructor(\n config?: Config<TAgents, TWorkflows, TVectors, TTTS, TLogger, TMCPServers, TScorers, TTools, TProcessors, TMemory>,\n ) {\n // This is only used internally for server handlers that require temporary persistence\n this.#serverCache = new InMemoryServerCache();\n\n if (config?.pubsub) {\n this.#pubsub = config.pubsub;\n } else {\n this.#pubsub = new EventEmitterPubSub();\n }\n\n this.#events = {};\n for (const topic in config?.events ?? {}) {\n if (!Array.isArray(config?.events?.[topic])) {\n this.#events[topic] = [config?.events?.[topic] as any];\n } else {\n this.#events[topic] = config?.events?.[topic] ?? [];\n }\n }\n\n const workflowEventProcessor = new WorkflowEventProcessor({ mastra: this });\n const workflowEventCb = async (event: Event, cb?: () => Promise<void>): Promise<void> => {\n try {\n await workflowEventProcessor.process(event, cb);\n } catch (e) {\n this.getLogger()?.error('Error processing event', e);\n }\n };\n if (this.#events.workflows) {\n this.#events.workflows.push(workflowEventCb);\n } else {\n this.#events.workflows = [workflowEventCb];\n }\n\n let logger: TLogger;\n if (config?.logger === false) {\n logger = noopLogger as unknown as TLogger;\n } else {\n if (config?.logger) {\n logger = config.logger;\n } else {\n const levelOnEnv =\n process.env.NODE_ENV === 'production' && process.env.MASTRA_DEV !== 'true' ? LogLevel.WARN : LogLevel.INFO;\n logger = new ConsoleLogger({ name: 'Mastra', level: levelOnEnv }) as unknown as TLogger;\n }\n }\n this.#logger = logger;\n\n this.#idGenerator = config?.idGenerator;\n\n let storage = config?.storage;\n\n if (storage) {\n storage = augmentWithInit(storage);\n }\n\n // Validate and assign observability instance\n if (config?.observability) {\n if (typeof config.observability.getDefaultInstance === 'function') {\n this.#observability = config.observability;\n // Set logger early\n this.#observability.setLogger({ logger: this.#logger });\n } else {\n this.#logger?.warn(\n 'Observability configuration error: Expected an Observability instance, but received a config object. ' +\n 'Import and instantiate: import { Observability } from \"@mastra/observability\"; ' +\n 'then pass: observability: new Observability({ default: { enabled: true } }). ' +\n 'Observability has been disabled.',\n );\n this.#observability = new NoOpObservability();\n }\n } else {\n this.#observability = new NoOpObservability();\n }\n\n this.#storage = storage;\n\n // Initialize all primitive storage objects first, we need to do this before adding primitives to avoid circular dependencies\n this.#vectors = {} as TVectors;\n this.#mcpServers = {} as TMCPServers;\n this.#tts = {} as TTTS;\n this.#agents = {} as TAgents;\n this.#scorers = {} as TScorers;\n this.#tools = {} as TTools;\n this.#processors = {} as TProcessors;\n this.#memory = {} as TMemory;\n this.#workflows = {} as TWorkflows;\n this.#gateways = {} as Record<string, MastraModelGateway>;\n\n // Now add primitives - order matters for auto-registration\n // Tools and processors should be added before agents and MCP servers that might use them\n // Note: We validate each entry to handle cases where config was spread ({ ...config })\n // which can cause undefined values if the source object had getters or non-enumerable properties\n if (config?.tools) {\n Object.entries(config.tools).forEach(([key, tool]) => {\n if (tool != null) {\n this.addTool(tool, key);\n }\n });\n }\n\n if (config?.processors) {\n Object.entries(config.processors).forEach(([key, processor]) => {\n if (processor != null) {\n this.addProcessor(processor, key);\n }\n });\n }\n\n if (config?.memory) {\n Object.entries(config.memory).forEach(([key, memory]) => {\n if (memory != null) {\n this.addMemory(memory, key);\n }\n });\n }\n\n if (config?.vectors) {\n Object.entries(config.vectors).forEach(([key, vector]) => {\n if (vector != null) {\n this.addVector(vector, key);\n }\n });\n }\n\n if (config?.scorers) {\n Object.entries(config.scorers).forEach(([key, scorer]) => {\n if (scorer != null) {\n this.addScorer(scorer, key);\n }\n });\n }\n\n if (config?.workflows) {\n Object.entries(config.workflows).forEach(([key, workflow]) => {\n if (workflow != null) {\n this.addWorkflow(workflow, key);\n }\n });\n }\n\n if (config?.gateways) {\n Object.entries(config.gateways).forEach(([key, gateway]) => {\n if (gateway != null) {\n this.addGateway(gateway, key);\n }\n });\n }\n\n // Add MCP servers and agents last since they might reference other primitives\n if (config?.mcpServers) {\n Object.entries(config.mcpServers).forEach(([key, server]) => {\n if (server != null) {\n this.addMCPServer(server, key);\n }\n });\n }\n\n if (config?.agents) {\n Object.entries(config.agents).forEach(([key, agent]) => {\n if (agent != null) {\n this.addAgent(agent, key);\n }\n });\n }\n\n if (config?.tts) {\n Object.entries(config.tts).forEach(([key, tts]) => {\n if (tts != null) {\n (this.#tts as Record<string, MastraTTS>)[key] = tts;\n }\n });\n }\n\n if (config?.server) {\n this.#server = config.server;\n }\n\n registerHook(AvailableHooks.ON_SCORER_RUN, createOnScorerHook(this));\n\n /*\n Initialize observability with Mastra context (after storage configured)\n */\n this.#observability.setMastraContext({ mastra: this });\n\n this.setLogger({ logger });\n }\n\n /**\n * Retrieves a registered agent by its name.\n *\n * @template TAgentName - The specific agent name type from the registered agents\n * @throws {MastraError} When the agent with the specified name is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({\n * id: 'weather-agent',\n * name: 'weather-agent',\n * instructions: 'You provide weather information',\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n * const agent = mastra.getAgent('weatherAgent');\n * const response = await agent.generate('What is the weather?');\n * ```\n */\n public getAgent<TAgentName extends keyof TAgents>(name: TAgentName): TAgents[TAgentName] {\n const agent = this.#agents?.[name];\n if (!agent) {\n const error = new MastraError({\n id: 'MASTRA_GET_AGENT_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Agent with name ${String(name)} not found`,\n details: {\n status: 404,\n agentName: String(name),\n agents: Object.keys(this.#agents ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#agents[name];\n }\n\n /**\n * Retrieves a registered agent by its unique ID.\n *\n * This method searches for an agent using its internal ID property. If no agent\n * is found with the given ID, it also attempts to find an agent using the ID as\n * a name.\n *\n * @throws {MastraError} When no agent is found with the specified ID\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * assistant: new Agent({\n * id: 'assistant',\n * name: 'assistant',\n * instructions: 'You are a helpful assistant',\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n *\n * const assistant = mastra.getAgent('assistant');\n * const sameAgent = mastra.getAgentById(assistant.id);\n * ```\n */\n public getAgentById<TAgentName extends keyof TAgents>(id: TAgents[TAgentName]['id']): TAgents[TAgentName] {\n let agent = Object.values(this.#agents).find(a => a.id === id);\n\n if (!agent) {\n try {\n agent = this.getAgent(id);\n } catch {\n // do nothing\n }\n }\n\n if (!agent) {\n const error = new MastraError({\n id: 'MASTRA_GET_AGENT_BY_AGENT_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Agent with id ${String(id)} not found`,\n details: {\n status: 404,\n agentId: String(id),\n agents: Object.keys(this.#agents ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n return agent as TAgents[TAgentName];\n }\n\n /**\n * Returns all registered agents as a record keyed by their names.\n *\n * This method provides access to the complete registry of agents, allowing you to\n * iterate over them, check what agents are available, or perform bulk operations.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: {\n * weatherAgent: new Agent({ id: 'weather-agent', name: 'weather', model: 'openai/gpt-4o' }),\n * supportAgent: new Agent({ id: 'support-agent', name: 'support', model: 'openai/gpt-4o' })\n * }\n * });\n *\n * const allAgents = mastra.listAgents();\n * console.log(Object.keys(allAgents)); // ['weatherAgent', 'supportAgent']\n * ```\n */\n public listAgents() {\n return this.#agents;\n }\n\n /**\n * Retrieves a stored agent from the database by its unique identifier.\n *\n * By default, returns an executable Agent instance. Set `raw: true` to get\n * the raw stored configuration data instead.\n *\n * @param id - The unique identifier of the stored agent\n * @param options - Options for the query\n * @param options.raw - If true, returns raw stored data instead of Agent instance\n *\n * @throws {MastraError} When storage is not configured or doesn't support agents\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * storage: new PostgresStore({ connectionString: process.env.DATABASE_URL })\n * });\n *\n * // Get as executable Agent instance (default)\n * const agent = await mastra.getStoredAgentById('my-agent-id');\n * if (agent) {\n * const response = await agent.generate('Hello!');\n * console.log(response.text);\n * }\n *\n * // Get raw stored configuration\n * const rawConfig = await mastra.getStoredAgentById('my-agent-id', { raw: true });\n * if (rawConfig) {\n * console.log(rawConfig.instructions);\n * }\n * ```\n */\n public async getStoredAgentById(id: string, options?: { raw?: false }): Promise<Agent | null>;\n public async getStoredAgentById(id: string, options: { raw: true }): Promise<StorageAgentType | null>;\n public async getStoredAgentById(id: string, options?: { raw?: boolean }): Promise<Agent | StorageAgentType | null> {\n const storage = this.#storage;\n\n if (!storage) {\n const error = new MastraError({\n id: 'MASTRA_GET_STORED_AGENT_STORAGE_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Storage is not configured',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const agentsStore = await storage.getStore('agents');\n if (!agentsStore) {\n const error = new MastraError({\n id: 'MASTRA_GET_STORED_AGENT_NOT_SUPPORTED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Agents storage is not available',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const storedAgent = await agentsStore.getAgentById({ id });\n\n if (!storedAgent) {\n return null;\n }\n\n if (options?.raw) {\n return storedAgent;\n }\n\n return this.#createAgentFromStoredConfig(storedAgent);\n }\n\n /**\n * Lists all stored agents from the database with optional pagination.\n *\n * By default, returns executable Agent instances. Set `raw: true` to get\n * the raw stored configuration data instead.\n *\n * @param args - Options for pagination and output format\n * @param args.page - Zero-indexed page number (default: 0)\n * @param args.perPage - Items per page, or false for all (default: 100)\n * @param args.orderBy - Sort order configuration\n * @param args.raw - If true, returns raw stored data instead of Agent instances\n *\n * @throws {MastraError} When storage is not configured or doesn't support agents\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * storage: new PostgresStore({ connectionString: process.env.DATABASE_URL })\n * });\n *\n * // List as executable Agent instances (default)\n * const result = await mastra.listStoredAgents();\n * for (const agent of result.agents) {\n * const response = await agent.generate('Hello!');\n * }\n *\n * // List raw stored configurations\n * const rawResult = await mastra.listStoredAgents({ raw: true });\n * for (const config of rawResult.agents) {\n * console.log(config.instructions, config.createdAt);\n * }\n *\n * // With pagination\n * const paginated = await mastra.listStoredAgents({\n * page: 0,\n * perPage: 10,\n * orderBy: { field: 'createdAt', direction: 'DESC' }\n * });\n * ```\n */\n public async listStoredAgents(args?: {\n page?: number;\n perPage?: number | false;\n orderBy?: { field: 'createdAt' | 'updatedAt'; direction: 'ASC' | 'DESC' };\n raw?: false;\n }): Promise<{\n agents: Agent[];\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }>;\n public async listStoredAgents(args: {\n page?: number;\n perPage?: number | false;\n orderBy?: { field: 'createdAt' | 'updatedAt'; direction: 'ASC' | 'DESC' };\n raw: true;\n }): Promise<{\n agents: StorageAgentType[];\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }>;\n public async listStoredAgents(args?: {\n page?: number;\n perPage?: number | false;\n orderBy?: { field: 'createdAt' | 'updatedAt'; direction: 'ASC' | 'DESC' };\n raw?: boolean;\n }): Promise<{\n agents: Agent[] | StorageAgentType[];\n total: number;\n page: number;\n perPage: number | false;\n hasMore: boolean;\n }> {\n const storage = this.#storage;\n\n if (!storage) {\n const error = new MastraError({\n id: 'MASTRA_LIST_STORED_AGENTS_STORAGE_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Storage is not configured',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const agentsStore = await storage.getStore('agents');\n if (!agentsStore) {\n const error = new MastraError({\n id: 'MASTRA_LIST_STORED_AGENTS_NOT_SUPPORTED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Agents storage is not available',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const result = await agentsStore.listAgents({\n page: args?.page,\n perPage: args?.perPage,\n orderBy: args?.orderBy,\n });\n\n if (args?.raw) {\n return result;\n }\n\n // Transform stored configs into Agent instances\n const agents = result.agents.map(storedAgent => this.#createAgentFromStoredConfig(storedAgent));\n\n return {\n agents,\n total: result.total,\n page: result.page,\n perPage: result.perPage,\n hasMore: result.hasMore,\n };\n }\n\n /**\n * Creates an Agent instance from a stored agent configuration.\n * @private\n */\n #createAgentFromStoredConfig(storedAgent: StorageAgentType): Agent {\n // Build model config from stored data\n // The model field stores { provider, name, ...otherConfig }\n const modelConfig = storedAgent.model as { provider?: string; name?: string; [key: string]: unknown };\n\n // Build the model string in \"provider/modelName\" format\n if (!modelConfig.provider || !modelConfig.name) {\n throw new MastraError({\n id: 'MASTRA_STORED_AGENT_INVALID_MODEL',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Stored agent \"${storedAgent.id}\" has invalid model configuration. Both provider and name are required.`,\n details: { agentId: storedAgent.id, model: JSON.stringify(storedAgent.model) },\n });\n }\n\n // Use model router format: \"provider/modelName\"\n const model = `${modelConfig.provider}/${modelConfig.name}`;\n\n // Resolve tools from the stored tool references\n const tools = this.#resolveStoredTools(storedAgent.tools);\n\n // Resolve workflows from the stored workflow references\n const workflows = this.#resolveStoredWorkflows(storedAgent.workflows);\n\n // Resolve sub-agents from the stored agent references\n const agents = this.#resolveStoredAgents(storedAgent.agents);\n\n // Resolve memory from the stored memory reference\n const memory = this.#resolveStoredMemory(storedAgent.memory);\n\n // Resolve scorers from the stored scorer references\n const scorers = this.#resolveStoredScorers(storedAgent.scorers);\n\n // Create the agent instance\n const agent = new Agent({\n id: storedAgent.id,\n name: storedAgent.name,\n description: storedAgent.description,\n instructions: storedAgent.instructions,\n model,\n tools,\n workflows,\n agents,\n memory,\n scorers,\n defaultOptions: storedAgent.defaultOptions,\n });\n\n // Register the agent with Mastra\n agent.__setLogger(this.#logger);\n agent.__registerMastra(this);\n agent.__registerPrimitives({\n logger: this.getLogger(),\n storage: this.getStorage(),\n agents: this.#agents as Record<string, Agent<any>>,\n tts: this.#tts,\n vectors: this.#vectors,\n });\n\n return agent;\n }\n\n /**\n * Resolves tool references from stored configuration to actual tool instances.\n * @private\n */\n #resolveStoredTools(storedTools?: string[]): Record<string, ToolAction<any, any, any, any, any, any>> {\n if (!storedTools || storedTools.length === 0) {\n return {};\n }\n\n const resolvedTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n const registeredTools = this.#tools;\n\n for (const toolKey of storedTools) {\n // Try to find the tool in registered tools\n if (registeredTools && registeredTools[toolKey]) {\n resolvedTools[toolKey] = registeredTools[toolKey];\n } else {\n // Tool reference exists but tool is not registered - log warning\n this.#logger?.warn(`Tool \"${toolKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n\n return resolvedTools;\n }\n\n /**\n * Resolves workflow references from stored configuration to actual workflow instances.\n * @private\n */\n #resolveStoredWorkflows(storedWorkflows?: string[]): Record<string, Workflow<any, any, any, any, any, any>> {\n if (!storedWorkflows || storedWorkflows.length === 0) {\n return {};\n }\n\n const resolvedWorkflows: Record<string, Workflow<any, any, any, any, any, any>> = {};\n\n for (const workflowKey of storedWorkflows) {\n // Try to find the workflow in registered workflows\n try {\n const workflow = this.getWorkflow(workflowKey);\n resolvedWorkflows[workflowKey] = workflow;\n } catch {\n // Try by ID\n try {\n const workflow = this.getWorkflowById(workflowKey);\n resolvedWorkflows[workflowKey] = workflow;\n } catch {\n this.#logger?.warn(`Workflow \"${workflowKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n\n return resolvedWorkflows;\n }\n\n /**\n * Resolves agent references from stored configuration to actual agent instances.\n * @private\n */\n #resolveStoredAgents(storedAgents?: string[]): Record<string, Agent<any>> {\n if (!storedAgents || storedAgents.length === 0) {\n return {};\n }\n\n const resolvedAgents: Record<string, Agent<any>> = {};\n\n for (const agentKey of storedAgents) {\n // Try to find the agent in registered agents\n try {\n const agent = this.getAgent(agentKey as keyof TAgents);\n resolvedAgents[agentKey] = agent;\n } catch {\n // Try by ID\n try {\n const agent = this.getAgentById(agentKey as TAgents[keyof TAgents]['id']);\n resolvedAgents[agentKey] = agent;\n } catch {\n this.#logger?.warn(`Agent \"${agentKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n\n return resolvedAgents;\n }\n\n /**\n * Resolves memory reference from stored configuration to actual memory instance.\n * @private\n */\n #resolveStoredMemory(storedMemory?: string): MastraMemory | undefined {\n if (!storedMemory) {\n return undefined;\n }\n\n // Try by key first\n try {\n return this.getMemory(storedMemory as keyof TMemory);\n } catch {\n // Try by id\n try {\n return this.getMemoryById(storedMemory);\n } catch {\n this.#logger?.warn(`Memory \"${storedMemory}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n\n return undefined;\n }\n\n /**\n * Resolves scorer references from stored configuration to actual scorer instances.\n * @private\n */\n #resolveStoredScorers(storedScorers?: Record<string, StorageScorerConfig>): MastraScorers | undefined {\n if (!storedScorers) {\n return undefined;\n }\n\n const resolvedScorers: MastraScorers = {};\n\n for (const [scorerKey, scorerConfig] of Object.entries(storedScorers)) {\n // Try to find the scorer in registered scorers by key\n try {\n const scorer = this.getScorer(scorerKey as keyof TScorers);\n resolvedScorers[scorerKey] = {\n scorer,\n sampling: scorerConfig.sampling as ScoringSamplingConfig | undefined,\n };\n } catch {\n // Try by ID\n try {\n const scorer = this.getScorerById(scorerKey);\n resolvedScorers[scorerKey] = {\n scorer,\n sampling: scorerConfig.sampling as ScoringSamplingConfig | undefined,\n };\n } catch {\n this.#logger?.warn(`Scorer \"${scorerKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n\n return Object.keys(resolvedScorers).length > 0 ? resolvedScorers : undefined;\n }\n\n /**\n * Adds a new agent to the Mastra instance.\n *\n * This method allows dynamic registration of agents after the Mastra instance\n * has been created. The agent will be initialized with the current logger.\n *\n * @throws {MastraError} When an agent with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newAgent = new Agent({\n * id: 'chat-agent',\n * name: 'Chat Assistant',\n * model: 'openai/gpt-4o'\n * });\n * mastra.addAgent(newAgent); // Uses agent.id as key\n * // or\n * mastra.addAgent(newAgent, 'customKey'); // Uses custom key\n * ```\n */\n public addAgent<A extends Agent<any> | ToolLoopAgentLike>(agent: A, key?: string): void {\n if (!agent) {\n throw createUndefinedPrimitiveError('agent', agent, key);\n }\n let mastraAgent: Agent<any>;\n if (isToolLoopAgentLike(agent)) {\n // Pass the config key as the name if the ToolLoopAgent doesn't have an id\n mastraAgent = toolLoopAgentToMastraAgent(agent, { fallbackName: key });\n } else {\n mastraAgent = agent;\n }\n const agentKey = key || mastraAgent.id;\n const agents = this.#agents as Record<string, Agent<any>>;\n if (agents[agentKey]) {\n const logger = this.getLogger();\n logger.debug(`Agent with key ${agentKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the agent\n mastraAgent.__setLogger(this.#logger);\n mastraAgent.__registerMastra(this);\n mastraAgent.__registerPrimitives({\n logger: this.getLogger(),\n storage: this.getStorage(),\n agents: agents,\n tts: this.#tts,\n vectors: this.#vectors,\n });\n agents[agentKey] = mastraAgent;\n\n // Register configured processor workflows from the agent\n // Use .then() to handle async resolution without blocking the constructor\n // This excludes memory-derived processors to avoid triggering memory factory functions\n mastraAgent\n .getConfiguredProcessorWorkflows()\n .then(processorWorkflows => {\n for (const workflow of processorWorkflows) {\n this.addWorkflow(workflow, workflow.id);\n }\n })\n .catch(err => {\n this.#logger?.debug(`Failed to register processor workflows for agent ${agentKey}:`, err);\n });\n }\n\n /**\n * Retrieves a registered vector store by its name.\n *\n * @template TVectorName - The specific vector store name type from the registered vectors\n * @throws {MastraError} When the vector store with the specified name is not found\n *\n * @example Using a vector store for semantic search\n * ```typescript\n * import { PineconeVector } from '@mastra/pinecone';\n * import { OpenAIEmbedder } from '@mastra/embedders';\n *\n * const mastra = new Mastra({\n * vectors: {\n * knowledge: new PineconeVector({\n * apiKey: process.env.PINECONE_API_KEY,\n * indexName: 'knowledge-base',\n * embedder: new OpenAIEmbedder({\n * apiKey: process.env.OPENAI_API_KEY,\n * model: 'text-embedding-3-small'\n * })\n * }),\n * products: new PineconeVector({\n * apiKey: process.env.PINECONE_API_KEY,\n * indexName: 'product-catalog'\n * })\n * }\n * });\n *\n * // Get a vector store and perform semantic search\n * const knowledgeBase = mastra.getVector('knowledge');\n * const results = await knowledgeBase.query({\n * query: 'How to reset password?',\n * topK: 5\n * });\n *\n * console.log('Relevant documents:', results);\n * ```\n */\n public getVector<TVectorName extends keyof TVectors>(name: TVectorName): TVectors[TVectorName] {\n const vector = this.#vectors?.[name];\n if (!vector) {\n const error = new MastraError({\n id: 'MASTRA_GET_VECTOR_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Vector with name ${String(name)} not found`,\n details: {\n status: 404,\n vectorName: String(name),\n vectors: Object.keys(this.#vectors ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return vector;\n }\n\n /**\n * Retrieves a specific vector store instance by its ID.\n *\n * This method searches for a vector store by its internal ID property.\n * If not found by ID, it falls back to searching by registration key.\n *\n * @throws {MastraError} When the specified vector store is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * vectors: {\n * embeddings: chromaVector\n * }\n * });\n *\n * const vectorStore = mastra.getVectorById('chroma-123');\n * ```\n */\n public getVectorById<TVectorName extends keyof TVectors>(id: TVectors[TVectorName]['id']): TVectors[TVectorName] {\n const allVectors = this.#vectors ?? ({} as Record<string, MastraVector>);\n\n // First try to find by internal ID\n for (const vector of Object.values(allVectors)) {\n if (vector.id === id) {\n return vector as TVectors[TVectorName];\n }\n }\n\n // Fallback to searching by registration key\n const vectorByKey = allVectors[id];\n if (vectorByKey) {\n return vectorByKey as TVectors[TVectorName];\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_VECTOR_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Vector store with id ${id} not found`,\n details: {\n status: 404,\n vectorId: String(id),\n vectors: Object.keys(allVectors).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Returns all registered vector stores as a record keyed by their names.\n *\n * @example Listing all vector stores\n * ```typescript\n * const mastra = new Mastra({\n * vectors: {\n * documents: new PineconeVector({ indexName: 'docs' }),\n * images: new PineconeVector({ indexName: 'images' }),\n * products: new ChromaVector({ collectionName: 'products' })\n * }\n * });\n *\n * const allVectors = mastra.getVectors();\n * console.log(Object.keys(allVectors)); // ['documents', 'images', 'products']\n *\n * // Check vector store types and configurations\n * for (const [name, vectorStore] of Object.entries(allVectors)) {\n * console.log(`Vector store ${name}:`, vectorStore.constructor.name);\n * }\n * ```\n */\n public listVectors(): TVectors | undefined {\n return this.#vectors;\n }\n\n /**\n * Adds a new vector store to the Mastra instance.\n *\n * This method allows dynamic registration of vector stores after the Mastra instance\n * has been created. The vector store will be initialized with the current logger.\n *\n * @throws {MastraError} When a vector store with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newVector = new ChromaVector({ id: 'chroma-embeddings' });\n * mastra.addVector(newVector); // Uses vector.id as key\n * // or\n * mastra.addVector(newVector, 'customKey'); // Uses custom key\n * ```\n */\n public addVector<V extends MastraVector>(vector: V, key?: string): void {\n if (!vector) {\n throw createUndefinedPrimitiveError('vector', vector, key);\n }\n const vectorKey = key || vector.id;\n const vectors = this.#vectors as Record<string, MastraVector>;\n if (vectors[vectorKey]) {\n const logger = this.getLogger();\n logger.debug(`Vector with key ${vectorKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the vector with the logger\n vector.__setLogger(this.#logger || this.getLogger());\n vectors[vectorKey] = vector;\n }\n\n /**\n * @deprecated Use listVectors() instead\n */\n public getVectors(): TVectors | undefined {\n console.warn('getVectors() is deprecated. Use listVectors() instead.');\n return this.listVectors();\n }\n\n /**\n * Gets the currently configured deployment provider.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * deployer: new VercelDeployer({\n * token: process.env.VERCEL_TOKEN,\n * projectId: process.env.VERCEL_PROJECT_ID\n * })\n * });\n *\n * const deployer = mastra.getDeployer();\n * if (deployer) {\n * await deployer.deploy({\n * name: 'my-mastra-app',\n * environment: 'production'\n * });\n * }\n * ```\n */\n public getDeployer() {\n return this.#deployer;\n }\n\n /**\n * Retrieves a registered workflow by its ID.\n *\n * @template TWorkflowId - The specific workflow ID type from the registered workflows\n * @throws {MastraError} When the workflow with the specified ID is not found\n *\n * @example Getting and executing a workflow\n * ```typescript\n * import { createWorkflow, createStep } from '@mastra/core/workflows';\n * import { z } from 'zod';\n *\n * const processDataWorkflow = createWorkflow({\n * name: 'process-data',\n * triggerSchema: z.object({ input: z.string() })\n * })\n * .then(validateStep)\n * .then(transformStep)\n * .then(saveStep)\n * .commit();\n *\n * const mastra = new Mastra({\n * workflows: {\n * dataProcessor: processDataWorkflow\n * }\n * });\n * ```\n */\n public getWorkflow<TWorkflowId extends keyof TWorkflows>(\n id: TWorkflowId,\n { serialized }: { serialized?: boolean } = {},\n ): TWorkflows[TWorkflowId] {\n const workflow = this.#workflows?.[id];\n if (!workflow) {\n const error = new MastraError({\n id: 'MASTRA_GET_WORKFLOW_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Workflow with ID ${String(id)} not found`,\n details: {\n status: 404,\n workflowId: String(id),\n workflows: Object.keys(this.#workflows ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n if (serialized) {\n return { name: workflow.name } as TWorkflows[TWorkflowId];\n }\n\n return workflow;\n }\n\n __registerInternalWorkflow(workflow: Workflow) {\n workflow.__registerMastra(this);\n workflow.__registerPrimitives({\n logger: this.getLogger(),\n });\n this.#internalMastraWorkflows[workflow.id] = workflow;\n }\n\n __hasInternalWorkflow(id: string): boolean {\n return Object.values(this.#internalMastraWorkflows).some(workflow => workflow.id === id);\n }\n\n __getInternalWorkflow(id: string): Workflow {\n const workflow = Object.values(this.#internalMastraWorkflows).find(a => a.id === id);\n if (!workflow) {\n throw new MastraError({\n id: 'MASTRA_GET_INTERNAL_WORKFLOW_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.SYSTEM,\n text: `Workflow with id ${String(id)} not found`,\n details: {\n status: 404,\n workflowId: String(id),\n },\n });\n }\n\n return workflow;\n }\n\n /**\n * Retrieves a registered workflow by its unique ID.\n *\n * This method searches for a workflow using its internal ID property. If no workflow\n * is found with the given ID, it also attempts to find a workflow using the ID as\n * a name.\n *\n * @throws {MastraError} When no workflow is found with the specified ID\n *\n * @example Finding a workflow by ID\n * ```typescript\n * const mastra = new Mastra({\n * workflows: {\n * dataProcessor: createWorkflow({\n * name: 'process-data',\n * triggerSchema: z.object({ input: z.string() })\n * }).commit()\n * }\n * });\n *\n * // Get the workflow's ID\n * const workflow = mastra.getWorkflow('dataProcessor');\n * const workflowId = workflow.id;\n *\n * // Later, retrieve the workflow by ID\n * const sameWorkflow = mastra.getWorkflowById(workflowId);\n * console.log(sameWorkflow.name); // \"process-data\"\n * ```\n */\n public getWorkflowById<TWorkflowName extends keyof TWorkflows>(\n id: TWorkflows[TWorkflowName]['id'],\n ): TWorkflows[TWorkflowName] {\n let workflow = Object.values(this.#workflows).find(a => a.id === id);\n\n if (!workflow) {\n try {\n workflow = this.getWorkflow(id);\n } catch {\n // do nothing\n }\n }\n\n if (!workflow) {\n const error = new MastraError({\n id: 'MASTRA_GET_WORKFLOW_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Workflow with id ${String(id)} not found`,\n details: {\n status: 404,\n workflowId: String(id),\n workflows: Object.keys(this.#workflows ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n return workflow as TWorkflows[TWorkflowName];\n }\n\n public async listActiveWorkflowRuns(): Promise<WorkflowRuns> {\n const storage = this.#storage;\n if (!storage) {\n this.#logger.debug('Cannot get active workflow runs. Mastra storage is not initialized');\n return { runs: [], total: 0 };\n }\n\n // Get all workflows with default engine type\n const defaultEngineWorkflows = Object.values(this.#workflows).filter(workflow => workflow.engineType === 'default');\n\n // Collect all active runs for workflows with default engine type\n const allRuns: WorkflowRuns['runs'] = [];\n let allTotal = 0;\n\n for (const workflow of defaultEngineWorkflows) {\n const runningRuns = await workflow.listWorkflowRuns({ status: 'running' });\n const waitingRuns = await workflow.listWorkflowRuns({ status: 'waiting' });\n\n allRuns.push(...runningRuns.runs, ...waitingRuns.runs);\n allTotal += runningRuns.total + waitingRuns.total;\n }\n\n return {\n runs: allRuns,\n total: allTotal,\n };\n }\n\n public async restartAllActiveWorkflowRuns(): Promise<void> {\n const activeRuns = await this.listActiveWorkflowRuns();\n if (activeRuns.runs.length > 0) {\n this.#logger.debug(\n `Restarting ${activeRuns.runs.length} active workflow run${activeRuns.runs.length > 1 ? 's' : ''}`,\n );\n }\n for (const runSnapshot of activeRuns.runs) {\n const workflow = this.getWorkflowById(runSnapshot.workflowName);\n try {\n const run = await workflow.createRun({ runId: runSnapshot.runId });\n await run.restart();\n this.#logger.debug(`Restarted ${runSnapshot.workflowName} workflow run ${runSnapshot.runId}`);\n } catch (error) {\n this.#logger.error(`Failed to restart ${runSnapshot.workflowName} workflow run ${runSnapshot.runId}: ${error}`);\n }\n }\n }\n\n /**\n * Returns all registered scorers as a record keyed by their IDs.\n *\n * @example Listing all scorers\n * ```typescript\n * import { HelpfulnessScorer, AccuracyScorer, RelevanceScorer } from '@mastra/scorers';\n *\n * const mastra = new Mastra({\n * scorers: {\n * helpfulness: new HelpfulnessScorer(),\n * accuracy: new AccuracyScorer(),\n * relevance: new RelevanceScorer()\n * }\n * });\n *\n * const allScorers = mastra.listScorers();\n * console.log(Object.keys(allScorers)); // ['helpfulness', 'accuracy', 'relevance']\n *\n * // Check scorer configurations\n * for (const [id, scorer] of Object.entries(allScorers)) {\n * console.log(`Scorer ${id}:`, scorer.id, scorer.name, scorer.description);\n * }\n * ```\n */\n public listScorers() {\n return this.#scorers;\n }\n\n /**\n * Adds a new scorer to the Mastra instance.\n *\n * This method allows dynamic registration of scorers after the Mastra instance\n * has been created.\n *\n * @throws {MastraError} When a scorer with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newScorer = new MastraScorer({\n * id: 'quality-scorer',\n * name: 'Quality Scorer'\n * });\n * mastra.addScorer(newScorer); // Uses scorer.id as key\n * // or\n * mastra.addScorer(newScorer, 'customKey'); // Uses custom key\n * ```\n */\n public addScorer<S extends MastraScorer<any, any, any, any>>(scorer: S, key?: string): void {\n if (!scorer) {\n throw createUndefinedPrimitiveError('scorer', scorer, key);\n }\n const scorerKey = key || scorer.id;\n const scorers = this.#scorers as Record<string, MastraScorer<any, any, any, any>>;\n if (scorers[scorerKey]) {\n const logger = this.getLogger();\n logger.debug(`Scorer with key ${scorerKey} already exists. Skipping addition.`);\n return;\n }\n\n // Register Mastra instance with scorer to enable custom gateway access\n scorer.__registerMastra(this);\n\n scorers[scorerKey] = scorer;\n }\n\n /**\n * Retrieves a registered scorer by its key.\n *\n * @template TScorerKey - The specific scorer key type from the registered scorers\n * @throws {MastraError} When the scorer with the specified key is not found\n *\n * @example Getting and using a scorer\n * ```typescript\n * import { HelpfulnessScorer, AccuracyScorer } from '@mastra/scorers';\n *\n * const mastra = new Mastra({\n * scorers: {\n * helpfulness: new HelpfulnessScorer({\n * model: 'openai/gpt-4o',\n * criteria: 'Rate how helpful this response is'\n * }),\n * accuracy: new AccuracyScorer({\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n *\n * // Get a specific scorer\n * const helpfulnessScorer = mastra.getScorer('helpfulness');\n * const score = await helpfulnessScorer.score({\n * input: 'How do I reset my password?',\n * output: 'You can reset your password by clicking the forgot password link.',\n * expected: 'Detailed password reset instructions'\n * });\n *\n * console.log('Helpfulness score:', score);\n * ```\n */\n public getScorer<TScorerKey extends keyof TScorers>(key: TScorerKey): TScorers[TScorerKey] {\n const scorer = this.#scorers?.[key];\n if (!scorer) {\n const error = new MastraError({\n id: 'MASTRA_GET_SCORER_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Scorer with ${String(key)} not found`,\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return scorer;\n }\n\n /**\n * Retrieves a registered scorer by its name.\n *\n * This method searches through all registered scorers to find one with the specified name.\n * Unlike `getScorer()` which uses the registration key, this method uses the scorer's\n * internal name property.\n *\n * @throws {MastraError} When no scorer is found with the specified name\n *\n * @example Finding a scorer by name\n * ```typescript\n * import { HelpfulnessScorer } from '@mastra/scorers';\n *\n * const mastra = new Mastra({\n * scorers: {\n * myHelpfulnessScorer: new HelpfulnessScorer({\n * name: 'helpfulness-evaluator',\n * model: 'openai/gpt-5'\n * })\n * }\n * });\n *\n * // Find scorer by its internal name, not the registration key\n * const scorer = mastra.getScorerById('helpfulness-evaluator');\n * const score = await scorer.score({\n * input: 'question',\n * output: 'answer'\n * });\n * ```\n */\n public getScorerById<TScorerName extends keyof TScorers>(id: TScorers[TScorerName]['id']): TScorers[TScorerName] {\n for (const [_key, value] of Object.entries(this.#scorers ?? {})) {\n if (value.id === id || value?.name === id) {\n return value as TScorers[TScorerName];\n }\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_SCORER_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Scorer with id ${String(id)} not found`,\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Retrieves a specific tool by registration key.\n *\n * @throws {MastraError} When the specified tool is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tools: {\n * calculator: calculatorTool,\n * weather: weatherTool\n * }\n * });\n *\n * const tool = mastra.getTool('calculator');\n * ```\n */\n public getTool<TToolName extends keyof TTools>(name: TToolName): TTools[TToolName] {\n if (!this.#tools || !this.#tools[name]) {\n const error = new MastraError({\n id: 'MASTRA_GET_TOOL_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Tool with name ${String(name)} not found`,\n details: {\n status: 404,\n toolName: String(name),\n tools: Object.keys(this.#tools ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#tools[name];\n }\n\n /**\n * Retrieves a specific tool by its ID.\n *\n * @throws {MastraError} When the specified tool is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tools: {\n * calculator: calculatorTool\n * }\n * });\n *\n * const tool = mastra.getToolById('calculator-tool-id');\n * ```\n */\n public getToolById<TToolName extends keyof TTools>(id: TTools[TToolName]['id']): TTools[TToolName] {\n const allTools = this.#tools;\n\n if (!allTools) {\n throw new MastraError({\n id: 'MASTRA_GET_TOOL_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Tool with id ${id} not found`,\n });\n }\n // First try to find by internal ID\n for (const tool of Object.values(allTools)) {\n if (tool.id === id) {\n return tool as TTools[TToolName];\n }\n }\n\n // Fallback to searching by registration key\n const toolByKey = allTools[id];\n if (toolByKey) {\n return toolByKey as TTools[TToolName];\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_TOOL_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Tool with id ${id} not found`,\n details: {\n status: 404,\n toolId: String(id),\n tools: Object.keys(allTools).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Lists all configured tools.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tools: {\n * calculator: calculatorTool,\n * weather: weatherTool\n * }\n * });\n *\n * const tools = mastra.listTools();\n * Object.entries(tools || {}).forEach(([name, tool]) => {\n * console.log(`Tool \"${name}\":`, tool.id);\n * });\n * ```\n */\n public listTools(): TTools | undefined {\n return this.#tools;\n }\n\n /**\n * Adds a new tool to the Mastra instance.\n *\n * This method allows dynamic registration of tools after the Mastra instance\n * has been created.\n *\n * @throws {MastraError} When a tool with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newTool = createTool({\n * id: 'calculator-tool',\n * description: 'Performs calculations'\n * });\n * mastra.addTool(newTool); // Uses tool.id as key\n * // or\n * mastra.addTool(newTool, 'customKey'); // Uses custom key\n * ```\n */\n public addTool<T extends ToolAction<any, any, any, any>>(tool: T, key?: string): void {\n if (!tool) {\n throw createUndefinedPrimitiveError('tool', tool, key);\n }\n const toolKey = key || tool.id;\n const tools = this.#tools as Record<string, ToolAction<any, any, any, any>>;\n if (tools[toolKey]) {\n const logger = this.getLogger();\n logger.debug(`Tool with key ${toolKey} already exists. Skipping addition.`);\n return;\n }\n\n tools[toolKey] = tool;\n }\n\n /**\n * Retrieves a specific processor by registration key.\n *\n * @throws {MastraError} When the specified processor is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * processors: {\n * validator: validatorProcessor,\n * transformer: transformerProcessor\n * }\n * });\n *\n * const processor = mastra.getProcessor('validator');\n * ```\n */\n public getProcessor<TProcessorName extends keyof TProcessors>(name: TProcessorName): TProcessors[TProcessorName] {\n if (!this.#processors || !this.#processors[name]) {\n const error = new MastraError({\n id: 'MASTRA_GET_PROCESSOR_BY_NAME_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Processor with name ${String(name)} not found`,\n details: {\n status: 404,\n processorName: String(name),\n processors: Object.keys(this.#processors ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#processors[name];\n }\n\n /**\n * Retrieves a specific processor by its ID.\n *\n * @throws {MastraError} When the specified processor is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * processors: {\n * validator: validatorProcessor\n * }\n * });\n *\n * const processor = mastra.getProcessorById('validator-processor-id');\n * ```\n */\n public getProcessorById<TProcessorName extends keyof TProcessors>(\n id: TProcessors[TProcessorName]['id'],\n ): TProcessors[TProcessorName] {\n const allProcessors = this.#processors;\n\n if (!allProcessors) {\n throw new MastraError({\n id: 'MASTRA_GET_PROCESSOR_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Processor with id ${id} not found`,\n });\n }\n\n // First try to find by internal ID\n for (const processor of Object.values(allProcessors)) {\n if (processor.id === id) {\n return processor as TProcessors[TProcessorName];\n }\n }\n\n // Fallback to searching by registration key\n const processorByKey = allProcessors[id];\n if (processorByKey) {\n return processorByKey as TProcessors[TProcessorName];\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_PROCESSOR_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Processor with id ${id} not found`,\n details: {\n status: 404,\n processorId: String(id),\n processors: Object.keys(allProcessors).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Lists all configured processors.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * processors: {\n * validator: validatorProcessor,\n * transformer: transformerProcessor\n * }\n * });\n *\n * const processors = mastra.listProcessors();\n * Object.entries(processors || {}).forEach(([name, processor]) => {\n * console.log(`Processor \"${name}\":`, processor.id);\n * });\n * ```\n */\n public listProcessors(): TProcessors | undefined {\n return this.#processors;\n }\n\n /**\n * Adds a new processor to the Mastra instance.\n *\n * This method allows dynamic registration of processors after the Mastra instance\n * has been created.\n *\n * @throws {MastraError} When a processor with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newProcessor = {\n * id: 'text-processor',\n * processInput: async (messages) => messages\n * };\n * mastra.addProcessor(newProcessor); // Uses processor.id as key\n * // or\n * mastra.addProcessor(newProcessor, 'customKey'); // Uses custom key\n * ```\n */\n public addProcessor<P extends Processor>(processor: P, key?: string): void {\n if (!processor) {\n throw createUndefinedPrimitiveError('processor', processor, key);\n }\n const processorKey = key || processor.id;\n const processors = this.#processors as Record<string, Processor>;\n if (processors[processorKey]) {\n const logger = this.getLogger();\n logger.debug(`Processor with key ${processorKey} already exists. Skipping addition.`);\n return;\n }\n\n processors[processorKey] = processor;\n }\n\n /**\n * Retrieves a registered memory instance by its registration key.\n *\n * @throws {MastraError} When the memory instance with the specified key is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * memory: {\n * chat: new Memory({ storage })\n * }\n * });\n *\n * const chatMemory = mastra.getMemory('chat');\n * ```\n */\n public getMemory<TMemoryName extends keyof TMemory>(name: TMemoryName): TMemory[TMemoryName] {\n if (!this.#memory || !this.#memory[name]) {\n const error = new MastraError({\n id: 'MASTRA_GET_MEMORY_BY_KEY_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Memory with key ${String(name)} not found`,\n details: {\n status: 404,\n memoryKey: String(name),\n memory: Object.keys(this.#memory ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return this.#memory[name];\n }\n\n /**\n * Retrieves a registered memory instance by its ID.\n *\n * Searches through all registered memory instances and returns the one whose ID matches.\n *\n * @throws {MastraError} When no memory instance with the specified ID is found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * memory: {\n * chat: new Memory({ id: 'chat-memory', storage })\n * }\n * });\n *\n * const memory = mastra.getMemoryById('chat-memory');\n * ```\n */\n public getMemoryById(id: string): MastraMemory {\n const allMemory = this.#memory;\n if (allMemory) {\n for (const [, memory] of Object.entries(allMemory)) {\n if (memory.id === id) {\n return memory;\n }\n }\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_MEMORY_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Memory with id ${id} not found`,\n details: {\n status: 404,\n memoryId: id,\n availableIds: Object.values(allMemory ?? {})\n .map(m => m.id)\n .join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Returns all registered memory instances as a record keyed by their names.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * memory: {\n * chat: new Memory({ storage }),\n * longTerm: new Memory({ storage })\n * }\n * });\n *\n * const allMemory = mastra.listMemory();\n * console.log(Object.keys(allMemory)); // ['chat', 'longTerm']\n * ```\n */\n public listMemory(): TMemory | undefined {\n return this.#memory;\n }\n\n /**\n * Adds a new memory instance to the Mastra instance.\n *\n * This method allows dynamic registration of memory instances after the Mastra instance\n * has been created.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const chatMemory = new Memory({\n * id: 'chat-memory',\n * storage: mastra.getStorage()\n * });\n * mastra.addMemory(chatMemory); // Uses memory.id as key\n * // or\n * mastra.addMemory(chatMemory, 'customKey'); // Uses custom key\n * ```\n */\n public addMemory<M extends MastraMemory>(memory: M, key?: string): void {\n if (!memory) {\n throw createUndefinedPrimitiveError('memory', memory, key);\n }\n const memoryKey = key || memory.id;\n const memoryRegistry = this.#memory as Record<string, MastraMemory>;\n if (memoryRegistry[memoryKey]) {\n const logger = this.getLogger();\n logger.debug(`Memory with key ${memoryKey} already exists. Skipping addition.`);\n return;\n }\n\n memoryRegistry[memoryKey] = memory;\n }\n\n /**\n * Returns all registered workflows as a record keyed by their IDs.\n *\n * @example Listing all workflows\n * ```typescript\n * const mastra = new Mastra({\n * workflows: {\n * dataProcessor: createWorkflow({...}).commit(),\n * emailSender: createWorkflow({...}).commit(),\n * reportGenerator: createWorkflow({...}).commit()\n * }\n * });\n *\n * const allWorkflows = mastra.listWorkflows();\n * console.log(Object.keys(allWorkflows)); // ['dataProcessor', 'emailSender', 'reportGenerator']\n *\n * // Execute all workflows with sample data\n * for (const [id, workflow] of Object.entries(allWorkflows)) {\n * console.log(`Workflow ${id}:`, workflow.name);\n * // const result = await workflow.execute(sampleData);\n * }\n * ```\n */\n public listWorkflows(props: { serialized?: boolean } = {}): Record<string, Workflow> {\n if (props.serialized) {\n return Object.entries(this.#workflows).reduce((acc, [k, v]) => {\n return {\n ...acc,\n [k]: { name: v.name },\n };\n }, {});\n }\n return this.#workflows;\n }\n\n /**\n * Adds a new workflow to the Mastra instance.\n *\n * This method allows dynamic registration of workflows after the Mastra instance\n * has been created. The workflow will be initialized with Mastra and primitives.\n *\n * @throws {MastraError} When a workflow with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newWorkflow = createWorkflow({\n * id: 'data-pipeline',\n * name: 'Data Pipeline'\n * }).commit();\n * mastra.addWorkflow(newWorkflow); // Uses workflow.id as key\n * // or\n * mastra.addWorkflow(newWorkflow, 'customKey'); // Uses custom key\n * ```\n */\n public addWorkflow<W extends Workflow<any, any, any, any, any, any>>(workflow: W, key?: string): void {\n if (!workflow) {\n throw createUndefinedPrimitiveError('workflow', workflow, key);\n }\n const workflowKey = key || workflow.id;\n const workflows = this.#workflows as Record<string, Workflow<any, any, any, any, any, any>>;\n if (workflows[workflowKey]) {\n const logger = this.getLogger();\n logger.debug(`Workflow with key ${workflowKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the workflow with Mastra and primitives\n workflow.__registerMastra(this);\n workflow.__registerPrimitives({\n logger: this.getLogger(),\n storage: this.getStorage(),\n });\n if (!workflow.committed) {\n workflow.commit();\n }\n workflows[workflowKey] = workflow;\n }\n\n /**\n * Sets the storage provider for the Mastra instance.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n *\n * // Set PostgreSQL storage\n * mastra.setStorage(new PostgresStore({\n * connectionString: process.env.DATABASE_URL\n * }));\n *\n * // Now agents can use memory with the storage\n * const agent = new Agent({\n * id: 'assistant',\n * name: 'assistant',\n * memory: new Memory({ storage: mastra.getStorage() })\n * });\n * ```\n */\n public setStorage(storage: MastraStorage) {\n this.#storage = augmentWithInit(storage);\n }\n\n public setLogger({ logger }: { logger: TLogger }) {\n this.#logger = logger;\n\n if (this.#agents) {\n Object.keys(this.#agents).forEach(key => {\n this.#agents?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#deployer) {\n this.#deployer.__setLogger(this.#logger);\n }\n\n if (this.#tts) {\n Object.keys(this.#tts).forEach(key => {\n this.#tts?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#storage) {\n this.#storage.__setLogger(this.#logger);\n }\n\n if (this.#vectors) {\n Object.keys(this.#vectors).forEach(key => {\n this.#vectors?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#mcpServers) {\n Object.keys(this.#mcpServers).forEach(key => {\n this.#mcpServers?.[key]?.__setLogger(this.#logger);\n });\n }\n\n if (this.#serverAdapter) {\n this.#serverAdapter.__setLogger(this.#logger);\n }\n\n this.#observability.setLogger({ logger: this.#logger });\n }\n\n /**\n * Gets all registered text-to-speech (TTS) providers.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * tts: {\n * openai: new OpenAITTS({\n * apiKey: process.env.OPENAI_API_KEY,\n * voice: 'alloy'\n * })\n * }\n * });\n *\n * const ttsProviders = mastra.getTTS();\n * const openaiTTS = ttsProviders?.openai;\n * if (openaiTTS) {\n * const audioBuffer = await openaiTTS.synthesize('Hello, world!');\n * }\n * ```\n */\n public getTTS() {\n return this.#tts;\n }\n\n /**\n * Gets the currently configured logger instance.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * logger: new PinoLogger({\n * name: 'MyApp',\n * level: 'info'\n * })\n * });\n *\n * const logger = mastra.getLogger();\n * logger.info('Application started');\n * logger.error('An error occurred', { error: 'details' });\n * ```\n */\n public getLogger() {\n return this.#logger;\n }\n\n /**\n * Gets the currently configured storage provider.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * storage: new LibSQLStore({ id: 'mastra-storage', url: 'file:./data.db' })\n * });\n *\n * // Use the storage in agent memory\n * const agent = new Agent({\n * id: 'assistant',\n * name: 'assistant',\n * memory: new Memory({\n * storage: mastra.getStorage()\n * })\n * });\n * ```\n */\n public getStorage() {\n return this.#storage;\n }\n\n get observability(): ObservabilityEntrypoint {\n return this.#observability;\n }\n\n public getServerMiddleware() {\n return this.#serverMiddleware;\n }\n\n public getServerCache() {\n return this.#serverCache;\n }\n\n public setServerMiddleware(serverMiddleware: Middleware | Middleware[]) {\n if (typeof serverMiddleware === 'function') {\n this.#serverMiddleware = [\n {\n handler: serverMiddleware,\n path: '/api/*',\n },\n ];\n return;\n }\n\n if (!Array.isArray(serverMiddleware)) {\n const error = new MastraError({\n id: 'MASTRA_SET_SERVER_MIDDLEWARE_INVALID_TYPE',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Invalid middleware: expected a function or array, received ${typeof serverMiddleware}`,\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n this.#serverMiddleware = serverMiddleware.map(m => {\n if (typeof m === 'function') {\n return {\n handler: m,\n path: '/api/*',\n };\n }\n return {\n handler: m.handler,\n path: m.path || '/api/*',\n };\n });\n }\n\n public getServer() {\n return this.#server;\n }\n\n /**\n * Sets the server adapter for this Mastra instance.\n *\n * The server adapter provides access to the underlying server app (e.g., Hono, Express)\n * and allows users to call routes directly via `app.fetch()` instead of making HTTP requests.\n *\n * This is typically called by `createHonoServer` or similar factory functions during\n * server initialization.\n *\n * @param adapter - The server adapter instance (e.g., MastraServer from @mastra/hono or @mastra/express)\n *\n * @example\n * ```typescript\n * const app = new Hono();\n * const adapter = new MastraServer({ app, mastra });\n * mastra.setMastraServer(adapter);\n * ```\n */\n public setMastraServer(adapter: MastraServerBase): void {\n if (this.#serverAdapter) {\n this.#logger?.debug(\n 'Replacing existing server adapter. Only one adapter should be registered per Mastra instance.',\n );\n }\n this.#serverAdapter = adapter;\n // Inject the logger into the adapter\n if (this.#logger) {\n adapter.__setLogger(this.#logger);\n }\n }\n\n /**\n * Gets the server adapter for this Mastra instance.\n *\n * @returns The server adapter, or undefined if not set\n *\n * @example\n * ```typescript\n * const adapter = mastra.getMastraServer();\n * if (adapter) {\n * const app = adapter.getApp<Hono>();\n * }\n * ```\n */\n public getMastraServer(): MastraServerBase | undefined {\n return this.#serverAdapter;\n }\n\n /**\n * Gets the server app from the server adapter.\n *\n * This is a convenience method that calls `getMastraServer()?.getApp<T>()`.\n * Use this to access the underlying server framework's app instance (e.g., Hono, Express)\n * for direct operations like calling routes via `app.fetch()`.\n *\n * @template T - The expected type of the app (e.g., Hono, Express Application)\n * @returns The server app, or undefined if no adapter is set\n *\n * @example\n * ```typescript\n * // After createHonoServer() is called:\n * const app = mastra.getServerApp<Hono>();\n *\n * // Call routes directly without HTTP overhead\n * const response = await app?.fetch(new Request('http://localhost/health'));\n * const data = await response?.json();\n * ```\n */\n public getServerApp<T = unknown>(): T | undefined {\n return this.#serverAdapter?.getApp<T>();\n }\n\n public getBundlerConfig() {\n return this.#bundler;\n }\n\n public async listLogsByRunId({\n runId,\n transportId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n }: {\n runId: string;\n transportId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }) {\n if (!transportId) {\n const error = new MastraError({\n id: 'MASTRA_LIST_LOGS_BY_RUN_ID_MISSING_TRANSPORT',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Transport ID is required',\n details: {\n runId,\n transportId,\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n if (!this.#logger?.listLogsByRunId) {\n const error = new MastraError({\n id: 'MASTRA_GET_LOGS_BY_RUN_ID_LOGGER_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.SYSTEM,\n text: 'Logger is not configured or does not support listLogsByRunId operation',\n details: {\n runId,\n transportId,\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n return await this.#logger.listLogsByRunId({\n runId,\n transportId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n });\n }\n\n public async listLogs(\n transportId: string,\n params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n },\n ) {\n if (!transportId) {\n const error = new MastraError({\n id: 'MASTRA_GET_LOGS_MISSING_TRANSPORT',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'Transport ID is required',\n details: {\n transportId,\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n if (!this.#logger) {\n const error = new MastraError({\n id: 'MASTRA_GET_LOGS_LOGGER_NOT_CONFIGURED',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.SYSTEM,\n text: 'Logger is not set',\n details: {\n transportId,\n },\n });\n throw error;\n }\n\n return await this.#logger.listLogs(transportId, params);\n }\n\n /**\n * Gets all registered Model Context Protocol (MCP) server instances.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * mcpServers: {\n * filesystem: new FileSystemMCPServer({\n * rootPath: '/app/data'\n * })\n * }\n * });\n *\n * const mcpServers = mastra.getMCPServers();\n * if (mcpServers) {\n * const fsServer = mcpServers.filesystem;\n * const tools = await fsServer.listTools();\n * }\n * ```\n */\n public listMCPServers(): Record<string, MCPServerBase> | undefined {\n return this.#mcpServers;\n }\n\n /**\n * Adds a new MCP server to the Mastra instance.\n *\n * This method allows dynamic registration of MCP servers after the Mastra instance\n * has been created. The server will be initialized with ID, Mastra instance, and logger.\n *\n * @throws {MastraError} When an MCP server with the same key already exists\n *\n * @example\n * ```typescript\n * const mastra = new Mastra();\n * const newServer = new FileSystemMCPServer({\n * rootPath: '/data'\n * });\n * mastra.addMCPServer(newServer); // Uses server.id as key\n * // or\n * mastra.addMCPServer(newServer, 'customKey'); // Uses custom key\n * ```\n */\n public addMCPServer<M extends MCPServerBase>(server: M, key?: string): void {\n if (!server) {\n throw createUndefinedPrimitiveError('mcp-server', server, key);\n }\n // If a key is provided, try to set it as the ID\n // The setId method will only update if the ID wasn't explicitly set by the user\n if (key) {\n server.setId(key);\n }\n\n // Now resolve the ID after potentially setting it\n const resolvedId = server.id;\n if (!resolvedId) {\n const error = new MastraError({\n id: 'MASTRA_ADD_MCP_SERVER_MISSING_ID',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: 'MCP server must expose an id or be registered under one',\n details: { status: 400 },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n const serverKey = key ?? resolvedId;\n const servers = this.#mcpServers as Record<string, MCPServerBase>;\n if (servers[serverKey]) {\n const logger = this.getLogger();\n logger.debug(`MCP server with key ${serverKey} already exists. Skipping addition.`);\n return;\n }\n\n // Initialize the server\n server.__registerMastra(this);\n server.__setLogger(this.getLogger());\n servers[serverKey] = server;\n }\n\n /**\n * Retrieves a specific MCP server instance by registration key.\n *\n * @throws {MastraError} When the specified MCP server is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * mcpServers: {\n * filesystem: new FileSystemMCPServer({...})\n * }\n * });\n *\n * const fsServer = mastra.getMCPServer('filesystem');\n * const tools = await fsServer.listTools();\n * ```\n */\n public getMCPServer<TMCPServerName extends keyof TMCPServers>(\n name: TMCPServerName,\n ): TMCPServers[TMCPServerName] | undefined {\n if (!this.#mcpServers || !this.#mcpServers[name]) {\n this.#logger?.debug(`MCP server with name ${String(name)} not found`);\n return undefined as TMCPServers[TMCPServerName] | undefined;\n }\n return this.#mcpServers[name];\n }\n\n /**\n * Retrieves a specific Model Context Protocol (MCP) server instance by its logical ID.\n *\n * This method searches for an MCP server using its logical ID. If a version is specified,\n * it returns the exact version match. If no version is provided, it returns the server\n * with the most recent release date.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * mcpServers: {\n * filesystem: new FileSystemMCPServer({\n * id: 'fs-server',\n * version: '1.0.0',\n * rootPath: '/app/data'\n * })\n * }\n * });\n *\n * const fsServer = mastra.getMCPServerById('fs-server');\n * if (fsServer) {\n * const tools = await fsServer.listTools();\n * }\n * ```\n */\n public getMCPServerById<TMCPServerName extends keyof TMCPServers>(\n serverId: TMCPServers[TMCPServerName]['id'],\n version?: string,\n ): TMCPServers[TMCPServerName] | undefined {\n if (!this.#mcpServers) {\n return undefined;\n }\n\n const allRegisteredServers = Object.values(this.#mcpServers || {});\n\n const matchingLogicalIdServers = allRegisteredServers.filter(server => server.id === serverId);\n\n if (matchingLogicalIdServers.length === 0) {\n this.#logger?.debug(`No MCP servers found with logical ID: ${serverId}`);\n return undefined;\n }\n\n if (version) {\n const specificVersionServer = matchingLogicalIdServers.find(server => server.version === version);\n if (!specificVersionServer) {\n this.#logger?.debug(`MCP server with logical ID '${serverId}' found, but not version '${version}'.`);\n }\n return specificVersionServer as TMCPServers[TMCPServerName] | undefined;\n } else {\n // No version specified, find the one with the most recent releaseDate\n if (matchingLogicalIdServers.length === 1) {\n return matchingLogicalIdServers[0] as TMCPServers[TMCPServerName];\n }\n\n matchingLogicalIdServers.sort((a, b) => {\n // Ensure releaseDate exists and is a string before creating a Date object\n const dateAVal = a.releaseDate && typeof a.releaseDate === 'string' ? new Date(a.releaseDate).getTime() : NaN;\n const dateBVal = b.releaseDate && typeof b.releaseDate === 'string' ? new Date(b.releaseDate).getTime() : NaN;\n\n if (isNaN(dateAVal) && isNaN(dateBVal)) return 0;\n if (isNaN(dateAVal)) return 1; // Treat invalid/missing dates as older\n if (isNaN(dateBVal)) return -1; // Treat invalid/missing dates as older\n\n return dateBVal - dateAVal; // Sorts in descending order of time (latest first)\n });\n\n // After sorting, the first element should be the latest if its date is valid\n if (matchingLogicalIdServers.length > 0) {\n const latestServer = matchingLogicalIdServers[0];\n if (\n latestServer &&\n latestServer.releaseDate &&\n typeof latestServer.releaseDate === 'string' &&\n !isNaN(new Date(latestServer.releaseDate).getTime())\n ) {\n return latestServer as TMCPServers[TMCPServerName];\n }\n }\n this.#logger?.warn(\n `Could not determine the latest server for logical ID '${serverId}' due to invalid or missing release dates, or no servers left after filtering.`,\n );\n return undefined;\n }\n }\n\n public async addTopicListener(topic: string, listener: (event: any) => Promise<void>) {\n await this.#pubsub.subscribe(topic, listener);\n }\n\n public async removeTopicListener(topic: string, listener: (event: any) => Promise<void>) {\n await this.#pubsub.unsubscribe(topic, listener);\n }\n\n public async startEventEngine() {\n for (const topic in this.#events) {\n if (!this.#events[topic]) {\n continue;\n }\n\n const listeners = Array.isArray(this.#events[topic]) ? this.#events[topic] : [this.#events[topic]];\n for (const listener of listeners) {\n await this.#pubsub.subscribe(topic, listener);\n }\n }\n }\n\n public async stopEventEngine() {\n for (const topic in this.#events) {\n if (!this.#events[topic]) {\n continue;\n }\n\n const listeners = Array.isArray(this.#events[topic]) ? this.#events[topic] : [this.#events[topic]];\n for (const listener of listeners) {\n await this.#pubsub.unsubscribe(topic, listener);\n }\n }\n\n await this.#pubsub.flush();\n }\n\n /**\n * Retrieves a registered gateway by its key.\n *\n * @throws {MastraError} When the gateway with the specified key is not found\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * gateways: {\n * myGateway: new CustomGateway()\n * }\n * });\n *\n * const gateway = mastra.getGateway('myGateway');\n * ```\n */\n public getGateway(key: string): MastraModelGateway {\n const gateway = this.#gateways?.[key];\n if (!gateway) {\n const error = new MastraError({\n id: 'MASTRA_GET_GATEWAY_BY_KEY_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Gateway with key ${key} not found`,\n details: {\n status: 404,\n gatewayKey: key,\n gateways: Object.keys(this.#gateways ?? {}).join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n return gateway;\n }\n\n /**\n * Retrieves a registered gateway by its ID.\n *\n * Searches through all registered gateways and returns the one whose ID matches.\n * If a gateway doesn't have an explicit ID, its name is used as the ID.\n *\n * @throws {MastraError} When no gateway with the specified ID is found\n *\n * @example\n * ```typescript\n * class CustomGateway extends MastraModelGateway {\n * readonly id = 'custom-gateway-v1';\n * readonly name = 'Custom Gateway';\n * // ...\n * }\n *\n * const mastra = new Mastra({\n * gateways: {\n * myGateway: new CustomGateway()\n * }\n * });\n *\n * const gateway = mastra.getGatewayById('custom-gateway-v1');\n * ```\n */\n public getGatewayById(id: string): MastraModelGateway {\n const gateways = this.#gateways ?? {};\n for (const gateway of Object.values(gateways)) {\n if (gateway.getId() === id) {\n return gateway;\n }\n }\n\n const error = new MastraError({\n id: 'MASTRA_GET_GATEWAY_BY_ID_NOT_FOUND',\n domain: ErrorDomain.MASTRA,\n category: ErrorCategory.USER,\n text: `Gateway with ID ${id} not found`,\n details: {\n status: 404,\n gatewayId: id,\n availableIds: Object.values(gateways)\n .map(g => g.getId())\n .join(', '),\n },\n });\n this.#logger?.trackException(error);\n throw error;\n }\n\n /**\n * Returns all registered gateways as a record keyed by their names.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * gateways: {\n * netlify: new NetlifyGateway(),\n * custom: new CustomGateway()\n * }\n * });\n *\n * const allGateways = mastra.listGateways();\n * console.log(Object.keys(allGateways)); // ['netlify', 'custom']\n * ```\n */\n public listGateways(): Record<string, MastraModelGateway> | undefined {\n return this.#gateways;\n }\n\n /**\n * Adds a new gateway to the Mastra instance.\n *\n * This method allows dynamic registration of gateways after the Mastra instance\n * has been created. Gateways enable access to LLM providers through custom\n * authentication and routing logic.\n *\n * If no key is provided, the gateway's ID (or name if no ID is set) will be used as the key.\n *\n * @example\n * ```typescript\n * import { MastraModelGateway } from '@mastra/core';\n *\n * class CustomGateway extends MastraModelGateway {\n * readonly id = 'custom-gateway-v1'; // Optional, defaults to name\n * readonly name = 'custom';\n * readonly prefix = 'custom';\n *\n * async fetchProviders() {\n * return {\n * myProvider: {\n * name: 'My Provider',\n * models: ['model-1', 'model-2'],\n * apiKeyEnvVar: 'MY_API_KEY',\n * gateway: 'custom'\n * }\n * };\n * }\n *\n * buildUrl(modelId: string) {\n * return 'https://api.myprovider.com/v1';\n * }\n *\n * async getApiKey(modelId: string) {\n * return process.env.MY_API_KEY || '';\n * }\n *\n * async resolveLanguageModel({ modelId, providerId, apiKey }) {\n * const baseURL = this.buildUrl(`${providerId}/${modelId}`);\n * return createOpenAICompatible({\n * name: providerId,\n * apiKey,\n * baseURL,\n * supportsStructuredOutputs: true,\n * }).chatModel(modelId);\n * }\n * }\n *\n * const mastra = new Mastra();\n * const newGateway = new CustomGateway();\n * mastra.addGateway(newGateway); // Uses gateway.getId() as key (gateway.id)\n * // or\n * mastra.addGateway(newGateway, 'customKey'); // Uses custom key\n * ```\n */\n public addGateway(gateway: MastraModelGateway, key?: string): void {\n if (!gateway) {\n throw createUndefinedPrimitiveError('gateway', gateway, key);\n }\n const gatewayKey = key || gateway.getId();\n const gateways = this.#gateways as Record<string, MastraModelGateway>;\n if (gateways[gatewayKey]) {\n const logger = this.getLogger();\n logger.debug(`Gateway with key ${gatewayKey} already exists. Skipping addition.`);\n return;\n }\n\n gateways[gatewayKey] = gateway;\n\n // Register custom gateways with the registry for type generation\n this.#syncGatewayRegistry();\n }\n\n /**\n * Sync custom gateways with the GatewayRegistry for type generation\n * @private\n */\n #syncGatewayRegistry(): void {\n try {\n // Only sync in dev mode (when MASTRA_DEV is set)\n if (process.env.MASTRA_DEV !== 'true' && process.env.MASTRA_DEV !== '1') {\n return;\n }\n\n // Trigger sync immediately (non-blocking, but logs progress)\n import('../llm/model/provider-registry.js')\n .then(async ({ GatewayRegistry }) => {\n const registry = GatewayRegistry.getInstance();\n const customGateways = Object.values(this.#gateways || {});\n registry.registerCustomGateways(customGateways);\n\n // Log that we're syncing\n const logger = this.getLogger();\n logger.info('🔄 Syncing custom gateway types...');\n\n // Trigger a sync to regenerate types\n await registry.syncGateways(true);\n\n logger.info('✅ Custom gateway types synced! Restart your TypeScript server to see autocomplete.');\n })\n .catch(err => {\n const logger = this.getLogger();\n logger.debug('Gateway registry sync skipped:', err);\n });\n } catch (err) {\n // Silent fail - this is a dev-only feature\n const logger = this.getLogger();\n logger.debug('Gateway registry sync failed:', err);\n }\n }\n\n /**\n * Gracefully shuts down the Mastra instance and cleans up all resources.\n *\n * This method performs a clean shutdown of all Mastra components, including:\n * - tracing registry and all tracing instances\n * - Event engine and pub/sub system\n * - All registered components and their resources\n *\n * It's important to call this method when your application is shutting down\n * to ensure proper cleanup and prevent resource leaks.\n *\n * @example\n * ```typescript\n * const mastra = new Mastra({\n * agents: { myAgent },\n * workflows: { myWorkflow }\n * });\n *\n * // Graceful shutdown on SIGINT\n * process.on('SIGINT', async () => {\n * await mastra.shutdown();\n * process.exit(0);\n * });\n * ```\n */\n async shutdown(): Promise<void> {\n await this.stopEventEngine();\n // Shutdown observability registry, exporters, etc...\n await this.#observability.shutdown();\n\n this.#logger?.info('Mastra shutdown completed');\n }\n\n // This method is only used internally for server hnadlers that require temporary persistence\n public get serverCache() {\n return this.#serverCache;\n }\n}\n"]}