@mastra/editor 0.11.0-alpha.2 → 0.11.0-alpha.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ee/agent-builder.ts","../src/ee/agent-builder-agent.ts","../src/ee/index.ts","../src/index.ts","../src/namespaces/base.ts","../src/namespaces/agent.ts","../src/rule-evaluator.ts","../src/template-engine.ts","../src/instruction-builder.ts","../src/processor-graph-hydrator.ts","../src/namespaces/mcp.ts","../src/namespaces/mcp-server.ts","../src/namespaces/prompt.ts","../src/namespaces/scorer.ts","../src/namespaces/workspace.ts","../src/namespaces/skill.ts","../src/namespaces/favorites.ts","../src/providers.ts","../src/snapshots-match.ts"],"sourcesContent":["import type { AgentBuilderOptions, AgentFeatures, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport { isBuilderModelPolicyActive, isModelAllowed, resolveAgentFeatures } from '@mastra/core/agent-builder/ee';\n\n/**\n * Concrete implementation of the Agent Builder EE feature.\n * Instantiated by MastraEditor.resolveBuilder() when builder config is enabled.\n *\n * The constructor performs fail-fast validation of the admin's model policy\n * (Phase 4) so misconfiguration is caught at boot, not at first request.\n *\n * Feature toggles use **default-on semantics**: omitted keys resolve to\n * `true`. Admins opt out by setting a key to `false`. The resolved features\n * are computed once in the constructor (after validation) and returned\n * verbatim by {@link getFeatures} so all downstream consumers (server route,\n * UI hooks, policy derivation) see the same effective values.\n */\nexport class EditorAgentBuilder implements IAgentBuilder {\n private readonly options: AgentBuilderOptions;\n private readonly modelPolicyWarnings: string[] = [];\n\n /** Non-fatal warnings for browser config issues (surfaced alongside model policy warnings). */\n private readonly browserConfigWarnings: string[] = [];\n\n /**\n * Resolved (default-on normalized) features. Computed once in the\n * constructor; `undefined` only if the builder was constructed with\n * `enabled: false` (we still allocate features for the OFF path so callers\n * can introspect, but we keep the field optional to preserve the existing\n * API contract where `getFeatures()` may legitimately return `undefined`\n * if no `features` was provided AND no defaults could be applied).\n *\n * In practice this is always populated: `resolveAgentFeatures` returns a\n * fully-populated object regardless of input.\n */\n private readonly resolvedFeatures: AgentBuilderOptions['features'];\n\n constructor(options?: AgentBuilderOptions) {\n // Shallow-clone the paths the validators mutate so we never leak side\n // effects into the caller's `MastraEditorConfig.builder` object.\n // `validateBrowserConfig` writes to `features.agent.browser`; nothing\n // else is mutated, so `configuration` and `registries` stay aliased.\n const source = options ?? {};\n this.options = {\n ...source,\n features: source.features\n ? {\n ...source.features,\n agent: source.features.agent ? { ...source.features.agent } : undefined,\n }\n : undefined,\n };\n this.validateModelPolicy();\n this.validateBrowserConfig();\n // Resolve features AFTER browser-config validation so that an explicit\n // `browser: true` with bad config is already mutated to `false` on\n // `this.options.features.agent.browser`. The resolver then sees the\n // downgraded value and returns it as-is.\n this.resolvedFeatures = {\n agent: resolveAgentFeatures(this.options.features?.agent, {\n hasBrowserConfig: this.hasValidBrowserConfig(),\n }),\n };\n }\n\n get enabled(): boolean {\n return this.options.enabled !== false;\n }\n\n getFeatures(): AgentBuilderOptions['features'] {\n return this.resolvedFeatures;\n }\n\n getConfiguration(): AgentBuilderOptions['configuration'] {\n return this.options.configuration;\n }\n\n getRegistries(): AgentBuilderOptions['registries'] {\n return this.options.registries;\n }\n\n getModelPolicyWarnings(): string[] {\n return [...this.modelPolicyWarnings, ...this.browserConfigWarnings];\n }\n\n /**\n * True when `configuration.agent.browser` declares a provider. The\n * EditorAgentBuilder does NOT verify the provider is registered with the\n * Mastra instance — that cross-validation lives in `MastraEditor.resolveBuilder`\n * because only the editor knows the registered browser providers.\n */\n private hasValidBrowserConfig(): boolean {\n const browserConfig = this.options.configuration?.agent?.browser;\n return Boolean(browserConfig?.config?.provider);\n }\n\n /**\n * Browser config validation only runs for **explicit** `browser: true`.\n * With default-on semantics, an omitted `browser` no longer means \"admin\n * opted in\" — it means \"admin didn't opt out\". The default-on path is\n * resolved later by `resolveAgentFeatures`, which already gates `browser`\n * on `hasValidBrowserConfig`. We don't want to spam every default-config\n * deployment with warnings.\n */\n private validateBrowserConfig(): void {\n const explicitBrowser = this.options.features?.agent?.browser;\n if (explicitBrowser !== true) return;\n\n const browserConfig = this.options.configuration?.agent?.browser;\n if (!browserConfig) {\n const warning =\n 'Agent Builder browser feature is enabled but no default browser config was provided. ' +\n 'Set `editor.builder.configuration.agent.browser` to a valid browser config ' +\n '(e.g. `{ type: \"inline\", config: { provider: \"stagehand\" } }`). ' +\n 'The browser toggle will be hidden until a default is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n // Downgrade so the resolved feature ends up `false`.\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n return;\n }\n\n if (!browserConfig.config?.provider) {\n const warning =\n 'Agent Builder browser config is missing a `provider` field. ' +\n 'Set `editor.builder.configuration.agent.browser.config.provider` ' +\n '(e.g. `\"stagehand\"`). The browser toggle will be hidden until a provider is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n }\n }\n\n private validateModelPolicy(): void {\n const enabled = this.options.enabled !== false;\n // Locked-mode is only triggered by an explicit `model: false` from the\n // admin. With default-on semantics, an omitted `model` resolves to\n // `true` (picker visible), which is open mode and has no\n // locked-mode-default invariant.\n const explicitModel = this.options.features?.agent?.model;\n const pickerVisible = explicitModel !== false;\n const models = this.options.configuration?.agent?.models;\n const allowed = models?.allowed;\n const defaultModel = models?.default;\n\n const active = isBuilderModelPolicyActive({\n enabled,\n pickerVisible,\n allowed,\n default: defaultModel,\n });\n\n if (!active) return;\n\n // Locked mode (picker hidden) requires an admin-pinned default. Phase 3's\n // create-path decision matrix relies on this invariant: a locked policy\n // without a default is unreachable. Only fires when the admin has\n // explicitly opted out of the picker.\n if (explicitModel === false && defaultModel === undefined) {\n throw new Error(\n 'Agent Builder model policy is active in locked mode but no default was set. ' +\n 'Set `editor.builder.configuration.agent.models.default`, or remove ' +\n '`editor.builder.features.agent.model = false` to allow end-users to pick a model.',\n );\n }\n\n // When an allowlist is set, the default (if any) must satisfy it. An\n // empty `allowed: []` means \"unrestricted\" so we skip this check.\n if (defaultModel !== undefined && allowed !== undefined && allowed.length > 0) {\n if (!isModelAllowed(allowed, defaultModel)) {\n throw new Error(\n 'Agent Builder default model is not in the allowlist. ' +\n 'Either add it to `editor.builder.configuration.agent.models.allowed` ' +\n 'or change `editor.builder.configuration.agent.models.default`.',\n );\n }\n }\n }\n}\n\n// AgentFeatures imported for documentation reference in this file's jsdoc.\nexport type { AgentFeatures };\n","import { Agent } from '@mastra/core/agent';\nimport { Memory } from '@mastra/memory';\nimport { Workspace, LocalFilesystem } from '@mastra/core/workspace';\n\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst workspacePath = path.join(__dirname, 'workspace');\n\nconst workspace = new Workspace({\n filesystem: new LocalFilesystem({\n basePath: workspacePath,\n }),\n skills: ['skills'],\n});\n\n/**\n * Agent Builder Agent\n *\n * Audience: non-technical users (Product, founders, operators, business stakeholders).\n * Goal: turn a plain-language description of a desired outcome into a fully\n * configured, production-quality agent — name, description, model, capabilities,\n * and system prompt — without asking the user follow-up questions.\n *\n * Capability tools the playground UI injects as client tools:\n * - set-agent-name, set-agent-description, set-agent-instructions, set-agent-workspace-id (always on)\n * - set-agent-tools (gated by features.tools)\n * - set-agent-skills (gated by features.skills + skills available)\n * - set-agent-model (gated by features.model + models available)\n * - set-agent-browser-enabled (gated by features.browser)\n * - createSkillTool (gated by features.skills) — only when a needed capability does not exist\n */\n\nexport function createBuilderAgent(\n args?: Partial<ConstructorParameters<typeof Agent<'builder-agent'>>[0]>,\n): Agent<'builder-agent'> {\n const memory = new Memory();\n\n return new Agent<'builder-agent'>({\n instructions: `You are the Agent Builder.\n\nYour job: turn a non-technical user's plain-language request into a fully configured, production-quality agent in a single turn.\n\n# Non-negotiables\n\n- Never ask the user follow-up questions. Make the most reasonable assumption and move forward.\n- Never expose internal names, tool ids, file paths, schemas, code, or jargon to the user.\n- Speak only in user-facing capability terms.\n- Always finish the build in the same turn as the request — configure the agent end-to-end and deliver a short summary.\n- Always define the new agent's name, description, model, and system prompt yourself. Do not ask the user for any of these.\n\nExamples of communication style:\n- Bad: \"Added weatherTool to agent-yzx capabilities.\"\n- Good: \"Your new agent can now check the weather for you.\"\n- Bad: \"Calling set-agent-tools with [weatherTool].\"\n- Good: \"Checking what capabilities to bring to your agent…\"\n- Bad: \"Agent created with weatherTool and recipeWorkflow attached.\"\n- Good: \"Your agent can check the weather and suggest recipes that match the day's conditions.\"\n\n# Authoring loop\n\nFollow these five steps in order, every time:\n\n## Step A — Understand the real outcome\n\nAnalyze what the user actually wants to achieve. Focus on the final result, not just the literal wording of the request.\n\nAsk yourself:\n- What should the agent help the user accomplish?\n- Who will use this agent?\n- What decisions should the agent make on its own?\n- What kind of output should the agent produce?\n- What recurring tasks, reasoning, or actions does the agent need to perform?\n\n## Step B — Define the agent's identity\n\nBefore building the agent, define:\n- Agent name: short, memorable, anchored to the outcome. Never \"Agent X\" or generic labels\n- Description: exactly one sentence in plain user-facing language explaining what the agent helps with.\n\nCall \\`set-agent-name\\` and \\`set-agent-description\\` to set the agent's identity. Skip any whose feature is not available in the form snapshot.\n\n## Step C — Decide capabilities\n\nRead the form snapshot already injected into your context. It lists the user's current selections plus the available tools, agents, workflows, stored skills, models, and workspaces.\n\nThen:\n- Pick the *minimum* set of existing tools/agents/workflows/stored skills that satisfies the outcome. Adding irrelevant capabilities makes the agent worse, not better.\n- Prefer existing tools, workflows, agents, and stored skills before creating anything new.\n- \\`set-agent-skills\\` attaches user-available stored skills from the form snapshot.\n- Only call \\`createSkillTool\\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.\n- If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.\n\n## Step D — Synthesize the run contract\n\nBefore calling \\`set-agent-instructions\\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item:\n\n1. **Trigger / input** — what user request, schedule, event, file, row, ticket, or message starts a run.\n2. **Owned outcome** — the exact result the produced agent is responsible for finishing.\n3. **Available capabilities** — only capabilities actually attached or already available from the form snapshot, described in user-facing outcome terms.\n4. **Missing-capability fallback** — what the produced agent does when a required integration, workspace, credential, or source is absent.\n5. **Done criteria** — verifiable conditions that prove the job is finished, including tool confirmation or an explicit \"not run\" reason when verification is impossible.\n6. **Final response format** — the receipt, summary, draft, diff summary, report, or confirmation the user receives.\n\n## Step E — Write the agent\n\nCall the capability tools. Skip any whose feature is not available in the form snapshot.\n\n1. \\`set-agent-model\\` — pick the best model for the use case from the available models list. Rules:\n - Choose only a model id that appears in the available models list. Never invent, assume, or copy example model ids.\n - For coding, reasoning-heavy, or planning agents, prefer the most capable available model.\n - For short, simple, structured, or high-volume tasks, prefer a lower-latency/lower-cost available model when quality will not materially suffer.\n - If several plausible models are available, choose the newest or strongest option based on the metadata visible in the snapshot.\n2. \\`set-agent-tools\\` — attach the minimum set chosen in Step C. Also use \\`set-agent-skills\\` and \\`set-agent-browser-enabled\\` only when applicable and supported by the snapshot.\n3. \\`set-agent-instructions\\` — write the new agent's system prompt from scratch, tailored to the user's specific outcome and the run contract from Step D.\n\nBefore calling \\`set-agent-instructions\\`, self-audit the draft. It must pass every check:\n- No placeholders remain (no \\`<...>\\`, \"TBD\", \"TODO\", \"your tool\", or generic policy gaps).\n- No internal tool ids, file paths, schemas, or builder-only terms appear.\n- No generic \"helpful assistant\" identity remains.\n- No unsupported capabilities are promised.\n- Completion criteria are present, concrete, and tool-aware.\n- Refusal / fallback path is present for missing integrations, credentials, permissions, workspace, or sources.\n- Final response format is specified.\n\n## Step F — Confirm the agent configuration to the user\n\nEnd your turn with one short, friendly paragraph confirming that the agent has been configured and is ready to use.\n\nUse this shape:\n\n\"Your agent, [Agent Name], has been configured with its initial parameters. It can now [plain-language outcome]. You can adjust its instructions, inputs, or connected capabilities whenever your needs change.\"\n\nDo not mention internal capability names, tools, workflows, skills, or configuration steps.\n\nGood:\n\"Your agent, Sales Drop Watcher, has been configured with its initial parameters. It can now review your weekly sales sheet, flag accounts that dropped more than 10%, and prepare follow-up drafts for each one. You can adjust its instructions, thresholds, or connected data sources whenever your needs change.\"\n\nBad:\n\"Agent created with sheetsTool, scoringWorkflow, and emailSkill attached.\"\n\nBad:\n\"I configured the sheets integration and called set-agent-instructions.\"\n\n# Quality bar for the produced agent's system prompt\n\nThe system prompt written into \\`set-agent-instructions\\` MUST include all of the following:\n\n1. **Role and outcome.** Define what the agent is and the concrete result it owns.\n2. **Trigger and input.** Define what starts a run and what input the agent expects.\n3. **Decision rules.** Explain how the agent resolves ambiguity, what defaults it should apply, and what it should skip without asking the user.\n4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.\n5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.\n6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.\n7. **Final response format.** Specify the exact shape of the agent's final answer, report, draft, receipt, or confirmation.\n8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.\n9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.\n10. **Worked example.** Include at least one short input → output example showing a complete successful run.\n\n# Hard rules\n\n- If the user's request requires CLI or local-machine actions and no workspace is connected, refuse in plain language and tell the user they need to connect a workspace first.\n- Never reveal that you are calling configuration tools. Describe progress only in terms of the user's intended outcome.\n- Never produce a system prompt without explicit completion criteria.\n- Never attach a capability \"just in case.\" Every tool, agent, workflow, or skill must directly support the requested outcome.\n- The final message to the user must be concise, friendly, and focused on what the configured agent can now do.\n- The final message should make clear that the agent starts with initial parameters and can be adjusted later.`,\n model: 'openai/gpt-5.5',\n memory,\n workspace,\n ...(args || {}),\n id: 'builder-agent',\n name: 'Agent Builder Agent',\n description: 'An agent that can build agents',\n });\n}\n","export { EditorAgentBuilder } from './agent-builder';\nexport { createBuilderAgent } from './agent-builder-agent';\n","import { Mastra } from '@mastra/core';\nimport type { AgentBuilderOptions, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport type {\n IMastraEditor,\n MastraEditorConfig,\n FilesystemProvider,\n SandboxProvider,\n BlobStoreProvider,\n BrowserProvider,\n} from '@mastra/core/editor';\nimport type { IMastraLogger as Logger } from '@mastra/core/logger';\nimport { BUILT_IN_PROCESSOR_PROVIDERS } from '@mastra/core/processor-provider';\nimport type { ProcessorProvider } from '@mastra/core/processor-provider';\nimport type { BlobStore } from '@mastra/core/storage';\nimport { UnknownToolProviderError } from '@mastra/core/tool-provider';\nimport type { ToolProvider } from '@mastra/core/tool-provider';\n\nimport {\n EditorAgentNamespace,\n EditorMCPNamespace,\n EditorMCPServerNamespace,\n EditorPromptNamespace,\n EditorScorerNamespace,\n EditorWorkspaceNamespace,\n EditorSkillNamespace,\n EditorFavoritesNamespace,\n} from './namespaces';\nimport { localFilesystemProvider, localSandboxProvider } from './providers';\nimport { snapshotsMatch } from './snapshots-match';\n\nexport type { MastraEditorConfig };\n\nexport { renderTemplate } from './template-engine';\nexport { evaluateRuleGroup } from './rule-evaluator';\nexport { resolveInstructionBlocks } from './instruction-builder';\nexport {\n EditorNamespace,\n CrudEditorNamespace,\n EditorAgentNamespace,\n EditorMCPNamespace,\n EditorMCPServerNamespace,\n EditorPromptNamespace,\n EditorScorerNamespace,\n EditorWorkspaceNamespace,\n EditorSkillNamespace,\n EditorFavoritesNamespace,\n} from './namespaces';\nexport type { StorageAdapter } from './namespaces';\nexport { localFilesystemProvider, localSandboxProvider } from './providers';\nexport type { BrowserProvider } from '@mastra/core/editor';\n\nexport class MastraEditor implements IMastraEditor {\n /** @internal — exposed for namespace classes, not part of public API */\n __mastra?: Mastra;\n /** @internal — exposed for namespace classes, not part of public API */\n __logger?: Logger;\n\n private __toolProviders: Record<string, ToolProvider>;\n private __processorProviders: Record<string, ProcessorProvider>;\n private readonly __builderConfig?: AgentBuilderOptions;\n private __builderInstance?: IAgentBuilder;\n private __builderResolved = false;\n\n /**\n * @internal — exposed for namespace classes to hydrate stored workspace configs.\n * Maps provider ID (e.g., 'local', 's3') to the provider descriptor.\n * Built-in providers are auto-registered; additional providers come from config.\n */\n readonly __filesystems: Map<string, FilesystemProvider>;\n\n /**\n * @internal — exposed for namespace classes to hydrate stored workspace configs.\n * Maps provider ID (e.g., 'local', 'e2b') to the provider descriptor.\n * Built-in providers are auto-registered; additional providers come from config.\n */\n readonly __sandboxes: Map<string, SandboxProvider>;\n\n /**\n * @internal — exposed for namespace classes to resolve blob stores.\n * Maps provider ID (e.g., 'storage', 's3') to the provider descriptor.\n * The built-in 'storage' provider uses the configured storage backend.\n * Additional providers come from config.\n */\n readonly __blobStores: Map<string, BlobStoreProvider>;\n\n /**\n * @internal — exposed for namespace classes to hydrate stored browser configs.\n * Maps provider ID (e.g., 'stagehand', 'agent-browser') to the provider descriptor.\n * No built-in providers — browser packages must be registered via config.\n */\n readonly __browsers: Map<string, BrowserProvider>;\n\n public readonly agent: EditorAgentNamespace;\n public readonly mcp: EditorMCPNamespace;\n public readonly mcpServer: EditorMCPServerNamespace;\n public readonly prompt: EditorPromptNamespace;\n public readonly scorer: EditorScorerNamespace;\n public readonly workspace: EditorWorkspaceNamespace;\n public readonly skill: EditorSkillNamespace;\n public readonly favorites: EditorFavoritesNamespace;\n\n constructor(config?: MastraEditorConfig) {\n this.__logger = config?.logger;\n this.__toolProviders = config?.toolProviders ?? {};\n this.__processorProviders = { ...BUILT_IN_PROCESSOR_PROVIDERS, ...config?.processorProviders };\n\n // Built-in providers are always registered first, then merged with user-provided ones\n this.__filesystems = new Map<string, FilesystemProvider>();\n this.__filesystems.set(localFilesystemProvider.id, localFilesystemProvider);\n for (const [id, provider] of Object.entries(config?.filesystems ?? {})) {\n this.__filesystems.set(id, provider);\n }\n\n this.__sandboxes = new Map<string, SandboxProvider>();\n this.__sandboxes.set(localSandboxProvider.id, localSandboxProvider);\n for (const [id, provider] of Object.entries(config?.sandboxes ?? {})) {\n this.__sandboxes.set(id, provider);\n }\n\n // Blob store providers — no built-in default since the 'storage' fallback\n // is handled at resolve time via storage.getStore('blobs')\n this.__blobStores = new Map<string, BlobStoreProvider>();\n for (const [id, provider] of Object.entries(config?.blobStores ?? {})) {\n this.__blobStores.set(id, provider);\n }\n\n // Browser providers — no built-in providers; browser packages must be registered\n this.__browsers = new Map<string, BrowserProvider>();\n for (const [id, provider] of Object.entries(config?.browsers ?? {})) {\n this.__browsers.set(id, provider);\n }\n\n this.agent = new EditorAgentNamespace(this);\n this.mcp = new EditorMCPNamespace(this);\n this.mcpServer = new EditorMCPServerNamespace(this);\n this.prompt = new EditorPromptNamespace(this);\n this.scorer = new EditorScorerNamespace(this);\n this.workspace = new EditorWorkspaceNamespace(this);\n this.skill = new EditorSkillNamespace(this);\n this.favorites = new EditorFavoritesNamespace(this);\n\n // Store builder config for EE feature\n this.__builderConfig = config?.builder;\n }\n\n /**\n * Register this editor with a Mastra instance.\n * This gives the editor access to Mastra's storage, tools, workflows, etc.\n */\n registerWithMastra(mastra: Mastra): void {\n this.__mastra = mastra;\n if (!this.__logger) {\n this.__logger = mastra.getLogger();\n }\n\n // Fire-and-forget: persist builder default workspace to DB if configured,\n // then reconcile orphaned builder workspaces\n this.ensureBuilderWorkspaces()\n .then(() => this.reconcileBuilderWorkspaces())\n .catch(err => {\n this.__logger?.warn('[MastraEditor] Failed to persist/reconcile builder workspaces on startup', {\n error: err,\n });\n });\n }\n\n /**\n * Ensure the builder default workspace is persisted to the DB.\n * Called automatically on startup when the editor registers with Mastra.\n * Goes through the normal create() path so hydration validates that\n * all providers (filesystem, sandbox) are properly registered.\n *\n * If the workspace already exists but its config has drifted from the\n * runtime workspace, the DB record is updated (creating a new version).\n * Builder-created workspaces are tagged with `metadata.source = 'builder'`\n * so they can be identified during reconciliation.\n */\n private async ensureBuilderWorkspaces(): Promise<void> {\n if (!this.hasEnabledBuilderConfig()) return;\n\n const builder = await this.resolveBuilder();\n const agentConfig = builder?.getConfiguration()?.agent;\n const workspaceRef = agentConfig?.workspace as { type: string; workspaceId?: string } | undefined;\n if (!workspaceRef || workspaceRef.type !== 'id' || !workspaceRef.workspaceId) return;\n\n const runtimeWorkspace = this.__mastra?.getWorkspaceById(workspaceRef.workspaceId);\n if (!runtimeWorkspace) return;\n\n const snapshot = await this.workspace.snapshotFromWorkspace(runtimeWorkspace);\n const builderMetadata = { source: 'builder' as const, builderWorkspaceId: workspaceRef.workspaceId };\n\n const existing = await this.workspace.getById(workspaceRef.workspaceId);\n if (!existing) {\n // First time — create with builder metadata\n await this.workspace.create({\n id: workspaceRef.workspaceId,\n metadata: builderMetadata,\n ...snapshot,\n });\n this.__logger?.info(`[MastraEditor] Persisted builder workspace '${workspaceRef.workspaceId}' to DB`);\n return;\n }\n\n // Workspace exists — check for config drift and backfill metadata\n const needsMetadataBackfill = !existing.metadata?.source;\n const configDrifted = !snapshotsMatch(existing, snapshot);\n\n if (needsMetadataBackfill || configDrifted) {\n const updateInput: Record<string, unknown> = { id: workspaceRef.workspaceId };\n if (needsMetadataBackfill) {\n updateInput.metadata = { ...existing.metadata, ...builderMetadata };\n }\n if (configDrifted) {\n Object.assign(updateInput, snapshot);\n this.__logger?.info(\n `[MastraEditor] Workspace '${workspaceRef.workspaceId}' config drifted — updating DB record`,\n );\n }\n await this.workspace.update(updateInput as any);\n }\n }\n\n /**\n * Archive builder-created workspaces that no longer match the current\n * builder configuration. Called after `ensureBuilderWorkspaces()` on startup.\n *\n * Only touches workspaces tagged with `metadata.source === 'builder'`.\n * The current builder workspace (if any) is never archived.\n */\n private async reconcileBuilderWorkspaces(): Promise<void> {\n if (!this.hasEnabledBuilderConfig()) return;\n\n const builder = await this.resolveBuilder();\n const agentConfig = builder?.getConfiguration()?.agent;\n const workspaceRef = agentConfig?.workspace as { type: string; workspaceId?: string } | undefined;\n\n // Determine the \"current\" builder workspace ID\n let currentWorkspaceId: string | undefined;\n if (workspaceRef?.type === 'id' && workspaceRef.workspaceId) {\n currentWorkspaceId = workspaceRef.workspaceId;\n }\n // For inline workspaces, the ID is deterministic based on config hash\n // (computed in agent.ensureStoredWorkspace), but since ensureBuilderWorkspaces\n // only handles type='id', we just need the current ID here.\n\n // Without a resolvable current workspace ID we can't safely distinguish\n // orphans from the active workspace, so skip reconciliation entirely.\n // (Bailing out leaves orphans untouched, which is recoverable; archiving\n // every builder-tagged workspace would not be.)\n if (!currentWorkspaceId) return;\n\n // List all builder-tagged workspaces\n const { workspaces: allWorkspaces } = await this.workspace.listResolved({\n perPage: false, // fetch all\n metadata: { source: 'builder' },\n });\n\n for (const ws of allWorkspaces) {\n // Skip the current builder workspace\n if (ws.id === currentWorkspaceId) continue;\n // Skip already archived\n if (ws.status === 'archived') continue;\n\n // Archive this orphaned builder workspace\n try {\n await this.workspace.update({ id: ws.id, status: 'archived' } as any);\n this.__logger?.info(`[MastraEditor] Archived orphaned builder workspace '${ws.id}'`);\n } catch (err) {\n this.__logger?.warn(`[MastraEditor] Failed to archive workspace '${ws.id}'`, { error: err });\n }\n }\n }\n\n /**\n * Sync. OSS-safe. Does NOT import @mastra/editor/ee.\n * Returns true if builder config is present and enabled.\n */\n hasEnabledBuilderConfig(): boolean {\n if (!this.__builderConfig) return false;\n return this.__builderConfig.enabled !== false;\n }\n\n /**\n * Async. Dynamic-imports @mastra/editor/ee on first call. Caches result.\n * Returns undefined if builder is not enabled.\n */\n async resolveBuilder(): Promise<IAgentBuilder | undefined> {\n if (this.__builderResolved) {\n return this.__builderInstance;\n }\n\n if (!this.hasEnabledBuilderConfig()) {\n this.__builderResolved = true;\n return undefined;\n }\n\n await this.assertAgentBuilderLicensed();\n\n const { EditorAgentBuilder } = await import('./ee');\n this.__builderInstance = new EditorAgentBuilder(this.__builderConfig);\n\n // Cross-validate: if the builder has a browser config with a provider that\n // isn't registered in __browsers, downgrade the feature flag and warn.\n const browserRef = this.__builderInstance.getConfiguration()?.agent?.browser;\n const browserFeatureOn = this.__builderInstance.getFeatures()?.agent?.browser === true;\n if (browserFeatureOn && browserRef?.config?.provider) {\n const providerId = browserRef.config.provider;\n if (!this.__browsers.has(providerId)) {\n const warning =\n `Agent Builder browser config references provider \"${providerId}\" but no matching browser ` +\n `provider is registered in \\`editor.browsers\\`. The browser toggle will be hidden. ` +\n `Register the provider: \\`new MastraEditor({ browsers: { \"${providerId}\": yourProvider } })\\`.`;\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor] ${warning}`);\n const features = this.__builderInstance.getFeatures()?.agent;\n if (features) {\n features.browser = false;\n }\n }\n }\n\n this.__builderResolved = true;\n return this.__builderInstance;\n }\n\n /**\n * Defense-in-depth license guard for the Agent Builder. Mirrors the\n * startup-time check in `MastraServer.validateAgentBuilderLicense()` so the\n * builder cannot be instantiated outside the server boot path without a\n * valid EE license. Dev environments bypass via `isEEEnabled()`.\n */\n private async assertAgentBuilderLicensed(): Promise<void> {\n try {\n const { isEEEnabled } = await import('@mastra/core/auth/ee');\n if (!isEEEnabled()) {\n throw new Error(\n '[mastra/auth-ee] Agent Builder is configured but no valid EE license was found.\\n' +\n 'Agent Builder requires a Mastra Enterprise License for production use.\\n' +\n 'Set the MASTRA_EE_LICENSE environment variable with your license key.\\n' +\n 'Learn more: https://github.com/mastra-ai/mastra/blob/main/ee/LICENSE',\n );\n }\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('[mastra/auth-ee]')) {\n throw err;\n }\n throw new Error(\n '[mastra/auth-ee] Agent Builder is configured but the EE module (@mastra/core/auth/ee) could not be loaded.\\n' +\n 'Ensure @mastra/core is updated to a version that includes EE support.',\n );\n }\n }\n\n /** Registered tool providers */\n getToolProvider(id: string): ToolProvider | undefined {\n return this.__toolProviders[id];\n }\n\n /**\n * Like {@link getToolProvider}, but throws {@link UnknownToolProviderError}\n * when the id is unknown.\n */\n getToolProviderOrThrow(id: string): ToolProvider {\n const provider = this.__toolProviders[id];\n if (!provider) {\n throw new UnknownToolProviderError(id, Object.keys(this.__toolProviders));\n }\n return provider;\n }\n\n /** List all registered tool providers */\n getToolProviders(): Record<string, ToolProvider> {\n return this.__toolProviders;\n }\n\n /** Get a processor provider by ID */\n getProcessorProvider(id: string): ProcessorProvider | undefined {\n return this.__processorProviders[id];\n }\n\n /** List all registered processor providers */\n getProcessorProviders(): Record<string, ProcessorProvider> {\n return this.__processorProviders;\n }\n /** List all registered filesystem providers */\n getFilesystemProviders(): FilesystemProvider[] {\n return Array.from(this.__filesystems.values());\n }\n\n /** List all registered sandbox providers */\n getSandboxProviders(): SandboxProvider[] {\n return Array.from(this.__sandboxes.values());\n }\n\n /** List all registered blob store providers */\n getBlobStoreProviders(): BlobStoreProvider[] {\n return Array.from(this.__blobStores.values());\n }\n\n /**\n * Resolve a blob store from the provider registry, or fall back to the\n * storage backend's blobs domain.\n *\n * @param providerId - If specified, look up a registered provider by ID\n * and create a blob store from the given config. If omitted, falls back\n * to `storage.getStore('blobs')`.\n * @param providerConfig - Provider-specific configuration (only used when\n * `providerId` is specified).\n */\n async resolveBlobStore(providerId?: string, providerConfig?: Record<string, unknown>): Promise<BlobStore> {\n // If a specific provider is requested, resolve it\n if (providerId) {\n const provider = this.__blobStores.get(providerId);\n if (!provider) {\n throw new Error(\n `Blob store provider \"${providerId}\" is not registered. ` +\n `Register it via new MastraEditor({ blobStores: { '${providerId}': yourProvider } })`,\n );\n }\n const blobStore = await provider.createBlobStore(providerConfig ?? {});\n await blobStore.init();\n return blobStore;\n }\n\n // Fall back to storage backend's blobs domain\n const storage = this.__mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) throw new Error('Blob storage domain is not available');\n return blobStore;\n }\n}\n","import type { Mastra } from '@mastra/core';\nimport type { IMastraLogger as Logger } from '@mastra/core/logger';\nimport type { GetByIdOptions } from '@mastra/core/editor';\nimport type { MastraEditor } from '../index';\n\nexport type { GetByIdOptions };\n\n/**\n * Adapter interface that bridges entity-specific storage method names\n * to a generic CRUD interface. Each CrudEditorNamespace subclass implements\n * this to map its storage domain's methods.\n */\nexport interface StorageAdapter<\n TCreateInput extends { id: string },\n TUpdateInput extends { id: string },\n TListInput,\n TListOutput,\n TListResolvedOutput,\n TResolved,\n> {\n create(input: TCreateInput): Promise<unknown>;\n getByIdResolved(id: string, options?: GetByIdOptions): Promise<TResolved | null>;\n update(input: TUpdateInput): Promise<unknown>;\n delete(id: string): Promise<void>;\n list(args?: TListInput): Promise<TListOutput>;\n listResolved(args?: TListInput): Promise<TListResolvedOutput>;\n}\n\n/**\n * Base class for all editor namespaces.\n * Provides shared infrastructure: mastra/logger access and registration check.\n */\nexport abstract class EditorNamespace {\n constructor(protected editor: MastraEditor) {}\n\n protected get mastra(): Mastra | undefined {\n return this.editor.__mastra;\n }\n\n protected get logger(): Logger | undefined {\n return this.editor.__logger;\n }\n\n protected ensureRegistered(): void {\n if (!this.editor.__mastra) {\n throw new Error('MastraEditor is not registered with a Mastra instance');\n }\n }\n}\n\n/**\n * Abstract base class for editor namespaces with full CRUD operations.\n *\n * Generic parameters:\n * - TCreateInput / TUpdateInput — storage input shapes\n * - TListInput / TListOutput / TListResolvedOutput — list shapes\n * - TResolved — the raw config shape returned from storage\n * - THydrated — the runtime primitive type returned by getById (defaults to TResolved)\n *\n * Subclasses override `hydrate()` to convert raw config into a runtime primitive.\n * For namespaces without hydration (e.g. prompts), THydrated = TResolved and hydrate is identity.\n *\n * Includes a built-in cache for getById results. Mutations (create/update/delete)\n * automatically invalidate the cache for the affected entity.\n */\nexport abstract class CrudEditorNamespace<\n TCreateInput extends { id: string },\n TUpdateInput extends { id: string },\n TListInput,\n TListOutput,\n TListResolvedOutput,\n TResolved,\n THydrated = TResolved,\n> extends EditorNamespace {\n protected _cache = new Map<string, THydrated>();\n\n /**\n * Each subclass must provide a storage adapter that maps\n * entity-specific storage method names to the generic interface.\n */\n protected abstract getStorageAdapter(): Promise<\n StorageAdapter<TCreateInput, TUpdateInput, TListInput, TListOutput, TListResolvedOutput, TResolved>\n >;\n\n /**\n * Convert a raw resolved config into a runtime primitive.\n * Override in subclasses that need hydration (e.g. agents → Agent instance).\n * Default implementation returns the resolved config as-is.\n */\n protected async hydrate(resolved: TResolved): Promise<THydrated> {\n return resolved as unknown as THydrated;\n }\n\n /**\n * Hook called when an entity is evicted from the cache (on delete, update, or clearCache).\n * Override in subclasses to also remove the entity from the Mastra runtime registry.\n */\n protected onCacheEvict(_id: string): void {\n // Default: no-op. Subclasses override to clean up runtime registries.\n }\n\n async create(input: TCreateInput): Promise<THydrated> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n await adapter.create(input);\n const resolved = await adapter.getByIdResolved(input.id);\n if (!resolved) {\n throw new Error(`Failed to resolve entity ${input.id} after creation`);\n }\n const hydrated = await this.hydrate(resolved);\n this._cache.set(input.id, hydrated);\n return hydrated;\n }\n\n async getById(id: string, options?: GetByIdOptions): Promise<THydrated | null> {\n this.ensureRegistered();\n\n // Only use the cache for default version requests (no specific version or status override)\n const isVersionRequest = options?.versionId || options?.versionNumber || options?.status;\n if (!isVersionRequest) {\n const cached = this._cache.get(id);\n if (cached) {\n this.logger?.debug(`[getById] Cache hit for \"${id}\"`);\n return cached;\n }\n }\n\n this.logger?.debug(`[getById] Cache miss for \"${id}\", fetching from storage`);\n const adapter = await this.getStorageAdapter();\n const resolved = await adapter.getByIdResolved(id, options);\n if (!resolved) return null;\n\n const hydrated = await this.hydrate(resolved);\n\n // Only cache default (latest) version\n if (!isVersionRequest) {\n this._cache.set(id, hydrated);\n }\n return hydrated;\n }\n\n async update(input: TUpdateInput): Promise<THydrated> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n await adapter.update(input);\n this._cache.delete(input.id);\n this.onCacheEvict(input.id);\n const resolved = await adapter.getByIdResolved(input.id);\n if (!resolved) {\n throw new Error(`Failed to resolve entity ${input.id} after update`);\n }\n const hydrated = await this.hydrate(resolved);\n this._cache.set(input.id, hydrated);\n return hydrated;\n }\n\n async delete(id: string): Promise<void> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n await adapter.delete(id);\n this._cache.delete(id);\n this.onCacheEvict(id);\n }\n\n async list(args?: TListInput): Promise<TListOutput> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n return adapter.list(args);\n }\n\n async listResolved(args?: TListInput): Promise<TListResolvedOutput> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n return adapter.listResolved(args);\n }\n\n /**\n * Clear cached entities. If an id is provided, only that entity is cleared.\n * Otherwise all cached entities in this namespace are cleared.\n */\n clearCache(id?: string): void {\n if (id) {\n this._cache.delete(id);\n // Always notify subclasses so they can clean up runtime registries\n // (e.g. remove the agent from mastra.#agents), even if the entity\n // wasn't in the editor cache (version-specific lookups skip caching).\n this.onCacheEvict(id);\n this.logger?.debug(`[clearCache] Cleared cache for \"${id}\"`);\n } else {\n for (const cachedId of Array.from(this._cache.keys())) {\n this.onCacheEvict(cachedId);\n }\n this._cache.clear();\n this.logger?.debug('[clearCache] Cleared all cached entities');\n }\n }\n}\n","import { createHash } from 'node:crypto';\n\nimport { Memory } from '@mastra/memory';\nimport { Agent } from '@mastra/core/agent';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core';\nimport { Workspace, CompositeVersionedSkillSource } from '@mastra/core/workspace';\nimport type { SkillSource, VersionedSkillEntry } from '@mastra/core/workspace';\nimport type { MastraMemory, MemoryConfig, SerializedMemoryConfig, SharedMemoryConfig } from '@mastra/core/memory';\nimport type { MastraVector as MastraVectorProvider } from '@mastra/core/vector';\nimport type { ToolAction } from '@mastra/core/tools';\nimport type { Workflow } from '@mastra/core/workflows';\nimport type { MastraScorers } from '@mastra/core/evals';\nimport type {\n StorageResolvedAgentType,\n StorageScorerConfig,\n StorageToolConfig,\n StorageMCPClientToolsConfig,\n StorageSkillConfig,\n} from '@mastra/core/storage';\nimport { convertSchemaToZod } from '@mastra/schema-compat';\n\nimport type {\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageListAgentsResolvedOutput,\n StorageConditionalVariant,\n StorageConditionalField,\n StorageDefaultOptions,\n StorageModelConfig,\n AgentInstructionBlock,\n StoredProcessorGraph,\n StorageWorkspaceRef,\n StorageBrowserRef,\n} from '@mastra/core/storage';\nimport type { MastraBrowser } from '@mastra/core/browser';\n\nimport { RequestContext } from '@mastra/core/request-context';\nimport { resolveStoredToolProviders } from '@mastra/core/tool-provider';\nimport type { ToolProviders } from '@mastra/core/tool-provider';\n\nimport { evaluateRuleGroup } from '../rule-evaluator';\nimport { resolveInstructionBlocks } from '../instruction-builder';\nimport { hydrateProcessorGraph, selectFirstMatchingGraph } from '../processor-graph-hydrator';\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\nimport { EditorMCPNamespace } from './mcp';\n\n// ============================================================================\n// Builder Defaults\n// ============================================================================\n\n/** Fields from builder.configuration.agent that can be applied as creation defaults */\nconst BUILDER_DEFAULT_FIELDS = ['memory', 'workspace', 'browser'] as const;\n\n/**\n * Shape of `configuration.agent.models.default` entries (mirrors\n * `DefaultModelEntry` from `@mastra/core/agent-builder/ee` without the type-level\n * narrowing — this file only cares about the runtime shape).\n */\ntype DefaultModelEntryRuntime = {\n kind?: 'custom';\n provider: string;\n modelId: string;\n};\n\n/**\n * Convert the admin's `DefaultModelEntry` (`{ provider, modelId }`) into the\n * stored `StorageModelConfig` (`{ provider, name }`) used by every agent record.\n */\nfunction defaultModelToStored(entry: DefaultModelEntryRuntime): StorageModelConfig {\n return { provider: entry.provider, name: entry.modelId };\n}\n\n/**\n * Built-in baseline defaults applied when the admin has not pinned a\n * `configuration.agent.<field>` value AND the user did not provide one on\n * the creation input. Explicit `null` on input still wins (opt-out).\n */\nconst BUILDER_BASELINE_DEFAULTS: Partial<Record<(typeof BUILDER_DEFAULT_FIELDS)[number], unknown>> = {\n memory: { observationalMemory: true } satisfies SerializedMemoryConfig,\n};\n\n/**\n * Apply builder defaults to agent creation input.\n * Only applies for fields where input is `undefined` (not `null` — null is explicit disable).\n *\n * Resolution order per field:\n * 1. `input[field]` — user intent always wins\n * 2. `builderAgentConfig[field]` — admin-pinned default\n * 3. `BUILDER_BASELINE_DEFAULTS[field]` — built-in default (e.g. observational memory on)\n *\n * `model` is special-cased: it is NOT in `BUILDER_DEFAULT_FIELDS` because the\n * stored shape (`{ provider, name }`) differs from the admin-config shape\n * (`{ provider, modelId }`). It also must never overwrite a conditional model\n * already present on `input`.\n */\nfunction applyBuilderDefaults(\n input: StorageCreateAgentInput,\n builderAgentConfig: Record<string, unknown> | undefined,\n): StorageCreateAgentInput {\n const defaults: Partial<StorageCreateAgentInput> = {};\n\n for (const field of BUILDER_DEFAULT_FIELDS) {\n if (input[field] !== undefined) continue;\n const adminValue = builderAgentConfig?.[field];\n if (adminValue !== undefined) {\n (defaults as Record<string, unknown>)[field] = adminValue;\n continue;\n }\n const baseline = BUILDER_BASELINE_DEFAULTS[field];\n if (baseline !== undefined) {\n (defaults as Record<string, unknown>)[field] = baseline;\n }\n }\n\n // Seed `model` from the admin's `models.default` only when input omits it.\n // Conditional models are preserved verbatim (they are objects but not the\n // admin-config shape, and the user's intent always wins).\n if (input.model === undefined && builderAgentConfig) {\n const models = (builderAgentConfig.models ?? undefined) as { default?: DefaultModelEntryRuntime } | undefined;\n const adminDefault = models?.default;\n if (adminDefault && typeof adminDefault.provider === 'string' && typeof adminDefault.modelId === 'string') {\n (defaults as Record<string, unknown>).model = defaultModelToStored(adminDefault);\n }\n }\n\n return Object.keys(defaults).length > 0 ? { ...input, ...defaults } : input;\n}\n\n// ============================================================================\n// EditorAgentNamespace\n// ============================================================================\n\nexport class EditorAgentNamespace extends CrudEditorNamespace<\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageListAgentsResolvedOutput,\n StorageResolvedAgentType,\n Agent\n> {\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageListAgentsResolvedOutput,\n StorageResolvedAgentType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('agents');\n if (!store) throw new Error('Agents storage domain is not available');\n\n return {\n create: input => store.create({ agent: input }),\n getByIdResolved: async (id, options) => {\n if (options?.versionId || options?.versionNumber) {\n // Fetch the agent metadata first\n const agent = await store.getById(id);\n if (!agent) return null;\n\n // Fetch the specific version\n const version = options.versionId\n ? await store.getVersion(options.versionId)\n : await store.getVersionByNumber(id, options.versionNumber!);\n\n if (!version) return null;\n if (version.agentId !== id) {\n throw new Error(`Version \"${version.id}\" does not belong to agent \"${id}\"`);\n }\n\n const {\n id: versionId,\n agentId: _aId,\n versionNumber: _vn,\n changedFields: _cf,\n changeMessage: _cm,\n createdAt: _ca,\n ...snapshotConfig\n } = version;\n return { ...agent, ...snapshotConfig, resolvedVersionId: versionId } as StorageResolvedAgentType;\n }\n return store.getByIdResolved(id, options?.status ? { status: options.status } : undefined);\n },\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Hydrate a stored agent config into a runtime Agent instance.\n */\n protected async hydrate(storedAgent: StorageResolvedAgentType): Promise<Agent> {\n return this.createAgentFromStoredConfig(storedAgent);\n }\n\n /**\n * Create a new agent, applying builder defaults for fields not specified in input.\n * Also ensures the referenced workspace (if any) is persisted as a stored workspace.\n */\n async create(input: StorageCreateAgentInput): Promise<Agent> {\n let finalInput = input;\n\n if (this.editor.hasEnabledBuilderConfig()) {\n const builder = await this.editor.resolveBuilder();\n const agentConfig = builder?.getConfiguration()?.agent;\n finalInput = applyBuilderDefaults(input, agentConfig);\n }\n\n // Ensure the workspace referenced by the agent exists in stored workspaces\n await this.ensureStoredWorkspace(finalInput.workspace as StorageWorkspaceRef | undefined);\n\n return super.create(finalInput);\n }\n\n /**\n * Ensure a workspace reference is persisted in the DB.\n *\n * For `type: 'id'`: looks up the runtime workspace, serializes its config,\n * and creates a stored workspace record if one doesn't already exist.\n *\n * For `type: 'inline'`: derives a deterministic ID from the config and\n * persists it as a stored workspace if one doesn't already exist.\n */\n private async ensureStoredWorkspace(workspaceRef: StorageWorkspaceRef | undefined): Promise<void> {\n if (!workspaceRef) return;\n\n const workspaceNs = this.editor.workspace;\n if (!workspaceNs) return;\n\n try {\n if (workspaceRef.type === 'id') {\n // Check if already stored in DB\n const existing = await workspaceNs.getById(workspaceRef.workspaceId);\n if (existing) return;\n\n // Not in DB — look up the runtime workspace and serialize it\n const runtimeWorkspace = this.mastra?.getWorkspaceById(workspaceRef.workspaceId);\n if (!runtimeWorkspace) {\n this.logger?.warn(\n `[ensureStoredWorkspace] Workspace '${workspaceRef.workspaceId}' not found in runtime registry, cannot persist`,\n );\n return;\n }\n\n const snapshot = await workspaceNs.snapshotFromWorkspace(runtimeWorkspace);\n await workspaceNs.create({\n id: workspaceRef.workspaceId,\n metadata: { source: 'builder', builderWorkspaceId: workspaceRef.workspaceId },\n ...snapshot,\n });\n this.logger?.debug(`[ensureStoredWorkspace] Persisted runtime workspace '${workspaceRef.workspaceId}' to DB`);\n } else if (workspaceRef.type === 'inline') {\n // Derive a deterministic ID from the inline config\n const configHash = createHash('sha256').update(JSON.stringify(workspaceRef.config)).digest('hex').slice(0, 12);\n const workspaceId = `inline-${configHash}`;\n\n // Check if already stored in DB\n const existing = await workspaceNs.getById(workspaceId);\n if (existing) return;\n\n await workspaceNs.create({\n id: workspaceId,\n metadata: { source: 'builder', builderConfigHash: configHash },\n ...workspaceRef.config,\n });\n this.logger?.debug(`[ensureStoredWorkspace] Persisted inline workspace '${workspaceId}' to DB`);\n }\n } catch (error) {\n // Don't fail agent creation if workspace persistence fails\n this.logger?.warn('[ensureStoredWorkspace] Failed to persist workspace', { error });\n }\n }\n\n protected override onCacheEvict(id: string): void {\n // Only remove stored agents from the Mastra registry.\n // Code-defined agents must survive cache eviction because they live\n // in code and may only have a stored config overlay.\n try {\n const existing = this.mastra?.getAgentById(id);\n if (existing?.source === 'stored') {\n this.mastra?.removeAgent(id);\n }\n } catch {\n // Agent not found in registry — nothing to remove\n }\n }\n\n /**\n * Evict all cached agents that reference a given skill ID.\n * Called by EditorSkillNamespace after a skill is published so that\n * subsequent agent.getById() calls re-hydrate with the updated skill version.\n */\n invalidateAgentsReferencingSkill(skillId: string): void {\n for (const [agentId, agent] of this._cache.entries()) {\n const raw = (agent as Agent).toRawConfig?.();\n if (!raw?.skills) continue;\n\n const skillsField = raw.skills;\n let found = false;\n\n if (Array.isArray(skillsField)) {\n // StorageConditionalVariant<Record<string, StorageSkillConfig>>[]\n found = skillsField.some(\n (variant: { value?: Record<string, unknown> }) => variant?.value && skillId in variant.value,\n );\n } else if (typeof skillsField === 'object' && skillsField !== null) {\n // Plain Record<string, StorageSkillConfig>\n found = skillId in (skillsField as Record<string, unknown>);\n }\n\n if (found) {\n this.logger?.debug(\n `[invalidateAgentsReferencingSkill] Evicting agent \"${agentId}\" (references skill \"${skillId}\")`,\n );\n this._cache.delete(agentId);\n this.onCacheEvict(agentId);\n }\n }\n }\n\n /**\n * Apply stored configuration overrides to a code-defined agent.\n *\n * When a stored config exists for the given agent's ID, the following fields\n * from the stored config override the code agent's values (if explicitly set):\n * - `instructions` — system prompt\n * - `tools` — tool selection with description overrides (merged on top of code tools)\n *\n * Fields that are absent or undefined in the stored config are left untouched.\n * Model, workspace, memory, and other code-defined fields are never overridden —\n * they may contain SDK instances or dynamic functions that cannot be safely serialized.\n * Returns the (possibly mutated) agent.\n */\n async applyStoredOverrides(\n agent: Agent,\n options?: { status?: 'draft' | 'published' } | { versionId: string },\n requestContext?: RequestContext,\n ): Promise<Agent> {\n let storedConfig: StorageResolvedAgentType | null = null;\n try {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n const resolvedOptions: { versionId: string } | { status: 'draft' | 'published' | 'archived' } =\n options && 'versionId' in options\n ? { versionId: options.versionId }\n : { status: (options as { status?: 'draft' | 'published' } | undefined)?.status ?? 'draft' };\n storedConfig = await adapter.getByIdResolved(agent.id, resolvedOptions);\n } catch (error) {\n // If a specific versionId was requested, don't fail open — propagate the error\n if (options && 'versionId' in options) {\n throw error;\n }\n // Editor not registered, storage not available, or agent not found — return unchanged\n return agent;\n }\n\n if (!storedConfig) {\n return agent;\n }\n\n // If requesting published status but no version has been published, don't override the code-defined agent\n const requestedPublished = options && !('versionId' in options) && options.status === 'published';\n if (requestedPublished && !storedConfig.activeVersionId) {\n return agent;\n }\n\n // Fork the agent so overrides don't mutate the singleton instance\n const fork = agent.__fork();\n\n this.logger?.debug(`[applyStoredOverrides] Applying stored overrides to code agent \"${agent.id}\"`);\n\n // --- Instructions ---\n if (storedConfig.instructions !== undefined && storedConfig.instructions !== null) {\n const resolved = this.resolveStoredInstructions(storedConfig.instructions);\n if (resolved !== undefined) {\n fork.__updateInstructions(resolved);\n }\n }\n\n // --- Tools (merge: stored tools override code tools, code tools not in stored config are preserved) ---\n const hasStoredTools = storedConfig.tools != null;\n const hasStoredMCPClients = storedConfig.mcpClients != null;\n const hasStoredIntegrationTools = storedConfig.integrationTools != null;\n const hasStoredToolProviders =\n storedConfig.toolProviders != null && Object.keys(storedConfig.toolProviders as object).length > 0;\n\n if (hasStoredTools || hasStoredMCPClients || hasStoredIntegrationTools || hasStoredToolProviders) {\n const hasConditionalTools = this.isConditionalVariants(storedConfig.tools);\n const hasConditionalMCPClients =\n storedConfig.mcpClients != null && this.isConditionalVariants(storedConfig.mcpClients);\n const hasConditionalIntegrationTools =\n storedConfig.integrationTools != null && this.isConditionalVariants(storedConfig.integrationTools);\n const hasConditionalToolProviders =\n storedConfig.toolProviders != null && this.isConditionalVariants(storedConfig.toolProviders);\n // toolProviders need request-time context for `caller-supplied` scope, so they\n // always force the dynamic branch (mirrors the create-stored-agent path).\n const isDynamicTools =\n hasConditionalTools ||\n hasConditionalMCPClients ||\n hasConditionalIntegrationTools ||\n hasStoredIntegrationTools ||\n hasConditionalToolProviders ||\n hasStoredToolProviders;\n\n if (isDynamicTools) {\n // Wrap in a dynamic function that merges at request time\n const originalTools = agent.listTools.bind(agent);\n const toolsFn = async ({ requestContext }: { requestContext: RequestContext }): Promise<ToolsInput> => {\n const codeTools = await originalTools({ requestContext });\n const ctx = requestContext.toJSON();\n\n const resolvedToolsConfig = hasConditionalTools\n ? this.accumulateObjectVariants(\n storedConfig!.tools as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n )\n : (storedConfig!.tools as Record<string, StorageToolConfig> | undefined);\n const registryTools = this.resolveStoredTools(resolvedToolsConfig);\n\n const resolvedMCPClientsConfig = hasConditionalMCPClients\n ? this.accumulateObjectVariants(\n storedConfig!.mcpClients as StorageConditionalVariant<Record<string, StorageMCPClientToolsConfig>>[],\n ctx,\n )\n : (storedConfig!.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined);\n const mcpTools = await this.resolveStoredMCPTools(resolvedMCPClientsConfig, requestContext);\n\n const resolvedIntegrationToolsConfig = hasConditionalIntegrationTools\n ? this.accumulateObjectVariants(\n storedConfig!.integrationTools as StorageConditionalVariant<\n Record<string, StorageMCPClientToolsConfig>\n >[],\n ctx,\n )\n : (storedConfig!.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined);\n const integrationTools = await this.resolveStoredIntegrationTools(\n resolvedIntegrationToolsConfig,\n requestContext,\n );\n\n // Resolve tool providers (v1 toolProviders)\n const resolvedToolProvidersConfig = hasConditionalToolProviders\n ? this.accumulateObjectVariants(\n storedConfig!.toolProviders as StorageConditionalVariant<ToolProviders>[],\n ctx,\n )\n : (storedConfig!.toolProviders as ToolProviders | undefined);\n const providerTools = await resolveStoredToolProviders(\n resolvedToolProvidersConfig,\n (providerId: string) => this.editor.getToolProviderOrThrow(providerId),\n {\n requestContext: ctx,\n authorId: storedConfig!.authorId,\n logger: this.logger,\n },\n );\n\n return { ...codeTools, ...registryTools, ...mcpTools, ...integrationTools, ...providerTools };\n };\n fork.__setTools(toolsFn);\n } else {\n // Static tools — resolve once and merge\n const codeTools = await fork.listTools();\n const registryTools = this.resolveStoredTools(\n storedConfig.tools as Record<string, StorageToolConfig> | undefined,\n );\n const mcpTools = await this.resolveStoredMCPTools(\n storedConfig.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined,\n requestContext,\n );\n const integrationTools = await this.resolveStoredIntegrationTools(\n storedConfig.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined,\n );\n fork.__setTools({ ...codeTools, ...registryTools, ...mcpTools, ...integrationTools });\n }\n }\n\n // Persist the resolved version ID so it can be read by span attributes / handlers\n if (storedConfig.resolvedVersionId) {\n const existing = fork.toRawConfig() ?? {};\n fork.__setRawConfig({ ...existing, resolvedVersionId: storedConfig.resolvedVersionId });\n }\n\n return fork;\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n /**\n * Detect whether a StorageConditionalField value is a conditional variant array\n * (as opposed to the plain static value T).\n */\n private isConditionalVariants<T>(field: StorageConditionalField<T>): field is StorageConditionalVariant<T>[] {\n return (\n Array.isArray(field) &&\n field.length > 0 &&\n typeof field[0] === 'object' &&\n field[0] !== null &&\n 'value' in field[0]\n );\n }\n\n /**\n * Accumulate all matching variants for an array-typed field.\n * Each matching variant's value (an array) is concatenated in order.\n * Variants with no rules are treated as unconditional (always included).\n */\n private accumulateArrayVariants<T>(\n variants: StorageConditionalVariant<T[]>[],\n context: Record<string, unknown>,\n ): T[] {\n const result: T[] = [];\n for (const variant of variants) {\n if (!variant.rules || evaluateRuleGroup(variant.rules, context)) {\n result.push(...variant.value);\n }\n }\n return result;\n }\n\n /**\n * Accumulate all matching variants for an object/record-typed field.\n * Each matching variant's value is shallow-merged in order, so later\n * matches override keys from earlier ones.\n * Variants with no rules are treated as unconditional (always included).\n */\n private accumulateObjectVariants<T extends Record<string, unknown>>(\n variants: StorageConditionalVariant<T>[],\n context: Record<string, unknown>,\n ): T | undefined {\n let result: T | undefined;\n for (const variant of variants) {\n if (!variant.rules || evaluateRuleGroup(variant.rules, context)) {\n result = result ? { ...result, ...variant.value } : { ...variant.value };\n }\n }\n return result;\n }\n\n private async createAgentFromStoredConfig(storedAgent: StorageResolvedAgentType): Promise<Agent> {\n if (!this.mastra) {\n throw new Error('MastraEditor is not registered with a Mastra instance');\n }\n\n this.logger?.debug(`[createAgentFromStoredConfig] Creating agent from stored config \"${storedAgent.id}\"`);\n\n const instructions = this.resolveStoredInstructions(storedAgent.instructions);\n\n // Determine if any conditional fields exist that require dynamic resolution\n const hasConditionalTools = storedAgent.tools != null && this.isConditionalVariants(storedAgent.tools);\n const hasConditionalMCPClients =\n storedAgent.mcpClients != null && this.isConditionalVariants(storedAgent.mcpClients);\n const hasConditionalIntegrationTools =\n storedAgent.integrationTools != null && this.isConditionalVariants(storedAgent.integrationTools);\n const hasToolProviders =\n storedAgent.toolProviders != null && Object.keys(storedAgent.toolProviders as object).length > 0;\n const hasConditionalToolProviders =\n storedAgent.toolProviders != null && this.isConditionalVariants(storedAgent.toolProviders);\n const hasConditionalWorkflows = storedAgent.workflows != null && this.isConditionalVariants(storedAgent.workflows);\n const hasConditionalAgents = storedAgent.agents != null && this.isConditionalVariants(storedAgent.agents);\n const hasConditionalMemory = storedAgent.memory != null && this.isConditionalVariants(storedAgent.memory);\n const hasConditionalScorers = storedAgent.scorers != null && this.isConditionalVariants(storedAgent.scorers);\n const hasConditionalInputProcessors =\n storedAgent.inputProcessors != null && this.isConditionalVariants(storedAgent.inputProcessors);\n const hasConditionalOutputProcessors =\n storedAgent.outputProcessors != null && this.isConditionalVariants(storedAgent.outputProcessors);\n const hasConditionalDefaultOptions =\n storedAgent.defaultOptions != null && this.isConditionalVariants(storedAgent.defaultOptions);\n const hasConditionalModel = this.isConditionalVariants(storedAgent.model);\n const hasConditionalWorkspace = storedAgent.workspace != null && this.isConditionalVariants(storedAgent.workspace);\n const hasConditionalBrowser = storedAgent.browser != null && this.isConditionalVariants(storedAgent.browser);\n\n // --- Resolve fields: conditional fields accumulate all matching variants ---\n\n // Tools: registry tools, MCP client tools, and integration tools can each be conditional.\n // If any is conditional, the combined result must be a dynamic function.\n const hasIntegrationTools = storedAgent.integrationTools != null;\n const isDynamicTools =\n hasConditionalTools ||\n hasConditionalMCPClients ||\n hasConditionalIntegrationTools ||\n hasIntegrationTools ||\n hasConditionalToolProviders ||\n hasToolProviders;\n\n let tools:\n | Record<string, ToolAction<any, any, any, any, any, any>>\n | (({\n requestContext,\n }: {\n requestContext: RequestContext;\n }) => Promise<Record<string, ToolAction<any, any, any, any, any, any>>>);\n\n if (isDynamicTools) {\n // At least one tool source is conditional — resolve all at request time\n tools = async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n\n // Resolve registry tools\n const resolvedToolsConfig = hasConditionalTools\n ? this.accumulateObjectVariants(\n storedAgent.tools as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n )\n : (storedAgent.tools as Record<string, StorageToolConfig> | undefined);\n const registryTools = this.resolveStoredTools(resolvedToolsConfig);\n\n // Resolve MCP client tools\n const resolvedMCPClientsConfig = hasConditionalMCPClients\n ? this.accumulateObjectVariants(\n storedAgent.mcpClients as StorageConditionalVariant<Record<string, StorageMCPClientToolsConfig>>[],\n ctx,\n )\n : (storedAgent.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined);\n const mcpTools = await this.resolveStoredMCPTools(resolvedMCPClientsConfig, requestContext);\n\n // Resolve integration tools (tool providers)\n const resolvedIntegrationToolsConfig = hasConditionalIntegrationTools\n ? this.accumulateObjectVariants(\n storedAgent.integrationTools as StorageConditionalVariant<Record<string, StorageMCPClientToolsConfig>>[],\n ctx,\n )\n : (storedAgent.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined);\n const integrationTools = await this.resolveStoredIntegrationTools(\n resolvedIntegrationToolsConfig,\n requestContext,\n );\n\n // Resolve tool providers (v1 toolProviders)\n const resolvedToolProvidersConfig = hasConditionalToolProviders\n ? this.accumulateObjectVariants(storedAgent.toolProviders as StorageConditionalVariant<ToolProviders>[], ctx)\n : (storedAgent.toolProviders as ToolProviders | undefined);\n const providerTools = await resolveStoredToolProviders(\n resolvedToolProvidersConfig,\n (providerId: string) => this.editor.getToolProviderOrThrow(providerId),\n {\n requestContext: ctx,\n authorId: storedAgent.authorId,\n logger: this.logger,\n },\n );\n\n return { ...registryTools, ...mcpTools, ...integrationTools, ...providerTools };\n };\n } else {\n // All are static — resolve once at agent creation time (no requestContext available).\n // Note: `hasToolProviders` is part of `isDynamicTools` above, so the v1 toolProviders\n // path is always handled in the dynamic branch (where `requestContext` is available\n // for `caller-supplied` scope). Nothing to resolve here.\n const registryTools = this.resolveStoredTools(storedAgent.tools as Record<string, StorageToolConfig> | undefined);\n const mcpTools = await this.resolveStoredMCPTools(\n storedAgent.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined,\n );\n const integrationTools = await this.resolveStoredIntegrationTools(\n storedAgent.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined,\n );\n tools = { ...registryTools, ...mcpTools, ...integrationTools };\n }\n\n // Workflows: variant values may be string[] or Record<string, StorageToolConfig>\n const workflows = hasConditionalWorkflows\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const variants = storedAgent.workflows as StorageConditionalVariant<\n Record<string, StorageToolConfig> | string[]\n >[];\n const isArrayVariant = Array.isArray(variants[0]?.value);\n const resolved = isArrayVariant\n ? this.accumulateArrayVariants(variants as StorageConditionalVariant<string[]>[], ctx)\n : this.accumulateObjectVariants(\n variants as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n );\n return this.resolveStoredWorkflows(resolved);\n }\n : this.resolveStoredWorkflows(storedAgent.workflows as Record<string, StorageToolConfig> | string[] | undefined);\n\n // Agents: variant values may be string[] or Record<string, StorageToolConfig>\n const agents = hasConditionalAgents\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const variants = storedAgent.agents as StorageConditionalVariant<\n Record<string, StorageToolConfig> | string[]\n >[];\n const isArrayVariant = Array.isArray(variants[0]?.value);\n const resolved = isArrayVariant\n ? this.accumulateArrayVariants(variants as StorageConditionalVariant<string[]>[], ctx)\n : this.accumulateObjectVariants(\n variants as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n );\n return this.resolveStoredAgents(resolved);\n }\n : this.resolveStoredAgents(storedAgent.agents as Record<string, StorageToolConfig> | string[] | undefined);\n\n // Memory (object): accumulate by merging config from all matching variants\n const memory = hasConditionalMemory\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolved = this.accumulateObjectVariants(\n storedAgent.memory as StorageConditionalVariant<SerializedMemoryConfig>[],\n ctx,\n );\n return this.resolveStoredMemory(resolved as SerializedMemoryConfig | undefined);\n }\n : this.resolveStoredMemory(storedAgent.memory as SerializedMemoryConfig | undefined);\n\n // Scorers (Record): accumulate by merging objects from all matching variants\n const scorers = hasConditionalScorers\n ? async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolved = this.accumulateObjectVariants(\n storedAgent.scorers as StorageConditionalVariant<Record<string, StorageScorerConfig>>[],\n ctx,\n );\n return this.resolveStoredScorers(resolved);\n }\n : await this.resolveStoredScorers(storedAgent.scorers as Record<string, StorageScorerConfig> | undefined);\n\n // Input processors (graph): first-match from conditional variants, then hydrate\n const processorProviders = this.editor.getProcessorProviders();\n const hydrationCtx = { providers: processorProviders, mastra: this.mastra, logger: this.logger };\n\n const inputProcessors = hasConditionalInputProcessors\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const graph = selectFirstMatchingGraph(\n storedAgent.inputProcessors as StorageConditionalVariant<StoredProcessorGraph>[],\n ctx,\n );\n return hydrateProcessorGraph(graph, 'input', hydrationCtx);\n }\n : hydrateProcessorGraph(storedAgent.inputProcessors as StoredProcessorGraph | undefined, 'input', hydrationCtx);\n\n // Output processors (graph): first-match from conditional variants, then hydrate\n const outputProcessors = hasConditionalOutputProcessors\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const graph = selectFirstMatchingGraph(\n storedAgent.outputProcessors as StorageConditionalVariant<StoredProcessorGraph>[],\n ctx,\n );\n return hydrateProcessorGraph(graph, 'output', hydrationCtx);\n }\n : hydrateProcessorGraph(storedAgent.outputProcessors as StoredProcessorGraph | undefined, 'output', hydrationCtx);\n\n // Model (object): accumulate by merging config from all matching variants\n let model: string | (({ requestContext }: { requestContext: RequestContext }) => string);\n let staticModelConfig: StorageModelConfig | undefined;\n\n /** Extract model-level settings into the shape expected by defaultOptions.modelSettings */\n const modelSettingsFrom = (cfg: StorageModelConfig) => ({\n temperature: cfg.temperature,\n topP: cfg.topP,\n frequencyPenalty: cfg.frequencyPenalty,\n presencePenalty: cfg.presencePenalty,\n maxOutputTokens: cfg.maxCompletionTokens,\n });\n\n if (hasConditionalModel) {\n model = ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolved = this.accumulateObjectVariants(\n storedAgent.model as StorageConditionalVariant<StorageModelConfig>[],\n ctx,\n );\n if (!resolved || !resolved.provider || !resolved.name) {\n throw new Error(\n `Stored agent \"${storedAgent.id}\" conditional model resolved to invalid configuration. Both provider and name are required.`,\n );\n }\n return `${resolved.provider}/${resolved.name}`;\n };\n } else {\n staticModelConfig = storedAgent.model as StorageModelConfig;\n if (!staticModelConfig || !staticModelConfig.provider || !staticModelConfig.name) {\n throw new Error(\n `Stored agent \"${storedAgent.id}\" has no active version or invalid model configuration. Both provider and name are required.`,\n );\n }\n model = `${staticModelConfig.provider}/${staticModelConfig.name}`;\n }\n\n // Default options (object): accumulate by merging from all matching variants.\n // When the model is conditional, defaultOptions must also be dynamic so that\n // model-level settings (temperature, topP, etc.) are forwarded at request time.\n const staticDefaultOptions =\n hasConditionalDefaultOptions || hasConditionalModel\n ? undefined\n : (storedAgent.defaultOptions as StorageDefaultOptions | undefined);\n\n const resolveModelSettings = (ctx: Record<string, unknown>) => {\n const resolved = this.accumulateObjectVariants(\n storedAgent.model as StorageConditionalVariant<StorageModelConfig>[],\n ctx,\n );\n return resolved ? modelSettingsFrom(resolved) : {};\n };\n\n let defaultOptions;\n if (hasConditionalDefaultOptions || hasConditionalModel) {\n defaultOptions = ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n\n const baseOptions = hasConditionalDefaultOptions\n ? (this.accumulateObjectVariants(\n storedAgent.defaultOptions as StorageConditionalVariant<StorageDefaultOptions>[],\n ctx,\n ) ?? {})\n : ((storedAgent.defaultOptions as StorageDefaultOptions | undefined) ?? {});\n\n const mSettings = hasConditionalModel\n ? resolveModelSettings(ctx)\n : staticModelConfig\n ? modelSettingsFrom(staticModelConfig)\n : {};\n\n return {\n ...baseOptions,\n modelSettings: {\n ...((baseOptions as Record<string, unknown>).modelSettings as Record<string, unknown> | undefined),\n ...mSettings,\n },\n };\n };\n } else {\n defaultOptions = {\n ...staticDefaultOptions,\n modelSettings: {\n ...staticDefaultOptions?.modelSettings,\n ...(staticModelConfig ? modelSettingsFrom(staticModelConfig) : undefined),\n },\n };\n }\n\n // Convert requestContextSchema from JSON Schema to ZodSchema if present\n const requestContextSchema = storedAgent.requestContextSchema\n ? convertSchemaToZod(storedAgent.requestContextSchema as Record<string, unknown>)\n : undefined;\n\n // Resolve agent-level skill source for versioned skills (pin/latest strategy).\n // This creates a CompositeVersionedSkillSource that reads from the blob store\n // instead of the live filesystem, enabling draft/publish/rollback semantics.\n const skillSource = await this.resolveAgentSkillSource(storedAgent.skills);\n\n // Workspace: resolve stored workspace reference (ID or inline) to a runtime Workspace.\n // When conditional, wrapped in a DynamicArgument function resolved at request time.\n const workspace = hasConditionalWorkspace\n ? async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolvedRef = this.accumulateObjectVariants(\n storedAgent.workspace as StorageConditionalVariant<StorageWorkspaceRef>[],\n ctx,\n );\n return this.resolveStoredWorkspace(resolvedRef, skillSource);\n }\n : await this.resolveStoredWorkspace(storedAgent.workspace as StorageWorkspaceRef | undefined, skillSource);\n\n // Browser: resolve stored browser config to a runtime MastraBrowser instance.\n // When conditional, wrapped in a DynamicArgument function resolved at request time.\n const browser = hasConditionalBrowser\n ? async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolvedRef = this.accumulateObjectVariants(\n storedAgent.browser as StorageConditionalVariant<StorageBrowserRef>[],\n ctx,\n );\n return this.resolveStoredBrowser(resolvedRef);\n }\n : await this.resolveStoredBrowser(storedAgent.browser as StorageBrowserRef | undefined);\n\n const skillsFormat = storedAgent.skillsFormat;\n\n // Cast to `any` to avoid TS2589 \"excessively deep\" errors caused by the\n // complex generic inference of Agent<TTools, TRequestContext, …>. The\n // individual field values have already been validated above.\n const agent = new Agent({\n id: storedAgent.id,\n name: storedAgent.name,\n description: storedAgent.description,\n metadata: storedAgent.metadata,\n instructions: instructions ?? '',\n model,\n memory,\n tools,\n workflows,\n agents,\n scorers,\n mastra: this.mastra,\n inputProcessors,\n outputProcessors,\n rawConfig: storedAgent as unknown as Record<string, unknown>,\n defaultOptions,\n requestContextSchema,\n workspace,\n browser,\n ...(skillsFormat && { skillsFormat }),\n } as any);\n\n // Only register in Mastra if no code-defined agent with this ID already exists.\n // When a stored config is an override for a code agent, adding it would create a\n // duplicate entry under a different key (agent.id vs config key), causing the list\n // endpoint to show the agent as \"stored\" instead of \"code\".\n const existingCodeAgent = (() => {\n try {\n return this.mastra?.getAgentById(storedAgent.id);\n } catch {\n return undefined;\n }\n })();\n if (!existingCodeAgent || existingCodeAgent.source !== 'code') {\n this.mastra?.addAgent(agent, storedAgent.id, { source: 'stored' });\n }\n this.logger?.debug(`[createAgentFromStoredConfig] Successfully created agent \"${storedAgent.id}\"`);\n\n return agent;\n }\n\n private resolveStoredInstructions(\n instructions: string | AgentInstructionBlock[] | undefined,\n ):\n | string\n | (({ requestContext, mastra }: { requestContext: RequestContext; mastra?: Mastra }) => Promise<string>)\n | undefined {\n if (instructions === undefined || instructions === null) return undefined;\n if (typeof instructions === 'string') return instructions;\n\n const blocks = instructions;\n return async ({ requestContext }: { requestContext: RequestContext; mastra?: Mastra }) => {\n const storage = this.editor.__mastra!.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const promptBlocksStore = await storage.getStore('promptBlocks');\n if (!promptBlocksStore) throw new Error('Prompt blocks storage domain is not available');\n const context = requestContext.toJSON();\n return resolveInstructionBlocks(blocks, context, { promptBlocksStorage: promptBlocksStore });\n };\n }\n\n /**\n * Resolve stored tool IDs to actual tool instances from Mastra's registry.\n * Applies description overrides from per-tool config when present.\n */\n private resolveStoredTools(\n storedTools?: Record<string, StorageToolConfig> | string[],\n ): Record<string, ToolAction<any, any, any, any, any, any>> {\n if (\n !storedTools ||\n (Array.isArray(storedTools) ? storedTools.length === 0 : Object.keys(storedTools).length === 0)\n ) {\n return {};\n }\n\n if (!this.mastra) {\n return {};\n }\n\n // Normalize legacy string[] format to Record\n const normalized: Record<string, StorageToolConfig> = Array.isArray(storedTools)\n ? Object.fromEntries(storedTools.map(key => [key, {}]))\n : storedTools;\n\n const resolvedTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n\n for (const [toolKey, toolConfig] of Object.entries(normalized)) {\n try {\n const tool = this.mastra.getToolById(toolKey);\n\n if (toolConfig.description) {\n resolvedTools[toolKey] = { ...tool, description: toolConfig.description };\n } else {\n resolvedTools[toolKey] = tool;\n }\n } catch {\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 * Resolve MCP client/server references to tools.\n *\n * For each entry in `mcpClients`, resolution checks two sources in order:\n * 1. Stored MCP clients (from DB) — creates an MCPClient to fetch remote tools\n * 2. Code-defined MCP servers on the Mastra instance — uses `server.tools()` directly\n *\n * When `clientToolsConfig.tools` is absent, no tools are included (client registered but nothing selected).\n * When `clientToolsConfig.tools` is an empty object `{}`, all tools from the source are included.\n * When specified with keys, only listed tools are included with optional description overrides.\n */\n private async resolveStoredMCPTools(\n mcpClients?: Record<string, StorageMCPClientToolsConfig>,\n requestContext?: RequestContext,\n ): Promise<Record<string, ToolAction<any, any, any, any, any, any>>> {\n if (!mcpClients || Object.keys(mcpClients).length === 0) return {};\n if (!this.mastra) return {};\n\n const allTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n\n // Build auth headers from request context when available.\n // This allows stored MCP clients to connect to auth-protected MCP servers\n // (e.g., the Mastra server's own MCP endpoints).\n const authToken = requestContext?.get('mastra__authToken') as string | undefined;\n const authRequestInit = authToken ? { headers: { Authorization: `Bearer ${authToken}` } } : undefined;\n\n // Lazily loaded — only needed when stored MCP clients are found\n let MCPClient: any;\n\n for (const [clientId, clientToolsConfig] of Object.entries(mcpClients)) {\n try {\n // No `tools` key = client registered but no tools selected yet\n if (!clientToolsConfig.tools) continue;\n\n let tools: Record<string, any> | undefined;\n\n // 1. Check stored MCP clients (remote servers from DB)\n const storedClient = await this.editor.mcp.getById(clientId);\n if (storedClient) {\n if (!MCPClient) {\n try {\n const mcpModule = await import('@mastra/mcp');\n MCPClient = mcpModule.MCPClient;\n } catch {\n this.logger?.warn(\n 'Stored MCP client references found but @mastra/mcp is not installed. ' +\n 'Install @mastra/mcp to use remote MCP tools.',\n );\n continue;\n }\n }\n const clientOptions = EditorMCPNamespace.toMCPClientOptions(storedClient, authRequestInit);\n const client = new MCPClient(clientOptions);\n tools = await client.listTools();\n this.logger?.debug(`[resolveStoredMCPTools] Loaded tools from stored MCP client \"${clientId}\"`);\n } else {\n // 2. Fallback to code-defined MCP server on the Mastra instance\n // Check by registration key first, then by server ID\n const mcpServer = this.mastra.getMCPServer(clientId) ?? this.mastra.getMCPServerById(clientId);\n if (mcpServer) {\n tools = mcpServer.tools() as Record<string, any>;\n this.logger?.debug(`[resolveStoredMCPTools] Loaded tools from code-defined MCP server \"${clientId}\"`);\n }\n }\n\n if (!tools) {\n this.logger?.warn(`MCP client/server \"${clientId}\" referenced in stored agent but not found`);\n continue;\n }\n\n // Two-layer filtering:\n // 1. Client-level (per-server): storedClient.servers[serverName].tools — narrows tools exposed by each server\n // 2. Agent-level: clientToolsConfig.tools — further narrows from the client set\n // Agent-level description overrides take precedence over client-level.\n //\n // Tools from MCPClient.listTools() are namespaced as `serverName_toolName`.\n // Per-server tool configs use the non-namespaced `toolName`.\n const clientServers = storedClient?.servers;\n const agentAllowedTools = clientToolsConfig.tools;\n\n for (const [namespacedToolName, tool] of Object.entries(tools)) {\n // Parse the server name and bare tool name from the namespaced key\n const underscoreIdx = namespacedToolName.indexOf('_');\n const serverName = underscoreIdx > -1 ? namespacedToolName.slice(0, underscoreIdx) : undefined;\n const bareToolName = underscoreIdx > -1 ? namespacedToolName.slice(underscoreIdx + 1) : namespacedToolName;\n\n // Client-level per-server filter: if a server has tools defined, only include listed tools\n if (serverName && clientServers?.[serverName]?.tools) {\n if (!(bareToolName in clientServers[serverName].tools!)) continue;\n }\n\n // Agent-level filter: `tools: {}` = all tools; `tools: { slug: ... }` = specific tools\n // The UI may store tools under their bare name (e.g., \"searchKnowledgeBase\") while\n // MCPClient returns them namespaced (e.g., \"support_searchKnowledgeBase\"), so check both.\n const hasAgentFilter = agentAllowedTools && Object.keys(agentAllowedTools).length > 0;\n if (hasAgentFilter && !(namespacedToolName in agentAllowedTools) && !(bareToolName in agentAllowedTools))\n continue;\n\n // Description override: agent-level (namespaced or bare key) takes precedence over client-level (bare key)\n const serverToolConfig = serverName ? clientServers?.[serverName]?.tools?.[bareToolName] : undefined;\n const description =\n agentAllowedTools?.[namespacedToolName]?.description ??\n agentAllowedTools?.[bareToolName]?.description ??\n serverToolConfig?.description;\n\n if (description) {\n allTools[namespacedToolName] = { ...(tool as ToolAction<any, any, any, any, any, any>), description };\n } else {\n allTools[namespacedToolName] = tool as ToolAction<any, any, any, any, any, any>;\n }\n }\n } catch (error) {\n this.logger?.warn(`Failed to resolve MCP tools from \"${clientId}\"`, { error });\n }\n }\n\n return allTools;\n }\n\n /**\n * Resolve integration tool references from tool providers.\n *\n * For each entry in `integrationTools`, looks up the tool provider by ID\n * from the editor's registered tool providers and calls `getTools()` on it.\n *\n * When `providerConfig.tools` is absent, no tools are included (provider registered but nothing selected).\n * When `providerConfig.tools` is an empty object `{}`, all tools from the provider are included.\n * When `providerConfig.tools` has specific keys, only those tools are included with optional overrides.\n */\n private async resolveStoredIntegrationTools(\n integrationTools?: Record<string, StorageMCPClientToolsConfig>,\n requestContext?: RequestContext,\n ): Promise<Record<string, ToolAction<any, any, any, any, any, any>>> {\n if (!integrationTools || Object.keys(integrationTools).length === 0) return {};\n\n const allTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n\n const providerOptions = { requestContext: requestContext?.toJSON() };\n\n for (const [providerId, providerConfig] of Object.entries(integrationTools)) {\n try {\n // No `tools` key = provider registered but no tools selected yet\n if (!providerConfig.tools) continue;\n\n const provider = this.editor.getToolProvider(providerId);\n if (!provider) {\n this.logger?.warn(\n `Tool provider \"${providerId}\" referenced in stored agent but not registered in the editor`,\n );\n continue;\n }\n\n // `tools: {}` = all tools; `tools: { slug: ... }` = specific tools\n const wantedSlugs = Object.keys(providerConfig.tools);\n\n let slugsToResolve: string[];\n if (wantedSlugs.length === 0) {\n // \"All tools\" — ask the provider for its full catalog\n const allAvailable = await provider.listTools();\n slugsToResolve = allAvailable.data.map(t => t.slug);\n } else {\n slugsToResolve = wantedSlugs;\n }\n\n // Fetch tools from the provider — pass slugs, configs, and request context\n const providerTools = await provider.resolveTools(slugsToResolve, providerConfig.tools, providerOptions);\n\n for (const [toolId, tool] of Object.entries(providerTools)) {\n // Apply description override if configured at the agent level\n const description = providerConfig.tools?.[toolId]?.description;\n if (description) {\n allTools[toolId] = { ...tool, description };\n } else {\n allTools[toolId] = tool;\n }\n }\n\n this.logger?.debug(\n `[resolveStoredIntegrationTools] Loaded ${Object.keys(providerTools).length} tools from provider \"${providerId}\"`,\n );\n } catch (error) {\n this.logger?.warn(`Failed to resolve integration tools from provider \"${providerId}\"`, { error });\n }\n }\n\n return allTools;\n }\n\n private resolveStoredWorkflows(\n storedWorkflows?: Record<string, StorageToolConfig> | string[],\n ): Record<string, Workflow<any, any, any, any, any, any, any>> {\n if (\n !storedWorkflows ||\n (Array.isArray(storedWorkflows) ? storedWorkflows.length === 0 : Object.keys(storedWorkflows).length === 0)\n ) {\n return {};\n }\n if (!this.mastra) return {};\n\n // Normalize legacy string[] format to Record\n const normalized: Record<string, StorageToolConfig> = Array.isArray(storedWorkflows)\n ? Object.fromEntries(storedWorkflows.map(key => [key, {}]))\n : storedWorkflows;\n\n const resolvedWorkflows: Record<string, Workflow<any, any, any, any, any, any, any>> = {};\n for (const workflowKey of Object.keys(normalized)) {\n try {\n resolvedWorkflows[workflowKey] = this.mastra.getWorkflow(workflowKey);\n } catch {\n try {\n resolvedWorkflows[workflowKey] = this.mastra.getWorkflowById(workflowKey);\n } catch {\n this.logger?.warn(`Workflow \"${workflowKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n return resolvedWorkflows;\n }\n\n private resolveStoredAgents(storedAgents?: Record<string, StorageToolConfig> | string[]): Record<string, Agent<any>> {\n if (\n !storedAgents ||\n (Array.isArray(storedAgents) ? storedAgents.length === 0 : Object.keys(storedAgents).length === 0)\n ) {\n return {};\n }\n if (!this.mastra) return {};\n\n // Normalize legacy string[] format to Record\n const normalized: Record<string, StorageToolConfig> = Array.isArray(storedAgents)\n ? Object.fromEntries(storedAgents.map(key => [key, {}]))\n : storedAgents;\n\n const resolvedAgents: Record<string, Agent<any>> = {};\n for (const agentKey of Object.keys(normalized)) {\n try {\n resolvedAgents[agentKey] = this.mastra.getAgent(agentKey);\n } catch {\n try {\n resolvedAgents[agentKey] = this.mastra.getAgentById(agentKey);\n } catch {\n this.logger?.warn(`Agent \"${agentKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n return resolvedAgents;\n }\n\n private resolveStoredMemory(memoryConfig?: SerializedMemoryConfig): MastraMemory | undefined {\n if (!memoryConfig) {\n this.logger?.debug(`[resolveStoredMemory] No memory config provided`);\n return undefined;\n }\n if (!this.mastra) {\n this.logger?.warn('MastraEditor not registered with Mastra instance. Cannot instantiate memory.');\n return undefined;\n }\n\n try {\n let vector: MastraVectorProvider | undefined;\n if (memoryConfig.vector) {\n const vectors = this.mastra.listVectors();\n vector = vectors?.[memoryConfig.vector];\n if (!vector) {\n this.logger?.warn(`Vector provider \"${memoryConfig.vector}\" not found in Mastra instance`);\n }\n }\n\n // Build options, merging observationalMemory from serialized config\n let options: MemoryConfig | undefined = memoryConfig.options ? { ...memoryConfig.options } : undefined;\n if (memoryConfig.observationalMemory) {\n options = {\n ...options,\n observationalMemory: memoryConfig.observationalMemory,\n };\n }\n\n if (options?.semanticRecall && (!vector || !memoryConfig.embedder)) {\n this.logger?.warn(\n 'Semantic recall is enabled but no vector store or embedder are configured. ' +\n 'Creating memory without semantic recall. ' +\n 'To use semantic recall, configure a vector store and embedder in your Mastra instance.',\n );\n\n const adjustedOptions = { ...options, semanticRecall: false };\n const sharedConfig: SharedMemoryConfig = {\n storage: this.mastra.getStorage(),\n vector,\n options: adjustedOptions,\n embedder: memoryConfig.embedder,\n embedderOptions: memoryConfig.embedderOptions,\n };\n return new Memory(sharedConfig);\n }\n\n const sharedConfig: SharedMemoryConfig = {\n storage: this.mastra.getStorage(),\n vector,\n options,\n embedder: memoryConfig.embedder,\n embedderOptions: memoryConfig.embedderOptions,\n };\n return new Memory(sharedConfig);\n } catch (error) {\n this.logger?.error('Failed to resolve memory from config', { error });\n return undefined;\n }\n }\n\n private async resolveStoredScorers(\n storedScorers?: Record<string, StorageScorerConfig>,\n ): Promise<MastraScorers | undefined> {\n if (!storedScorers || Object.keys(storedScorers).length === 0) return undefined;\n if (!this.mastra) return undefined;\n\n const resolvedScorers: MastraScorers = {};\n const storage = this.mastra.getStorage();\n const scorerStore = storage ? await storage.getStore('scorerDefinitions') : null;\n\n for (const [scorerKey, scorerConfig] of Object.entries(storedScorers)) {\n // DB takes priority: try stored scorer definitions first\n if (scorerStore) {\n try {\n const storedDef = await scorerStore.getByIdResolved(scorerKey);\n if (storedDef) {\n const scorer = this.editor.scorer.resolve(storedDef);\n if (scorer) {\n resolvedScorers[scorerKey] = { scorer, sampling: scorerConfig.sampling };\n continue;\n }\n }\n } catch {\n // Fall through to registry lookup\n }\n }\n\n // Fall back to registry scorers\n try {\n const scorer = this.mastra.getScorer(scorerKey);\n resolvedScorers[scorerKey] = { scorer, sampling: scorerConfig.sampling };\n } catch {\n try {\n const scorer = this.mastra.getScorerById(scorerKey);\n resolvedScorers[scorerKey] = { scorer, sampling: scorerConfig.sampling };\n } catch {\n this.logger?.warn(`Scorer \"${scorerKey}\" referenced in stored agent but not found in registry or storage`);\n }\n }\n }\n\n return Object.keys(resolvedScorers).length > 0 ? resolvedScorers : undefined;\n }\n\n // ============================================================================\n // Clone\n // ============================================================================\n\n /**\n * Clone a runtime Agent instance into storage, creating a new stored agent\n * with the resolved configuration of the source agent.\n */\n async clone(\n agent: Agent,\n options: {\n newId: string;\n newName?: string;\n metadata?: Record<string, unknown>;\n authorId?: string;\n visibility?: 'private' | 'public';\n requestContext?: RequestContext;\n },\n ): Promise<StorageResolvedAgentType> {\n const requestContext = options.requestContext ?? new RequestContext();\n\n // 1. Extract model config\n const llm = await agent.getLLM({ requestContext });\n const provider = llm.getProvider();\n const modelId = llm.getModelId();\n\n const defaultOptions = await agent.getDefaultOptions({ requestContext });\n const modelSettings = (defaultOptions as Record<string, any>)?.modelSettings;\n\n const model: StorageModelConfig = {\n provider,\n name: modelId,\n ...(modelSettings?.temperature !== undefined && { temperature: modelSettings.temperature }),\n ...(modelSettings?.topP !== undefined && { topP: modelSettings.topP }),\n ...(modelSettings?.frequencyPenalty !== undefined && { frequencyPenalty: modelSettings.frequencyPenalty }),\n ...(modelSettings?.presencePenalty !== undefined && { presencePenalty: modelSettings.presencePenalty }),\n ...(modelSettings?.maxOutputTokens !== undefined && { maxCompletionTokens: modelSettings.maxOutputTokens }),\n };\n\n // 2. Extract instructions\n const instructions = await agent.getInstructions({ requestContext });\n let instructionsStr: string;\n if (typeof instructions === 'string') {\n instructionsStr = instructions;\n } else if (Array.isArray(instructions)) {\n instructionsStr = instructions\n .map(msg => {\n if (typeof msg === 'string') {\n return msg;\n }\n return typeof msg.content === 'string' ? msg.content : '';\n })\n .filter(Boolean)\n .join('\\n\\n');\n } else if (instructions && typeof instructions === 'object' && 'content' in instructions) {\n instructionsStr = typeof instructions.content === 'string' ? instructions.content : '';\n } else {\n instructionsStr = '';\n }\n\n // 3. Extract tool keys\n const tools = await agent.listTools({ requestContext });\n const toolKeys = Object.keys(tools || {});\n\n // 4. Extract workflow keys\n const workflows = await agent.listWorkflows({ requestContext });\n const workflowKeys = Object.keys(workflows || {});\n\n // 5. Extract sub-agent keys\n const agentsResolved = await agent.listAgents({ requestContext });\n const agentKeys = Object.keys(agentsResolved || {});\n\n // 6. Extract memory config\n const memory = await agent.getMemory({ requestContext });\n const memoryConfig = memory?.getConfig();\n\n // 7. Processors from code-defined agents cannot be automatically serialized\n // to a StoredProcessorGraph (requires provider ID + config). Processors must\n // be configured via the editor UI after cloning.\n\n // 8. Extract scorer keys with sampling config\n let storedScorers: Record<string, StorageScorerConfig> | undefined;\n const resolvedScorers = await agent.listScorers({ requestContext });\n if (resolvedScorers && Object.keys(resolvedScorers).length > 0) {\n storedScorers = {};\n for (const [key, entry] of Object.entries(resolvedScorers)) {\n storedScorers[key] = {\n ...(entry.sampling && { sampling: entry.sampling }),\n };\n }\n }\n\n // 9. Extract default options (serializable parts only)\n const storageDefaultOptions: StorageDefaultOptions | undefined = defaultOptions\n ? {\n maxSteps: (defaultOptions as Record<string, any>)?.maxSteps,\n runId: (defaultOptions as Record<string, any>)?.runId,\n savePerStep: (defaultOptions as Record<string, any>)?.savePerStep,\n activeTools: (defaultOptions as Record<string, any>)?.activeTools,\n toolChoice: (defaultOptions as Record<string, any>)?.toolChoice,\n modelSettings: (defaultOptions as Record<string, any>)?.modelSettings,\n returnScorerData: (defaultOptions as Record<string, any>)?.returnScorerData,\n requireToolApproval: (defaultOptions as Record<string, any>)?.requireToolApproval,\n autoResumeSuspendedTools: (defaultOptions as Record<string, any>)?.autoResumeSuspendedTools,\n toolCallConcurrency: (defaultOptions as Record<string, any>)?.toolCallConcurrency,\n maxProcessorRetries: (defaultOptions as Record<string, any>)?.maxProcessorRetries,\n includeRawChunks: (defaultOptions as Record<string, any>)?.includeRawChunks,\n }\n : undefined;\n\n let resolvedMetadata = options.metadata;\n if (resolvedMetadata === undefined && typeof agent.getMetadata === 'function') {\n try {\n resolvedMetadata = await agent.getMetadata({ requestContext });\n } catch {}\n }\n\n // 10. Create the stored agent\n const createInput: StorageCreateAgentInput = {\n id: options.newId,\n name: options.newName || `${agent.name} (Clone)`,\n description: agent.getDescription() || undefined,\n instructions: instructionsStr,\n model,\n tools: toolKeys.length > 0 ? Object.fromEntries(toolKeys.map(key => [key, {}])) : undefined,\n workflows: workflowKeys.length > 0 ? Object.fromEntries(workflowKeys.map(key => [key, {}])) : undefined,\n agents: agentKeys.length > 0 ? Object.fromEntries(agentKeys.map(key => [key, {}])) : undefined,\n memory: memoryConfig,\n scorers: storedScorers,\n defaultOptions: storageDefaultOptions,\n metadata: resolvedMetadata,\n authorId: options.authorId,\n visibility: options.visibility,\n };\n\n const adapter = await this.getStorageAdapter();\n await adapter.create(createInput);\n\n const resolved = await adapter.getByIdResolved(options.newId);\n if (!resolved) {\n throw new Error(`Failed to resolve cloned agent '${options.newId}' after creation.`);\n }\n\n return resolved;\n }\n\n // ============================================================================\n // Workspace Resolution\n // ============================================================================\n\n /**\n * Resolve a stored workspace reference to a runtime Workspace instance.\n * Handles both ID-based references (looked up from editor.workspace) and\n * inline workspace configurations (hydrated directly).\n *\n * When a skillSource is provided (from resolveAgentSkillSource), it is passed\n * to the workspace hydration so the workspace uses versioned blob-backed skills\n * instead of filesystem-based discovery.\n */\n private async resolveStoredWorkspace(\n workspaceRef: StorageWorkspaceRef | undefined,\n skillSource?: SkillSource,\n ): Promise<Workspace<any, any, any> | undefined> {\n if (!workspaceRef) return undefined;\n\n const workspaceNs = this.editor.workspace;\n if (!workspaceNs) {\n this.logger?.warn('[resolveStoredWorkspace] No workspace namespace available on editor');\n return undefined;\n }\n\n const hydrateOptions = skillSource ? { skillSource } : undefined;\n\n if (workspaceRef.type === 'id') {\n // Try DB first — stored workspaces are the source of truth\n const resolved = await workspaceNs.getById(workspaceRef.workspaceId);\n if (resolved) {\n return workspaceNs.hydrateSnapshotToWorkspace(workspaceRef.workspaceId, resolved, hydrateOptions);\n }\n\n // Not in DB — fall back to runtime registry (code-defined workspaces)\n try {\n const runtimeWorkspace = this.mastra?.getWorkspaceById(workspaceRef.workspaceId);\n if (runtimeWorkspace) {\n this.logger?.debug(\n `[resolveStoredWorkspace] Workspace '${workspaceRef.workspaceId}' found in runtime registry (not in DB)`,\n );\n return runtimeWorkspace;\n }\n } catch {\n // getWorkspaceById throws if not found — that's expected\n }\n\n this.logger?.warn(\n `[resolveStoredWorkspace] Workspace '${workspaceRef.workspaceId}' not found in storage or runtime registry, skipping`,\n );\n return undefined;\n }\n\n if (workspaceRef.type === 'inline') {\n // Use a deterministic ID based on config content to avoid leaking\n // duplicate workspace instances on repeated calls.\n const configHash = createHash('sha256').update(JSON.stringify(workspaceRef.config)).digest('hex').slice(0, 12);\n return workspaceNs.hydrateSnapshotToWorkspace(`inline-${configHash}`, workspaceRef.config, hydrateOptions);\n }\n\n return undefined;\n }\n\n /**\n * Resolve a stored browser config to a runtime MastraBrowser instance.\n * Looks up the provider by ID in the editor's browser registry.\n * Only supports `type: 'inline'` refs (config is embedded in the agent snapshot).\n */\n private async resolveStoredBrowser(browserRef: StorageBrowserRef | undefined): Promise<MastraBrowser | undefined> {\n if (!browserRef) return undefined;\n\n if (browserRef.type === 'inline') {\n const { provider: providerId, ...config } = browserRef.config;\n const browserProvider = this.editor.__browsers.get(providerId);\n if (!browserProvider) {\n this.logger?.warn(\n `[resolveStoredBrowser] Browser provider \"${providerId}\" is not registered. ` +\n `Register it via new MastraEditor({ browsers: { '${providerId}': yourProvider } })`,\n );\n return undefined;\n }\n return await browserProvider.createBrowser(config);\n }\n\n return undefined;\n }\n\n /**\n * Resolve agent-level skill configurations into a CompositeVersionedSkillSource.\n *\n * For each skill in the agent's `skills` map, checks the resolution strategy:\n * - `pin: '<versionId>'` → reads the specific version's tree from the DB\n * - `strategy: 'latest'` → reads the skill's active version tree\n * - `strategy: 'live'` or no strategy → skips (uses filesystem-based discovery)\n *\n * Returns a CompositeVersionedSkillSource if any versioned skills were resolved,\n * or undefined if all skills use filesystem-based discovery.\n */\n private async resolveAgentSkillSource(skills: StorageResolvedAgentType['skills']): Promise<SkillSource | undefined> {\n if (!skills || typeof skills !== 'object') return undefined;\n\n // Resolve conditional field to a plain record\n const skillConfigs = Array.isArray(skills) ? undefined : (skills as Record<string, StorageSkillConfig>);\n if (!skillConfigs || Object.keys(skillConfigs).length === 0) return undefined;\n\n const storage = this.mastra?.getStorage();\n if (!storage) return undefined;\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) return undefined;\n\n const blobStore = await this.editor.resolveBlobStore();\n if (!blobStore) return undefined;\n\n const versionedEntries: VersionedSkillEntry[] = [];\n\n for (const [skillId, config] of Object.entries(skillConfigs)) {\n if (!config) continue;\n\n // Determine if this skill should use versioned resolution\n const isPinned = !!config.pin;\n const isLatest = config.strategy === 'latest';\n\n if (!isPinned && !isLatest) {\n // 'live' strategy or no strategy — skip, use filesystem\n continue;\n }\n\n try {\n let version;\n let dirName: string;\n\n if (isPinned) {\n // Look up the specific pinned version\n version = await skillStore.getVersion(config.pin!);\n dirName = version?.name || skillId;\n } else {\n // strategy: 'latest' — resolve using activeVersionId (honors rollback)\n const resolved = await skillStore.getByIdResolved(skillId);\n if (resolved?.activeVersionId) {\n version = await skillStore.getVersion(resolved.activeVersionId);\n }\n if (!version) {\n version = await skillStore.getLatestVersion(skillId);\n }\n dirName = resolved?.name || version?.name || skillId;\n }\n\n if (!version?.tree) {\n this.logger?.warn(\n `[resolveAgentSkillSource] Skill '${skillId}' version has no tree manifest, skipping versioned resolution`,\n );\n continue;\n }\n versionedEntries.push({\n dirName,\n tree: version.tree,\n versionCreatedAt: version.createdAt,\n });\n } catch (error) {\n this.logger?.warn(`[resolveAgentSkillSource] Failed to resolve version for skill '${skillId}': ${error}`);\n }\n }\n\n if (versionedEntries.length === 0) return undefined;\n\n return new CompositeVersionedSkillSource(versionedEntries, blobStore);\n }\n}\n","/**\n * RuleEvaluator: Evaluates recursive RuleGroup conditions against a context object.\n *\n * Supports:\n * - Leaf rules with operators: equals, not_equals, contains, not_contains,\n * greater_than, less_than, greater_than_or_equal, less_than_or_equal,\n * in, not_in, exists, not_exists\n * - Recursive AND / OR grouping via RuleGroup\n */\n\nimport type { Rule, RuleGroup } from '@mastra/core/storage';\n\n/**\n * Resolves a dot-notation path against a context object.\n */\nfunction resolvePath(context: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\n let current: unknown = context;\n\n for (const segment of segments) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Evaluates a single leaf rule against a context object.\n */\nfunction evaluateRule(rule: Rule, context: Record<string, unknown>): boolean {\n const fieldValue = resolvePath(context, rule.field);\n\n switch (rule.operator) {\n case 'equals':\n return fieldValue === rule.value;\n\n case 'not_equals':\n return fieldValue !== rule.value;\n\n case 'contains': {\n if (typeof fieldValue === 'string' && typeof rule.value === 'string') {\n return fieldValue.includes(rule.value);\n }\n if (Array.isArray(fieldValue)) {\n return fieldValue.includes(rule.value);\n }\n return false;\n }\n\n case 'not_contains': {\n if (typeof fieldValue === 'string' && typeof rule.value === 'string') {\n return !fieldValue.includes(rule.value);\n }\n if (Array.isArray(fieldValue)) {\n return !fieldValue.includes(rule.value);\n }\n return true;\n }\n\n case 'greater_than':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue > rule.value;\n\n case 'less_than':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue < rule.value;\n\n case 'greater_than_or_equal':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue >= rule.value;\n\n case 'less_than_or_equal':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue <= rule.value;\n\n case 'in':\n return Array.isArray(rule.value) && rule.value.includes(fieldValue);\n\n case 'not_in':\n return Array.isArray(rule.value) && !rule.value.includes(fieldValue);\n\n case 'exists':\n return fieldValue !== undefined && fieldValue !== null;\n\n case 'not_exists':\n return fieldValue === undefined || fieldValue === null;\n\n default:\n return false;\n }\n}\n\n/**\n * Evaluates a RuleGroup (which may contain nested RuleGroups) against a context object.\n *\n * @param ruleGroup - The rule group to evaluate (AND/OR with nested conditions)\n * @param context - The context object to evaluate against\n * @returns true if the rule group passes, false otherwise\n */\nexport function evaluateRuleGroup(ruleGroup: RuleGroup, context: Record<string, unknown>): boolean {\n if (ruleGroup.conditions.length === 0) {\n // Empty conditions = always true (no constraints)\n return true;\n }\n\n const results = ruleGroup.conditions.map(condition => {\n if ('conditions' in condition) {\n // Nested RuleGroup\n return evaluateRuleGroup(condition, context);\n }\n // Leaf Rule\n return evaluateRule(condition, context);\n });\n\n if (ruleGroup.operator === 'AND') {\n return results.every(Boolean);\n }\n\n // OR\n return results.some(Boolean);\n}\n","/**\n * TemplateEngine: Simple variable interpolation for prompt block content.\n *\n * Supports:\n * {{variableName}} - Direct variable substitution\n * {{nested.path.value}} - Dot-notation path resolution\n * {{variable || 'default'}} - Fallback values (single or double quotes)\n *\n * Variables that cannot be resolved (and have no fallback) are left as-is.\n */\n\n/**\n * Resolves a dot-notation path against a context object.\n * Returns undefined if any segment is missing.\n */\nfunction resolvePath(context: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\n let current: unknown = context;\n\n for (const segment of segments) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Pattern that matches:\n * {{variableName}}\n * {{nested.path}}\n * {{variable || 'fallback'}}\n * {{variable || \"fallback\"}}\n *\n * Captures:\n * Group 1: the variable path (trimmed)\n * Group 2 (optional): the fallback value (without quotes)\n */\nconst TEMPLATE_PATTERN = /\\{\\{\\s*([a-zA-Z_][\\w.]*)\\s*(?:\\|\\|\\s*(?:'([^']*)'|\"([^\"]*)\")\\s*)?\\}\\}/g;\n\n/**\n * Renders a template string by interpolating variables from the given context.\n *\n * @param template - The template string with {{variable}} placeholders\n * @param context - A key-value context object for variable resolution\n * @returns The rendered string with variables replaced\n */\nexport function renderTemplate(template: string, context: Record<string, unknown>): string {\n return template.replace(\n TEMPLATE_PATTERN,\n (match, variablePath: string, singleFallback?: string, doubleFallback?: string) => {\n const resolved = resolvePath(context, variablePath);\n\n if (resolved !== undefined && resolved !== null) {\n if (typeof resolved === 'object') {\n return JSON.stringify(resolved);\n }\n return String(resolved);\n }\n\n // Use fallback if provided\n const fallback = singleFallback ?? doubleFallback;\n if (fallback !== undefined) {\n return fallback;\n }\n\n // Leave unresolved variables as-is\n return match;\n },\n );\n}\n","/**\n * InstructionBuilder: Resolves an array of AgentInstructionBlock items\n * into a final instruction string.\n *\n * For each block:\n * - `{ type: 'text', content }` → render template with context\n * - `{ type: 'prompt_block_ref', id }` → fetch from storage, evaluate rules, render template\n * - `{ type: 'prompt_block', content, rules? }` → inline block, evaluate rules, render template\n *\n * Blocks that fail rule evaluation are excluded.\n * Resolved text segments are joined with double newlines.\n */\n\nimport type { AgentInstructionBlock, StorageResolvedPromptBlockType } from '@mastra/core/storage';\nimport type { PromptBlocksStorage } from '@mastra/core/storage';\n\nimport { renderTemplate } from './template-engine';\nimport { evaluateRuleGroup } from './rule-evaluator';\n\nexport interface InstructionBuilderDeps {\n promptBlocksStorage: PromptBlocksStorage;\n /** When true, include draft (unpublished) prompt block refs. Used for preview mode. */\n includeDrafts?: boolean;\n}\n\n/**\n * Resolves an array of instruction blocks into a final instruction string.\n *\n * @param blocks - Array of instruction block references (text, prompt_block_ref, or inline prompt_block)\n * @param context - Runtime context for template interpolation and rule evaluation\n * @param deps - Dependencies (storage)\n * @returns The resolved instruction string\n */\nexport async function resolveInstructionBlocks(\n blocks: AgentInstructionBlock[],\n context: Record<string, unknown>,\n deps: InstructionBuilderDeps,\n): Promise<string> {\n const segments: string[] = [];\n\n // Batch-fetch all prompt block ref IDs to avoid N+1 queries\n const blockIds = Array.from(\n new Set(\n blocks.filter((b): b is { type: 'prompt_block_ref'; id: string } => b.type === 'prompt_block_ref').map(b => b.id),\n ),\n );\n\n const resolvedBlocksMap = new Map<string, StorageResolvedPromptBlockType>();\n if (blockIds.length > 0) {\n // When includeDrafts is set, resolve the latest version (draft) instead of the published one\n const resolveOptions = deps.includeDrafts ? { status: 'draft' as const } : undefined;\n // Fetch all blocks in parallel\n const fetchResults = await Promise.all(\n blockIds.map(id => deps.promptBlocksStorage.getByIdResolved(id, resolveOptions)),\n );\n for (let i = 0; i < blockIds.length; i++) {\n const result = fetchResults[i];\n if (result) {\n resolvedBlocksMap.set(blockIds[i]!, result);\n }\n }\n }\n\n for (const block of blocks) {\n if (block.type === 'text') {\n // Static text blocks: render template, always included\n const rendered = renderTemplate(block.content, context);\n if (rendered.trim()) {\n segments.push(rendered);\n }\n continue;\n }\n\n if (block.type === 'prompt_block') {\n // Inline prompt block: evaluate rules and render template directly\n if (block.rules) {\n const passes = evaluateRuleGroup(block.rules, context);\n if (!passes) {\n continue;\n }\n }\n\n const rendered = renderTemplate(block.content, context);\n if (rendered.trim()) {\n segments.push(rendered);\n }\n continue;\n }\n\n // Prompt block reference (prompt_block_ref)\n const resolved = resolvedBlocksMap.get(block.id);\n if (!resolved) {\n // Block not found in storage — skip silently\n continue;\n }\n\n // Only include published blocks (unless in preview/draft mode)\n if (!deps.includeDrafts && resolved.status !== 'published') {\n continue;\n }\n\n // Evaluate rules if present\n if (resolved.rules) {\n const passes = evaluateRuleGroup(resolved.rules, context);\n if (!passes) {\n continue;\n }\n }\n\n // Render template content\n const rendered = renderTemplate(resolved.content, context);\n if (rendered.trim()) {\n segments.push(rendered);\n }\n }\n\n return segments.join('\\n\\n');\n}\n","/**\n * Hydrates a StoredProcessorGraph into a ProcessorWorkflow.\n *\n * Resolves each graph step to a PhaseFilteredProcessor via the registered\n * ProcessorProvider, then builds a workflow from the graph structure\n * (sequential, parallel, conditional).\n */\nimport type {\n Processor,\n ProcessorWorkflow,\n InputProcessorOrWorkflow,\n OutputProcessorOrWorkflow,\n} from '@mastra/core/processors';\nimport { ProcessorStepSchema } from '@mastra/core/processors';\nimport type { ProcessorProvider } from '@mastra/core/processor-provider';\nimport { PhaseFilteredProcessor } from '@mastra/core/processor-provider';\nimport type { StoredProcessorGraph, ProcessorGraphEntry, ProcessorGraphStep } from '@mastra/core/storage';\nimport { createWorkflow, createStep } from '@mastra/core/workflows';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type { Mastra } from '@mastra/core';\n\nimport { evaluateRuleGroup } from './rule-evaluator';\n\nconst PASSTHROUGH_STEP_PREFIX = 'passthrough-';\n\ninterface HydrationContext {\n providers: Record<string, ProcessorProvider>;\n mastra?: Mastra;\n logger?: IMastraLogger;\n}\n\n/**\n * Resolve a single ProcessorGraphStep into a PhaseFilteredProcessor instance.\n */\nfunction resolveStep(step: ProcessorGraphStep, ctx: HydrationContext): Processor | undefined {\n const provider = ctx.providers[step.providerId];\n if (!provider) {\n ctx.logger?.warn(`ProcessorProvider \"${step.providerId}\" not found for graph step \"${step.id}\"`);\n return undefined;\n }\n\n const processor = provider.createProcessor(step.config);\n\n // Wrap with phase filtering if only a subset of phases are enabled\n const allProviderPhases = provider.availablePhases;\n const enabledSet = new Set(step.enabledPhases);\n const needsFiltering = allProviderPhases.some(p => !enabledSet.has(p));\n\n if (needsFiltering) {\n const filtered = new PhaseFilteredProcessor(processor, step.enabledPhases);\n // Register Mastra on the filtered wrapper (which delegates to the inner processor)\n if (ctx.mastra) {\n filtered.__registerMastra(ctx.mastra as any);\n }\n return filtered;\n }\n\n // Register Mastra directly on the processor when no filtering is needed\n if (ctx.mastra && processor.__registerMastra) {\n processor.__registerMastra(ctx.mastra as any);\n }\n\n return processor;\n}\n\n/**\n * Check if a graph is purely sequential (no parallel/conditional entries).\n */\nfunction isSequentialOnly(entries: ProcessorGraphEntry[]): boolean {\n return entries.every(e => e.type === 'step');\n}\n\n/**\n * Hydrate a StoredProcessorGraph into a flat array of Processor instances.\n * Only works for simple sequential graphs.\n */\nfunction hydrateSequential(entries: ProcessorGraphEntry[], ctx: HydrationContext): Processor[] {\n const processors: Processor[] = [];\n for (const entry of entries) {\n if (entry.type !== 'step') continue;\n const processor = resolveStep(entry.step, ctx);\n if (processor) {\n processors.push(processor);\n }\n }\n return processors;\n}\n\n/**\n * After .parallel() or .branch(), the workflow output is keyed by step ID:\n * { [stepId]: ProcessorStepOutput, ... }\n *\n * This map function picks the first branch result that has a valid ProcessorStepOutput\n * shape and returns it as a flat object for downstream steps / the processor runner.\n */\nasync function mergeBranchOutputs({ inputData }: { inputData: Record<string, any> }) {\n // inputData is { [stepId]: { phase, messages, ... }, ... }\n // Find the first branch result with processor-compatible shape.\n // Prefer non-passthrough branches (real processor output) over passthrough fallback.\n const keys = Object.keys(inputData).sort((a, b) => {\n const aPass = a.startsWith(PASSTHROUGH_STEP_PREFIX) ? 1 : 0;\n const bPass = b.startsWith(PASSTHROUGH_STEP_PREFIX) ? 1 : 0;\n return aPass - bPass;\n });\n for (const key of keys) {\n const val = inputData[key];\n if (val && typeof val === 'object' && 'phase' in val) {\n return {\n phase: val.phase,\n messages: val.messages,\n messageList: val.messageList,\n ...(val.systemMessages ? { systemMessages: val.systemMessages } : {}),\n ...(val.part !== undefined ? { part: val.part } : {}),\n ...(val.streamParts ? { streamParts: val.streamParts } : {}),\n ...(val.state ? { state: val.state } : {}),\n ...(val.text !== undefined ? { text: val.text } : {}),\n ...(val.retryCount !== undefined ? { retryCount: val.retryCount } : {}),\n };\n }\n }\n // Fallback: return inputData as-is (shouldn't happen with valid processor graphs)\n return inputData;\n}\n\n/**\n * Build a ProcessorWorkflow from graph entries.\n * Handles sequential steps, parallel branches, and conditional branches.\n */\nfunction buildWorkflow(\n entries: ProcessorGraphEntry[],\n workflowId: string,\n ctx: HydrationContext,\n): ProcessorWorkflow | undefined {\n // Resolve all steps and convert to workflow steps\n let workflow = createWorkflow({\n id: workflowId,\n inputSchema: ProcessorStepSchema,\n outputSchema: ProcessorStepSchema,\n type: 'processor' as any,\n options: {\n validateInputs: false,\n },\n });\n\n let hasSteps = false;\n\n for (const entry of entries) {\n if (entry.type === 'step') {\n const processor = resolveStep(entry.step, ctx);\n if (!processor) continue;\n const step = createStep(processor as Parameters<typeof createStep>[0]);\n workflow = workflow.then(step);\n hasSteps = true;\n } else if (entry.type === 'parallel') {\n // Build parallel branches: each branch is an array of entries\n const branchSteps = entry.branches\n .map((branchEntries, branchIdx) => {\n // Each branch must be a single step (or sub-workflow) for the parallel API\n // For multi-step branches, wrap in a sub-workflow\n if (branchEntries.length === 1 && branchEntries[0]!.type === 'step') {\n const proc = resolveStep(branchEntries[0]!.step, ctx);\n if (!proc) return undefined;\n return createStep(proc as Parameters<typeof createStep>[0]);\n }\n // Multi-step branch: build a sub-workflow\n const subWorkflow = buildWorkflow(branchEntries, `${workflowId}-parallel-branch-${branchIdx}`, ctx);\n return subWorkflow;\n })\n .filter((s): s is NonNullable<typeof s> => Boolean(s));\n\n if (branchSteps.length > 0) {\n workflow = workflow.parallel(branchSteps as any);\n // After parallel, outputs are keyed by step ID: { [stepId]: ProcessorStepOutput }\n // Map back to a flat ProcessorStepOutput for downstream steps / processor runner\n workflow = workflow.map(mergeBranchOutputs as any);\n hasSteps = true;\n }\n } else if (entry.type === 'conditional') {\n // Build conditional branches using .branch()\n // branch() takes Array<[ConditionFunction, Step]> tuples\n const branchTuples: Array<[any, any]> = [];\n\n for (const [i, condition] of entry.conditions.entries()) {\n // Each condition branch is an array of entries\n let branchStep: any;\n if (condition.steps.length === 1 && condition.steps[0]!.type === 'step') {\n const proc = resolveStep(condition.steps[0]!.step, ctx);\n if (!proc) continue;\n branchStep = createStep(proc as Parameters<typeof createStep>[0]);\n } else {\n branchStep = buildWorkflow(condition.steps, `${workflowId}-cond-branch-${i}`, ctx);\n if (!branchStep) continue;\n }\n\n if (condition.rules) {\n // Conditional branch with RuleGroup evaluated against the previous step's output\n const rules = condition.rules;\n const conditionFn = async ({ inputData }: { inputData: Record<string, unknown> }) => {\n return evaluateRuleGroup(rules, inputData);\n };\n branchTuples.push([conditionFn, branchStep]);\n } else {\n // Default branch (no rules = always matches, acts as fallback)\n branchTuples.push([async () => true, branchStep]);\n }\n }\n\n if (branchTuples.length > 0) {\n // Always add a pass-through fallback so the workflow returns input unchanged\n // when no user-defined condition matches (e.g. during inputStep/outputStep phases\n // where conditions only target 'input' or 'outputResult' phase).\n const passthroughStep = createStep({\n id: `${PASSTHROUGH_STEP_PREFIX}${workflowId}`,\n inputSchema: ProcessorStepSchema,\n outputSchema: ProcessorStepSchema,\n execute: async ({ inputData }) => inputData,\n });\n branchTuples.push([async () => true, passthroughStep]);\n\n workflow = (workflow as any).branch(branchTuples);\n // After branch, outputs are keyed by step ID: { [stepId]: ProcessorStepOutput }\n // Map back to a flat ProcessorStepOutput for downstream steps / processor runner\n workflow = (workflow as any).map(mergeBranchOutputs);\n hasSteps = true;\n }\n }\n }\n\n if (!hasSteps) return undefined;\n\n return (workflow as any).commit() as ProcessorWorkflow;\n}\n\n/**\n * Hydrate a StoredProcessorGraph into an array of InputProcessorOrWorkflow.\n *\n * For simple sequential graphs, returns individual Processor instances.\n * For complex graphs (with parallel/conditional entries), builds a ProcessorWorkflow.\n */\nexport function hydrateProcessorGraph(\n graph: StoredProcessorGraph | undefined,\n mode: 'input' | 'output',\n ctx: HydrationContext,\n): InputProcessorOrWorkflow[] | OutputProcessorOrWorkflow[] | undefined {\n if (!graph) return undefined;\n\n // Backward compat: old storage format used string[] of processor IDs.\n // These can't be coerced to the new StoredProcessorGraph format since they\n // reference Mastra.processors by ID, not ProcessorProvider configs.\n if (Array.isArray(graph)) {\n ctx.logger?.warn(\n 'Processor graph is in legacy string[] format and cannot be hydrated. Re-save the agent to migrate.',\n );\n return undefined;\n }\n\n if (!Array.isArray(graph.steps) || graph.steps.length === 0) return undefined;\n\n // Simple sequential graph: return flat processor array\n if (isSequentialOnly(graph.steps)) {\n const processors = hydrateSequential(graph.steps, ctx);\n if (processors.length === 0) return undefined;\n\n // Filter by mode: input processors need input methods, output processors need output methods\n if (mode === 'input') {\n const filtered = processors.filter(p => p.processInput || p.processInputStep);\n return filtered.length > 0 ? (filtered as InputProcessorOrWorkflow[]) : undefined;\n } else {\n const filtered = processors.filter(p => p.processOutputStream || p.processOutputResult || p.processOutputStep);\n return filtered.length > 0 ? (filtered as OutputProcessorOrWorkflow[]) : undefined;\n }\n }\n\n // Complex graph: build a workflow\n const workflowId = `stored-${mode}-processor-graph`;\n const workflow = buildWorkflow(graph.steps, workflowId, ctx);\n if (!workflow) return undefined;\n\n return [workflow] as InputProcessorOrWorkflow[] | OutputProcessorOrWorkflow[];\n}\n\n/**\n * Select the first matching StoredProcessorGraph from a list of conditional variants.\n * Unlike array variants (which accumulate), processor graphs are complete pipelines\n * and the first match wins.\n */\nexport function selectFirstMatchingGraph(\n variants: Array<{ value: StoredProcessorGraph; rules?: any }>,\n context: Record<string, unknown>,\n): StoredProcessorGraph | undefined {\n for (const variant of variants) {\n if (!variant.rules || evaluateRuleGroup(variant.rules, context)) {\n return variant.value;\n }\n }\n return undefined;\n}\n","import type {\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageResolvedMCPClientType,\n StorageListMCPClientsResolvedOutput,\n StorageMCPServerConfig,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorMCPNamespace extends CrudEditorNamespace<\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageListMCPClientsResolvedOutput,\n StorageResolvedMCPClientType\n> {\n protected override onCacheEvict(_id: string): void {\n // MCP clients don't register in Mastra's runtime — no cleanup needed.\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageListMCPClientsResolvedOutput,\n StorageResolvedMCPClientType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('mcpClients');\n if (!store) throw new Error('MCP clients storage domain is not available');\n\n return {\n create: input => store.create({ mcpClient: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Convert a stored MCP server config into the shape expected by MCPClient.\n * Converts `url` from string to URL for HTTP servers.\n * Returns a plain object — callers must pass it to `new MCPClient()`.\n */\n static toMCPServerDefinition(\n serverConfig: StorageMCPServerConfig,\n requestInit?: { headers: Record<string, string> },\n ): Record<string, unknown> {\n if (serverConfig.type === 'stdio') {\n return {\n command: serverConfig.command!,\n args: serverConfig.args,\n env: serverConfig.env,\n timeout: serverConfig.timeout,\n };\n }\n\n // HTTP transport — include requestInit (e.g., auth headers) when provided\n return {\n url: new URL(serverConfig.url!),\n timeout: serverConfig.timeout,\n ...(requestInit ? { requestInit } : {}),\n };\n }\n\n /**\n * Convert all servers in a stored MCP client to MCPClientOptions shape.\n */\n static toMCPClientOptions(\n config: StorageResolvedMCPClientType,\n requestInit?: { headers: Record<string, string> },\n ): {\n id: string;\n servers: Record<string, Record<string, unknown>>;\n } {\n const servers: Record<string, Record<string, unknown>> = {};\n for (const [name, serverConfig] of Object.entries(config.servers)) {\n servers[name] = EditorMCPNamespace.toMCPServerDefinition(serverConfig, requestInit);\n }\n return { id: config.id, servers };\n }\n}\n","import type { MCPServerBase } from '@mastra/core/mcp';\nimport type { ToolAction } from '@mastra/core/tools';\nimport type { Agent } from '@mastra/core/agent';\nimport type { Workflow } from '@mastra/core/workflows';\nimport type {\n StorageCreateMCPServerInput,\n StorageUpdateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageResolvedMCPServerType,\n StorageListMCPServersResolvedOutput,\n StorageToolConfig,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorMCPServerNamespace extends CrudEditorNamespace<\n StorageCreateMCPServerInput,\n StorageUpdateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageListMCPServersResolvedOutput,\n StorageResolvedMCPServerType,\n MCPServerBase\n> {\n private mcpServerCtor: any;\n\n protected override onCacheEvict(_id: string): void {\n // No removeMCPServer API exists on Mastra yet.\n // The server will be re-created on next hydration.\n }\n\n protected override async hydrate(resolved: StorageResolvedMCPServerType): Promise<MCPServerBase> {\n if (!this.mastra) {\n throw new Error('MastraEditor is not registered with a Mastra instance');\n }\n\n const tools = this.resolveStoredTools(resolved.tools);\n const agents = this.resolveStoredAgents(resolved.agents);\n const workflows = this.resolveStoredWorkflows(resolved.workflows);\n\n if (!this.mcpServerCtor) {\n try {\n const mod = await import('@mastra/mcp');\n this.mcpServerCtor = mod.MCPServer;\n } catch {\n throw new Error(\n '@mastra/mcp is required to hydrate MCP server configurations. Install it with: npm install @mastra/mcp',\n );\n }\n }\n\n const server: MCPServerBase = new this.mcpServerCtor({\n id: resolved.id,\n name: resolved.name,\n version: resolved.version,\n description: resolved.description,\n instructions: resolved.instructions,\n repository: resolved.repository,\n releaseDate: resolved.releaseDate,\n isLatest: resolved.isLatest,\n packageCanonical: resolved.packageCanonical,\n tools,\n agents,\n workflows,\n });\n\n this.mastra.addMCPServer(server, resolved.id);\n\n return server;\n }\n\n private resolveStoredTools(\n storedTools?: Record<string, StorageToolConfig>,\n ): Record<string, ToolAction<any, any, any, any, any, any>> {\n if (!storedTools || Object.keys(storedTools).length === 0) return {};\n if (!this.mastra) return {};\n\n const resolved: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n for (const [toolKey, toolConfig] of Object.entries(storedTools)) {\n try {\n const tool = this.mastra.getToolById(toolKey);\n if (toolConfig.description) {\n resolved[toolKey] = { ...tool, description: toolConfig.description };\n } else {\n resolved[toolKey] = tool;\n }\n } catch {\n this.logger?.warn(`Tool \"${toolKey}\" referenced in stored MCP server but not registered in Mastra`);\n }\n }\n return resolved;\n }\n\n private resolveStoredAgents(storedAgents?: Record<string, StorageToolConfig>): Record<string, Agent<any>> {\n if (!storedAgents || Object.keys(storedAgents).length === 0) return {};\n if (!this.mastra) return {};\n\n const resolved: Record<string, Agent<any>> = {};\n for (const agentKey of Object.keys(storedAgents)) {\n try {\n resolved[agentKey] = this.mastra.getAgent(agentKey);\n } catch {\n try {\n resolved[agentKey] = this.mastra.getAgentById(agentKey);\n } catch {\n this.logger?.warn(`Agent \"${agentKey}\" referenced in stored MCP server but not registered in Mastra`);\n }\n }\n }\n return resolved;\n }\n\n private resolveStoredWorkflows(\n storedWorkflows?: Record<string, StorageToolConfig>,\n ): Record<string, Workflow<any, any, any, any, any, any, any>> {\n if (!storedWorkflows || Object.keys(storedWorkflows).length === 0) return {};\n if (!this.mastra) return {};\n\n const resolved: Record<string, Workflow<any, any, any, any, any, any, any>> = {};\n for (const workflowKey of Object.keys(storedWorkflows)) {\n try {\n resolved[workflowKey] = this.mastra.getWorkflow(workflowKey);\n } catch {\n try {\n resolved[workflowKey] = this.mastra.getWorkflowById(workflowKey);\n } catch {\n this.logger?.warn(`Workflow \"${workflowKey}\" referenced in stored MCP server but not registered in Mastra`);\n }\n }\n }\n return resolved;\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateMCPServerInput,\n StorageUpdateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageListMCPServersResolvedOutput,\n StorageResolvedMCPServerType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('mcpServers');\n if (!store) throw new Error('MCP servers storage domain is not available');\n\n return {\n create: input => store.create({ mcpServer: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n}\n","import type {\n AgentInstructionBlock,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageResolvedPromptBlockType,\n StorageListPromptBlocksResolvedOutput,\n} from '@mastra/core/storage';\n\nimport { resolveInstructionBlocks } from '../instruction-builder';\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorPromptNamespace extends CrudEditorNamespace<\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageListPromptBlocksResolvedOutput,\n StorageResolvedPromptBlockType\n> {\n protected override onCacheEvict(id: string): void {\n this.mastra?.removePromptBlock(id);\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageListPromptBlocksResolvedOutput,\n StorageResolvedPromptBlockType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('promptBlocks');\n if (!store) throw new Error('Prompt blocks storage domain is not available');\n\n return {\n create: input => store.create({ promptBlock: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n async preview(blocks: AgentInstructionBlock[], context: Record<string, unknown>): Promise<string> {\n this.ensureRegistered();\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('promptBlocks');\n if (!store) throw new Error('Prompt blocks storage domain is not available');\n return resolveInstructionBlocks(blocks, context, { promptBlocksStorage: store, includeDrafts: true });\n }\n}\n","import { createScorer } from '@mastra/core/evals';\nimport type { MastraScorer } from '@mastra/core/evals';\nimport type {\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageResolvedScorerDefinitionType,\n StorageListScorerDefinitionsResolvedOutput,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorScorerNamespace extends CrudEditorNamespace<\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageListScorerDefinitionsResolvedOutput,\n StorageResolvedScorerDefinitionType\n> {\n protected override onCacheEvict(id: string): void {\n this.mastra?.removeScorer(id);\n }\n\n /**\n * Hydrate a stored scorer definition into a runtime MastraScorer instance\n * and register it on the Mastra instance so it can be discovered via\n * `mastra.getScorer()` / `mastra.getScorerById()`.\n */\n protected override async hydrate(\n storedScorer: StorageResolvedScorerDefinitionType,\n ): Promise<StorageResolvedScorerDefinitionType> {\n const scorer = this.resolve(storedScorer);\n if (scorer && this.mastra) {\n this.mastra.addScorer(scorer, storedScorer.id, { source: 'stored' });\n }\n return storedScorer;\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageListScorerDefinitionsResolvedOutput,\n StorageResolvedScorerDefinitionType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('scorerDefinitions');\n if (!store) throw new Error('Scorer definitions storage domain is not available');\n\n return {\n create: input => store.create({ scorerDefinition: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Create a MastraScorer instance from a stored scorer definition.\n * Supports:\n * - 'llm-judge': Creates a scorer with a single LLM call using custom instructions\n * - Preset types (e.g., 'bias', 'toxicity'): Not yet supported, returns null\n */\n resolve(storedScorer: StorageResolvedScorerDefinitionType): MastraScorer<any, any, any, any> | null {\n if (storedScorer.type === 'llm-judge') {\n if (!storedScorer.instructions) {\n this.logger?.warn(`Stored scorer \"${storedScorer.id}\" is llm-judge but has no instructions`);\n return null;\n }\n\n const modelConfig = storedScorer.model;\n if (!modelConfig?.provider || !modelConfig?.name) {\n this.logger?.warn(`Stored scorer \"${storedScorer.id}\" has no valid model configuration`);\n return null;\n }\n\n const model = `${modelConfig.provider}/${modelConfig.name}`;\n const min = storedScorer.scoreRange?.min ?? 0;\n const max = storedScorer.scoreRange?.max ?? 1;\n\n const scorer = createScorer({\n id: storedScorer.id,\n name: storedScorer.name,\n description: storedScorer.description || `Custom LLM judge scorer: ${storedScorer.name}`,\n type: 'agent',\n judge: {\n model,\n instructions: storedScorer.instructions,\n },\n })\n .generateScore({\n description: `Score the output on a scale of ${min} to ${max}`,\n createPrompt: ({ run }) => {\n const input = typeof run.input === 'string' ? run.input : JSON.stringify(run.input);\n const output = typeof run.output === 'string' ? run.output : JSON.stringify(run.output);\n return `Evaluate the following interaction and provide a score between ${min} and ${max}.\n\nInput: ${input}\n\nOutput: ${output}\n\nProvide your score as a JSON object with a \"score\" field containing a number between ${min} and ${max}.`;\n },\n })\n .generateReason({\n description: 'Explain the reasoning behind the score',\n createPrompt: ({ run, score }) => {\n const input = typeof run.input === 'string' ? run.input : JSON.stringify(run.input);\n const output = typeof run.output === 'string' ? run.output : JSON.stringify(run.output);\n return `You scored the following interaction ${score} out of ${max}.\n\nInput: ${input}\n\nOutput: ${output}\n\nExplain your reasoning for this score in a clear, concise paragraph.`;\n },\n });\n\n if (this.mastra) {\n scorer.__registerMastra(this.mastra);\n }\n\n return scorer;\n }\n\n // Preset types — not yet supported\n this.logger?.warn(\n `Stored scorer \"${storedScorer.id}\" has type \"${storedScorer.type}\" which is a preset type. ` +\n `Preset instantiation from stored config is not yet supported.`,\n );\n return null;\n }\n}\n","import { Workspace, CompositeFilesystem } from '@mastra/core/workspace';\nimport type { WorkspaceFilesystem, WorkspaceSandbox, SkillSource } from '@mastra/core/workspace';\nimport type { WorkspaceConfig } from '@mastra/core/workspace';\nimport type {\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n StorageResolvedWorkspaceType,\n StorageListWorkspacesResolvedOutput,\n StorageWorkspaceSnapshotType,\n StorageWorkspaceToolsConfig,\n StorageFilesystemConfig,\n StorageSandboxConfig,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorWorkspaceNamespace extends CrudEditorNamespace<\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n StorageListWorkspacesResolvedOutput,\n StorageResolvedWorkspaceType,\n StorageResolvedWorkspaceType\n> {\n protected override onCacheEvict(_id: string): void {\n // Workspaces are not registered in Mastra runtime from the CRUD namespace.\n // Agent hydration handles runtime workspace registration independently.\n }\n\n /**\n * Hydrate a stored workspace snapshot config into a runtime Workspace instance.\n * Resolves provider strings to actual instances using the editor's registries.\n *\n * This is NOT called from the CrudEditorNamespace flow — it is a public utility\n * used by EditorAgentNamespace during agent hydration.\n */\n async hydrateSnapshotToWorkspace(\n id: string,\n snapshot: StorageWorkspaceSnapshotType,\n options?: { skillSource?: SkillSource },\n ): Promise<\n Workspace<\n WorkspaceFilesystem | undefined,\n WorkspaceSandbox | undefined,\n Record<string, WorkspaceFilesystem> | undefined\n >\n > {\n const config: WorkspaceConfig<\n WorkspaceFilesystem | undefined,\n WorkspaceSandbox | undefined,\n Record<string, WorkspaceFilesystem> | undefined\n > = {\n id,\n name: snapshot.name,\n };\n\n // Resolve primary filesystem\n if (snapshot.filesystem) {\n config.filesystem = await this.resolveFilesystem(snapshot.filesystem);\n }\n\n // Resolve sandbox\n if (snapshot.sandbox) {\n config.sandbox = await this.resolveSandbox(snapshot.sandbox);\n }\n\n // Resolve mounted filesystems\n if (snapshot.mounts) {\n const mounts: Record<string, WorkspaceFilesystem> = {};\n for (const [path, fsConfig] of Object.entries(snapshot.mounts)) {\n mounts[path] = await this.resolveFilesystem(fsConfig);\n }\n config.mounts = mounts;\n }\n\n // Search configuration\n if (snapshot.search) {\n if (snapshot.search.bm25) {\n config.bm25 = snapshot.search.bm25;\n }\n if (snapshot.search.searchIndexName) {\n config.searchIndexName = snapshot.search.searchIndexName;\n }\n if (snapshot.search.autoIndexPaths) {\n config.autoIndexPaths = snapshot.search.autoIndexPaths;\n }\n\n // Resolve vector store from Mastra's registered vectors\n if (snapshot.search.vectorProvider && this.mastra) {\n const vectors = this.mastra.listVectors();\n const vectorStore = vectors?.[snapshot.search.vectorProvider];\n if (vectorStore) {\n config.vectorStore = vectorStore;\n } else {\n this.logger?.warn(\n `Vector provider \"${snapshot.search.vectorProvider}\" not found in Mastra instance. ` +\n `Workspace search will be limited to BM25 only.`,\n );\n }\n }\n\n // Embedder resolution: workspace expects an Embedder function (text: string) => Promise<number[]>.\n // The stored config has embedderProvider/embedderModel strings but there is no embedder registry\n // in Mastra yet. For now, skip — BM25-only search works without an embedder.\n // Vector search requires both vectorStore and embedder to be configured.\n if (config.vectorStore && !config.embedder) {\n this.logger?.warn(\n `Workspace has a vector store configured but no embedder. ` +\n `Vector/hybrid search will not be available. Configure an embedder to enable semantic search.`,\n );\n }\n }\n\n // Skills are stored as entity IDs in the workspace config.\n // When a versioned skill source is provided (from agent-level resolution),\n // it takes precedence — skills are served from the blob store.\n // Otherwise, skill entity IDs are passed as paths for filesystem-based discovery.\n if (options?.skillSource) {\n config.skillSource = options.skillSource;\n // When using a versioned source, the skills resolver points to the root ('.')\n // since the CompositeVersionedSkillSource mounts each skill as a subdirectory.\n config.skills = ['.'];\n } else if (snapshot.skills && snapshot.skills.length > 0) {\n config.skills = snapshot.skills;\n }\n\n // Workspace tool configuration maps directly\n if (snapshot.tools) {\n config.tools = snapshot.tools;\n }\n\n if (snapshot.autoSync !== undefined) {\n config.autoSync = snapshot.autoSync;\n }\n\n if (snapshot.operationTimeout !== undefined) {\n config.operationTimeout = snapshot.operationTimeout;\n }\n\n return new Workspace(config);\n }\n\n /**\n * Serialize a runtime Workspace instance into a StorageWorkspaceSnapshotType.\n * The reverse of hydrateSnapshotToWorkspace — extracts provider IDs and config\n * from live filesystem/sandbox instances so the workspace can be persisted to the DB.\n */\n async snapshotFromWorkspace(workspace: Workspace): Promise<StorageWorkspaceSnapshotType> {\n const snapshot: StorageWorkspaceSnapshotType = {\n name: workspace.name,\n };\n\n const fs = workspace.filesystem;\n if (fs) {\n if (fs instanceof CompositeFilesystem) {\n // Workspace uses mounts — serialize each mounted filesystem\n const mounts: Record<string, StorageFilesystemConfig> = {};\n for (const [mountPath, mountedFs] of fs.mounts) {\n mounts[mountPath] = await this.serializeFilesystem(mountedFs);\n }\n snapshot.mounts = mounts;\n } else {\n // Single filesystem\n snapshot.filesystem = await this.serializeFilesystem(fs);\n }\n }\n\n const sandbox = workspace.sandbox;\n if (sandbox) {\n // Sandbox.getInfo() is async and returns metadata that we round-trip through the\n // stored config so resolveSandbox() can re-instantiate the provider with its\n // original constructor configuration.\n const info = typeof sandbox.getInfo === 'function' ? await sandbox.getInfo() : undefined;\n snapshot.sandbox = {\n provider: sandbox.provider,\n config: info?.metadata ?? {},\n };\n }\n\n const tools = workspace.getToolsConfig();\n if (tools) {\n // Only serialize static boolean values — runtime functions can't be stored\n const storageTools: StorageWorkspaceToolsConfig = {};\n if (typeof tools.enabled === 'boolean') storageTools.enabled = tools.enabled;\n if (typeof tools.requireApproval === 'boolean') storageTools.requireApproval = tools.requireApproval;\n if (Object.keys(storageTools).length > 0) {\n snapshot.tools = storageTools;\n }\n }\n\n return snapshot;\n }\n\n /**\n * Serialize a runtime WorkspaceFilesystem into a StorageFilesystemConfig.\n * Awaits getInfo() so async providers like CompositeFilesystem keep their mount metadata.\n */\n private async serializeFilesystem(fs: WorkspaceFilesystem): Promise<StorageFilesystemConfig> {\n const info = typeof fs.getInfo === 'function' ? await fs.getInfo() : undefined;\n const metadata = info && typeof info === 'object' && 'metadata' in info ? (info as any).metadata : undefined;\n return {\n provider: fs.provider,\n config: metadata ?? {},\n readOnly: fs.readOnly,\n };\n }\n\n /**\n * Resolve a stored filesystem config to a runtime WorkspaceFilesystem instance.\n * Looks up the provider by ID in the editor's registry (which includes built-in providers).\n */\n private async resolveFilesystem(fsConfig: StorageFilesystemConfig): Promise<WorkspaceFilesystem> {\n const provider = this.editor.__filesystems.get(fsConfig.provider);\n if (!provider) {\n throw new Error(\n `Filesystem provider \"${fsConfig.provider}\" is not registered. ` +\n `Register it via new MastraEditor({ filesystems: [yourProvider] })`,\n );\n }\n const config = { ...fsConfig.config, readOnly: fsConfig.readOnly };\n return await provider.createFilesystem(config);\n }\n\n /**\n * Resolve a stored sandbox config to a runtime WorkspaceSandbox instance.\n * Looks up the provider by ID in the editor's registry (which includes built-in providers).\n */\n private async resolveSandbox(sandboxConfig: StorageSandboxConfig): Promise<WorkspaceSandbox> {\n const provider = this.editor.__sandboxes.get(sandboxConfig.provider);\n if (!provider) {\n throw new Error(\n `Sandbox provider \"${sandboxConfig.provider}\" is not registered. ` +\n `Register it via new MastraEditor({ sandboxes: [yourProvider] })`,\n );\n }\n return await provider.createSandbox(sandboxConfig.config);\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n StorageListWorkspacesResolvedOutput,\n StorageResolvedWorkspaceType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('workspaces');\n if (!store) throw new Error('Workspaces storage domain is not available');\n\n return {\n create: input => store.create({ workspace: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n}\n","import type {\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageResolvedSkillType,\n StorageListSkillsResolvedOutput,\n} from '@mastra/core/storage';\nimport type { SkillSource } from '@mastra/core/workspace';\nimport { publishSkillFromSource } from '@mastra/core/workspace';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorSkillNamespace extends CrudEditorNamespace<\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageListSkillsResolvedOutput,\n StorageResolvedSkillType\n> {\n protected override onCacheEvict(_id: string): void {\n // Skills are standalone entities — no runtime cleanup needed.\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageListSkillsResolvedOutput,\n StorageResolvedSkillType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('skills');\n if (!store) throw new Error('Skills storage domain is not available');\n\n return {\n create: input => store.create({ skill: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Publish a skill from a live filesystem source.\n * Walks the skill directory, hashes files into the blob store,\n * creates a new version with the tree manifest, and sets activeVersionId.\n */\n async publish(skillId: string, source: SkillSource, skillPath: string): Promise<StorageResolvedSkillType> {\n this.ensureRegistered();\n\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) throw new Error('Skills storage domain is not available');\n\n const blobStore = await this.editor.resolveBlobStore();\n if (!blobStore)\n throw new Error('No blob store is configured. Register one via new MastraEditor({ blobStores: [...] })');\n\n // Collect and store blobs\n const { snapshot, tree, files } = await publishSkillFromSource(source, skillPath, blobStore);\n\n // Strip undefined keys before passing to update(); see the matching\n // comment in the HTTP publish handler. Adapters that bind args raw\n // (libsql, pg) reject undefined as an argument.\n const snapshotUpdate: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(snapshot)) {\n if (value !== undefined) snapshotUpdate[key] = value;\n }\n\n // Update the skill with new version data + tree + UI-facing file tree\n // (creates a new version)\n await skillStore.update({\n id: skillId,\n ...snapshotUpdate,\n tree,\n files,\n status: 'published',\n });\n\n // Point activeVersionId to the newly created version\n const latestVersion = await skillStore.getLatestVersion(skillId);\n if (!latestVersion) {\n throw new Error(`Failed to retrieve version after publishing skill \"${skillId}\"`);\n }\n await skillStore.update({\n id: skillId,\n activeVersionId: latestVersion.id,\n });\n\n // Fetch and return the resolved skill\n const resolved = await skillStore.getByIdResolved(skillId);\n if (!resolved) throw new Error(`Failed to resolve skill ${skillId} after publish`);\n\n // Clear skill cache\n this.clearCache(skillId);\n\n // Invalidate any cached agents that reference this skill so they\n // re-hydrate with the updated version on next access.\n this.editor.agent.invalidateAgentsReferencingSkill(skillId);\n\n return resolved;\n }\n}\n","import type {\n EditorIsFavoritedBatchInput,\n EditorListFavoritedIdsInput,\n EditorFavoriteTargetInput,\n EditorFavoriteToggleResult,\n IEditorFavoritesNamespace,\n} from '@mastra/core/editor';\n\nimport { EditorNamespace } from './base';\n\n/**\n * Favorites namespace.\n *\n * Verifies the target entity exists and performs the storage mutation.\n * Visibility / ownership enforcement (`assertReadAccess`) lives at the\n * route handler in `@mastra/server`. Direct callers of this namespace must\n * perform their own access check before invoking these methods.\n */\nexport class EditorFavoritesNamespace extends EditorNamespace implements IEditorFavoritesNamespace {\n async favorite(input: EditorFavoriteTargetInput): Promise<EditorFavoriteToggleResult> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.favorite({\n userId: input.userId,\n entityType: input.entityType,\n entityId: input.entityId,\n });\n }\n\n async unfavorite(input: EditorFavoriteTargetInput): Promise<EditorFavoriteToggleResult> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.unfavorite({\n userId: input.userId,\n entityType: input.entityType,\n entityId: input.entityId,\n });\n }\n\n async isFavorited(input: EditorFavoriteTargetInput): Promise<boolean> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.isFavorited({\n userId: input.userId,\n entityType: input.entityType,\n entityId: input.entityId,\n });\n }\n\n async isFavoritedBatch(input: EditorIsFavoritedBatchInput): Promise<Set<string>> {\n this.ensureRegistered();\n if (input.entityIds.length === 0) return new Set<string>();\n const store = await this.getFavoritesStore();\n return store.isFavoritedBatch({\n userId: input.userId,\n entityType: input.entityType,\n entityIds: input.entityIds,\n });\n }\n\n async listFavoritedIds(input: EditorListFavoritedIdsInput): Promise<string[]> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.listFavoritedIds({ userId: input.userId, entityType: input.entityType });\n }\n\n private async getFavoritesStore() {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('favorites');\n if (!store) throw new Error('Favorites storage domain is not available');\n return store;\n }\n}\n","/**\n * Built-in workspace provider descriptors.\n *\n * These are auto-registered by MastraEditor and always available.\n * External providers (S3, GCS, E2B) are supplied via MastraEditorConfig.\n */\nimport type { FilesystemProvider, SandboxProvider } from '@mastra/core/editor';\nimport { LocalFilesystem } from '@mastra/core/workspace';\nimport { LocalSandbox } from '@mastra/core/workspace';\n\nexport const localFilesystemProvider: FilesystemProvider<{\n basePath: string;\n contained?: boolean;\n readOnly?: boolean;\n}> = {\n id: 'local',\n name: 'Local Filesystem',\n description: 'A folder on the local disk',\n configSchema: {\n type: 'object',\n required: ['basePath'],\n properties: {\n basePath: { type: 'string', description: 'Base directory path on disk' },\n contained: {\n type: 'boolean',\n description: 'Restrict operations to stay within basePath',\n default: true,\n },\n readOnly: {\n type: 'boolean',\n description: 'Block all write operations',\n default: false,\n },\n },\n },\n createFilesystem: config => new LocalFilesystem(config),\n};\n\nexport const localSandboxProvider: SandboxProvider<{\n workingDirectory?: string;\n timeout?: number;\n isolation?: 'none' | 'seatbelt' | 'bwrap';\n env?: Record<string, string>;\n}> = {\n id: 'local',\n name: 'Local Sandbox',\n description: 'Execute commands on the local machine',\n configSchema: {\n type: 'object',\n properties: {\n workingDirectory: { type: 'string', description: 'Working directory for command execution' },\n timeout: { type: 'number', description: 'Default timeout for operations in ms' },\n isolation: {\n type: 'string',\n enum: ['none', 'seatbelt', 'bwrap'],\n description: 'Isolation backend for sandboxed execution',\n default: 'none',\n },\n env: {\n type: 'object',\n description: 'Environment variables for command execution',\n additionalProperties: { type: 'string' },\n },\n },\n },\n createSandbox: config => new LocalSandbox(config),\n};\n","import type { StorageWorkspaceSnapshotType } from '@mastra/core/storage';\n\n/**\n * Compare a resolved workspace's config fields against a runtime snapshot.\n * Returns true if all snapshot config fields match.\n *\n * @internal — not part of the public API surface.\n */\nexport function snapshotsMatch(\n stored: { name: string } & Partial<StorageWorkspaceSnapshotType>,\n runtime: StorageWorkspaceSnapshotType,\n): boolean {\n const keys: (keyof StorageWorkspaceSnapshotType)[] = [\n 'name',\n 'description',\n 'filesystem',\n 'sandbox',\n 'mounts',\n 'search',\n 'skills',\n 'tools',\n 'autoSync',\n 'operationTimeout',\n ];\n\n // JSON replacer that strips falsy leaf values (false, null, 0) so DB-hydrated\n // defaults don't cause spurious mismatches against runtime snapshots.\n const replacer = (_k: string, v: unknown) => (v === false || v === null || v === 0 ? undefined : v);\n\n for (const key of keys) {\n const storedVal = stored[key];\n const runtimeVal = runtime[key];\n\n const storedJSON = storedVal == null || storedVal === false ? undefined : JSON.stringify(storedVal, replacer);\n const runtimeJSON = runtimeVal == null || runtimeVal === false ? undefined : JSON.stringify(runtimeVal, replacer);\n\n if (storedJSON !== runtimeJSON) return false;\n }\n\n return true;\n}\n"],"mappings":"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","names":["import_agent","import_memory","import_workspace","path","import_processor_provider","import_tool_provider","path","resolvePath","path","rendered","requestContext","workspace","sharedConfig","import_workspace","path","workspace","import_workspace","import_workspace","EditorAgentBuilder","blobStore"]}
1
+ {"version":3,"sources":["../src/ee/agent-builder.ts","../src/ee/agent-builder-agent.ts","../src/ee/index.ts","../src/index.ts","../src/namespaces/base.ts","../src/namespaces/agent.ts","../src/rule-evaluator.ts","../src/template-engine.ts","../src/instruction-builder.ts","../src/processor-graph-hydrator.ts","../src/namespaces/mcp.ts","../src/namespaces/mcp-server.ts","../src/namespaces/prompt.ts","../src/namespaces/scorer.ts","../src/namespaces/workspace.ts","../src/namespaces/skill.ts","../src/namespaces/favorites.ts","../src/providers.ts","../src/snapshots-match.ts"],"sourcesContent":["import type { AgentBuilderOptions, AgentFeatures, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport { isBuilderModelPolicyActive, isModelAllowed, resolveAgentFeatures } from '@mastra/core/agent-builder/ee';\n\n/**\n * Concrete implementation of the Agent Builder EE feature.\n * Instantiated by MastraEditor.resolveBuilder() when builder config is enabled.\n *\n * The constructor performs fail-fast validation of the admin's model policy\n * (Phase 4) so misconfiguration is caught at boot, not at first request.\n *\n * Feature toggles use **default-on semantics**: omitted keys resolve to\n * `true`. Admins opt out by setting a key to `false`. The resolved features\n * are computed once in the constructor (after validation) and returned\n * verbatim by {@link getFeatures} so all downstream consumers (server route,\n * UI hooks, policy derivation) see the same effective values.\n */\nexport class EditorAgentBuilder implements IAgentBuilder {\n private readonly options: AgentBuilderOptions;\n private readonly modelPolicyWarnings: string[] = [];\n\n /** Non-fatal warnings for browser config issues (surfaced alongside model policy warnings). */\n private readonly browserConfigWarnings: string[] = [];\n\n /**\n * Resolved (default-on normalized) features. Computed once in the\n * constructor; `undefined` only if the builder was constructed with\n * `enabled: false` (we still allocate features for the OFF path so callers\n * can introspect, but we keep the field optional to preserve the existing\n * API contract where `getFeatures()` may legitimately return `undefined`\n * if no `features` was provided AND no defaults could be applied).\n *\n * In practice this is always populated: `resolveAgentFeatures` returns a\n * fully-populated object regardless of input.\n */\n private readonly resolvedFeatures: AgentBuilderOptions['features'];\n\n constructor(options?: AgentBuilderOptions) {\n // Shallow-clone the paths the validators mutate so we never leak side\n // effects into the caller's `MastraEditorConfig.builder` object.\n // `validateBrowserConfig` writes to `features.agent.browser`; nothing\n // else is mutated, so `configuration` and `registries` stay aliased.\n const source = options ?? {};\n this.options = {\n ...source,\n features: source.features\n ? {\n ...source.features,\n agent: source.features.agent ? { ...source.features.agent } : undefined,\n }\n : undefined,\n };\n this.validateModelPolicy();\n this.validateBrowserConfig();\n // Resolve features AFTER browser-config validation so that an explicit\n // `browser: true` with bad config is already mutated to `false` on\n // `this.options.features.agent.browser`. The resolver then sees the\n // downgraded value and returns it as-is.\n this.resolvedFeatures = {\n agent: resolveAgentFeatures(this.options.features?.agent, {\n hasBrowserConfig: this.hasValidBrowserConfig(),\n }),\n };\n }\n\n get enabled(): boolean {\n return this.options.enabled !== false;\n }\n\n getFeatures(): AgentBuilderOptions['features'] {\n return this.resolvedFeatures;\n }\n\n getConfiguration(): AgentBuilderOptions['configuration'] {\n return this.options.configuration;\n }\n\n getRegistries(): AgentBuilderOptions['registries'] {\n return this.options.registries;\n }\n\n getModelPolicyWarnings(): string[] {\n return [...this.modelPolicyWarnings, ...this.browserConfigWarnings];\n }\n\n /**\n * True when `configuration.agent.browser` declares a provider. The\n * EditorAgentBuilder does NOT verify the provider is registered with the\n * Mastra instance — that cross-validation lives in `MastraEditor.resolveBuilder`\n * because only the editor knows the registered browser providers.\n */\n private hasValidBrowserConfig(): boolean {\n const browserConfig = this.options.configuration?.agent?.browser;\n return Boolean(browserConfig?.config?.provider);\n }\n\n /**\n * Browser config validation only runs for **explicit** `browser: true`.\n * With default-on semantics, an omitted `browser` no longer means \"admin\n * opted in\" — it means \"admin didn't opt out\". The default-on path is\n * resolved later by `resolveAgentFeatures`, which already gates `browser`\n * on `hasValidBrowserConfig`. We don't want to spam every default-config\n * deployment with warnings.\n */\n private validateBrowserConfig(): void {\n const explicitBrowser = this.options.features?.agent?.browser;\n if (explicitBrowser !== true) return;\n\n const browserConfig = this.options.configuration?.agent?.browser;\n if (!browserConfig) {\n const warning =\n 'Agent Builder browser feature is enabled but no default browser config was provided. ' +\n 'Set `editor.builder.configuration.agent.browser` to a valid browser config ' +\n '(e.g. `{ type: \"inline\", config: { provider: \"stagehand\" } }`). ' +\n 'The browser toggle will be hidden until a default is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n // Downgrade so the resolved feature ends up `false`.\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n return;\n }\n\n if (!browserConfig.config?.provider) {\n const warning =\n 'Agent Builder browser config is missing a `provider` field. ' +\n 'Set `editor.builder.configuration.agent.browser.config.provider` ' +\n '(e.g. `\"stagehand\"`). The browser toggle will be hidden until a provider is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n }\n }\n\n private validateModelPolicy(): void {\n const enabled = this.options.enabled !== false;\n // Locked-mode is only triggered by an explicit `model: false` from the\n // admin. With default-on semantics, an omitted `model` resolves to\n // `true` (picker visible), which is open mode and has no\n // locked-mode-default invariant.\n const explicitModel = this.options.features?.agent?.model;\n const pickerVisible = explicitModel !== false;\n const models = this.options.configuration?.agent?.models;\n const allowed = models?.allowed;\n const defaultModel = models?.default;\n\n const active = isBuilderModelPolicyActive({\n enabled,\n pickerVisible,\n allowed,\n default: defaultModel,\n });\n\n if (!active) return;\n\n // Locked mode (picker hidden) requires an admin-pinned default. Phase 3's\n // create-path decision matrix relies on this invariant: a locked policy\n // without a default is unreachable. Only fires when the admin has\n // explicitly opted out of the picker.\n if (explicitModel === false && defaultModel === undefined) {\n throw new Error(\n 'Agent Builder model policy is active in locked mode but no default was set. ' +\n 'Set `editor.builder.configuration.agent.models.default`, or remove ' +\n '`editor.builder.features.agent.model = false` to allow end-users to pick a model.',\n );\n }\n\n // When an allowlist is set, the default (if any) must satisfy it. An\n // empty `allowed: []` means \"unrestricted\" so we skip this check.\n if (defaultModel !== undefined && allowed !== undefined && allowed.length > 0) {\n if (!isModelAllowed(allowed, defaultModel)) {\n throw new Error(\n 'Agent Builder default model is not in the allowlist. ' +\n 'Either add it to `editor.builder.configuration.agent.models.allowed` ' +\n 'or change `editor.builder.configuration.agent.models.default`.',\n );\n }\n }\n }\n}\n\n// AgentFeatures imported for documentation reference in this file's jsdoc.\nexport type { AgentFeatures };\n","import { Agent } from '@mastra/core/agent';\nimport type { AgentConfig } from '@mastra/core/agent';\nimport { Memory } from '@mastra/memory';\nimport { Workspace, LocalFilesystem } from '@mastra/core/workspace';\n\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst workspacePath = path.join(__dirname, 'workspace');\n\nconst workspace = new Workspace({\n filesystem: new LocalFilesystem({\n basePath: workspacePath,\n }),\n skills: ['skills'],\n});\n\n/**\n * Agent Builder Agent\n *\n * Audience: non-technical users (Product, founders, operators, business stakeholders).\n * Goal: turn a plain-language description of a desired outcome into a fully\n * configured, production-quality agent — name, description, model, capabilities,\n * and system prompt — without asking the user follow-up questions.\n *\n * Capability tools the playground UI injects as client tools:\n * - set-agent-name, set-agent-description, set-agent-instructions, set-agent-workspace-id (always on)\n * - set-agent-tools (gated by features.tools)\n * - set-agent-skills (gated by features.skills + skills available)\n * - set-agent-model (gated by features.model + models available)\n * - set-agent-browser-enabled (gated by features.browser)\n * - createSkillTool (gated by features.skills) — only when a needed capability does not exist\n */\n\nexport function createBuilderAgent(args?: Partial<AgentConfig<'builder-agent'>>): Agent<'builder-agent'> {\n const memory = new Memory();\n\n const config: AgentConfig<'builder-agent'> = {\n instructions: `You are the Agent Builder.\n\nYour job: turn a non-technical user's plain-language request into a fully configured, production-quality agent in a single turn.\n\n# Non-negotiables\n\n- Never ask the user follow-up questions. Make the most reasonable assumption and move forward.\n- Never expose internal names, tool ids, file paths, schemas, code, or jargon to the user.\n- Speak only in user-facing capability terms.\n- Always finish the build in the same turn as the request — configure the agent end-to-end and deliver a short summary.\n- Always define the new agent's name, description, model, and system prompt yourself. Do not ask the user for any of these.\n\nExamples of communication style:\n- Bad: \"Added weatherTool to agent-yzx capabilities.\"\n- Good: \"Your new agent can now check the weather for you.\"\n- Bad: \"Calling set-agent-tools with [weatherTool].\"\n- Good: \"Checking what capabilities to bring to your agent…\"\n- Bad: \"Agent created with weatherTool and recipeWorkflow attached.\"\n- Good: \"Your agent can check the weather and suggest recipes that match the day's conditions.\"\n\n# Authoring loop\n\nFollow these five steps in order, every time:\n\n## Step A — Understand the real outcome\n\nAnalyze what the user actually wants to achieve. Focus on the final result, not just the literal wording of the request.\n\nAsk yourself:\n- What should the agent help the user accomplish?\n- Who will use this agent?\n- What decisions should the agent make on its own?\n- What kind of output should the agent produce?\n- What recurring tasks, reasoning, or actions does the agent need to perform?\n\n## Step B — Define the agent's identity\n\nBefore building the agent, define:\n- Agent name: short, memorable, anchored to the outcome. Never \"Agent X\" or generic labels\n- Description: exactly one sentence in plain user-facing language explaining what the agent helps with.\n\nCall \\`set-agent-name\\` and \\`set-agent-description\\` to set the agent's identity. Skip any whose feature is not available in the form snapshot.\n\n## Step C — Decide capabilities\n\nRead the form snapshot already injected into your context. It lists the user's current selections plus the available tools, agents, workflows, stored skills, models, and workspaces.\n\nThen:\n- Pick the *minimum* set of existing tools/agents/workflows/stored skills that satisfies the outcome. Adding irrelevant capabilities makes the agent worse, not better.\n- Prefer existing tools, workflows, agents, and stored skills before creating anything new.\n- \\`set-agent-skills\\` attaches user-available stored skills from the form snapshot.\n- Only call \\`createSkillTool\\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.\n- If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.\n\n## Step D — Synthesize the run contract\n\nBefore calling \\`set-agent-instructions\\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item:\n\n1. **Trigger / input** — what user request, schedule, event, file, row, ticket, or message starts a run.\n2. **Owned outcome** — the exact result the produced agent is responsible for finishing.\n3. **Available capabilities** — only capabilities actually attached or already available from the form snapshot, described in user-facing outcome terms.\n4. **Missing-capability fallback** — what the produced agent does when a required integration, workspace, credential, or source is absent.\n5. **Done criteria** — verifiable conditions that prove the job is finished, including tool confirmation or an explicit \"not run\" reason when verification is impossible.\n6. **Final response format** — the receipt, summary, draft, diff summary, report, or confirmation the user receives.\n\n## Step E — Write the agent\n\nCall the capability tools. Skip any whose feature is not available in the form snapshot.\n\n1. \\`set-agent-model\\` — pick the best model for the use case from the available models list. Rules:\n - Choose only a model id that appears in the available models list. Never invent, assume, or copy example model ids.\n - For coding, reasoning-heavy, or planning agents, prefer the most capable available model.\n - For short, simple, structured, or high-volume tasks, prefer a lower-latency/lower-cost available model when quality will not materially suffer.\n - If several plausible models are available, choose the newest or strongest option based on the metadata visible in the snapshot.\n2. \\`set-agent-tools\\` — attach the minimum set chosen in Step C. Also use \\`set-agent-skills\\` and \\`set-agent-browser-enabled\\` only when applicable and supported by the snapshot.\n3. \\`set-agent-instructions\\` — write the new agent's system prompt from scratch, tailored to the user's specific outcome and the run contract from Step D.\n\nBefore calling \\`set-agent-instructions\\`, self-audit the draft. It must pass every check:\n- No placeholders remain (no \\`<...>\\`, \"TBD\", \"TODO\", \"your tool\", or generic policy gaps).\n- No internal tool ids, file paths, schemas, or builder-only terms appear.\n- No generic \"helpful assistant\" identity remains.\n- No unsupported capabilities are promised.\n- Completion criteria are present, concrete, and tool-aware.\n- Refusal / fallback path is present for missing integrations, credentials, permissions, workspace, or sources.\n- Final response format is specified.\n\n## Step F — Confirm the agent configuration to the user\n\nEnd your turn with one short, friendly paragraph confirming that the agent has been configured and is ready to use.\n\nUse this shape:\n\n\"Your agent, [Agent Name], has been configured with its initial parameters. It can now [plain-language outcome]. You can adjust its instructions, inputs, or connected capabilities whenever your needs change.\"\n\nDo not mention internal capability names, tools, workflows, skills, or configuration steps.\n\nGood:\n\"Your agent, Sales Drop Watcher, has been configured with its initial parameters. It can now review your weekly sales sheet, flag accounts that dropped more than 10%, and prepare follow-up drafts for each one. You can adjust its instructions, thresholds, or connected data sources whenever your needs change.\"\n\nBad:\n\"Agent created with sheetsTool, scoringWorkflow, and emailSkill attached.\"\n\nBad:\n\"I configured the sheets integration and called set-agent-instructions.\"\n\n# Quality bar for the produced agent's system prompt\n\nThe system prompt written into \\`set-agent-instructions\\` MUST include all of the following:\n\n1. **Role and outcome.** Define what the agent is and the concrete result it owns.\n2. **Trigger and input.** Define what starts a run and what input the agent expects.\n3. **Decision rules.** Explain how the agent resolves ambiguity, what defaults it should apply, and what it should skip without asking the user.\n4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.\n5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.\n6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.\n7. **Final response format.** Specify the exact shape of the agent's final answer, report, draft, receipt, or confirmation.\n8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.\n9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.\n10. **Worked example.** Include at least one short input → output example showing a complete successful run.\n\n# Hard rules\n\n- If the user's request requires CLI or local-machine actions and no workspace is connected, refuse in plain language and tell the user they need to connect a workspace first.\n- Never reveal that you are calling configuration tools. Describe progress only in terms of the user's intended outcome.\n- Never produce a system prompt without explicit completion criteria.\n- Never attach a capability \"just in case.\" Every tool, agent, workflow, or skill must directly support the requested outcome.\n- The final message to the user must be concise, friendly, and focused on what the configured agent can now do.\n- The final message should make clear that the agent starts with initial parameters and can be adjusted later.`,\n model: 'openai/gpt-5.5',\n memory,\n workspace,\n ...(args || {}),\n id: 'builder-agent',\n name: 'Agent Builder Agent',\n description: 'An agent that can build agents',\n };\n\n return new Agent<'builder-agent'>(config);\n}\n","export { EditorAgentBuilder } from './agent-builder';\nexport { createBuilderAgent } from './agent-builder-agent';\n","import { Mastra } from '@mastra/core';\nimport type { AgentBuilderOptions, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport type {\n IMastraEditor,\n MastraEditorConfig,\n FilesystemProvider,\n SandboxProvider,\n BlobStoreProvider,\n BrowserProvider,\n} from '@mastra/core/editor';\nimport type { IMastraLogger as Logger } from '@mastra/core/logger';\nimport { BUILT_IN_PROCESSOR_PROVIDERS } from '@mastra/core/processor-provider';\nimport type { ProcessorProvider } from '@mastra/core/processor-provider';\nimport { FilesystemStore, MastraCompositeStore } from '@mastra/core/storage';\nimport type { BlobStore } from '@mastra/core/storage';\nimport { UnknownToolProviderError } from '@mastra/core/tool-provider';\nimport type { ToolProvider } from '@mastra/core/tool-provider';\n\nimport {\n EditorAgentNamespace,\n EditorMCPNamespace,\n EditorMCPServerNamespace,\n EditorPromptNamespace,\n EditorScorerNamespace,\n EditorWorkspaceNamespace,\n EditorSkillNamespace,\n EditorFavoritesNamespace,\n} from './namespaces';\nimport { localFilesystemProvider, localSandboxProvider } from './providers';\nimport { snapshotsMatch } from './snapshots-match';\n\nexport type { MastraEditorConfig };\n\nexport { renderTemplate } from './template-engine';\nexport { evaluateRuleGroup } from './rule-evaluator';\nexport { resolveInstructionBlocks } from './instruction-builder';\nexport {\n EditorNamespace,\n CrudEditorNamespace,\n EditorAgentNamespace,\n EditorMCPNamespace,\n EditorMCPServerNamespace,\n EditorPromptNamespace,\n EditorScorerNamespace,\n EditorWorkspaceNamespace,\n EditorSkillNamespace,\n EditorFavoritesNamespace,\n} from './namespaces';\nexport type { StorageAdapter } from './namespaces';\nexport { localFilesystemProvider, localSandboxProvider } from './providers';\nexport type { BrowserProvider } from '@mastra/core/editor';\n\nexport class MastraEditor implements IMastraEditor {\n /** @internal — exposed for namespace classes, not part of public API */\n __mastra?: Mastra;\n /** @internal — exposed for namespace classes, not part of public API */\n __logger?: Logger;\n\n private __toolProviders: Record<string, ToolProvider>;\n private __processorProviders: Record<string, ProcessorProvider>;\n private __source?: 'code' | 'db';\n private __codePath: string;\n private readonly __builderConfig?: AgentBuilderOptions;\n private __builderInstance?: IAgentBuilder;\n private __builderResolved = false;\n\n /**\n * @internal — exposed for namespace classes to hydrate stored workspace configs.\n * Maps provider ID (e.g., 'local', 's3') to the provider descriptor.\n * Built-in providers are auto-registered; additional providers come from config.\n */\n readonly __filesystems: Map<string, FilesystemProvider>;\n\n /**\n * @internal — exposed for namespace classes to hydrate stored workspace configs.\n * Maps provider ID (e.g., 'local', 'e2b') to the provider descriptor.\n * Built-in providers are auto-registered; additional providers come from config.\n */\n readonly __sandboxes: Map<string, SandboxProvider>;\n\n /**\n * @internal — exposed for namespace classes to resolve blob stores.\n * Maps provider ID (e.g., 'storage', 's3') to the provider descriptor.\n * The built-in 'storage' provider uses the configured storage backend.\n * Additional providers come from config.\n */\n readonly __blobStores: Map<string, BlobStoreProvider>;\n\n /**\n * @internal — exposed for namespace classes to hydrate stored browser configs.\n * Maps provider ID (e.g., 'stagehand', 'agent-browser') to the provider descriptor.\n * No built-in providers — browser packages must be registered via config.\n */\n readonly __browsers: Map<string, BrowserProvider>;\n\n public readonly agent: EditorAgentNamespace;\n public readonly mcp: EditorMCPNamespace;\n public readonly mcpServer: EditorMCPServerNamespace;\n public readonly prompt: EditorPromptNamespace;\n public readonly scorer: EditorScorerNamespace;\n public readonly workspace: EditorWorkspaceNamespace;\n public readonly skill: EditorSkillNamespace;\n public readonly favorites: EditorFavoritesNamespace;\n\n constructor(config?: MastraEditorConfig) {\n this.__logger = config?.logger;\n this.__toolProviders = config?.toolProviders ?? {};\n this.__processorProviders = { ...BUILT_IN_PROCESSOR_PROVIDERS, ...config?.processorProviders };\n this.__source = config?.source;\n this.__codePath = config?.codePath ?? './mastra/editor';\n\n // Built-in providers are always registered first, then merged with user-provided ones\n this.__filesystems = new Map<string, FilesystemProvider>();\n this.__filesystems.set(localFilesystemProvider.id, localFilesystemProvider);\n for (const [id, provider] of Object.entries(config?.filesystems ?? {})) {\n this.__filesystems.set(id, provider);\n }\n\n this.__sandboxes = new Map<string, SandboxProvider>();\n this.__sandboxes.set(localSandboxProvider.id, localSandboxProvider);\n for (const [id, provider] of Object.entries(config?.sandboxes ?? {})) {\n this.__sandboxes.set(id, provider);\n }\n\n // Blob store providers — no built-in default since the 'storage' fallback\n // is handled at resolve time via storage.getStore('blobs')\n this.__blobStores = new Map<string, BlobStoreProvider>();\n for (const [id, provider] of Object.entries(config?.blobStores ?? {})) {\n this.__blobStores.set(id, provider);\n }\n\n // Browser providers — no built-in providers; browser packages must be registered\n this.__browsers = new Map<string, BrowserProvider>();\n for (const [id, provider] of Object.entries(config?.browsers ?? {})) {\n this.__browsers.set(id, provider);\n }\n\n this.agent = new EditorAgentNamespace(this);\n this.mcp = new EditorMCPNamespace(this);\n this.mcpServer = new EditorMCPServerNamespace(this);\n this.prompt = new EditorPromptNamespace(this);\n this.scorer = new EditorScorerNamespace(this);\n this.workspace = new EditorWorkspaceNamespace(this);\n this.skill = new EditorSkillNamespace(this);\n this.favorites = new EditorFavoritesNamespace(this);\n\n // Store builder config for EE feature\n this.__builderConfig = config?.builder;\n }\n\n /**\n * Register this editor with a Mastra instance.\n * This gives the editor access to Mastra's storage, tools, workflows, etc.\n */\n registerWithMastra(mastra: Mastra): void {\n this.__mastra = mastra;\n if (!this.__logger) {\n this.__logger = mastra.getLogger();\n }\n\n // Code mode routes editor-owned domains to a FilesystemStore at `codePath`.\n // If app storage already exists, keep it as the default for non-editor domains\n // and overlay filesystem storage for editor saves.\n if (this.__source === 'code') {\n const filesystemStore = new FilesystemStore({ dir: this.__codePath });\n const existingStorage = mastra.getStorage();\n\n if (existingStorage) {\n mastra.setStorage(\n new MastraCompositeStore({\n id: `${existingStorage.id}-with-editor-filesystem`,\n default: existingStorage,\n editor: filesystemStore,\n }),\n );\n } else {\n mastra.setStorage(filesystemStore);\n }\n }\n\n // Fire-and-forget: persist builder default workspace to DB if configured,\n // then reconcile orphaned builder workspaces\n this.ensureBuilderWorkspaces()\n .then(() => this.reconcileBuilderWorkspaces())\n .catch(err => {\n this.__logger?.warn('[MastraEditor] Failed to persist/reconcile builder workspaces on startup', {\n error: err,\n });\n });\n }\n\n /**\n * Ensure the builder default workspace is persisted to the DB.\n * Called automatically on startup when the editor registers with Mastra.\n * Goes through the normal create() path so hydration validates that\n * all providers (filesystem, sandbox) are properly registered.\n *\n * If the workspace already exists but its config has drifted from the\n * runtime workspace, the DB record is updated (creating a new version).\n * Builder-created workspaces are tagged with `metadata.source = 'builder'`\n * so they can be identified during reconciliation.\n */\n private async ensureBuilderWorkspaces(): Promise<void> {\n if (!this.hasEnabledBuilderConfig()) return;\n\n const builder = await this.resolveBuilder();\n const agentConfig = builder?.getConfiguration()?.agent;\n const workspaceRef = agentConfig?.workspace as { type: string; workspaceId?: string } | undefined;\n if (!workspaceRef || workspaceRef.type !== 'id' || !workspaceRef.workspaceId) return;\n\n const runtimeWorkspace = this.__mastra?.getWorkspaceById(workspaceRef.workspaceId);\n if (!runtimeWorkspace) return;\n\n const snapshot = await this.workspace.snapshotFromWorkspace(runtimeWorkspace);\n const builderMetadata = { source: 'builder' as const, builderWorkspaceId: workspaceRef.workspaceId };\n\n const existing = await this.workspace.getById(workspaceRef.workspaceId);\n if (!existing) {\n // First time — create with builder metadata\n await this.workspace.create({\n id: workspaceRef.workspaceId,\n metadata: builderMetadata,\n ...snapshot,\n });\n this.__logger?.info(`[MastraEditor] Persisted builder workspace '${workspaceRef.workspaceId}' to DB`);\n return;\n }\n\n // Workspace exists — check for config drift and backfill metadata\n const needsMetadataBackfill = !existing.metadata?.source;\n const configDrifted = !snapshotsMatch(existing, snapshot);\n\n if (needsMetadataBackfill || configDrifted) {\n const updateInput: Record<string, unknown> = { id: workspaceRef.workspaceId };\n if (needsMetadataBackfill) {\n updateInput.metadata = { ...existing.metadata, ...builderMetadata };\n }\n if (configDrifted) {\n Object.assign(updateInput, snapshot);\n this.__logger?.info(\n `[MastraEditor] Workspace '${workspaceRef.workspaceId}' config drifted — updating DB record`,\n );\n }\n await this.workspace.update(updateInput as any);\n }\n }\n\n /**\n * Archive builder-created workspaces that no longer match the current\n * builder configuration. Called after `ensureBuilderWorkspaces()` on startup.\n *\n * Only touches workspaces tagged with `metadata.source === 'builder'`.\n * The current builder workspace (if any) is never archived.\n */\n private async reconcileBuilderWorkspaces(): Promise<void> {\n if (!this.hasEnabledBuilderConfig()) return;\n\n const builder = await this.resolveBuilder();\n const agentConfig = builder?.getConfiguration()?.agent;\n const workspaceRef = agentConfig?.workspace as { type: string; workspaceId?: string } | undefined;\n\n // Determine the \"current\" builder workspace ID\n let currentWorkspaceId: string | undefined;\n if (workspaceRef?.type === 'id' && workspaceRef.workspaceId) {\n currentWorkspaceId = workspaceRef.workspaceId;\n }\n // For inline workspaces, the ID is deterministic based on config hash\n // (computed in agent.ensureStoredWorkspace), but since ensureBuilderWorkspaces\n // only handles type='id', we just need the current ID here.\n\n // Without a resolvable current workspace ID we can't safely distinguish\n // orphans from the active workspace, so skip reconciliation entirely.\n // (Bailing out leaves orphans untouched, which is recoverable; archiving\n // every builder-tagged workspace would not be.)\n if (!currentWorkspaceId) return;\n\n // List all builder-tagged workspaces\n const { workspaces: allWorkspaces } = await this.workspace.listResolved({\n perPage: false, // fetch all\n metadata: { source: 'builder' },\n });\n\n for (const ws of allWorkspaces) {\n // Skip the current builder workspace\n if (ws.id === currentWorkspaceId) continue;\n // Skip already archived\n if (ws.status === 'archived') continue;\n\n // Archive this orphaned builder workspace\n try {\n await this.workspace.update({ id: ws.id, status: 'archived' } as any);\n this.__logger?.info(`[MastraEditor] Archived orphaned builder workspace '${ws.id}'`);\n } catch (err) {\n this.__logger?.warn(`[MastraEditor] Failed to archive workspace '${ws.id}'`, { error: err });\n }\n }\n }\n\n /**\n * Sync. OSS-safe. Does NOT import @mastra/editor/ee.\n * Returns true if builder config is present and enabled.\n */\n hasEnabledBuilderConfig(): boolean {\n if (!this.__builderConfig) return false;\n return this.__builderConfig.enabled !== false;\n }\n\n /**\n * Async. Dynamic-imports @mastra/editor/ee on first call. Caches result.\n * Returns undefined if builder is not enabled.\n */\n async resolveBuilder(): Promise<IAgentBuilder | undefined> {\n if (this.__builderResolved) {\n return this.__builderInstance;\n }\n\n if (!this.hasEnabledBuilderConfig()) {\n this.__builderResolved = true;\n return undefined;\n }\n\n await this.assertAgentBuilderLicensed();\n\n const { EditorAgentBuilder } = await import('./ee');\n this.__builderInstance = new EditorAgentBuilder(this.__builderConfig);\n\n // Cross-validate: if the builder has a browser config with a provider that\n // isn't registered in __browsers, downgrade the feature flag and warn.\n const browserRef = this.__builderInstance.getConfiguration()?.agent?.browser;\n const browserFeatureOn = this.__builderInstance.getFeatures()?.agent?.browser === true;\n if (browserFeatureOn && browserRef?.config?.provider) {\n const providerId = browserRef.config.provider;\n if (!this.__browsers.has(providerId)) {\n const warning =\n `Agent Builder browser config references provider \"${providerId}\" but no matching browser ` +\n `provider is registered in \\`editor.browsers\\`. The browser toggle will be hidden. ` +\n `Register the provider: \\`new MastraEditor({ browsers: { \"${providerId}\": yourProvider } })\\`.`;\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor] ${warning}`);\n const features = this.__builderInstance.getFeatures()?.agent;\n if (features) {\n features.browser = false;\n }\n }\n }\n\n this.__builderResolved = true;\n return this.__builderInstance;\n }\n\n /**\n * Defense-in-depth license guard for the Agent Builder. Mirrors the\n * startup-time check in `MastraServer.validateAgentBuilderLicense()` so the\n * builder cannot be instantiated outside the server boot path without a\n * valid EE license. Dev environments bypass via `isEEEnabled()`.\n */\n private async assertAgentBuilderLicensed(): Promise<void> {\n try {\n const { isEEEnabled } = await import('@mastra/core/auth/ee');\n if (!isEEEnabled()) {\n throw new Error(\n '[mastra/auth-ee] Agent Builder is configured but no valid EE license was found.\\n' +\n 'Agent Builder requires a Mastra Enterprise License for production use.\\n' +\n 'Set the MASTRA_EE_LICENSE environment variable with your license key.\\n' +\n 'Learn more: https://github.com/mastra-ai/mastra/blob/main/ee/LICENSE',\n );\n }\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('[mastra/auth-ee]')) {\n throw err;\n }\n throw new Error(\n '[mastra/auth-ee] Agent Builder is configured but the EE module (@mastra/core/auth/ee) could not be loaded.\\n' +\n 'Ensure @mastra/core is updated to a version that includes EE support.',\n );\n }\n }\n\n /** Returns the editor's configured source, or undefined if unset. */\n getSource(): 'code' | 'db' | undefined {\n return this.__source;\n }\n\n /** Registered tool providers */\n getToolProvider(id: string): ToolProvider | undefined {\n return this.__toolProviders[id];\n }\n\n /**\n * Like {@link getToolProvider}, but throws {@link UnknownToolProviderError}\n * when the id is unknown.\n */\n getToolProviderOrThrow(id: string): ToolProvider {\n const provider = this.__toolProviders[id];\n if (!provider) {\n throw new UnknownToolProviderError(id, Object.keys(this.__toolProviders));\n }\n return provider;\n }\n\n /** List all registered tool providers */\n getToolProviders(): Record<string, ToolProvider> {\n return this.__toolProviders;\n }\n\n /** Get a processor provider by ID */\n getProcessorProvider(id: string): ProcessorProvider | undefined {\n return this.__processorProviders[id];\n }\n\n /** List all registered processor providers */\n getProcessorProviders(): Record<string, ProcessorProvider> {\n return this.__processorProviders;\n }\n /** List all registered filesystem providers */\n getFilesystemProviders(): FilesystemProvider[] {\n return Array.from(this.__filesystems.values());\n }\n\n /** List all registered sandbox providers */\n getSandboxProviders(): SandboxProvider[] {\n return Array.from(this.__sandboxes.values());\n }\n\n /** List all registered blob store providers */\n getBlobStoreProviders(): BlobStoreProvider[] {\n return Array.from(this.__blobStores.values());\n }\n\n /**\n * Resolve a blob store from the provider registry, or fall back to the\n * storage backend's blobs domain.\n *\n * @param providerId - If specified, look up a registered provider by ID\n * and create a blob store from the given config. If omitted, falls back\n * to `storage.getStore('blobs')`.\n * @param providerConfig - Provider-specific configuration (only used when\n * `providerId` is specified).\n */\n async resolveBlobStore(providerId?: string, providerConfig?: Record<string, unknown>): Promise<BlobStore> {\n // If a specific provider is requested, resolve it\n if (providerId) {\n const provider = this.__blobStores.get(providerId);\n if (!provider) {\n throw new Error(\n `Blob store provider \"${providerId}\" is not registered. ` +\n `Register it via new MastraEditor({ blobStores: { '${providerId}': yourProvider } })`,\n );\n }\n const blobStore = await provider.createBlobStore(providerConfig ?? {});\n await blobStore.init();\n return blobStore;\n }\n\n // Fall back to storage backend's blobs domain\n const storage = this.__mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) throw new Error('Blob storage domain is not available');\n return blobStore;\n }\n}\n","import type { Mastra } from '@mastra/core';\nimport type { IMastraLogger as Logger } from '@mastra/core/logger';\nimport type { GetByIdOptions } from '@mastra/core/editor';\nimport type { MastraEditor } from '../index';\n\nexport type { GetByIdOptions };\n\n/**\n * Adapter interface that bridges entity-specific storage method names\n * to a generic CRUD interface. Each CrudEditorNamespace subclass implements\n * this to map its storage domain's methods.\n */\nexport interface StorageAdapter<\n TCreateInput extends { id: string },\n TUpdateInput extends { id: string },\n TListInput,\n TListOutput,\n TListResolvedOutput,\n TResolved,\n> {\n create(input: TCreateInput): Promise<unknown>;\n getByIdResolved(id: string, options?: GetByIdOptions): Promise<TResolved | null>;\n update(input: TUpdateInput): Promise<unknown>;\n delete(id: string): Promise<void>;\n list(args?: TListInput): Promise<TListOutput>;\n listResolved(args?: TListInput): Promise<TListResolvedOutput>;\n}\n\n/**\n * Base class for all editor namespaces.\n * Provides shared infrastructure: mastra/logger access and registration check.\n */\nexport abstract class EditorNamespace {\n constructor(protected editor: MastraEditor) {}\n\n protected get mastra(): Mastra | undefined {\n return this.editor.__mastra;\n }\n\n protected get logger(): Logger | undefined {\n return this.editor.__logger;\n }\n\n protected ensureRegistered(): void {\n if (!this.editor.__mastra) {\n throw new Error('MastraEditor is not registered with a Mastra instance');\n }\n }\n}\n\n/**\n * Abstract base class for editor namespaces with full CRUD operations.\n *\n * Generic parameters:\n * - TCreateInput / TUpdateInput — storage input shapes\n * - TListInput / TListOutput / TListResolvedOutput — list shapes\n * - TResolved — the raw config shape returned from storage\n * - THydrated — the runtime primitive type returned by getById (defaults to TResolved)\n *\n * Subclasses override `hydrate()` to convert raw config into a runtime primitive.\n * For namespaces without hydration (e.g. prompts), THydrated = TResolved and hydrate is identity.\n *\n * Includes a built-in cache for getById results. Mutations (create/update/delete)\n * automatically invalidate the cache for the affected entity.\n */\nexport abstract class CrudEditorNamespace<\n TCreateInput extends { id: string },\n TUpdateInput extends { id: string },\n TListInput,\n TListOutput,\n TListResolvedOutput,\n TResolved,\n THydrated = TResolved,\n> extends EditorNamespace {\n protected _cache = new Map<string, THydrated>();\n\n /**\n * Each subclass must provide a storage adapter that maps\n * entity-specific storage method names to the generic interface.\n */\n protected abstract getStorageAdapter(): Promise<\n StorageAdapter<TCreateInput, TUpdateInput, TListInput, TListOutput, TListResolvedOutput, TResolved>\n >;\n\n /**\n * Convert a raw resolved config into a runtime primitive.\n * Override in subclasses that need hydration (e.g. agents → Agent instance).\n * Default implementation returns the resolved config as-is.\n */\n protected async hydrate(resolved: TResolved): Promise<THydrated> {\n return resolved as unknown as THydrated;\n }\n\n /**\n * Hook called when an entity is evicted from the cache (on delete, update, or clearCache).\n * Override in subclasses to also remove the entity from the Mastra runtime registry.\n */\n protected onCacheEvict(_id: string): void {\n // Default: no-op. Subclasses override to clean up runtime registries.\n }\n\n async create(input: TCreateInput): Promise<THydrated> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n await adapter.create(input);\n const resolved = await adapter.getByIdResolved(input.id);\n if (!resolved) {\n throw new Error(`Failed to resolve entity ${input.id} after creation`);\n }\n const hydrated = await this.hydrate(resolved);\n this._cache.set(input.id, hydrated);\n return hydrated;\n }\n\n async getById(id: string, options?: GetByIdOptions): Promise<THydrated | null> {\n this.ensureRegistered();\n\n // Only use the cache for default version requests (no specific version or status override)\n const isVersionRequest = options?.versionId || options?.versionNumber || options?.status;\n if (!isVersionRequest) {\n const cached = this._cache.get(id);\n if (cached) {\n this.logger?.debug(`[getById] Cache hit for \"${id}\"`);\n return cached;\n }\n }\n\n this.logger?.debug(`[getById] Cache miss for \"${id}\", fetching from storage`);\n const adapter = await this.getStorageAdapter();\n const resolved = await adapter.getByIdResolved(id, options);\n if (!resolved) return null;\n\n const hydrated = await this.hydrate(resolved);\n\n // Only cache default (latest) version\n if (!isVersionRequest) {\n this._cache.set(id, hydrated);\n }\n return hydrated;\n }\n\n async update(input: TUpdateInput): Promise<THydrated> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n await adapter.update(input);\n this._cache.delete(input.id);\n this.onCacheEvict(input.id);\n const resolved = await adapter.getByIdResolved(input.id);\n if (!resolved) {\n throw new Error(`Failed to resolve entity ${input.id} after update`);\n }\n const hydrated = await this.hydrate(resolved);\n this._cache.set(input.id, hydrated);\n return hydrated;\n }\n\n async delete(id: string): Promise<void> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n await adapter.delete(id);\n this._cache.delete(id);\n this.onCacheEvict(id);\n }\n\n async list(args?: TListInput): Promise<TListOutput> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n return adapter.list(args);\n }\n\n async listResolved(args?: TListInput): Promise<TListResolvedOutput> {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n return adapter.listResolved(args);\n }\n\n /**\n * Clear cached entities. If an id is provided, only that entity is cleared.\n * Otherwise all cached entities in this namespace are cleared.\n */\n clearCache(id?: string): void {\n if (id) {\n this._cache.delete(id);\n // Always notify subclasses so they can clean up runtime registries\n // (e.g. remove the agent from mastra.#agents), even if the entity\n // wasn't in the editor cache (version-specific lookups skip caching).\n this.onCacheEvict(id);\n this.logger?.debug(`[clearCache] Cleared cache for \"${id}\"`);\n } else {\n for (const cachedId of Array.from(this._cache.keys())) {\n this.onCacheEvict(cachedId);\n }\n this._cache.clear();\n this.logger?.debug('[clearCache] Cleared all cached entities');\n }\n }\n}\n","import { createHash } from 'node:crypto';\n\nimport { Memory } from '@mastra/memory';\nimport { Agent } from '@mastra/core/agent';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core';\nimport { Workspace, CompositeVersionedSkillSource } from '@mastra/core/workspace';\nimport type { SkillSource, VersionedSkillEntry } from '@mastra/core/workspace';\nimport type { MastraMemory, MemoryConfig, SerializedMemoryConfig, SharedMemoryConfig } from '@mastra/core/memory';\nimport type { MastraVector as MastraVectorProvider } from '@mastra/core/vector';\nimport type { ToolAction } from '@mastra/core/tools';\nimport type { Workflow } from '@mastra/core/workflows';\nimport type { MastraScorers } from '@mastra/core/evals';\nimport type {\n StorageResolvedAgentType,\n StorageScorerConfig,\n StorageToolConfig,\n StorageMCPClientToolsConfig,\n StorageSkillConfig,\n} from '@mastra/core/storage';\nimport { convertSchemaToZod } from '@mastra/schema-compat';\n\nimport type {\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageListAgentsResolvedOutput,\n StorageConditionalVariant,\n StorageConditionalField,\n StorageDefaultOptions,\n StorageModelConfig,\n AgentInstructionBlock,\n StoredProcessorGraph,\n StorageWorkspaceRef,\n StorageBrowserRef,\n} from '@mastra/core/storage';\nimport type { MastraBrowser } from '@mastra/core/browser';\n\nimport { RequestContext } from '@mastra/core/request-context';\nimport { resolveStoredToolProviders } from '@mastra/core/tool-provider';\nimport type { ToolProviders } from '@mastra/core/tool-provider';\n\nimport { evaluateRuleGroup } from '../rule-evaluator';\nimport { resolveInstructionBlocks } from '../instruction-builder';\nimport { hydrateProcessorGraph, selectFirstMatchingGraph } from '../processor-graph-hydrator';\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\nimport { EditorMCPNamespace } from './mcp';\n\ntype AgentEditorConfig = false | { instructions?: boolean; tools?: boolean | { description?: boolean } };\n\n// ============================================================================\n// Builder Defaults\n// ============================================================================\n\n/** Fields from builder.configuration.agent that can be applied as creation defaults */\nconst BUILDER_DEFAULT_FIELDS = ['memory', 'workspace', 'browser'] as const;\n\n/**\n * Shape of `configuration.agent.models.default` entries (mirrors\n * `DefaultModelEntry` from `@mastra/core/agent-builder/ee` without the type-level\n * narrowing — this file only cares about the runtime shape).\n */\ntype DefaultModelEntryRuntime = {\n kind?: 'custom';\n provider: string;\n modelId: string;\n};\n\n/**\n * Convert the admin's `DefaultModelEntry` (`{ provider, modelId }`) into the\n * stored `StorageModelConfig` (`{ provider, name }`) used by every agent record.\n */\nfunction defaultModelToStored(entry: DefaultModelEntryRuntime): StorageModelConfig {\n return { provider: entry.provider, name: entry.modelId };\n}\n\n/**\n * Built-in baseline defaults applied when the admin has not pinned a\n * `configuration.agent.<field>` value AND the user did not provide one on\n * the creation input. Explicit `null` on input still wins (opt-out).\n */\nconst BUILDER_BASELINE_DEFAULTS: Partial<Record<(typeof BUILDER_DEFAULT_FIELDS)[number], unknown>> = {\n memory: { observationalMemory: true } satisfies SerializedMemoryConfig,\n};\n\n/**\n * Apply builder defaults to agent creation input.\n * Only applies for fields where input is `undefined` (not `null` — null is explicit disable).\n *\n * Resolution order per field:\n * 1. `input[field]` — user intent always wins\n * 2. `builderAgentConfig[field]` — admin-pinned default\n * 3. `BUILDER_BASELINE_DEFAULTS[field]` — built-in default (e.g. observational memory on)\n *\n * `model` is special-cased: it is NOT in `BUILDER_DEFAULT_FIELDS` because the\n * stored shape (`{ provider, name }`) differs from the admin-config shape\n * (`{ provider, modelId }`). It also must never overwrite a conditional model\n * already present on `input`.\n */\nfunction applyBuilderDefaults(\n input: StorageCreateAgentInput,\n builderAgentConfig: Record<string, unknown> | undefined,\n): StorageCreateAgentInput {\n const defaults: Partial<StorageCreateAgentInput> = {};\n\n for (const field of BUILDER_DEFAULT_FIELDS) {\n if (input[field] !== undefined) continue;\n const adminValue = builderAgentConfig?.[field];\n if (adminValue !== undefined) {\n (defaults as Record<string, unknown>)[field] = adminValue;\n continue;\n }\n const baseline = BUILDER_BASELINE_DEFAULTS[field];\n if (baseline !== undefined) {\n (defaults as Record<string, unknown>)[field] = baseline;\n }\n }\n\n // Seed `model` from the admin's `models.default` only when input omits it.\n // Conditional models are preserved verbatim (they are objects but not the\n // admin-config shape, and the user's intent always wins).\n if (input.model === undefined && builderAgentConfig) {\n const models = (builderAgentConfig.models ?? undefined) as { default?: DefaultModelEntryRuntime } | undefined;\n const adminDefault = models?.default;\n if (adminDefault && typeof adminDefault.provider === 'string' && typeof adminDefault.modelId === 'string') {\n (defaults as Record<string, unknown>).model = defaultModelToStored(adminDefault);\n }\n }\n\n return Object.keys(defaults).length > 0 ? { ...input, ...defaults } : input;\n}\n\n// ============================================================================\n// EditorAgentNamespace\n// ============================================================================\n\nexport class EditorAgentNamespace extends CrudEditorNamespace<\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageListAgentsResolvedOutput,\n StorageResolvedAgentType,\n Agent\n> {\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageListAgentsResolvedOutput,\n StorageResolvedAgentType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('agents');\n if (!store) throw new Error('Agents storage domain is not available');\n\n return {\n create: input => store.create({ agent: input }),\n getByIdResolved: async (id, options) => {\n if (options?.versionId || options?.versionNumber) {\n // Fetch the agent metadata first\n const agent = await store.getById(id);\n if (!agent) return null;\n\n // Fetch the specific version\n const version = options.versionId\n ? await store.getVersion(options.versionId)\n : await store.getVersionByNumber(id, options.versionNumber!);\n\n if (!version) return null;\n if (version.agentId !== id) {\n throw new Error(`Version \"${version.id}\" does not belong to agent \"${id}\"`);\n }\n\n const {\n id: versionId,\n agentId: _aId,\n versionNumber: _vn,\n changedFields: _cf,\n changeMessage: _cm,\n createdAt: _ca,\n ...snapshotConfig\n } = version;\n return { ...agent, ...snapshotConfig, resolvedVersionId: versionId } as StorageResolvedAgentType;\n }\n return store.getByIdResolved(id, options?.status ? { status: options.status } : undefined);\n },\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Hydrate a stored agent config into a runtime Agent instance.\n */\n protected async hydrate(storedAgent: StorageResolvedAgentType): Promise<Agent> {\n return this.createAgentFromStoredConfig(storedAgent);\n }\n\n /**\n * Create a new agent, applying builder defaults for fields not specified in input.\n * Also ensures the referenced workspace (if any) is persisted as a stored workspace.\n */\n async create(input: StorageCreateAgentInput): Promise<Agent> {\n let finalInput = input;\n\n if (this.editor.hasEnabledBuilderConfig()) {\n const builder = await this.editor.resolveBuilder();\n const agentConfig = builder?.getConfiguration()?.agent;\n finalInput = applyBuilderDefaults(input, agentConfig);\n }\n\n // Ensure the workspace referenced by the agent exists in stored workspaces\n await this.ensureStoredWorkspace(finalInput.workspace as StorageWorkspaceRef | undefined);\n\n return super.create(finalInput);\n }\n\n /**\n * Ensure a workspace reference is persisted in the DB.\n *\n * For `type: 'id'`: looks up the runtime workspace, serializes its config,\n * and creates a stored workspace record if one doesn't already exist.\n *\n * For `type: 'inline'`: derives a deterministic ID from the config and\n * persists it as a stored workspace if one doesn't already exist.\n */\n private async ensureStoredWorkspace(workspaceRef: StorageWorkspaceRef | undefined): Promise<void> {\n if (!workspaceRef) return;\n\n const workspaceNs = this.editor.workspace;\n if (!workspaceNs) return;\n\n try {\n if (workspaceRef.type === 'id') {\n // Check if already stored in DB\n const existing = await workspaceNs.getById(workspaceRef.workspaceId);\n if (existing) return;\n\n // Not in DB — look up the runtime workspace and serialize it\n const runtimeWorkspace = this.mastra?.getWorkspaceById(workspaceRef.workspaceId);\n if (!runtimeWorkspace) {\n this.logger?.warn(\n `[ensureStoredWorkspace] Workspace '${workspaceRef.workspaceId}' not found in runtime registry, cannot persist`,\n );\n return;\n }\n\n const snapshot = await workspaceNs.snapshotFromWorkspace(runtimeWorkspace);\n await workspaceNs.create({\n id: workspaceRef.workspaceId,\n metadata: { source: 'builder', builderWorkspaceId: workspaceRef.workspaceId },\n ...snapshot,\n });\n this.logger?.debug(`[ensureStoredWorkspace] Persisted runtime workspace '${workspaceRef.workspaceId}' to DB`);\n } else if (workspaceRef.type === 'inline') {\n // Derive a deterministic ID from the inline config\n const configHash = createHash('sha256').update(JSON.stringify(workspaceRef.config)).digest('hex').slice(0, 12);\n const workspaceId = `inline-${configHash}`;\n\n // Check if already stored in DB\n const existing = await workspaceNs.getById(workspaceId);\n if (existing) return;\n\n await workspaceNs.create({\n id: workspaceId,\n metadata: { source: 'builder', builderConfigHash: configHash },\n ...workspaceRef.config,\n });\n this.logger?.debug(`[ensureStoredWorkspace] Persisted inline workspace '${workspaceId}' to DB`);\n }\n } catch (error) {\n // Don't fail agent creation if workspace persistence fails\n this.logger?.warn('[ensureStoredWorkspace] Failed to persist workspace', { error });\n }\n }\n\n protected override onCacheEvict(id: string): void {\n // Only remove stored agents from the Mastra registry.\n // Code-defined agents must survive cache eviction because they live\n // in code and may only have a stored config overlay.\n try {\n const existing = this.mastra?.getAgentById(id);\n if (existing?.source === 'stored') {\n this.mastra?.removeAgent(id);\n }\n } catch {\n // Agent not found in registry — nothing to remove\n }\n }\n\n /**\n * Evict all cached agents that reference a given skill ID.\n * Called by EditorSkillNamespace after a skill is published so that\n * subsequent agent.getById() calls re-hydrate with the updated skill version.\n */\n invalidateAgentsReferencingSkill(skillId: string): void {\n for (const [agentId, agent] of this._cache.entries()) {\n const raw = (agent as Agent).toRawConfig?.();\n if (!raw?.skills) continue;\n\n const skillsField = raw.skills;\n let found = false;\n\n if (Array.isArray(skillsField)) {\n // StorageConditionalVariant<Record<string, StorageSkillConfig>>[]\n found = skillsField.some(\n (variant: { value?: Record<string, unknown> }) => variant?.value && skillId in variant.value,\n );\n } else if (typeof skillsField === 'object' && skillsField !== null) {\n // Plain Record<string, StorageSkillConfig>\n found = skillId in (skillsField as Record<string, unknown>);\n }\n\n if (found) {\n this.logger?.debug(\n `[invalidateAgentsReferencingSkill] Evicting agent \"${agentId}\" (references skill \"${skillId}\")`,\n );\n this._cache.delete(agentId);\n this.onCacheEvict(agentId);\n }\n }\n }\n\n /**\n * Apply stored configuration overrides to a code-defined agent.\n *\n * When a stored config exists for the given agent's ID, the following fields\n * from the stored config override the code agent's values (if explicitly set):\n * - `instructions` — system prompt\n * - `tools` — tool selection with description overrides (merged on top of code tools)\n *\n * Fields that are absent or undefined in the stored config are left untouched.\n * Model, workspace, memory, and other code-defined fields are never overridden —\n * they may contain SDK instances or dynamic functions that cannot be safely serialized.\n * Returns the (possibly mutated) agent.\n */\n async applyStoredOverrides(\n agent: Agent,\n options?: { status?: 'draft' | 'published' } | { versionId: string },\n requestContext?: RequestContext,\n ): Promise<Agent> {\n const editorConfig = (\n agent as Agent & { __getEditorConfig?: () => AgentEditorConfig | undefined }\n ).__getEditorConfig?.();\n if (editorConfig === false) {\n return agent;\n }\n\n const instructionsEditable = editorConfig === undefined ? true : editorConfig.instructions === true;\n const toolsConfig = editorConfig === undefined ? true : editorConfig.tools;\n const toolsEditable = toolsConfig === true;\n const toolDescriptionsEditable =\n typeof toolsConfig === 'object' && toolsConfig !== null && toolsConfig.description === true;\n\n let storedConfig: StorageResolvedAgentType | null = null;\n try {\n this.ensureRegistered();\n const adapter = await this.getStorageAdapter();\n const resolvedOptions: { versionId: string } | { status: 'draft' | 'published' | 'archived' } =\n options && 'versionId' in options\n ? { versionId: options.versionId }\n : { status: (options as { status?: 'draft' | 'published' } | undefined)?.status ?? 'draft' };\n storedConfig = await adapter.getByIdResolved(agent.id, resolvedOptions);\n } catch (error) {\n // If a specific versionId was requested, don't fail open — propagate the error\n if (options && 'versionId' in options) {\n throw error;\n }\n // Editor not registered, storage not available, or agent not found — return unchanged\n return agent;\n }\n\n if (!storedConfig) {\n return agent;\n }\n\n // If requesting published status but no version has been published, don't override the code-defined agent\n const requestedPublished = options && !('versionId' in options) && options.status === 'published';\n if (requestedPublished && !storedConfig.activeVersionId) {\n return agent;\n }\n\n // Fork the agent so overrides don't mutate the singleton instance\n const fork = agent.__fork();\n\n this.logger?.debug(`[applyStoredOverrides] Applying stored overrides to code agent \"${agent.id}\"`);\n\n // --- Instructions ---\n if (instructionsEditable && storedConfig.instructions !== undefined && storedConfig.instructions !== null) {\n const resolved = this.resolveStoredInstructions(storedConfig.instructions);\n if (resolved !== undefined) {\n fork.__updateInstructions(resolved);\n }\n }\n\n // --- Tools (merge: stored tools override code tools, code tools not in stored config are preserved) ---\n const hasStoredTools = storedConfig.tools != null;\n const hasStoredMCPClients = storedConfig.mcpClients != null;\n const hasStoredIntegrationTools = storedConfig.integrationTools != null;\n const hasStoredToolProviders =\n storedConfig.toolProviders != null && Object.keys(storedConfig.toolProviders as object).length > 0;\n\n if (\n toolsEditable &&\n (hasStoredTools || hasStoredMCPClients || hasStoredIntegrationTools || hasStoredToolProviders)\n ) {\n const hasConditionalTools = this.isConditionalVariants(storedConfig.tools);\n const hasConditionalMCPClients =\n storedConfig.mcpClients != null && this.isConditionalVariants(storedConfig.mcpClients);\n const hasConditionalIntegrationTools =\n storedConfig.integrationTools != null && this.isConditionalVariants(storedConfig.integrationTools);\n const hasConditionalToolProviders =\n storedConfig.toolProviders != null && this.isConditionalVariants(storedConfig.toolProviders);\n // toolProviders need request-time context for `caller-supplied` scope, so they\n // always force the dynamic branch (mirrors the create-stored-agent path).\n const isDynamicTools =\n hasConditionalTools ||\n hasConditionalMCPClients ||\n hasConditionalIntegrationTools ||\n hasStoredIntegrationTools ||\n hasConditionalToolProviders ||\n hasStoredToolProviders;\n\n if (isDynamicTools) {\n // Wrap in a dynamic function that merges at request time\n const originalTools = agent.listTools.bind(agent);\n const toolsFn = async ({ requestContext }: { requestContext: RequestContext }): Promise<ToolsInput> => {\n const codeTools = await originalTools({ requestContext });\n const ctx = requestContext.toJSON();\n\n const resolvedToolsConfig = hasConditionalTools\n ? this.accumulateObjectVariants(\n storedConfig!.tools as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n )\n : (storedConfig!.tools as Record<string, StorageToolConfig> | undefined);\n const registryTools = this.resolveStoredTools(resolvedToolsConfig);\n\n const resolvedMCPClientsConfig = hasConditionalMCPClients\n ? this.accumulateObjectVariants(\n storedConfig!.mcpClients as StorageConditionalVariant<Record<string, StorageMCPClientToolsConfig>>[],\n ctx,\n )\n : (storedConfig!.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined);\n const mcpTools = await this.resolveStoredMCPTools(resolvedMCPClientsConfig, requestContext);\n\n const resolvedIntegrationToolsConfig = hasConditionalIntegrationTools\n ? this.accumulateObjectVariants(\n storedConfig!.integrationTools as StorageConditionalVariant<\n Record<string, StorageMCPClientToolsConfig>\n >[],\n ctx,\n )\n : (storedConfig!.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined);\n const integrationTools = await this.resolveStoredIntegrationTools(\n resolvedIntegrationToolsConfig,\n requestContext,\n );\n\n // Resolve tool providers (v1 toolProviders)\n const resolvedToolProvidersConfig = hasConditionalToolProviders\n ? this.accumulateObjectVariants(\n storedConfig!.toolProviders as StorageConditionalVariant<ToolProviders>[],\n ctx,\n )\n : (storedConfig!.toolProviders as ToolProviders | undefined);\n const providerTools = await resolveStoredToolProviders(\n resolvedToolProvidersConfig,\n (providerId: string) => this.editor.getToolProviderOrThrow(providerId),\n {\n requestContext: ctx,\n authorId: storedConfig!.authorId,\n logger: this.logger,\n },\n );\n\n return { ...codeTools, ...registryTools, ...mcpTools, ...integrationTools, ...providerTools };\n };\n fork.__setTools(toolsFn);\n } else {\n // Static tools — resolve once and merge\n const codeTools = await fork.listTools();\n const registryTools = this.resolveStoredTools(\n storedConfig.tools as Record<string, StorageToolConfig> | undefined,\n );\n const mcpTools = await this.resolveStoredMCPTools(\n storedConfig.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined,\n requestContext,\n );\n const integrationTools = await this.resolveStoredIntegrationTools(\n storedConfig.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined,\n );\n fork.__setTools({ ...codeTools, ...registryTools, ...mcpTools, ...integrationTools });\n }\n } else if (toolDescriptionsEditable && hasStoredTools) {\n const hasConditionalTools = this.isConditionalVariants(storedConfig.tools);\n\n if (hasConditionalTools) {\n const originalTools = agent.listTools.bind(agent);\n const toolsFn = async ({ requestContext }: { requestContext: RequestContext }): Promise<ToolsInput> => {\n const codeTools = await originalTools({ requestContext });\n const resolvedToolsConfig = this.accumulateObjectVariants(\n storedConfig!.tools as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n requestContext.toJSON(),\n );\n\n return this.applyStoredToolDescriptions(codeTools, resolvedToolsConfig);\n };\n fork.__setTools(toolsFn);\n } else {\n const codeTools = await fork.listTools();\n fork.__setTools(\n this.applyStoredToolDescriptions(\n codeTools,\n storedConfig.tools as Record<string, StorageToolConfig> | string[] | undefined,\n ),\n );\n }\n }\n\n // Persist the resolved version ID so it can be read by span attributes / handlers\n if (storedConfig.resolvedVersionId) {\n const existing = fork.toRawConfig() ?? {};\n fork.__setRawConfig({ ...existing, resolvedVersionId: storedConfig.resolvedVersionId });\n }\n\n return fork;\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n /**\n * Detect whether a StorageConditionalField value is a conditional variant array\n * (as opposed to the plain static value T).\n */\n private isConditionalVariants<T>(field: StorageConditionalField<T>): field is StorageConditionalVariant<T>[] {\n return (\n Array.isArray(field) &&\n field.length > 0 &&\n typeof field[0] === 'object' &&\n field[0] !== null &&\n 'value' in field[0]\n );\n }\n\n /**\n * Accumulate all matching variants for an array-typed field.\n * Each matching variant's value (an array) is concatenated in order.\n * Variants with no rules are treated as unconditional (always included).\n */\n private accumulateArrayVariants<T>(\n variants: StorageConditionalVariant<T[]>[],\n context: Record<string, unknown>,\n ): T[] {\n const result: T[] = [];\n for (const variant of variants) {\n if (!variant.rules || evaluateRuleGroup(variant.rules, context)) {\n result.push(...variant.value);\n }\n }\n return result;\n }\n\n /**\n * Accumulate all matching variants for an object/record-typed field.\n * Each matching variant's value is shallow-merged in order, so later\n * matches override keys from earlier ones.\n * Variants with no rules are treated as unconditional (always included).\n */\n private accumulateObjectVariants<T extends Record<string, unknown>>(\n variants: StorageConditionalVariant<T>[],\n context: Record<string, unknown>,\n ): T | undefined {\n let result: T | undefined;\n for (const variant of variants) {\n if (!variant.rules || evaluateRuleGroup(variant.rules, context)) {\n result = result ? { ...result, ...variant.value } : { ...variant.value };\n }\n }\n return result;\n }\n\n private async createAgentFromStoredConfig(storedAgent: StorageResolvedAgentType): Promise<Agent> {\n if (!this.mastra) {\n throw new Error('MastraEditor is not registered with a Mastra instance');\n }\n\n this.logger?.debug(`[createAgentFromStoredConfig] Creating agent from stored config \"${storedAgent.id}\"`);\n\n const instructions = this.resolveStoredInstructions(storedAgent.instructions);\n\n // Determine if any conditional fields exist that require dynamic resolution\n const hasConditionalTools = storedAgent.tools != null && this.isConditionalVariants(storedAgent.tools);\n const hasConditionalMCPClients =\n storedAgent.mcpClients != null && this.isConditionalVariants(storedAgent.mcpClients);\n const hasConditionalIntegrationTools =\n storedAgent.integrationTools != null && this.isConditionalVariants(storedAgent.integrationTools);\n const hasToolProviders =\n storedAgent.toolProviders != null && Object.keys(storedAgent.toolProviders as object).length > 0;\n const hasConditionalToolProviders =\n storedAgent.toolProviders != null && this.isConditionalVariants(storedAgent.toolProviders);\n const hasConditionalWorkflows = storedAgent.workflows != null && this.isConditionalVariants(storedAgent.workflows);\n const hasConditionalAgents = storedAgent.agents != null && this.isConditionalVariants(storedAgent.agents);\n const hasConditionalMemory = storedAgent.memory != null && this.isConditionalVariants(storedAgent.memory);\n const hasConditionalScorers = storedAgent.scorers != null && this.isConditionalVariants(storedAgent.scorers);\n const hasConditionalInputProcessors =\n storedAgent.inputProcessors != null && this.isConditionalVariants(storedAgent.inputProcessors);\n const hasConditionalOutputProcessors =\n storedAgent.outputProcessors != null && this.isConditionalVariants(storedAgent.outputProcessors);\n const hasConditionalDefaultOptions =\n storedAgent.defaultOptions != null && this.isConditionalVariants(storedAgent.defaultOptions);\n const hasConditionalModel = this.isConditionalVariants(storedAgent.model);\n const hasConditionalWorkspace = storedAgent.workspace != null && this.isConditionalVariants(storedAgent.workspace);\n const hasConditionalBrowser = storedAgent.browser != null && this.isConditionalVariants(storedAgent.browser);\n\n // --- Resolve fields: conditional fields accumulate all matching variants ---\n\n // Tools: registry tools, MCP client tools, and integration tools can each be conditional.\n // If any is conditional, the combined result must be a dynamic function.\n const hasIntegrationTools = storedAgent.integrationTools != null;\n const isDynamicTools =\n hasConditionalTools ||\n hasConditionalMCPClients ||\n hasConditionalIntegrationTools ||\n hasIntegrationTools ||\n hasConditionalToolProviders ||\n hasToolProviders;\n\n let tools:\n | Record<string, ToolAction<any, any, any, any, any, any>>\n | (({\n requestContext,\n }: {\n requestContext: RequestContext;\n }) => Promise<Record<string, ToolAction<any, any, any, any, any, any>>>);\n\n if (isDynamicTools) {\n // At least one tool source is conditional — resolve all at request time\n tools = async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n\n // Resolve registry tools\n const resolvedToolsConfig = hasConditionalTools\n ? this.accumulateObjectVariants(\n storedAgent.tools as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n )\n : (storedAgent.tools as Record<string, StorageToolConfig> | undefined);\n const registryTools = this.resolveStoredTools(resolvedToolsConfig);\n\n // Resolve MCP client tools\n const resolvedMCPClientsConfig = hasConditionalMCPClients\n ? this.accumulateObjectVariants(\n storedAgent.mcpClients as StorageConditionalVariant<Record<string, StorageMCPClientToolsConfig>>[],\n ctx,\n )\n : (storedAgent.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined);\n const mcpTools = await this.resolveStoredMCPTools(resolvedMCPClientsConfig, requestContext);\n\n // Resolve integration tools (tool providers)\n const resolvedIntegrationToolsConfig = hasConditionalIntegrationTools\n ? this.accumulateObjectVariants(\n storedAgent.integrationTools as StorageConditionalVariant<Record<string, StorageMCPClientToolsConfig>>[],\n ctx,\n )\n : (storedAgent.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined);\n const integrationTools = await this.resolveStoredIntegrationTools(\n resolvedIntegrationToolsConfig,\n requestContext,\n );\n\n // Resolve tool providers (v1 toolProviders)\n const resolvedToolProvidersConfig = hasConditionalToolProviders\n ? this.accumulateObjectVariants(storedAgent.toolProviders as StorageConditionalVariant<ToolProviders>[], ctx)\n : (storedAgent.toolProviders as ToolProviders | undefined);\n const providerTools = await resolveStoredToolProviders(\n resolvedToolProvidersConfig,\n (providerId: string) => this.editor.getToolProviderOrThrow(providerId),\n {\n requestContext: ctx,\n authorId: storedAgent.authorId,\n logger: this.logger,\n },\n );\n\n return { ...registryTools, ...mcpTools, ...integrationTools, ...providerTools };\n };\n } else {\n // All are static — resolve once at agent creation time (no requestContext available).\n // Note: `hasToolProviders` is part of `isDynamicTools` above, so the v1 toolProviders\n // path is always handled in the dynamic branch (where `requestContext` is available\n // for `caller-supplied` scope). Nothing to resolve here.\n const registryTools = this.resolveStoredTools(storedAgent.tools as Record<string, StorageToolConfig> | undefined);\n const mcpTools = await this.resolveStoredMCPTools(\n storedAgent.mcpClients as Record<string, StorageMCPClientToolsConfig> | undefined,\n );\n const integrationTools = await this.resolveStoredIntegrationTools(\n storedAgent.integrationTools as Record<string, StorageMCPClientToolsConfig> | undefined,\n );\n tools = { ...registryTools, ...mcpTools, ...integrationTools };\n }\n\n // Workflows: variant values may be string[] or Record<string, StorageToolConfig>\n const workflows = hasConditionalWorkflows\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const variants = storedAgent.workflows as StorageConditionalVariant<\n Record<string, StorageToolConfig> | string[]\n >[];\n const isArrayVariant = Array.isArray(variants[0]?.value);\n const resolved = isArrayVariant\n ? this.accumulateArrayVariants(variants as StorageConditionalVariant<string[]>[], ctx)\n : this.accumulateObjectVariants(\n variants as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n );\n return this.resolveStoredWorkflows(resolved);\n }\n : this.resolveStoredWorkflows(storedAgent.workflows as Record<string, StorageToolConfig> | string[] | undefined);\n\n // Agents: variant values may be string[] or Record<string, StorageToolConfig>\n const agents = hasConditionalAgents\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const variants = storedAgent.agents as StorageConditionalVariant<\n Record<string, StorageToolConfig> | string[]\n >[];\n const isArrayVariant = Array.isArray(variants[0]?.value);\n const resolved = isArrayVariant\n ? this.accumulateArrayVariants(variants as StorageConditionalVariant<string[]>[], ctx)\n : this.accumulateObjectVariants(\n variants as StorageConditionalVariant<Record<string, StorageToolConfig>>[],\n ctx,\n );\n return this.resolveStoredAgents(resolved);\n }\n : this.resolveStoredAgents(storedAgent.agents as Record<string, StorageToolConfig> | string[] | undefined);\n\n // Memory (object): accumulate by merging config from all matching variants\n const memory = hasConditionalMemory\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolved = this.accumulateObjectVariants(\n storedAgent.memory as StorageConditionalVariant<SerializedMemoryConfig>[],\n ctx,\n );\n return this.resolveStoredMemory(resolved as SerializedMemoryConfig | undefined);\n }\n : this.resolveStoredMemory(storedAgent.memory as SerializedMemoryConfig | undefined);\n\n // Scorers (Record): accumulate by merging objects from all matching variants\n const scorers = hasConditionalScorers\n ? async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolved = this.accumulateObjectVariants(\n storedAgent.scorers as StorageConditionalVariant<Record<string, StorageScorerConfig>>[],\n ctx,\n );\n return this.resolveStoredScorers(resolved);\n }\n : await this.resolveStoredScorers(storedAgent.scorers as Record<string, StorageScorerConfig> | undefined);\n\n // Input processors (graph): first-match from conditional variants, then hydrate\n const processorProviders = this.editor.getProcessorProviders();\n const hydrationCtx = { providers: processorProviders, mastra: this.mastra, logger: this.logger };\n\n const inputProcessors = hasConditionalInputProcessors\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const graph = selectFirstMatchingGraph(\n storedAgent.inputProcessors as StorageConditionalVariant<StoredProcessorGraph>[],\n ctx,\n );\n return hydrateProcessorGraph(graph, 'input', hydrationCtx);\n }\n : hydrateProcessorGraph(storedAgent.inputProcessors as StoredProcessorGraph | undefined, 'input', hydrationCtx);\n\n // Output processors (graph): first-match from conditional variants, then hydrate\n const outputProcessors = hasConditionalOutputProcessors\n ? ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const graph = selectFirstMatchingGraph(\n storedAgent.outputProcessors as StorageConditionalVariant<StoredProcessorGraph>[],\n ctx,\n );\n return hydrateProcessorGraph(graph, 'output', hydrationCtx);\n }\n : hydrateProcessorGraph(storedAgent.outputProcessors as StoredProcessorGraph | undefined, 'output', hydrationCtx);\n\n // Model (object): accumulate by merging config from all matching variants\n let model: string | (({ requestContext }: { requestContext: RequestContext }) => string);\n let staticModelConfig: StorageModelConfig | undefined;\n\n /** Extract model-level settings into the shape expected by defaultOptions.modelSettings */\n const modelSettingsFrom = (cfg: StorageModelConfig) => ({\n temperature: cfg.temperature,\n topP: cfg.topP,\n frequencyPenalty: cfg.frequencyPenalty,\n presencePenalty: cfg.presencePenalty,\n maxOutputTokens: cfg.maxCompletionTokens,\n });\n\n if (hasConditionalModel) {\n model = ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolved = this.accumulateObjectVariants(\n storedAgent.model as StorageConditionalVariant<StorageModelConfig>[],\n ctx,\n );\n if (!resolved || !resolved.provider || !resolved.name) {\n throw new Error(\n `Stored agent \"${storedAgent.id}\" conditional model resolved to invalid configuration. Both provider and name are required.`,\n );\n }\n return `${resolved.provider}/${resolved.name}`;\n };\n } else {\n staticModelConfig = storedAgent.model as StorageModelConfig;\n if (!staticModelConfig || !staticModelConfig.provider || !staticModelConfig.name) {\n throw new Error(\n `Stored agent \"${storedAgent.id}\" has no active version or invalid model configuration. Both provider and name are required.`,\n );\n }\n model = `${staticModelConfig.provider}/${staticModelConfig.name}`;\n }\n\n // Default options (object): accumulate by merging from all matching variants.\n // When the model is conditional, defaultOptions must also be dynamic so that\n // model-level settings (temperature, topP, etc.) are forwarded at request time.\n const staticDefaultOptions =\n hasConditionalDefaultOptions || hasConditionalModel\n ? undefined\n : (storedAgent.defaultOptions as StorageDefaultOptions | undefined);\n\n const resolveModelSettings = (ctx: Record<string, unknown>) => {\n const resolved = this.accumulateObjectVariants(\n storedAgent.model as StorageConditionalVariant<StorageModelConfig>[],\n ctx,\n );\n return resolved ? modelSettingsFrom(resolved) : {};\n };\n\n let defaultOptions;\n if (hasConditionalDefaultOptions || hasConditionalModel) {\n defaultOptions = ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n\n const baseOptions = hasConditionalDefaultOptions\n ? (this.accumulateObjectVariants(\n storedAgent.defaultOptions as StorageConditionalVariant<StorageDefaultOptions>[],\n ctx,\n ) ?? {})\n : ((storedAgent.defaultOptions as StorageDefaultOptions | undefined) ?? {});\n\n const mSettings = hasConditionalModel\n ? resolveModelSettings(ctx)\n : staticModelConfig\n ? modelSettingsFrom(staticModelConfig)\n : {};\n\n return {\n ...baseOptions,\n modelSettings: {\n ...((baseOptions as Record<string, unknown>).modelSettings as Record<string, unknown> | undefined),\n ...mSettings,\n },\n };\n };\n } else {\n defaultOptions = {\n ...staticDefaultOptions,\n modelSettings: {\n ...staticDefaultOptions?.modelSettings,\n ...(staticModelConfig ? modelSettingsFrom(staticModelConfig) : undefined),\n },\n };\n }\n\n // Convert requestContextSchema from JSON Schema to ZodSchema if present\n const requestContextSchema = storedAgent.requestContextSchema\n ? convertSchemaToZod(storedAgent.requestContextSchema as Record<string, unknown>)\n : undefined;\n\n // Resolve agent-level skill source for versioned skills (pin/latest strategy).\n // This creates a CompositeVersionedSkillSource that reads from the blob store\n // instead of the live filesystem, enabling draft/publish/rollback semantics.\n const skillSource = await this.resolveAgentSkillSource(storedAgent.skills);\n\n // Workspace: resolve stored workspace reference (ID or inline) to a runtime Workspace.\n // When conditional, wrapped in a DynamicArgument function resolved at request time.\n const workspace = hasConditionalWorkspace\n ? async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolvedRef = this.accumulateObjectVariants(\n storedAgent.workspace as StorageConditionalVariant<StorageWorkspaceRef>[],\n ctx,\n );\n return this.resolveStoredWorkspace(resolvedRef, skillSource);\n }\n : await this.resolveStoredWorkspace(storedAgent.workspace as StorageWorkspaceRef | undefined, skillSource);\n\n // Browser: resolve stored browser config to a runtime MastraBrowser instance.\n // When conditional, wrapped in a DynamicArgument function resolved at request time.\n const browser = hasConditionalBrowser\n ? async ({ requestContext }: { requestContext: RequestContext }) => {\n const ctx = requestContext.toJSON();\n const resolvedRef = this.accumulateObjectVariants(\n storedAgent.browser as StorageConditionalVariant<StorageBrowserRef>[],\n ctx,\n );\n return this.resolveStoredBrowser(resolvedRef);\n }\n : await this.resolveStoredBrowser(storedAgent.browser as StorageBrowserRef | undefined);\n\n const skillsFormat = storedAgent.skillsFormat;\n\n // Cast to `any` to avoid TS2589 \"excessively deep\" errors caused by the\n // complex generic inference of Agent<TTools, TRequestContext, …>. The\n // individual field values have already been validated above.\n const agent = new Agent({\n id: storedAgent.id,\n name: storedAgent.name,\n description: storedAgent.description,\n metadata: storedAgent.metadata,\n instructions: instructions ?? '',\n model,\n memory,\n tools,\n workflows,\n agents,\n scorers,\n mastra: this.mastra,\n inputProcessors,\n outputProcessors,\n rawConfig: storedAgent as unknown as Record<string, unknown>,\n defaultOptions,\n requestContextSchema,\n workspace,\n browser,\n ...(skillsFormat && { skillsFormat }),\n } as any);\n\n // Only register in Mastra if no code-defined agent with this ID already exists.\n // When a stored config is an override for a code agent, adding it would create a\n // duplicate entry under a different key (agent.id vs config key), causing the list\n // endpoint to show the agent as \"stored\" instead of \"code\".\n const existingCodeAgent = (() => {\n try {\n return this.mastra?.getAgentById(storedAgent.id);\n } catch {\n return undefined;\n }\n })();\n if (!existingCodeAgent || existingCodeAgent.source !== 'code') {\n this.mastra?.addAgent(agent, storedAgent.id, { source: 'stored' });\n }\n this.logger?.debug(`[createAgentFromStoredConfig] Successfully created agent \"${storedAgent.id}\"`);\n\n return agent;\n }\n\n private resolveStoredInstructions(\n instructions: string | AgentInstructionBlock[] | undefined,\n ):\n | string\n | (({ requestContext, mastra }: { requestContext: RequestContext; mastra?: Mastra }) => Promise<string>)\n | undefined {\n if (instructions === undefined || instructions === null) return undefined;\n if (typeof instructions === 'string') return instructions;\n\n const blocks = instructions;\n return async ({ requestContext }: { requestContext: RequestContext; mastra?: Mastra }) => {\n const storage = this.editor.__mastra!.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const promptBlocksStore = await storage.getStore('promptBlocks');\n if (!promptBlocksStore) throw new Error('Prompt blocks storage domain is not available');\n const context = requestContext.toJSON();\n return resolveInstructionBlocks(blocks, context, { promptBlocksStorage: promptBlocksStore });\n };\n }\n\n private applyStoredToolDescriptions(\n codeTools: ToolsInput,\n storedTools?: Record<string, StorageToolConfig> | string[],\n ): ToolsInput {\n if (!storedTools || Array.isArray(storedTools)) {\n return codeTools;\n }\n\n let nextTools: ToolsInput | undefined;\n for (const [toolKey, toolConfig] of Object.entries(storedTools)) {\n if (!toolConfig.description || !(toolKey in codeTools)) {\n continue;\n }\n\n nextTools ??= { ...codeTools };\n nextTools[toolKey] = { ...codeTools[toolKey], description: toolConfig.description };\n }\n\n return nextTools ?? codeTools;\n }\n\n /**\n * Resolve stored tool IDs to actual tool instances from Mastra's registry.\n * Applies description overrides from per-tool config when present.\n */\n private resolveStoredTools(\n storedTools?: Record<string, StorageToolConfig> | string[],\n ): Record<string, ToolAction<any, any, any, any, any, any>> {\n if (\n !storedTools ||\n (Array.isArray(storedTools) ? storedTools.length === 0 : Object.keys(storedTools).length === 0)\n ) {\n return {};\n }\n\n if (!this.mastra) {\n return {};\n }\n\n // Normalize legacy string[] format to Record\n const normalized: Record<string, StorageToolConfig> = Array.isArray(storedTools)\n ? Object.fromEntries(storedTools.map(key => [key, {}]))\n : storedTools;\n\n const resolvedTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n\n for (const [toolKey, toolConfig] of Object.entries(normalized)) {\n try {\n const tool = this.mastra.getToolById(toolKey);\n\n if (toolConfig.description) {\n resolvedTools[toolKey] = { ...tool, description: toolConfig.description };\n } else {\n resolvedTools[toolKey] = tool;\n }\n } catch {\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 * Resolve MCP client/server references to tools.\n *\n * For each entry in `mcpClients`, resolution checks two sources in order:\n * 1. Stored MCP clients (from DB) — creates an MCPClient to fetch remote tools\n * 2. Code-defined MCP servers on the Mastra instance — uses `server.tools()` directly\n *\n * When `clientToolsConfig.tools` is absent, no tools are included (client registered but nothing selected).\n * When `clientToolsConfig.tools` is an empty object `{}`, all tools from the source are included.\n * When specified with keys, only listed tools are included with optional description overrides.\n */\n private async resolveStoredMCPTools(\n mcpClients?: Record<string, StorageMCPClientToolsConfig>,\n requestContext?: RequestContext,\n ): Promise<Record<string, ToolAction<any, any, any, any, any, any>>> {\n if (!mcpClients || Object.keys(mcpClients).length === 0) return {};\n if (!this.mastra) return {};\n\n const allTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n\n // Build auth headers from request context when available.\n // This allows stored MCP clients to connect to auth-protected MCP servers\n // (e.g., the Mastra server's own MCP endpoints).\n const authToken = requestContext?.get('mastra__authToken') as string | undefined;\n const authRequestInit = authToken ? { headers: { Authorization: `Bearer ${authToken}` } } : undefined;\n\n // Lazily loaded — only needed when stored MCP clients are found\n let MCPClient: any;\n\n for (const [clientId, clientToolsConfig] of Object.entries(mcpClients)) {\n try {\n // No `tools` key = client registered but no tools selected yet\n if (!clientToolsConfig.tools) continue;\n\n let tools: Record<string, any> | undefined;\n\n // 1. Check stored MCP clients (remote servers from DB)\n const storedClient = await this.editor.mcp.getById(clientId);\n if (storedClient) {\n if (!MCPClient) {\n try {\n const mcpModule = await import('@mastra/mcp');\n MCPClient = mcpModule.MCPClient;\n } catch {\n this.logger?.warn(\n 'Stored MCP client references found but @mastra/mcp is not installed. ' +\n 'Install @mastra/mcp to use remote MCP tools.',\n );\n continue;\n }\n }\n const clientOptions = EditorMCPNamespace.toMCPClientOptions(storedClient, authRequestInit);\n const client = new MCPClient(clientOptions);\n tools = await client.listTools();\n this.logger?.debug(`[resolveStoredMCPTools] Loaded tools from stored MCP client \"${clientId}\"`);\n } else {\n // 2. Fallback to code-defined MCP server on the Mastra instance\n // Check by registration key first, then by server ID\n const mcpServer = this.mastra.getMCPServer(clientId) ?? this.mastra.getMCPServerById(clientId);\n if (mcpServer) {\n tools = mcpServer.tools() as Record<string, any>;\n this.logger?.debug(`[resolveStoredMCPTools] Loaded tools from code-defined MCP server \"${clientId}\"`);\n }\n }\n\n if (!tools) {\n this.logger?.warn(`MCP client/server \"${clientId}\" referenced in stored agent but not found`);\n continue;\n }\n\n // Two-layer filtering:\n // 1. Client-level (per-server): storedClient.servers[serverName].tools — narrows tools exposed by each server\n // 2. Agent-level: clientToolsConfig.tools — further narrows from the client set\n // Agent-level description overrides take precedence over client-level.\n //\n // Tools from MCPClient.listTools() are namespaced as `serverName_toolName`.\n // Per-server tool configs use the non-namespaced `toolName`.\n const clientServers = storedClient?.servers;\n const agentAllowedTools = clientToolsConfig.tools;\n\n for (const [namespacedToolName, tool] of Object.entries(tools)) {\n // Parse the server name and bare tool name from the namespaced key\n const underscoreIdx = namespacedToolName.indexOf('_');\n const serverName = underscoreIdx > -1 ? namespacedToolName.slice(0, underscoreIdx) : undefined;\n const bareToolName = underscoreIdx > -1 ? namespacedToolName.slice(underscoreIdx + 1) : namespacedToolName;\n\n // Client-level per-server filter: if a server has tools defined, only include listed tools\n if (serverName && clientServers?.[serverName]?.tools) {\n if (!(bareToolName in clientServers[serverName].tools!)) continue;\n }\n\n // Agent-level filter: `tools: {}` = all tools; `tools: { slug: ... }` = specific tools\n // The UI may store tools under their bare name (e.g., \"searchKnowledgeBase\") while\n // MCPClient returns them namespaced (e.g., \"support_searchKnowledgeBase\"), so check both.\n const hasAgentFilter = agentAllowedTools && Object.keys(agentAllowedTools).length > 0;\n if (hasAgentFilter && !(namespacedToolName in agentAllowedTools) && !(bareToolName in agentAllowedTools))\n continue;\n\n // Description override: agent-level (namespaced or bare key) takes precedence over client-level (bare key)\n const serverToolConfig = serverName ? clientServers?.[serverName]?.tools?.[bareToolName] : undefined;\n const description =\n agentAllowedTools?.[namespacedToolName]?.description ??\n agentAllowedTools?.[bareToolName]?.description ??\n serverToolConfig?.description;\n\n if (description) {\n allTools[namespacedToolName] = { ...(tool as ToolAction<any, any, any, any, any, any>), description };\n } else {\n allTools[namespacedToolName] = tool as ToolAction<any, any, any, any, any, any>;\n }\n }\n } catch (error) {\n this.logger?.warn(`Failed to resolve MCP tools from \"${clientId}\"`, { error });\n }\n }\n\n return allTools;\n }\n\n /**\n * Resolve integration tool references from tool providers.\n *\n * For each entry in `integrationTools`, looks up the tool provider by ID\n * from the editor's registered tool providers and calls `getTools()` on it.\n *\n * When `providerConfig.tools` is absent, no tools are included (provider registered but nothing selected).\n * When `providerConfig.tools` is an empty object `{}`, all tools from the provider are included.\n * When `providerConfig.tools` has specific keys, only those tools are included with optional overrides.\n */\n private async resolveStoredIntegrationTools(\n integrationTools?: Record<string, StorageMCPClientToolsConfig>,\n requestContext?: RequestContext,\n ): Promise<Record<string, ToolAction<any, any, any, any, any, any>>> {\n if (!integrationTools || Object.keys(integrationTools).length === 0) return {};\n\n const allTools: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n\n const providerOptions = { requestContext: requestContext?.toJSON() };\n\n for (const [providerId, providerConfig] of Object.entries(integrationTools)) {\n try {\n // No `tools` key = provider registered but no tools selected yet\n if (!providerConfig.tools) continue;\n\n const provider = this.editor.getToolProvider(providerId);\n if (!provider) {\n this.logger?.warn(\n `Tool provider \"${providerId}\" referenced in stored agent but not registered in the editor`,\n );\n continue;\n }\n\n // `tools: {}` = all tools; `tools: { slug: ... }` = specific tools\n const wantedSlugs = Object.keys(providerConfig.tools);\n\n let slugsToResolve: string[];\n if (wantedSlugs.length === 0) {\n // \"All tools\" — ask the provider for its full catalog\n const allAvailable = await provider.listTools();\n slugsToResolve = allAvailable.data.map(t => t.slug);\n } else {\n slugsToResolve = wantedSlugs;\n }\n\n // Fetch tools from the provider — pass slugs, configs, and request context\n const providerTools = await provider.resolveTools(slugsToResolve, providerConfig.tools, providerOptions);\n\n for (const [toolId, tool] of Object.entries(providerTools)) {\n // Apply description override if configured at the agent level\n const description = providerConfig.tools?.[toolId]?.description;\n if (description) {\n allTools[toolId] = { ...tool, description };\n } else {\n allTools[toolId] = tool;\n }\n }\n\n this.logger?.debug(\n `[resolveStoredIntegrationTools] Loaded ${Object.keys(providerTools).length} tools from provider \"${providerId}\"`,\n );\n } catch (error) {\n this.logger?.warn(`Failed to resolve integration tools from provider \"${providerId}\"`, { error });\n }\n }\n\n return allTools;\n }\n\n private resolveStoredWorkflows(\n storedWorkflows?: Record<string, StorageToolConfig> | string[],\n ): Record<string, Workflow<any, any, any, any, any, any, any>> {\n if (\n !storedWorkflows ||\n (Array.isArray(storedWorkflows) ? storedWorkflows.length === 0 : Object.keys(storedWorkflows).length === 0)\n ) {\n return {};\n }\n if (!this.mastra) return {};\n\n // Normalize legacy string[] format to Record\n const normalized: Record<string, StorageToolConfig> = Array.isArray(storedWorkflows)\n ? Object.fromEntries(storedWorkflows.map(key => [key, {}]))\n : storedWorkflows;\n\n const resolvedWorkflows: Record<string, Workflow<any, any, any, any, any, any, any>> = {};\n for (const workflowKey of Object.keys(normalized)) {\n try {\n resolvedWorkflows[workflowKey] = this.mastra.getWorkflow(workflowKey);\n } catch {\n try {\n resolvedWorkflows[workflowKey] = this.mastra.getWorkflowById(workflowKey);\n } catch {\n this.logger?.warn(`Workflow \"${workflowKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n return resolvedWorkflows;\n }\n\n private resolveStoredAgents(storedAgents?: Record<string, StorageToolConfig> | string[]): Record<string, Agent<any>> {\n if (\n !storedAgents ||\n (Array.isArray(storedAgents) ? storedAgents.length === 0 : Object.keys(storedAgents).length === 0)\n ) {\n return {};\n }\n if (!this.mastra) return {};\n\n // Normalize legacy string[] format to Record\n const normalized: Record<string, StorageToolConfig> = Array.isArray(storedAgents)\n ? Object.fromEntries(storedAgents.map(key => [key, {}]))\n : storedAgents;\n\n const resolvedAgents: Record<string, Agent<any>> = {};\n for (const agentKey of Object.keys(normalized)) {\n try {\n resolvedAgents[agentKey] = this.mastra.getAgent(agentKey);\n } catch {\n try {\n resolvedAgents[agentKey] = this.mastra.getAgentById(agentKey);\n } catch {\n this.logger?.warn(`Agent \"${agentKey}\" referenced in stored agent but not registered in Mastra`);\n }\n }\n }\n return resolvedAgents;\n }\n\n private resolveStoredMemory(memoryConfig?: SerializedMemoryConfig): MastraMemory | undefined {\n if (!memoryConfig) {\n this.logger?.debug(`[resolveStoredMemory] No memory config provided`);\n return undefined;\n }\n if (!this.mastra) {\n this.logger?.warn('MastraEditor not registered with Mastra instance. Cannot instantiate memory.');\n return undefined;\n }\n\n try {\n let vector: MastraVectorProvider | undefined;\n if (memoryConfig.vector) {\n const vectors = this.mastra.listVectors();\n vector = vectors?.[memoryConfig.vector];\n if (!vector) {\n this.logger?.warn(`Vector provider \"${memoryConfig.vector}\" not found in Mastra instance`);\n }\n }\n\n // Build options, merging observationalMemory from serialized config\n let options: MemoryConfig | undefined = memoryConfig.options ? { ...memoryConfig.options } : undefined;\n if (memoryConfig.observationalMemory) {\n options = {\n ...options,\n observationalMemory: memoryConfig.observationalMemory,\n };\n }\n\n if (options?.semanticRecall && (!vector || !memoryConfig.embedder)) {\n this.logger?.warn(\n 'Semantic recall is enabled but no vector store or embedder are configured. ' +\n 'Creating memory without semantic recall. ' +\n 'To use semantic recall, configure a vector store and embedder in your Mastra instance.',\n );\n\n const adjustedOptions = { ...options, semanticRecall: false };\n const sharedConfig: SharedMemoryConfig = {\n storage: this.mastra.getStorage(),\n vector,\n options: adjustedOptions,\n embedder: memoryConfig.embedder,\n embedderOptions: memoryConfig.embedderOptions,\n };\n return new Memory(sharedConfig);\n }\n\n const sharedConfig: SharedMemoryConfig = {\n storage: this.mastra.getStorage(),\n vector,\n options,\n embedder: memoryConfig.embedder,\n embedderOptions: memoryConfig.embedderOptions,\n };\n return new Memory(sharedConfig);\n } catch (error) {\n this.logger?.error('Failed to resolve memory from config', { error });\n return undefined;\n }\n }\n\n private async resolveStoredScorers(\n storedScorers?: Record<string, StorageScorerConfig>,\n ): Promise<MastraScorers | undefined> {\n if (!storedScorers || Object.keys(storedScorers).length === 0) return undefined;\n if (!this.mastra) return undefined;\n\n const resolvedScorers: MastraScorers = {};\n const storage = this.mastra.getStorage();\n const scorerStore = storage ? await storage.getStore('scorerDefinitions') : null;\n\n for (const [scorerKey, scorerConfig] of Object.entries(storedScorers)) {\n // DB takes priority: try stored scorer definitions first\n if (scorerStore) {\n try {\n const storedDef = await scorerStore.getByIdResolved(scorerKey);\n if (storedDef) {\n const scorer = this.editor.scorer.resolve(storedDef);\n if (scorer) {\n resolvedScorers[scorerKey] = { scorer, sampling: scorerConfig.sampling };\n continue;\n }\n }\n } catch {\n // Fall through to registry lookup\n }\n }\n\n // Fall back to registry scorers\n try {\n const scorer = this.mastra.getScorer(scorerKey);\n resolvedScorers[scorerKey] = { scorer, sampling: scorerConfig.sampling };\n } catch {\n try {\n const scorer = this.mastra.getScorerById(scorerKey);\n resolvedScorers[scorerKey] = { scorer, sampling: scorerConfig.sampling };\n } catch {\n this.logger?.warn(`Scorer \"${scorerKey}\" referenced in stored agent but not found in registry or storage`);\n }\n }\n }\n\n return Object.keys(resolvedScorers).length > 0 ? resolvedScorers : undefined;\n }\n\n // ============================================================================\n // Clone\n // ============================================================================\n\n /**\n * Clone a runtime Agent instance into storage, creating a new stored agent\n * with the resolved configuration of the source agent.\n */\n async clone(\n agent: Agent,\n options: {\n newId: string;\n newName?: string;\n metadata?: Record<string, unknown>;\n authorId?: string;\n visibility?: 'private' | 'public';\n requestContext?: RequestContext;\n },\n ): Promise<StorageResolvedAgentType> {\n const requestContext = options.requestContext ?? new RequestContext();\n\n // 1. Extract model config\n const llm = await agent.getLLM({ requestContext });\n const provider = llm.getProvider();\n const modelId = llm.getModelId();\n\n const defaultOptions = await agent.getDefaultOptions({ requestContext });\n const modelSettings = (defaultOptions as Record<string, any>)?.modelSettings;\n\n const model: StorageModelConfig = {\n provider,\n name: modelId,\n ...(modelSettings?.temperature !== undefined && { temperature: modelSettings.temperature }),\n ...(modelSettings?.topP !== undefined && { topP: modelSettings.topP }),\n ...(modelSettings?.frequencyPenalty !== undefined && { frequencyPenalty: modelSettings.frequencyPenalty }),\n ...(modelSettings?.presencePenalty !== undefined && { presencePenalty: modelSettings.presencePenalty }),\n ...(modelSettings?.maxOutputTokens !== undefined && { maxCompletionTokens: modelSettings.maxOutputTokens }),\n };\n\n // 2. Extract instructions\n const instructions = await agent.getInstructions({ requestContext });\n let instructionsStr: string;\n if (typeof instructions === 'string') {\n instructionsStr = instructions;\n } else if (Array.isArray(instructions)) {\n instructionsStr = instructions\n .map(msg => {\n if (typeof msg === 'string') {\n return msg;\n }\n return typeof msg.content === 'string' ? msg.content : '';\n })\n .filter(Boolean)\n .join('\\n\\n');\n } else if (instructions && typeof instructions === 'object' && 'content' in instructions) {\n instructionsStr = typeof instructions.content === 'string' ? instructions.content : '';\n } else {\n instructionsStr = '';\n }\n\n // 3. Extract tool keys\n const tools = await agent.listTools({ requestContext });\n const toolKeys = Object.keys(tools || {});\n\n // 4. Extract workflow keys\n const workflows = await agent.listWorkflows({ requestContext });\n const workflowKeys = Object.keys(workflows || {});\n\n // 5. Extract sub-agent keys\n const agentsResolved = await agent.listAgents({ requestContext });\n const agentKeys = Object.keys(agentsResolved || {});\n\n // 6. Extract memory config\n const memory = await agent.getMemory({ requestContext });\n const memoryConfig = memory?.getConfig();\n\n // 7. Processors from code-defined agents cannot be automatically serialized\n // to a StoredProcessorGraph (requires provider ID + config). Processors must\n // be configured via the editor UI after cloning.\n\n // 8. Extract scorer keys with sampling config\n let storedScorers: Record<string, StorageScorerConfig> | undefined;\n const resolvedScorers = await agent.listScorers({ requestContext });\n if (resolvedScorers && Object.keys(resolvedScorers).length > 0) {\n storedScorers = {};\n for (const [key, entry] of Object.entries(resolvedScorers)) {\n storedScorers[key] = {\n ...(entry.sampling && { sampling: entry.sampling }),\n };\n }\n }\n\n // 9. Extract default options (serializable parts only)\n const storageDefaultOptions: StorageDefaultOptions | undefined = defaultOptions\n ? {\n maxSteps: (defaultOptions as Record<string, any>)?.maxSteps,\n runId: (defaultOptions as Record<string, any>)?.runId,\n savePerStep: (defaultOptions as Record<string, any>)?.savePerStep,\n activeTools: (defaultOptions as Record<string, any>)?.activeTools,\n toolChoice: (defaultOptions as Record<string, any>)?.toolChoice,\n modelSettings: (defaultOptions as Record<string, any>)?.modelSettings,\n returnScorerData: (defaultOptions as Record<string, any>)?.returnScorerData,\n requireToolApproval: (defaultOptions as Record<string, any>)?.requireToolApproval,\n autoResumeSuspendedTools: (defaultOptions as Record<string, any>)?.autoResumeSuspendedTools,\n toolCallConcurrency: (defaultOptions as Record<string, any>)?.toolCallConcurrency,\n maxProcessorRetries: (defaultOptions as Record<string, any>)?.maxProcessorRetries,\n includeRawChunks: (defaultOptions as Record<string, any>)?.includeRawChunks,\n }\n : undefined;\n\n let resolvedMetadata = options.metadata;\n if (resolvedMetadata === undefined && typeof agent.getMetadata === 'function') {\n try {\n resolvedMetadata = await agent.getMetadata({ requestContext });\n } catch {}\n }\n\n // 10. Create the stored agent\n const createInput: StorageCreateAgentInput = {\n id: options.newId,\n name: options.newName || `${agent.name} (Clone)`,\n description: agent.getDescription() || undefined,\n instructions: instructionsStr,\n model,\n tools: toolKeys.length > 0 ? Object.fromEntries(toolKeys.map(key => [key, {}])) : undefined,\n workflows: workflowKeys.length > 0 ? Object.fromEntries(workflowKeys.map(key => [key, {}])) : undefined,\n agents: agentKeys.length > 0 ? Object.fromEntries(agentKeys.map(key => [key, {}])) : undefined,\n memory: memoryConfig,\n scorers: storedScorers,\n defaultOptions: storageDefaultOptions,\n metadata: resolvedMetadata,\n authorId: options.authorId,\n visibility: options.visibility,\n };\n\n const adapter = await this.getStorageAdapter();\n await adapter.create(createInput);\n\n const resolved = await adapter.getByIdResolved(options.newId);\n if (!resolved) {\n throw new Error(`Failed to resolve cloned agent '${options.newId}' after creation.`);\n }\n\n return resolved;\n }\n\n // ============================================================================\n // Workspace Resolution\n // ============================================================================\n\n /**\n * Resolve a stored workspace reference to a runtime Workspace instance.\n * Handles both ID-based references (looked up from editor.workspace) and\n * inline workspace configurations (hydrated directly).\n *\n * When a skillSource is provided (from resolveAgentSkillSource), it is passed\n * to the workspace hydration so the workspace uses versioned blob-backed skills\n * instead of filesystem-based discovery.\n */\n private async resolveStoredWorkspace(\n workspaceRef: StorageWorkspaceRef | undefined,\n skillSource?: SkillSource,\n ): Promise<Workspace<any, any, any> | undefined> {\n if (!workspaceRef) return undefined;\n\n const workspaceNs = this.editor.workspace;\n if (!workspaceNs) {\n this.logger?.warn('[resolveStoredWorkspace] No workspace namespace available on editor');\n return undefined;\n }\n\n const hydrateOptions = skillSource ? { skillSource } : undefined;\n\n if (workspaceRef.type === 'id') {\n // Try DB first — stored workspaces are the source of truth\n const resolved = await workspaceNs.getById(workspaceRef.workspaceId);\n if (resolved) {\n return workspaceNs.hydrateSnapshotToWorkspace(workspaceRef.workspaceId, resolved, hydrateOptions);\n }\n\n // Not in DB — fall back to runtime registry (code-defined workspaces)\n try {\n const runtimeWorkspace = this.mastra?.getWorkspaceById(workspaceRef.workspaceId);\n if (runtimeWorkspace) {\n this.logger?.debug(\n `[resolveStoredWorkspace] Workspace '${workspaceRef.workspaceId}' found in runtime registry (not in DB)`,\n );\n return runtimeWorkspace;\n }\n } catch {\n // getWorkspaceById throws if not found — that's expected\n }\n\n this.logger?.warn(\n `[resolveStoredWorkspace] Workspace '${workspaceRef.workspaceId}' not found in storage or runtime registry, skipping`,\n );\n return undefined;\n }\n\n if (workspaceRef.type === 'inline') {\n // Use a deterministic ID based on config content to avoid leaking\n // duplicate workspace instances on repeated calls.\n const configHash = createHash('sha256').update(JSON.stringify(workspaceRef.config)).digest('hex').slice(0, 12);\n return workspaceNs.hydrateSnapshotToWorkspace(`inline-${configHash}`, workspaceRef.config, hydrateOptions);\n }\n\n return undefined;\n }\n\n /**\n * Resolve a stored browser config to a runtime MastraBrowser instance.\n * Looks up the provider by ID in the editor's browser registry.\n * Only supports `type: 'inline'` refs (config is embedded in the agent snapshot).\n */\n private async resolveStoredBrowser(browserRef: StorageBrowserRef | undefined): Promise<MastraBrowser | undefined> {\n if (!browserRef) return undefined;\n\n if (browserRef.type === 'inline') {\n const { provider: providerId, ...config } = browserRef.config;\n const browserProvider = this.editor.__browsers.get(providerId);\n if (!browserProvider) {\n this.logger?.warn(\n `[resolveStoredBrowser] Browser provider \"${providerId}\" is not registered. ` +\n `Register it via new MastraEditor({ browsers: { '${providerId}': yourProvider } })`,\n );\n return undefined;\n }\n return await browserProvider.createBrowser(config);\n }\n\n return undefined;\n }\n\n /**\n * Resolve agent-level skill configurations into a CompositeVersionedSkillSource.\n *\n * For each skill in the agent's `skills` map, checks the resolution strategy:\n * - `pin: '<versionId>'` → reads the specific version's tree from the DB\n * - `strategy: 'latest'` → reads the skill's active version tree\n * - `strategy: 'live'` or no strategy → skips (uses filesystem-based discovery)\n *\n * Returns a CompositeVersionedSkillSource if any versioned skills were resolved,\n * or undefined if all skills use filesystem-based discovery.\n */\n private async resolveAgentSkillSource(skills: StorageResolvedAgentType['skills']): Promise<SkillSource | undefined> {\n if (!skills || typeof skills !== 'object') return undefined;\n\n // Resolve conditional field to a plain record\n const skillConfigs = Array.isArray(skills) ? undefined : (skills as Record<string, StorageSkillConfig>);\n if (!skillConfigs || Object.keys(skillConfigs).length === 0) return undefined;\n\n const storage = this.mastra?.getStorage();\n if (!storage) return undefined;\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) return undefined;\n\n const blobStore = await this.editor.resolveBlobStore();\n if (!blobStore) return undefined;\n\n const versionedEntries: VersionedSkillEntry[] = [];\n\n for (const [skillId, config] of Object.entries(skillConfigs)) {\n if (!config) continue;\n\n // Determine if this skill should use versioned resolution\n const isPinned = !!config.pin;\n const isLatest = config.strategy === 'latest';\n\n if (!isPinned && !isLatest) {\n // 'live' strategy or no strategy — skip, use filesystem\n continue;\n }\n\n try {\n let version;\n let dirName: string;\n\n if (isPinned) {\n // Look up the specific pinned version\n version = await skillStore.getVersion(config.pin!);\n dirName = version?.name || skillId;\n } else {\n // strategy: 'latest' — resolve using activeVersionId (honors rollback)\n const resolved = await skillStore.getByIdResolved(skillId);\n if (resolved?.activeVersionId) {\n version = await skillStore.getVersion(resolved.activeVersionId);\n }\n if (!version) {\n version = await skillStore.getLatestVersion(skillId);\n }\n dirName = resolved?.name || version?.name || skillId;\n }\n\n if (!version?.tree) {\n this.logger?.warn(\n `[resolveAgentSkillSource] Skill '${skillId}' version has no tree manifest, skipping versioned resolution`,\n );\n continue;\n }\n versionedEntries.push({\n dirName,\n tree: version.tree,\n versionCreatedAt: version.createdAt,\n });\n } catch (error) {\n this.logger?.warn(`[resolveAgentSkillSource] Failed to resolve version for skill '${skillId}': ${error}`);\n }\n }\n\n if (versionedEntries.length === 0) return undefined;\n\n return new CompositeVersionedSkillSource(versionedEntries, blobStore);\n }\n}\n","/**\n * RuleEvaluator: Evaluates recursive RuleGroup conditions against a context object.\n *\n * Supports:\n * - Leaf rules with operators: equals, not_equals, contains, not_contains,\n * greater_than, less_than, greater_than_or_equal, less_than_or_equal,\n * in, not_in, exists, not_exists\n * - Recursive AND / OR grouping via RuleGroup\n */\n\nimport type { Rule, RuleGroup } from '@mastra/core/storage';\n\n/**\n * Resolves a dot-notation path against a context object.\n */\nfunction resolvePath(context: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\n let current: unknown = context;\n\n for (const segment of segments) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Evaluates a single leaf rule against a context object.\n */\nfunction evaluateRule(rule: Rule, context: Record<string, unknown>): boolean {\n const fieldValue = resolvePath(context, rule.field);\n\n switch (rule.operator) {\n case 'equals':\n return fieldValue === rule.value;\n\n case 'not_equals':\n return fieldValue !== rule.value;\n\n case 'contains': {\n if (typeof fieldValue === 'string' && typeof rule.value === 'string') {\n return fieldValue.includes(rule.value);\n }\n if (Array.isArray(fieldValue)) {\n return fieldValue.includes(rule.value);\n }\n return false;\n }\n\n case 'not_contains': {\n if (typeof fieldValue === 'string' && typeof rule.value === 'string') {\n return !fieldValue.includes(rule.value);\n }\n if (Array.isArray(fieldValue)) {\n return !fieldValue.includes(rule.value);\n }\n return true;\n }\n\n case 'greater_than':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue > rule.value;\n\n case 'less_than':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue < rule.value;\n\n case 'greater_than_or_equal':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue >= rule.value;\n\n case 'less_than_or_equal':\n return typeof fieldValue === 'number' && typeof rule.value === 'number' && fieldValue <= rule.value;\n\n case 'in':\n return Array.isArray(rule.value) && rule.value.includes(fieldValue);\n\n case 'not_in':\n return Array.isArray(rule.value) && !rule.value.includes(fieldValue);\n\n case 'exists':\n return fieldValue !== undefined && fieldValue !== null;\n\n case 'not_exists':\n return fieldValue === undefined || fieldValue === null;\n\n default:\n return false;\n }\n}\n\n/**\n * Evaluates a RuleGroup (which may contain nested RuleGroups) against a context object.\n *\n * @param ruleGroup - The rule group to evaluate (AND/OR with nested conditions)\n * @param context - The context object to evaluate against\n * @returns true if the rule group passes, false otherwise\n */\nexport function evaluateRuleGroup(ruleGroup: RuleGroup, context: Record<string, unknown>): boolean {\n if (ruleGroup.conditions.length === 0) {\n // Empty conditions = always true (no constraints)\n return true;\n }\n\n const results = ruleGroup.conditions.map(condition => {\n if ('conditions' in condition) {\n // Nested RuleGroup\n return evaluateRuleGroup(condition, context);\n }\n // Leaf Rule\n return evaluateRule(condition, context);\n });\n\n if (ruleGroup.operator === 'AND') {\n return results.every(Boolean);\n }\n\n // OR\n return results.some(Boolean);\n}\n","/**\n * TemplateEngine: Simple variable interpolation for prompt block content.\n *\n * Supports:\n * {{variableName}} - Direct variable substitution\n * {{nested.path.value}} - Dot-notation path resolution\n * {{variable || 'default'}} - Fallback values (single or double quotes)\n *\n * Variables that cannot be resolved (and have no fallback) are left as-is.\n */\n\n/**\n * Resolves a dot-notation path against a context object.\n * Returns undefined if any segment is missing.\n */\nfunction resolvePath(context: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\n let current: unknown = context;\n\n for (const segment of segments) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Pattern that matches:\n * {{variableName}}\n * {{nested.path}}\n * {{variable || 'fallback'}}\n * {{variable || \"fallback\"}}\n *\n * Captures:\n * Group 1: the variable path (trimmed)\n * Group 2 (optional): the fallback value (without quotes)\n */\nconst TEMPLATE_PATTERN = /\\{\\{\\s*([a-zA-Z_][\\w.]*)\\s*(?:\\|\\|\\s*(?:'([^']*)'|\"([^\"]*)\")\\s*)?\\}\\}/g;\n\n/**\n * Renders a template string by interpolating variables from the given context.\n *\n * @param template - The template string with {{variable}} placeholders\n * @param context - A key-value context object for variable resolution\n * @returns The rendered string with variables replaced\n */\nexport function renderTemplate(template: string, context: Record<string, unknown>): string {\n return template.replace(\n TEMPLATE_PATTERN,\n (match, variablePath: string, singleFallback?: string, doubleFallback?: string) => {\n const resolved = resolvePath(context, variablePath);\n\n if (resolved !== undefined && resolved !== null) {\n if (typeof resolved === 'object') {\n return JSON.stringify(resolved);\n }\n return String(resolved);\n }\n\n // Use fallback if provided\n const fallback = singleFallback ?? doubleFallback;\n if (fallback !== undefined) {\n return fallback;\n }\n\n // Leave unresolved variables as-is\n return match;\n },\n );\n}\n","/**\n * InstructionBuilder: Resolves an array of AgentInstructionBlock items\n * into a final instruction string.\n *\n * For each block:\n * - `{ type: 'text', content }` → render template with context\n * - `{ type: 'prompt_block_ref', id }` → fetch from storage, evaluate rules, render template\n * - `{ type: 'prompt_block', content, rules? }` → inline block, evaluate rules, render template\n *\n * Blocks that fail rule evaluation are excluded.\n * Resolved text segments are joined with double newlines.\n */\n\nimport type { AgentInstructionBlock, StorageResolvedPromptBlockType } from '@mastra/core/storage';\nimport type { PromptBlocksStorage } from '@mastra/core/storage';\n\nimport { renderTemplate } from './template-engine';\nimport { evaluateRuleGroup } from './rule-evaluator';\n\nexport interface InstructionBuilderDeps {\n promptBlocksStorage: PromptBlocksStorage;\n /** When true, include draft (unpublished) prompt block refs. Used for preview mode. */\n includeDrafts?: boolean;\n}\n\n/**\n * Resolves an array of instruction blocks into a final instruction string.\n *\n * @param blocks - Array of instruction block references (text, prompt_block_ref, or inline prompt_block)\n * @param context - Runtime context for template interpolation and rule evaluation\n * @param deps - Dependencies (storage)\n * @returns The resolved instruction string\n */\nexport async function resolveInstructionBlocks(\n blocks: AgentInstructionBlock[],\n context: Record<string, unknown>,\n deps: InstructionBuilderDeps,\n): Promise<string> {\n const segments: string[] = [];\n\n // Batch-fetch all prompt block ref IDs to avoid N+1 queries\n const blockIds = Array.from(\n new Set(\n blocks.filter((b): b is { type: 'prompt_block_ref'; id: string } => b.type === 'prompt_block_ref').map(b => b.id),\n ),\n );\n\n const resolvedBlocksMap = new Map<string, StorageResolvedPromptBlockType>();\n if (blockIds.length > 0) {\n // When includeDrafts is set, resolve the latest version (draft) instead of the published one\n const resolveOptions = deps.includeDrafts ? { status: 'draft' as const } : undefined;\n // Fetch all blocks in parallel\n const fetchResults = await Promise.all(\n blockIds.map(id => deps.promptBlocksStorage.getByIdResolved(id, resolveOptions)),\n );\n for (let i = 0; i < blockIds.length; i++) {\n const result = fetchResults[i];\n if (result) {\n resolvedBlocksMap.set(blockIds[i]!, result);\n }\n }\n }\n\n for (const block of blocks) {\n if (block.type === 'text') {\n // Static text blocks: render template, always included\n const rendered = renderTemplate(block.content, context);\n if (rendered.trim()) {\n segments.push(rendered);\n }\n continue;\n }\n\n if (block.type === 'prompt_block') {\n // Inline prompt block: evaluate rules and render template directly\n if (block.rules) {\n const passes = evaluateRuleGroup(block.rules, context);\n if (!passes) {\n continue;\n }\n }\n\n const rendered = renderTemplate(block.content, context);\n if (rendered.trim()) {\n segments.push(rendered);\n }\n continue;\n }\n\n // Prompt block reference (prompt_block_ref)\n const resolved = resolvedBlocksMap.get(block.id);\n if (!resolved) {\n // Block not found in storage — skip silently\n continue;\n }\n\n // Only include published blocks (unless in preview/draft mode)\n if (!deps.includeDrafts && resolved.status !== 'published') {\n continue;\n }\n\n // Evaluate rules if present\n if (resolved.rules) {\n const passes = evaluateRuleGroup(resolved.rules, context);\n if (!passes) {\n continue;\n }\n }\n\n // Render template content\n const rendered = renderTemplate(resolved.content, context);\n if (rendered.trim()) {\n segments.push(rendered);\n }\n }\n\n return segments.join('\\n\\n');\n}\n","/**\n * Hydrates a StoredProcessorGraph into a ProcessorWorkflow.\n *\n * Resolves each graph step to a PhaseFilteredProcessor via the registered\n * ProcessorProvider, then builds a workflow from the graph structure\n * (sequential, parallel, conditional).\n */\nimport type {\n Processor,\n ProcessorWorkflow,\n InputProcessorOrWorkflow,\n OutputProcessorOrWorkflow,\n} from '@mastra/core/processors';\nimport { ProcessorStepSchema } from '@mastra/core/processors';\nimport type { ProcessorProvider } from '@mastra/core/processor-provider';\nimport { PhaseFilteredProcessor } from '@mastra/core/processor-provider';\nimport type { StoredProcessorGraph, ProcessorGraphEntry, ProcessorGraphStep } from '@mastra/core/storage';\nimport { createWorkflow, createStep } from '@mastra/core/workflows';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type { Mastra } from '@mastra/core';\n\nimport { evaluateRuleGroup } from './rule-evaluator';\n\nconst PASSTHROUGH_STEP_PREFIX = 'passthrough-';\n\ninterface HydrationContext {\n providers: Record<string, ProcessorProvider>;\n mastra?: Mastra;\n logger?: IMastraLogger;\n}\n\n/**\n * Resolve a single ProcessorGraphStep into a PhaseFilteredProcessor instance.\n */\nfunction resolveStep(step: ProcessorGraphStep, ctx: HydrationContext): Processor | undefined {\n const provider = ctx.providers[step.providerId];\n if (!provider) {\n ctx.logger?.warn(`ProcessorProvider \"${step.providerId}\" not found for graph step \"${step.id}\"`);\n return undefined;\n }\n\n const processor = provider.createProcessor(step.config);\n\n // Wrap with phase filtering if only a subset of phases are enabled\n const allProviderPhases = provider.availablePhases;\n const enabledSet = new Set(step.enabledPhases);\n const needsFiltering = allProviderPhases.some(p => !enabledSet.has(p));\n\n if (needsFiltering) {\n const filtered = new PhaseFilteredProcessor(processor, step.enabledPhases);\n // Register Mastra on the filtered wrapper (which delegates to the inner processor)\n if (ctx.mastra) {\n filtered.__registerMastra(ctx.mastra as any);\n }\n return filtered;\n }\n\n // Register Mastra directly on the processor when no filtering is needed\n if (ctx.mastra && processor.__registerMastra) {\n processor.__registerMastra(ctx.mastra as any);\n }\n\n return processor;\n}\n\n/**\n * Check if a graph is purely sequential (no parallel/conditional entries).\n */\nfunction isSequentialOnly(entries: ProcessorGraphEntry[]): boolean {\n return entries.every(e => e.type === 'step');\n}\n\n/**\n * Hydrate a StoredProcessorGraph into a flat array of Processor instances.\n * Only works for simple sequential graphs.\n */\nfunction hydrateSequential(entries: ProcessorGraphEntry[], ctx: HydrationContext): Processor[] {\n const processors: Processor[] = [];\n for (const entry of entries) {\n if (entry.type !== 'step') continue;\n const processor = resolveStep(entry.step, ctx);\n if (processor) {\n processors.push(processor);\n }\n }\n return processors;\n}\n\n/**\n * After .parallel() or .branch(), the workflow output is keyed by step ID:\n * { [stepId]: ProcessorStepOutput, ... }\n *\n * This map function picks the first branch result that has a valid ProcessorStepOutput\n * shape and returns it as a flat object for downstream steps / the processor runner.\n */\nasync function mergeBranchOutputs({ inputData }: { inputData: Record<string, any> }) {\n // inputData is { [stepId]: { phase, messages, ... }, ... }\n // Find the first branch result with processor-compatible shape.\n // Prefer non-passthrough branches (real processor output) over passthrough fallback.\n const keys = Object.keys(inputData).sort((a, b) => {\n const aPass = a.startsWith(PASSTHROUGH_STEP_PREFIX) ? 1 : 0;\n const bPass = b.startsWith(PASSTHROUGH_STEP_PREFIX) ? 1 : 0;\n return aPass - bPass;\n });\n for (const key of keys) {\n const val = inputData[key];\n if (val && typeof val === 'object' && 'phase' in val) {\n return {\n phase: val.phase,\n messages: val.messages,\n messageList: val.messageList,\n ...(val.systemMessages ? { systemMessages: val.systemMessages } : {}),\n ...(val.part !== undefined ? { part: val.part } : {}),\n ...(val.streamParts ? { streamParts: val.streamParts } : {}),\n ...(val.state ? { state: val.state } : {}),\n ...(val.text !== undefined ? { text: val.text } : {}),\n ...(val.retryCount !== undefined ? { retryCount: val.retryCount } : {}),\n };\n }\n }\n // Fallback: return inputData as-is (shouldn't happen with valid processor graphs)\n return inputData;\n}\n\n/**\n * Build a ProcessorWorkflow from graph entries.\n * Handles sequential steps, parallel branches, and conditional branches.\n */\nfunction buildWorkflow(\n entries: ProcessorGraphEntry[],\n workflowId: string,\n ctx: HydrationContext,\n): ProcessorWorkflow | undefined {\n // Resolve all steps and convert to workflow steps\n let workflow = createWorkflow({\n id: workflowId,\n inputSchema: ProcessorStepSchema,\n outputSchema: ProcessorStepSchema,\n type: 'processor' as any,\n options: {\n validateInputs: false,\n },\n });\n\n let hasSteps = false;\n\n for (const entry of entries) {\n if (entry.type === 'step') {\n const processor = resolveStep(entry.step, ctx);\n if (!processor) continue;\n const step = createStep(processor as Parameters<typeof createStep>[0]);\n workflow = workflow.then(step);\n hasSteps = true;\n } else if (entry.type === 'parallel') {\n // Build parallel branches: each branch is an array of entries\n const branchSteps = entry.branches\n .map((branchEntries, branchIdx) => {\n // Each branch must be a single step (or sub-workflow) for the parallel API\n // For multi-step branches, wrap in a sub-workflow\n if (branchEntries.length === 1 && branchEntries[0]!.type === 'step') {\n const proc = resolveStep(branchEntries[0]!.step, ctx);\n if (!proc) return undefined;\n return createStep(proc as Parameters<typeof createStep>[0]);\n }\n // Multi-step branch: build a sub-workflow\n const subWorkflow = buildWorkflow(branchEntries, `${workflowId}-parallel-branch-${branchIdx}`, ctx);\n return subWorkflow;\n })\n .filter((s): s is NonNullable<typeof s> => Boolean(s));\n\n if (branchSteps.length > 0) {\n workflow = workflow.parallel(branchSteps as any);\n // After parallel, outputs are keyed by step ID: { [stepId]: ProcessorStepOutput }\n // Map back to a flat ProcessorStepOutput for downstream steps / processor runner\n workflow = workflow.map(mergeBranchOutputs as any);\n hasSteps = true;\n }\n } else if (entry.type === 'conditional') {\n // Build conditional branches using .branch()\n // branch() takes Array<[ConditionFunction, Step]> tuples\n const branchTuples: Array<[any, any]> = [];\n\n for (const [i, condition] of entry.conditions.entries()) {\n // Each condition branch is an array of entries\n let branchStep: any;\n if (condition.steps.length === 1 && condition.steps[0]!.type === 'step') {\n const proc = resolveStep(condition.steps[0]!.step, ctx);\n if (!proc) continue;\n branchStep = createStep(proc as Parameters<typeof createStep>[0]);\n } else {\n branchStep = buildWorkflow(condition.steps, `${workflowId}-cond-branch-${i}`, ctx);\n if (!branchStep) continue;\n }\n\n if (condition.rules) {\n // Conditional branch with RuleGroup evaluated against the previous step's output\n const rules = condition.rules;\n const conditionFn = async ({ inputData }: { inputData: Record<string, unknown> }) => {\n return evaluateRuleGroup(rules, inputData);\n };\n branchTuples.push([conditionFn, branchStep]);\n } else {\n // Default branch (no rules = always matches, acts as fallback)\n branchTuples.push([async () => true, branchStep]);\n }\n }\n\n if (branchTuples.length > 0) {\n // Always add a pass-through fallback so the workflow returns input unchanged\n // when no user-defined condition matches (e.g. during inputStep/outputStep phases\n // where conditions only target 'input' or 'outputResult' phase).\n const passthroughStep = createStep({\n id: `${PASSTHROUGH_STEP_PREFIX}${workflowId}`,\n inputSchema: ProcessorStepSchema,\n outputSchema: ProcessorStepSchema,\n execute: async ({ inputData }) => inputData,\n });\n branchTuples.push([async () => true, passthroughStep]);\n\n workflow = (workflow as any).branch(branchTuples);\n // After branch, outputs are keyed by step ID: { [stepId]: ProcessorStepOutput }\n // Map back to a flat ProcessorStepOutput for downstream steps / processor runner\n workflow = (workflow as any).map(mergeBranchOutputs);\n hasSteps = true;\n }\n }\n }\n\n if (!hasSteps) return undefined;\n\n return (workflow as any).commit() as ProcessorWorkflow;\n}\n\n/**\n * Hydrate a StoredProcessorGraph into an array of InputProcessorOrWorkflow.\n *\n * For simple sequential graphs, returns individual Processor instances.\n * For complex graphs (with parallel/conditional entries), builds a ProcessorWorkflow.\n */\nexport function hydrateProcessorGraph(\n graph: StoredProcessorGraph | undefined,\n mode: 'input' | 'output',\n ctx: HydrationContext,\n): InputProcessorOrWorkflow[] | OutputProcessorOrWorkflow[] | undefined {\n if (!graph) return undefined;\n\n // Backward compat: old storage format used string[] of processor IDs.\n // These can't be coerced to the new StoredProcessorGraph format since they\n // reference Mastra.processors by ID, not ProcessorProvider configs.\n if (Array.isArray(graph)) {\n ctx.logger?.warn(\n 'Processor graph is in legacy string[] format and cannot be hydrated. Re-save the agent to migrate.',\n );\n return undefined;\n }\n\n if (!Array.isArray(graph.steps) || graph.steps.length === 0) return undefined;\n\n // Simple sequential graph: return flat processor array\n if (isSequentialOnly(graph.steps)) {\n const processors = hydrateSequential(graph.steps, ctx);\n if (processors.length === 0) return undefined;\n\n // Filter by mode: input processors need input methods, output processors need output methods\n if (mode === 'input') {\n const filtered = processors.filter(p => p.processInput || p.processInputStep);\n return filtered.length > 0 ? (filtered as InputProcessorOrWorkflow[]) : undefined;\n } else {\n const filtered = processors.filter(p => p.processOutputStream || p.processOutputResult || p.processOutputStep);\n return filtered.length > 0 ? (filtered as OutputProcessorOrWorkflow[]) : undefined;\n }\n }\n\n // Complex graph: build a workflow\n const workflowId = `stored-${mode}-processor-graph`;\n const workflow = buildWorkflow(graph.steps, workflowId, ctx);\n if (!workflow) return undefined;\n\n return [workflow] as InputProcessorOrWorkflow[] | OutputProcessorOrWorkflow[];\n}\n\n/**\n * Select the first matching StoredProcessorGraph from a list of conditional variants.\n * Unlike array variants (which accumulate), processor graphs are complete pipelines\n * and the first match wins.\n */\nexport function selectFirstMatchingGraph(\n variants: Array<{ value: StoredProcessorGraph; rules?: any }>,\n context: Record<string, unknown>,\n): StoredProcessorGraph | undefined {\n for (const variant of variants) {\n if (!variant.rules || evaluateRuleGroup(variant.rules, context)) {\n return variant.value;\n }\n }\n return undefined;\n}\n","import type {\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageResolvedMCPClientType,\n StorageListMCPClientsResolvedOutput,\n StorageMCPServerConfig,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorMCPNamespace extends CrudEditorNamespace<\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageListMCPClientsResolvedOutput,\n StorageResolvedMCPClientType\n> {\n protected override onCacheEvict(_id: string): void {\n // MCP clients don't register in Mastra's runtime — no cleanup needed.\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageListMCPClientsResolvedOutput,\n StorageResolvedMCPClientType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('mcpClients');\n if (!store) throw new Error('MCP clients storage domain is not available');\n\n return {\n create: input => store.create({ mcpClient: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Convert a stored MCP server config into the shape expected by MCPClient.\n * Converts `url` from string to URL for HTTP servers.\n * Returns a plain object — callers must pass it to `new MCPClient()`.\n */\n static toMCPServerDefinition(\n serverConfig: StorageMCPServerConfig,\n requestInit?: { headers: Record<string, string> },\n ): Record<string, unknown> {\n if (serverConfig.type === 'stdio') {\n return {\n command: serverConfig.command!,\n args: serverConfig.args,\n env: serverConfig.env,\n timeout: serverConfig.timeout,\n };\n }\n\n // HTTP transport — include requestInit (e.g., auth headers) when provided\n return {\n url: new URL(serverConfig.url!),\n timeout: serverConfig.timeout,\n ...(requestInit ? { requestInit } : {}),\n };\n }\n\n /**\n * Convert all servers in a stored MCP client to MCPClientOptions shape.\n */\n static toMCPClientOptions(\n config: StorageResolvedMCPClientType,\n requestInit?: { headers: Record<string, string> },\n ): {\n id: string;\n servers: Record<string, Record<string, unknown>>;\n } {\n const servers: Record<string, Record<string, unknown>> = {};\n for (const [name, serverConfig] of Object.entries(config.servers)) {\n servers[name] = EditorMCPNamespace.toMCPServerDefinition(serverConfig, requestInit);\n }\n return { id: config.id, servers };\n }\n}\n","import type { MCPServerBase } from '@mastra/core/mcp';\nimport type { ToolAction } from '@mastra/core/tools';\nimport type { Agent } from '@mastra/core/agent';\nimport type { Workflow } from '@mastra/core/workflows';\nimport type {\n StorageCreateMCPServerInput,\n StorageUpdateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageResolvedMCPServerType,\n StorageListMCPServersResolvedOutput,\n StorageToolConfig,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorMCPServerNamespace extends CrudEditorNamespace<\n StorageCreateMCPServerInput,\n StorageUpdateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageListMCPServersResolvedOutput,\n StorageResolvedMCPServerType,\n MCPServerBase\n> {\n private mcpServerCtor: any;\n\n protected override onCacheEvict(_id: string): void {\n // No removeMCPServer API exists on Mastra yet.\n // The server will be re-created on next hydration.\n }\n\n protected override async hydrate(resolved: StorageResolvedMCPServerType): Promise<MCPServerBase> {\n if (!this.mastra) {\n throw new Error('MastraEditor is not registered with a Mastra instance');\n }\n\n const tools = this.resolveStoredTools(resolved.tools);\n const agents = this.resolveStoredAgents(resolved.agents);\n const workflows = this.resolveStoredWorkflows(resolved.workflows);\n\n if (!this.mcpServerCtor) {\n try {\n const mod = await import('@mastra/mcp');\n this.mcpServerCtor = mod.MCPServer;\n } catch {\n throw new Error(\n '@mastra/mcp is required to hydrate MCP server configurations. Install it with: npm install @mastra/mcp',\n );\n }\n }\n\n const server: MCPServerBase = new this.mcpServerCtor({\n id: resolved.id,\n name: resolved.name,\n version: resolved.version,\n description: resolved.description,\n instructions: resolved.instructions,\n repository: resolved.repository,\n releaseDate: resolved.releaseDate,\n isLatest: resolved.isLatest,\n packageCanonical: resolved.packageCanonical,\n tools,\n agents,\n workflows,\n });\n\n this.mastra.addMCPServer(server, resolved.id);\n\n return server;\n }\n\n private resolveStoredTools(\n storedTools?: Record<string, StorageToolConfig>,\n ): Record<string, ToolAction<any, any, any, any, any, any>> {\n if (!storedTools || Object.keys(storedTools).length === 0) return {};\n if (!this.mastra) return {};\n\n const resolved: Record<string, ToolAction<any, any, any, any, any, any>> = {};\n for (const [toolKey, toolConfig] of Object.entries(storedTools)) {\n try {\n const tool = this.mastra.getToolById(toolKey);\n if (toolConfig.description) {\n resolved[toolKey] = { ...tool, description: toolConfig.description };\n } else {\n resolved[toolKey] = tool;\n }\n } catch {\n this.logger?.warn(`Tool \"${toolKey}\" referenced in stored MCP server but not registered in Mastra`);\n }\n }\n return resolved;\n }\n\n private resolveStoredAgents(storedAgents?: Record<string, StorageToolConfig>): Record<string, Agent<any>> {\n if (!storedAgents || Object.keys(storedAgents).length === 0) return {};\n if (!this.mastra) return {};\n\n const resolved: Record<string, Agent<any>> = {};\n for (const agentKey of Object.keys(storedAgents)) {\n try {\n resolved[agentKey] = this.mastra.getAgent(agentKey);\n } catch {\n try {\n resolved[agentKey] = this.mastra.getAgentById(agentKey);\n } catch {\n this.logger?.warn(`Agent \"${agentKey}\" referenced in stored MCP server but not registered in Mastra`);\n }\n }\n }\n return resolved;\n }\n\n private resolveStoredWorkflows(\n storedWorkflows?: Record<string, StorageToolConfig>,\n ): Record<string, Workflow<any, any, any, any, any, any, any>> {\n if (!storedWorkflows || Object.keys(storedWorkflows).length === 0) return {};\n if (!this.mastra) return {};\n\n const resolved: Record<string, Workflow<any, any, any, any, any, any, any>> = {};\n for (const workflowKey of Object.keys(storedWorkflows)) {\n try {\n resolved[workflowKey] = this.mastra.getWorkflow(workflowKey);\n } catch {\n try {\n resolved[workflowKey] = this.mastra.getWorkflowById(workflowKey);\n } catch {\n this.logger?.warn(`Workflow \"${workflowKey}\" referenced in stored MCP server but not registered in Mastra`);\n }\n }\n }\n return resolved;\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateMCPServerInput,\n StorageUpdateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageListMCPServersResolvedOutput,\n StorageResolvedMCPServerType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('mcpServers');\n if (!store) throw new Error('MCP servers storage domain is not available');\n\n return {\n create: input => store.create({ mcpServer: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n}\n","import type {\n AgentInstructionBlock,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageResolvedPromptBlockType,\n StorageListPromptBlocksResolvedOutput,\n} from '@mastra/core/storage';\n\nimport { resolveInstructionBlocks } from '../instruction-builder';\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorPromptNamespace extends CrudEditorNamespace<\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageListPromptBlocksResolvedOutput,\n StorageResolvedPromptBlockType\n> {\n protected override onCacheEvict(id: string): void {\n this.mastra?.removePromptBlock(id);\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageListPromptBlocksResolvedOutput,\n StorageResolvedPromptBlockType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('promptBlocks');\n if (!store) throw new Error('Prompt blocks storage domain is not available');\n\n return {\n create: input => store.create({ promptBlock: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n async preview(blocks: AgentInstructionBlock[], context: Record<string, unknown>): Promise<string> {\n this.ensureRegistered();\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('promptBlocks');\n if (!store) throw new Error('Prompt blocks storage domain is not available');\n return resolveInstructionBlocks(blocks, context, { promptBlocksStorage: store, includeDrafts: true });\n }\n}\n","import { createScorer } from '@mastra/core/evals';\nimport type { MastraScorer } from '@mastra/core/evals';\nimport type {\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageResolvedScorerDefinitionType,\n StorageListScorerDefinitionsResolvedOutput,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorScorerNamespace extends CrudEditorNamespace<\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageListScorerDefinitionsResolvedOutput,\n StorageResolvedScorerDefinitionType\n> {\n protected override onCacheEvict(id: string): void {\n this.mastra?.removeScorer(id);\n }\n\n /**\n * Hydrate a stored scorer definition into a runtime MastraScorer instance\n * and register it on the Mastra instance so it can be discovered via\n * `mastra.getScorer()` / `mastra.getScorerById()`.\n */\n protected override async hydrate(\n storedScorer: StorageResolvedScorerDefinitionType,\n ): Promise<StorageResolvedScorerDefinitionType> {\n const scorer = this.resolve(storedScorer);\n if (scorer && this.mastra) {\n this.mastra.addScorer(scorer, storedScorer.id, { source: 'stored' });\n }\n return storedScorer;\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageListScorerDefinitionsResolvedOutput,\n StorageResolvedScorerDefinitionType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('scorerDefinitions');\n if (!store) throw new Error('Scorer definitions storage domain is not available');\n\n return {\n create: input => store.create({ scorerDefinition: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Create a MastraScorer instance from a stored scorer definition.\n * Supports:\n * - 'llm-judge': Creates a scorer with a single LLM call using custom instructions\n * - Preset types (e.g., 'bias', 'toxicity'): Not yet supported, returns null\n */\n resolve(storedScorer: StorageResolvedScorerDefinitionType): MastraScorer<any, any, any, any> | null {\n if (storedScorer.type === 'llm-judge') {\n if (!storedScorer.instructions) {\n this.logger?.warn(`Stored scorer \"${storedScorer.id}\" is llm-judge but has no instructions`);\n return null;\n }\n\n const modelConfig = storedScorer.model;\n if (!modelConfig?.provider || !modelConfig?.name) {\n this.logger?.warn(`Stored scorer \"${storedScorer.id}\" has no valid model configuration`);\n return null;\n }\n\n const model = `${modelConfig.provider}/${modelConfig.name}`;\n const min = storedScorer.scoreRange?.min ?? 0;\n const max = storedScorer.scoreRange?.max ?? 1;\n\n const scorer = createScorer({\n id: storedScorer.id,\n name: storedScorer.name,\n description: storedScorer.description || `Custom LLM judge scorer: ${storedScorer.name}`,\n type: 'agent',\n judge: {\n model,\n instructions: storedScorer.instructions,\n },\n })\n .generateScore({\n description: `Score the output on a scale of ${min} to ${max}`,\n createPrompt: ({ run }) => {\n const input = typeof run.input === 'string' ? run.input : JSON.stringify(run.input);\n const output = typeof run.output === 'string' ? run.output : JSON.stringify(run.output);\n return `Evaluate the following interaction and provide a score between ${min} and ${max}.\n\nInput: ${input}\n\nOutput: ${output}\n\nProvide your score as a JSON object with a \"score\" field containing a number between ${min} and ${max}.`;\n },\n })\n .generateReason({\n description: 'Explain the reasoning behind the score',\n createPrompt: ({ run, score }) => {\n const input = typeof run.input === 'string' ? run.input : JSON.stringify(run.input);\n const output = typeof run.output === 'string' ? run.output : JSON.stringify(run.output);\n return `You scored the following interaction ${score} out of ${max}.\n\nInput: ${input}\n\nOutput: ${output}\n\nExplain your reasoning for this score in a clear, concise paragraph.`;\n },\n });\n\n if (this.mastra) {\n scorer.__registerMastra(this.mastra);\n }\n\n return scorer;\n }\n\n // Preset types — not yet supported\n this.logger?.warn(\n `Stored scorer \"${storedScorer.id}\" has type \"${storedScorer.type}\" which is a preset type. ` +\n `Preset instantiation from stored config is not yet supported.`,\n );\n return null;\n }\n}\n","import { Workspace, CompositeFilesystem } from '@mastra/core/workspace';\nimport type { WorkspaceFilesystem, WorkspaceSandbox, SkillSource } from '@mastra/core/workspace';\nimport type { WorkspaceConfig } from '@mastra/core/workspace';\nimport type {\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n StorageResolvedWorkspaceType,\n StorageListWorkspacesResolvedOutput,\n StorageWorkspaceSnapshotType,\n StorageWorkspaceToolsConfig,\n StorageFilesystemConfig,\n StorageSandboxConfig,\n} from '@mastra/core/storage';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorWorkspaceNamespace extends CrudEditorNamespace<\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n StorageListWorkspacesResolvedOutput,\n StorageResolvedWorkspaceType,\n StorageResolvedWorkspaceType\n> {\n protected override onCacheEvict(_id: string): void {\n // Workspaces are not registered in Mastra runtime from the CRUD namespace.\n // Agent hydration handles runtime workspace registration independently.\n }\n\n /**\n * Hydrate a stored workspace snapshot config into a runtime Workspace instance.\n * Resolves provider strings to actual instances using the editor's registries.\n *\n * This is NOT called from the CrudEditorNamespace flow — it is a public utility\n * used by EditorAgentNamespace during agent hydration.\n */\n async hydrateSnapshotToWorkspace(\n id: string,\n snapshot: StorageWorkspaceSnapshotType,\n options?: { skillSource?: SkillSource },\n ): Promise<\n Workspace<\n WorkspaceFilesystem | undefined,\n WorkspaceSandbox | undefined,\n Record<string, WorkspaceFilesystem> | undefined\n >\n > {\n const config: WorkspaceConfig<\n WorkspaceFilesystem | undefined,\n WorkspaceSandbox | undefined,\n Record<string, WorkspaceFilesystem> | undefined\n > = {\n id,\n name: snapshot.name,\n };\n\n // Resolve primary filesystem\n if (snapshot.filesystem) {\n config.filesystem = await this.resolveFilesystem(snapshot.filesystem);\n }\n\n // Resolve sandbox\n if (snapshot.sandbox) {\n config.sandbox = await this.resolveSandbox(snapshot.sandbox);\n }\n\n // Resolve mounted filesystems\n if (snapshot.mounts) {\n const mounts: Record<string, WorkspaceFilesystem> = {};\n for (const [path, fsConfig] of Object.entries(snapshot.mounts)) {\n mounts[path] = await this.resolveFilesystem(fsConfig);\n }\n config.mounts = mounts;\n }\n\n // Search configuration\n if (snapshot.search) {\n if (snapshot.search.bm25) {\n config.bm25 = snapshot.search.bm25;\n }\n if (snapshot.search.searchIndexName) {\n config.searchIndexName = snapshot.search.searchIndexName;\n }\n if (snapshot.search.autoIndexPaths) {\n config.autoIndexPaths = snapshot.search.autoIndexPaths;\n }\n\n // Resolve vector store from Mastra's registered vectors\n if (snapshot.search.vectorProvider && this.mastra) {\n const vectors = this.mastra.listVectors();\n const vectorStore = vectors?.[snapshot.search.vectorProvider];\n if (vectorStore) {\n config.vectorStore = vectorStore;\n } else {\n this.logger?.warn(\n `Vector provider \"${snapshot.search.vectorProvider}\" not found in Mastra instance. ` +\n `Workspace search will be limited to BM25 only.`,\n );\n }\n }\n\n // Embedder resolution: workspace expects an Embedder function (text: string) => Promise<number[]>.\n // The stored config has embedderProvider/embedderModel strings but there is no embedder registry\n // in Mastra yet. For now, skip — BM25-only search works without an embedder.\n // Vector search requires both vectorStore and embedder to be configured.\n if (config.vectorStore && !config.embedder) {\n this.logger?.warn(\n `Workspace has a vector store configured but no embedder. ` +\n `Vector/hybrid search will not be available. Configure an embedder to enable semantic search.`,\n );\n }\n }\n\n // Skills are stored as entity IDs in the workspace config.\n // When a versioned skill source is provided (from agent-level resolution),\n // it takes precedence — skills are served from the blob store.\n // Otherwise, skill entity IDs are passed as paths for filesystem-based discovery.\n if (options?.skillSource) {\n config.skillSource = options.skillSource;\n // When using a versioned source, the skills resolver points to the root ('.')\n // since the CompositeVersionedSkillSource mounts each skill as a subdirectory.\n config.skills = ['.'];\n } else if (snapshot.skills && snapshot.skills.length > 0) {\n config.skills = snapshot.skills;\n }\n\n // Workspace tool configuration maps directly\n if (snapshot.tools) {\n config.tools = snapshot.tools;\n }\n\n if (snapshot.autoSync !== undefined) {\n config.autoSync = snapshot.autoSync;\n }\n\n if (snapshot.operationTimeout !== undefined) {\n config.operationTimeout = snapshot.operationTimeout;\n }\n\n return new Workspace(config);\n }\n\n /**\n * Serialize a runtime Workspace instance into a StorageWorkspaceSnapshotType.\n * The reverse of hydrateSnapshotToWorkspace — extracts provider IDs and config\n * from live filesystem/sandbox instances so the workspace can be persisted to the DB.\n */\n async snapshotFromWorkspace(workspace: Workspace): Promise<StorageWorkspaceSnapshotType> {\n const snapshot: StorageWorkspaceSnapshotType = {\n name: workspace.name,\n };\n\n const fs = workspace.filesystem;\n if (fs) {\n if (fs instanceof CompositeFilesystem) {\n // Workspace uses mounts — serialize each mounted filesystem\n const mounts: Record<string, StorageFilesystemConfig> = {};\n for (const [mountPath, mountedFs] of fs.mounts) {\n mounts[mountPath] = await this.serializeFilesystem(mountedFs);\n }\n snapshot.mounts = mounts;\n } else {\n // Single filesystem\n snapshot.filesystem = await this.serializeFilesystem(fs);\n }\n }\n\n const sandbox = workspace.sandbox;\n if (sandbox) {\n // Sandbox.getInfo() is async and returns metadata that we round-trip through the\n // stored config so resolveSandbox() can re-instantiate the provider with its\n // original constructor configuration.\n const info = typeof sandbox.getInfo === 'function' ? await sandbox.getInfo() : undefined;\n snapshot.sandbox = {\n provider: sandbox.provider,\n config: info?.metadata ?? {},\n };\n }\n\n const tools = workspace.getToolsConfig();\n if (tools) {\n // Only serialize static boolean values — runtime functions can't be stored\n const storageTools: StorageWorkspaceToolsConfig = {};\n if (typeof tools.enabled === 'boolean') storageTools.enabled = tools.enabled;\n if (typeof tools.requireApproval === 'boolean') storageTools.requireApproval = tools.requireApproval;\n if (Object.keys(storageTools).length > 0) {\n snapshot.tools = storageTools;\n }\n }\n\n return snapshot;\n }\n\n /**\n * Serialize a runtime WorkspaceFilesystem into a StorageFilesystemConfig.\n * Awaits getInfo() so async providers like CompositeFilesystem keep their mount metadata.\n */\n private async serializeFilesystem(fs: WorkspaceFilesystem): Promise<StorageFilesystemConfig> {\n const info = typeof fs.getInfo === 'function' ? await fs.getInfo() : undefined;\n const metadata = info && typeof info === 'object' && 'metadata' in info ? (info as any).metadata : undefined;\n return {\n provider: fs.provider,\n config: metadata ?? {},\n readOnly: fs.readOnly,\n };\n }\n\n /**\n * Resolve a stored filesystem config to a runtime WorkspaceFilesystem instance.\n * Looks up the provider by ID in the editor's registry (which includes built-in providers).\n */\n private async resolveFilesystem(fsConfig: StorageFilesystemConfig): Promise<WorkspaceFilesystem> {\n const provider = this.editor.__filesystems.get(fsConfig.provider);\n if (!provider) {\n throw new Error(\n `Filesystem provider \"${fsConfig.provider}\" is not registered. ` +\n `Register it via new MastraEditor({ filesystems: [yourProvider] })`,\n );\n }\n const config = { ...fsConfig.config, readOnly: fsConfig.readOnly };\n return await provider.createFilesystem(config);\n }\n\n /**\n * Resolve a stored sandbox config to a runtime WorkspaceSandbox instance.\n * Looks up the provider by ID in the editor's registry (which includes built-in providers).\n */\n private async resolveSandbox(sandboxConfig: StorageSandboxConfig): Promise<WorkspaceSandbox> {\n const provider = this.editor.__sandboxes.get(sandboxConfig.provider);\n if (!provider) {\n throw new Error(\n `Sandbox provider \"${sandboxConfig.provider}\" is not registered. ` +\n `Register it via new MastraEditor({ sandboxes: [yourProvider] })`,\n );\n }\n return await provider.createSandbox(sandboxConfig.config);\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n StorageListWorkspacesResolvedOutput,\n StorageResolvedWorkspaceType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('workspaces');\n if (!store) throw new Error('Workspaces storage domain is not available');\n\n return {\n create: input => store.create({ workspace: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n}\n","import type {\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageResolvedSkillType,\n StorageListSkillsResolvedOutput,\n} from '@mastra/core/storage';\nimport type { SkillSource } from '@mastra/core/workspace';\nimport { publishSkillFromSource } from '@mastra/core/workspace';\n\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nexport class EditorSkillNamespace extends CrudEditorNamespace<\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageListSkillsResolvedOutput,\n StorageResolvedSkillType\n> {\n protected override onCacheEvict(_id: string): void {\n // Skills are standalone entities — no runtime cleanup needed.\n }\n\n protected async getStorageAdapter(): Promise<\n StorageAdapter<\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageListSkillsResolvedOutput,\n StorageResolvedSkillType\n >\n > {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('skills');\n if (!store) throw new Error('Skills storage domain is not available');\n\n return {\n create: input => store.create({ skill: input }),\n getByIdResolved: id => store.getByIdResolved(id),\n update: input => store.update(input),\n delete: id => store.delete(id),\n list: args => store.list(args),\n listResolved: args => store.listResolved(args),\n };\n }\n\n /**\n * Publish a skill from a live filesystem source.\n * Walks the skill directory, hashes files into the blob store,\n * creates a new version with the tree manifest, and sets activeVersionId.\n */\n async publish(skillId: string, source: SkillSource, skillPath: string): Promise<StorageResolvedSkillType> {\n this.ensureRegistered();\n\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) throw new Error('Skills storage domain is not available');\n\n const blobStore = await this.editor.resolveBlobStore();\n if (!blobStore)\n throw new Error('No blob store is configured. Register one via new MastraEditor({ blobStores: [...] })');\n\n // Collect and store blobs\n const { snapshot, tree, files } = await publishSkillFromSource(source, skillPath, blobStore);\n\n // Strip undefined keys before passing to update(); see the matching\n // comment in the HTTP publish handler. Adapters that bind args raw\n // (libsql, pg) reject undefined as an argument.\n const snapshotUpdate: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(snapshot)) {\n if (value !== undefined) snapshotUpdate[key] = value;\n }\n\n // Update the skill with new version data + tree + UI-facing file tree\n // (creates a new version)\n await skillStore.update({\n id: skillId,\n ...snapshotUpdate,\n tree,\n files,\n status: 'published',\n });\n\n // Point activeVersionId to the newly created version\n const latestVersion = await skillStore.getLatestVersion(skillId);\n if (!latestVersion) {\n throw new Error(`Failed to retrieve version after publishing skill \"${skillId}\"`);\n }\n await skillStore.update({\n id: skillId,\n activeVersionId: latestVersion.id,\n });\n\n // Fetch and return the resolved skill\n const resolved = await skillStore.getByIdResolved(skillId);\n if (!resolved) throw new Error(`Failed to resolve skill ${skillId} after publish`);\n\n // Clear skill cache\n this.clearCache(skillId);\n\n // Invalidate any cached agents that reference this skill so they\n // re-hydrate with the updated version on next access.\n this.editor.agent.invalidateAgentsReferencingSkill(skillId);\n\n return resolved;\n }\n}\n","import type {\n EditorIsFavoritedBatchInput,\n EditorListFavoritedIdsInput,\n EditorFavoriteTargetInput,\n EditorFavoriteToggleResult,\n IEditorFavoritesNamespace,\n} from '@mastra/core/editor';\n\nimport { EditorNamespace } from './base';\n\n/**\n * Favorites namespace.\n *\n * Verifies the target entity exists and performs the storage mutation.\n * Visibility / ownership enforcement (`assertReadAccess`) lives at the\n * route handler in `@mastra/server`. Direct callers of this namespace must\n * perform their own access check before invoking these methods.\n */\nexport class EditorFavoritesNamespace extends EditorNamespace implements IEditorFavoritesNamespace {\n async favorite(input: EditorFavoriteTargetInput): Promise<EditorFavoriteToggleResult> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.favorite({\n userId: input.userId,\n entityType: input.entityType,\n entityId: input.entityId,\n });\n }\n\n async unfavorite(input: EditorFavoriteTargetInput): Promise<EditorFavoriteToggleResult> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.unfavorite({\n userId: input.userId,\n entityType: input.entityType,\n entityId: input.entityId,\n });\n }\n\n async isFavorited(input: EditorFavoriteTargetInput): Promise<boolean> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.isFavorited({\n userId: input.userId,\n entityType: input.entityType,\n entityId: input.entityId,\n });\n }\n\n async isFavoritedBatch(input: EditorIsFavoritedBatchInput): Promise<Set<string>> {\n this.ensureRegistered();\n if (input.entityIds.length === 0) return new Set<string>();\n const store = await this.getFavoritesStore();\n return store.isFavoritedBatch({\n userId: input.userId,\n entityType: input.entityType,\n entityIds: input.entityIds,\n });\n }\n\n async listFavoritedIds(input: EditorListFavoritedIdsInput): Promise<string[]> {\n this.ensureRegistered();\n const store = await this.getFavoritesStore();\n return store.listFavoritedIds({ userId: input.userId, entityType: input.entityType });\n }\n\n private async getFavoritesStore() {\n const storage = this.mastra?.getStorage();\n if (!storage) throw new Error('Storage is not configured');\n const store = await storage.getStore('favorites');\n if (!store) throw new Error('Favorites storage domain is not available');\n return store;\n }\n}\n","/**\n * Built-in workspace provider descriptors.\n *\n * These are auto-registered by MastraEditor and always available.\n * External providers (S3, GCS, E2B) are supplied via MastraEditorConfig.\n */\nimport type { FilesystemProvider, SandboxProvider } from '@mastra/core/editor';\nimport { LocalFilesystem } from '@mastra/core/workspace';\nimport { LocalSandbox } from '@mastra/core/workspace';\n\nexport const localFilesystemProvider: FilesystemProvider<{\n basePath: string;\n contained?: boolean;\n readOnly?: boolean;\n}> = {\n id: 'local',\n name: 'Local Filesystem',\n description: 'A folder on the local disk',\n configSchema: {\n type: 'object',\n required: ['basePath'],\n properties: {\n basePath: { type: 'string', description: 'Base directory path on disk' },\n contained: {\n type: 'boolean',\n description: 'Restrict operations to stay within basePath',\n default: true,\n },\n readOnly: {\n type: 'boolean',\n description: 'Block all write operations',\n default: false,\n },\n },\n },\n createFilesystem: config => new LocalFilesystem(config),\n};\n\nexport const localSandboxProvider: SandboxProvider<{\n workingDirectory?: string;\n timeout?: number;\n isolation?: 'none' | 'seatbelt' | 'bwrap';\n env?: Record<string, string>;\n}> = {\n id: 'local',\n name: 'Local Sandbox',\n description: 'Execute commands on the local machine',\n configSchema: {\n type: 'object',\n properties: {\n workingDirectory: { type: 'string', description: 'Working directory for command execution' },\n timeout: { type: 'number', description: 'Default timeout for operations in ms' },\n isolation: {\n type: 'string',\n enum: ['none', 'seatbelt', 'bwrap'],\n description: 'Isolation backend for sandboxed execution',\n default: 'none',\n },\n env: {\n type: 'object',\n description: 'Environment variables for command execution',\n additionalProperties: { type: 'string' },\n },\n },\n },\n createSandbox: config => new LocalSandbox(config),\n};\n","import type { StorageWorkspaceSnapshotType } from '@mastra/core/storage';\n\n/**\n * Compare a resolved workspace's config fields against a runtime snapshot.\n * Returns true if all snapshot config fields match.\n *\n * @internal — not part of the public API surface.\n */\nexport function snapshotsMatch(\n stored: { name: string } & Partial<StorageWorkspaceSnapshotType>,\n runtime: StorageWorkspaceSnapshotType,\n): boolean {\n const keys: (keyof StorageWorkspaceSnapshotType)[] = [\n 'name',\n 'description',\n 'filesystem',\n 'sandbox',\n 'mounts',\n 'search',\n 'skills',\n 'tools',\n 'autoSync',\n 'operationTimeout',\n ];\n\n // JSON replacer that strips falsy leaf values (false, null, 0) so DB-hydrated\n // defaults don't cause spurious mismatches against runtime snapshots.\n const replacer = (_k: string, v: unknown) => (v === false || v === null || v === 0 ? undefined : v);\n\n for (const key of keys) {\n const storedVal = stored[key];\n const runtimeVal = runtime[key];\n\n const storedJSON = storedVal == null || storedVal === false ? undefined : JSON.stringify(storedVal, replacer);\n const runtimeJSON = runtimeVal == null || runtimeVal === false ? undefined : JSON.stringify(runtimeVal, replacer);\n\n if (storedJSON !== runtimeJSON) return false;\n }\n\n return true;\n}\n"],"mappings":"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","names":["import_agent","import_memory","import_workspace","path","import_processor_provider","import_tool_provider","path","resolvePath","path","rendered","requestContext","workspace","sharedConfig","import_workspace","path","workspace","import_workspace","import_workspace","EditorAgentBuilder","blobStore"]}