{"version":3,"file":"index.cjs","names":["resolvePath","PhaseFilteredProcessor","ProcessorStepSchema","isVersionNumberConflictError","Agent","Memory","RequestContext","CompositeVersionedSkillSource","Workspace","CompositeFilesystem","LocalFilesystem","LocalSandbox","BUILT_IN_PROCESSOR_PROVIDERS","SourceAgentsSourceControl","FilesystemStore","MastraCompositeStore","UnknownToolProviderError"],"sources":["../src/namespaces/base.ts","../src/rule-evaluator.ts","../src/template-engine.ts","../src/instruction-builder.ts","../src/processor-graph-hydrator.ts","../src/namespaces/mcp.ts","../src/namespaces/versioned-update.ts","../src/namespaces/agent.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","../src/index.ts"],"sourcesContent":["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","/**\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, 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 { deepEqual } from '@mastra/core/utils';\n\ntype VersionRecord = {\n  id: string;\n  versionNumber: number;\n};\n\nexport type VersionedUpdateStore<TVersion extends VersionRecord, TCreateVersionInput> = {\n  getLatestVersion(parentId: string): Promise<TVersion | null>;\n  createVersion(input: TCreateVersionInput): Promise<TVersion>;\n};\n\nexport function getProvidedSnapshotFields<TSnapshot extends object>(\n  input: Record<string, unknown>,\n  snapshotFields: readonly (keyof TSnapshot & string)[],\n): Partial<TSnapshot> {\n  const config: Partial<TSnapshot> = {};\n\n  for (const field of snapshotFields) {\n    if (input[field] !== undefined) {\n      (config as Record<string, unknown>)[field] = input[field];\n    }\n  }\n\n  return config;\n}\n\nexport function extractSnapshotConfig<TSnapshot extends object>(\n  version: unknown,\n  snapshotFields: readonly (keyof TSnapshot & string)[],\n): Partial<TSnapshot> {\n  const record = version as Record<string, unknown>;\n  const config: Partial<TSnapshot> = {};\n\n  for (const field of snapshotFields) {\n    if (field in record) {\n      (config as Record<string, unknown>)[field] = record[field];\n    }\n  }\n\n  return config;\n}\n\nfunction getChangedSnapshotFields<TSnapshot extends object>(\n  previousConfig: Partial<TSnapshot>,\n  providedConfig: Partial<TSnapshot>,\n  snapshotFields: readonly (keyof TSnapshot & string)[],\n): string[] {\n  return snapshotFields.filter(\n    field => field in providedConfig && !deepEqual(previousConfig[field], providedConfig[field]),\n  );\n}\n\nfunction isVersionNumberConflictError(error: unknown): boolean {\n  if (!(error instanceof Error)) return false;\n\n  const message = error.message.toLowerCase();\n  return (\n    (message.includes('unique') && message.includes('constraint')) ||\n    message.includes('duplicate key') ||\n    message.includes('unique_violation') ||\n    message.includes('sqlite_constraint_unique') ||\n    (message.includes('version number') && message.includes('already exists')) ||\n    message.includes('versionnumber')\n  );\n}\n\nexport async function createVersionFromSnapshotUpdate<\n  TVersion extends VersionRecord,\n  TCreateVersionInput,\n  TSnapshot extends object,\n>({\n  store,\n  parentId,\n  parentIdField,\n  snapshotFields,\n  providedConfig,\n  changeMessage = 'Auto-saved after edit',\n  maxRetries = 3,\n}: {\n  store: VersionedUpdateStore<TVersion, TCreateVersionInput>;\n  parentId: string;\n  parentIdField: string;\n  snapshotFields: readonly (keyof TSnapshot & string)[];\n  providedConfig: Partial<TSnapshot>;\n  changeMessage?: string;\n  maxRetries?: number;\n}): Promise<{ versionCreated: false } | { versionCreated: true; version: TVersion; changedFields: string[] }> {\n  let lastError: unknown;\n\n  for (let attempt = 0; attempt < maxRetries; attempt++) {\n    try {\n      const latestVersion = await store.getLatestVersion(parentId);\n      if (!latestVersion) {\n        return { versionCreated: false };\n      }\n\n      const previousConfig = extractSnapshotConfig<TSnapshot>(latestVersion, snapshotFields);\n      const changedFields = getChangedSnapshotFields(previousConfig, providedConfig, snapshotFields);\n      if (changedFields.length === 0) {\n        return { versionCreated: false };\n      }\n\n      const nextConfig: Record<string, unknown> = { ...previousConfig };\n      for (const [field, value] of Object.entries(providedConfig)) {\n        nextConfig[field] = value === null ? undefined : value;\n      }\n\n      const version = await store.createVersion({\n        ...nextConfig,\n        id: crypto.randomUUID(),\n        [parentIdField]: parentId,\n        versionNumber: latestVersion.versionNumber + 1,\n        changedFields,\n        changeMessage,\n      } as TCreateVersionInput);\n\n      return { versionCreated: true, version, changedFields };\n    } catch (error) {\n      lastError = error;\n\n      if (isVersionNumberConflictError(error) && attempt < maxRetries - 1) {\n        await new Promise(resolve => setTimeout(resolve, 10 * (attempt + 1)));\n        continue;\n      }\n\n      throw error;\n    }\n  }\n\n  throw lastError;\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  StorageAgentSnapshotType,\n  StorageScorerConfig,\n  StorageToolConfig,\n  StorageMCPClientToolsConfig,\n  StorageSkillConfig,\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 { convertSchemaToZod } from '@mastra/schema-compat';\n\nimport type { AgentVersion, CreateVersionInput } from '@mastra/core/storage/domains/agents';\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';\nimport { createVersionFromSnapshotUpdate, getProvidedSnapshotFields } from './versioned-update';\n\ntype AgentEditorConfig = false | { instructions?: boolean; tools?: boolean | { description?: boolean } };\n\nconst AGENT_SNAPSHOT_CONFIG_FIELDS = [\n  'name',\n  'description',\n  'instructions',\n  'model',\n  'tools',\n  'defaultOptions',\n  'workflows',\n  'agents',\n  'integrationTools',\n  'toolProviders',\n  'inputProcessors',\n  'outputProcessors',\n  'memory',\n  'scorers',\n  'requestContextSchema',\n  'mcpClients',\n  'skills',\n  'skillsFormat',\n  'workspace',\n  'browser',\n  'durable',\n] as const satisfies (keyof StorageAgentSnapshotType)[];\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/** Model used for observational memory when a builder agent stores `observationalMemory: true`. */\nconst BUILDER_DEFAULT_OM_MODEL = 'openai/gpt-5.4-mini';\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\nfunction getProvidedAgentRecordFields(input: StorageUpdateAgentInput): StorageUpdateAgentInput | null {\n  const { id, authorId, visibility, activeVersionId, metadata, status } = input;\n  const recordFields: StorageUpdateAgentInput = { id };\n\n  if (authorId !== undefined) recordFields.authorId = authorId;\n  if (visibility !== undefined) recordFields.visibility = visibility;\n  if (activeVersionId !== undefined) recordFields.activeVersionId = activeVersionId;\n  if (metadata !== undefined) recordFields.metadata = metadata;\n  if (status !== undefined) recordFields.status = status;\n\n  return Object.keys(recordFields).length > 1 ? recordFields : null;\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  override async update(input: StorageUpdateAgentInput): Promise<Agent> {\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('agents');\n    if (!store) throw new Error('Agents storage domain is not available');\n\n    const existing = await store.getById(input.id);\n    if (!existing) {\n      throw new Error(`Agent with id ${input.id} not found`);\n    }\n\n    const providedConfig = getProvidedSnapshotFields<StorageAgentSnapshotType>(\n      input as Record<string, unknown>,\n      AGENT_SNAPSHOT_CONFIG_FIELDS,\n    );\n    if ('workspace' in providedConfig) {\n      await this.ensureStoredWorkspaceRefs(providedConfig.workspace);\n    }\n\n    if (Object.keys(providedConfig).length > 0) {\n      await createVersionFromSnapshotUpdate<AgentVersion, CreateVersionInput, StorageAgentSnapshotType>({\n        store,\n        parentId: input.id,\n        parentIdField: 'agentId',\n        snapshotFields: AGENT_SNAPSHOT_CONFIG_FIELDS,\n        providedConfig,\n      });\n    }\n\n    const recordFields = getProvidedAgentRecordFields(input);\n    if (recordFields) {\n      await store.update(recordFields);\n    }\n\n    this._cache.delete(input.id);\n    this.onCacheEvict(input.id);\n\n    const existingCodeAgent = this.getCodeDefinedAgent(input.id);\n    if (existingCodeAgent) {\n      const hydrated = await this.applyStoredOverrides(existingCodeAgent, { status: 'draft' });\n      this._cache.set(input.id, hydrated);\n      return hydrated;\n    }\n\n    const resolved = await store.getByIdResolved(input.id, { status: 'draft' });\n    if (!resolved) {\n      throw new Error(`Failed to resolve entity ${input.id} after update`);\n    }\n\n    const hydrated = await this.hydrate(resolved);\n    this._cache.set(input.id, hydrated);\n    return hydrated;\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    // When creating a stored override for an agent that is already defined in\n    // code, the stored snapshot is an intentionally partial override (e.g.\n    // descriptions-only agents carry no instructions/model/name). Hydrating it\n    // as a standalone agent would fail because Agent requires a model. Persist\n    // the override and return the existing code-defined runtime agent instead.\n    const existingCodeAgent = this.getCodeDefinedAgent(finalInput.id);\n    if (existingCodeAgent) {\n      const adapter = await this.getStorageAdapter();\n      await adapter.create(finalInput);\n      this._cache.set(finalInput.id, existingCodeAgent);\n      return existingCodeAgent;\n    }\n\n    return super.create(finalInput);\n  }\n\n  private getCodeDefinedAgent(id: string): Agent | undefined {\n    let agent: Agent | undefined;\n    try {\n      agent = this.mastra?.getAgentById(id);\n    } catch {\n      return undefined;\n    }\n    return agent?.source === 'code' ? agent : undefined;\n  }\n\n  private async ensureStoredWorkspaceRefs(\n    workspace: StorageAgentSnapshotType['workspace'] | null | undefined,\n  ): Promise<void> {\n    if (!workspace) return;\n\n    if (this.isConditionalVariants(workspace)) {\n      for (const variant of workspace) {\n        await this.ensureStoredWorkspace(variant.value);\n      }\n      return;\n    }\n\n    await this.ensureStoredWorkspace(workspace);\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      } else if (workspaceRef.type === 'provider') {\n        // Provider-based workspaces are resolved at hydration time via the editor's\n        // workspace provider registry. The provider ref is stored directly in the\n        // agent snapshot — no separate workspace record needed.\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    // Instructions are exclusively owned by the editor only when `editor: { instructions: true }`\n    // is set explicitly — code is then forbidden from providing instructions at all (see\n    // `EditorOwnsInstructions` in `@mastra/core/agent/types`). When `editor` is omitted, code still\n    // carries real instructions as a fallback, so there is nothing to fail closed on.\n    const instructionsOwnedByEditor = editorConfig !== undefined && editorConfig.instructions === true;\n    const requestedStatus = options && !('versionId' in options) ? (options.status ?? 'draft') : undefined;\n\n    const failClosed = (reason: string): never => {\n      throw new Error(\n        `Agent \"${agent.id}\" delegates instructions to the editor (\"editor: { instructions: true }\") but ${reason}. ` +\n          `Publish a version in Studio before running this agent${requestedStatus === 'published' ? \", or request status: 'draft' instead\" : ''}.`,\n      );\n    };\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      if (instructionsOwnedByEditor) {\n        throw new Error(\n          `Agent \"${agent.id}\" delegates instructions to the editor (\"editor: { instructions: true }\") but the stored configuration could not be loaded: ${error instanceof Error ? error.message : String(error)}`,\n        );\n      }\n      // Editor not registered, storage not available, or agent not found — return unchanged\n      return agent;\n    }\n\n    if (!storedConfig) {\n      if (instructionsOwnedByEditor) {\n        failClosed('no stored agent configuration exists yet');\n      }\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      if (instructionsOwnedByEditor) {\n        failClosed('no version has been published');\n      }\n      return agent;\n    }\n\n    // A resolved record can still carry no instructions (e.g. a version published before any\n    // were written). That leaves an editor-owned agent with its empty code default just like the\n    // unresolved cases above, so it must fail closed here too.\n    if (instructionsOwnedByEditor && (storedConfig.instructions === undefined || storedConfig.instructions === null)) {\n      failClosed('the stored agent configuration has no instructions');\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,\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,\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    // Durable opt-in is persisted as a serializable subset (boolean or\n    // { maxSteps, cleanupTimeoutMs }). `cache`/`pubsub` are inherited from the\n    // Mastra instance by `createDurableAgent`, which `addAgent` invokes below\n    // whenever `agent.durable` is truthy.\n    const durable = storedAgent.durable;\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      ...(durable !== undefined && { durable }),\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    if (!this.getCodeDefinedAgent(storedAgent.id)) {\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          // A literal `true` means \"use the builder default OM model\"; an explicit\n          // object (user/admin choice) passes through untouched.\n          observationalMemory:\n            memoryConfig.observationalMemory === true\n              ? { model: BUILDER_DEFAULT_OM_MODEL }\n              : 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    if (workspaceRef.type === 'provider') {\n      return workspaceNs.resolveWorkspaceProvider(workspaceRef.provider, workspaceRef.config);\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","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  StoragePromptBlockSnapshotType,\n  PromptBlockVersion,\n  PromptBlocksStorage,\n} from '@mastra/core/storage';\n\nimport { resolveInstructionBlocks } from '../instruction-builder';\nimport { CrudEditorNamespace } from './base';\nimport type { StorageAdapter } from './base';\n\nconst PROMPT_BLOCK_SNAPSHOT_CONFIG_FIELDS = [\n  'name',\n  'description',\n  'content',\n  'rules',\n  'requestContextSchema',\n] as const satisfies (keyof StoragePromptBlockSnapshotType)[];\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n  if (a === b) return true;\n  if (a == null || b == null) return a === b;\n  if (typeof a !== typeof b) return false;\n\n  if (Array.isArray(a) && Array.isArray(b)) {\n    return a.length === b.length && a.every((item, index) => deepEqual(item, b[index]));\n  }\n\n  if (typeof a === 'object' && typeof b === 'object') {\n    const aObj = a as Record<string, unknown>;\n    const bObj = b as Record<string, unknown>;\n    const aKeys = Object.keys(aObj);\n    const bKeys = Object.keys(bObj);\n\n    return aKeys.length === bKeys.length && aKeys.every(key => deepEqual(aObj[key], bObj[key]));\n  }\n\n  return false;\n}\n\nfunction extractConfigFromVersion(version: PromptBlockVersion): StoragePromptBlockSnapshotType {\n  return {\n    name: version.name,\n    description: version.description,\n    content: version.content,\n    rules: version.rules,\n    requestContextSchema: version.requestContextSchema,\n  };\n}\n\nfunction getProvidedConfigFields(input: StorageUpdatePromptBlockInput): Partial<StoragePromptBlockSnapshotType> {\n  const config: Partial<StoragePromptBlockSnapshotType> = {};\n\n  for (const field of PROMPT_BLOCK_SNAPSHOT_CONFIG_FIELDS) {\n    if (input[field] !== undefined) {\n      config[field] = input[field] as never;\n    }\n  }\n\n  return config;\n}\n\nfunction getProvidedRecordFields(input: StorageUpdatePromptBlockInput): StorageUpdatePromptBlockInput | null {\n  const { id, authorId, activeVersionId, metadata, status } = input;\n  const recordFields: StorageUpdatePromptBlockInput = { id };\n\n  if (authorId !== undefined) recordFields.authorId = authorId;\n  if (activeVersionId !== undefined) recordFields.activeVersionId = activeVersionId;\n  if (metadata !== undefined) recordFields.metadata = metadata;\n  if (status !== undefined) recordFields.status = status;\n\n  return Object.keys(recordFields).length > 1 ? recordFields : null;\n}\n\nfunction getChangedFields(\n  previousConfig: Partial<StoragePromptBlockSnapshotType>,\n  providedConfig: Partial<StoragePromptBlockSnapshotType>,\n): (keyof StoragePromptBlockSnapshotType)[] {\n  return PROMPT_BLOCK_SNAPSHOT_CONFIG_FIELDS.filter(\n    field => field in providedConfig && !deepEqual(previousConfig[field], providedConfig[field]),\n  );\n}\n\nfunction isVersionNumberConflictError(error: unknown): boolean {\n  if (!(error instanceof Error)) return false;\n\n  const message = error.message.toLowerCase();\n  return (\n    (message.includes('unique') && message.includes('constraint')) ||\n    message.includes('duplicate key') ||\n    message.includes('unique_violation') ||\n    message.includes('sqlite_constraint_unique') ||\n    (message.includes('version number') && message.includes('already exists')) ||\n    message.includes('versionnumber')\n  );\n}\n\nasync function createPromptBlockVersionWithRetry(\n  store: PromptBlocksStorage,\n  blockId: string,\n  providedConfig: Partial<StoragePromptBlockSnapshotType>,\n  maxRetries = 3,\n): Promise<boolean> {\n  let lastError: unknown;\n\n  for (let attempt = 0; attempt < maxRetries; attempt++) {\n    try {\n      const latestVersion = await store.getLatestVersion(blockId);\n      if (!latestVersion) return false;\n\n      const previousConfig = extractConfigFromVersion(latestVersion);\n      const changedFields = getChangedFields(previousConfig, providedConfig);\n      if (changedFields.length === 0) return false;\n\n      await store.createVersion({\n        ...previousConfig,\n        ...providedConfig,\n        id: crypto.randomUUID(),\n        blockId,\n        versionNumber: latestVersion.versionNumber + 1,\n        changedFields,\n        changeMessage: 'Auto-saved after edit',\n      });\n\n      return true;\n    } catch (error) {\n      lastError = error;\n\n      if (isVersionNumberConflictError(error) && attempt < maxRetries - 1) {\n        await new Promise(resolve => setTimeout(resolve, 10 * (attempt + 1)));\n        continue;\n      }\n\n      throw error;\n    }\n  }\n\n  throw lastError;\n}\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  override async update(input: StorageUpdatePromptBlockInput): Promise<StorageResolvedPromptBlockType> {\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')) as PromptBlocksStorage | undefined;\n    if (!store) throw new Error('Prompt blocks storage domain is not available');\n\n    const existing = await store.getById(input.id);\n    if (!existing) {\n      throw new Error(`Prompt block with id ${input.id} not found`);\n    }\n\n    const providedConfig = getProvidedConfigFields(input);\n    if (Object.keys(providedConfig).length > 0) {\n      await createPromptBlockVersionWithRetry(store, input.id, providedConfig);\n    }\n\n    const recordFields = getProvidedRecordFields(input);\n    if (recordFields) {\n      await store.update(recordFields);\n    }\n\n    this._cache.delete(input.id);\n    this.onCacheEvict(input.id);\n\n    const resolved = await store.getByIdResolved(input.id, { status: 'draft' });\n    if (!resolved) {\n      throw new Error(`Failed to resolve entity ${input.id} after update`);\n    }\n\n    this._cache.set(input.id, resolved);\n    return resolved;\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, 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  /**\n   * Resolve a stored workspace provider config to a complete runtime Workspace instance.\n   * Looks up the provider by ID in the editor's workspace provider registry.\n   */\n  async resolveWorkspaceProvider(\n    providerId: string,\n    config: Record<string, unknown>,\n  ): Promise<Workspace<any, any, any>> {\n    const provider = this.editor.__workspaces.get(providerId);\n    if (!provider) {\n      throw new Error(\n        `Workspace provider \"${providerId}\" is not registered. ` +\n          `Register it via new MastraEditor({ workspaces: { '${providerId}': yourProvider } })`,\n      );\n    }\n    return await provider.createWorkspace(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, 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","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  WorkspaceProvider,\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 {\n  createGitHubSourceControlProviderFromEnv,\n  FilesystemStore,\n  MastraCompositeStore,\n  SourceAgentsSourceControl,\n} from '@mastra/core/storage';\nimport type { BlobStore, SourceControlProvider } 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 __sourceControlProvider?: SourceControlProvider;\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  /**\n   * @internal — exposed for namespace classes to hydrate stored workspace configs.\n   * Maps provider ID to the provider descriptor.\n   * No built-in providers — workspace providers must be registered via config.\n   */\n  readonly __workspaces: Map<string, WorkspaceProvider>;\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    this.__sourceControlProvider =\n      config?.sourceControlProvider ??\n      createGitHubSourceControlProviderFromEnv(process.env, { pathPrefix: this.__codePath });\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    // Workspace providers — no built-in providers; workspace packages must be registered\n    this.__workspaces = new Map<string, WorkspaceProvider>();\n    for (const [id, provider] of Object.entries(config?.workspaces ?? {})) {\n      this.__workspaces.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 source routes editor-owned domains away from the app's primary storage.\n    // Local development uses a FilesystemStore at `codePath`; hosted/self-hosted\n    // environments can provide a source provider so agent overrides are persisted\n    // through source-control operations instead of a local container filesystem.\n    if (this.__source === 'code') {\n      const existingStorage = mastra.getStorage();\n\n      if (this.__sourceControlProvider) {\n        const sourceAgentsStore = new SourceAgentsSourceControl({\n          provider: this.__sourceControlProvider,\n        });\n        const filesystemStore = new FilesystemStore({ dir: this.__codePath });\n\n        mastra.setStorage(\n          new MastraCompositeStore({\n            id: `${existingStorage?.id ?? 'mastra'}-with-editor-source-control`,\n            ...(existingStorage ? { default: existingStorage } : {}),\n            editor: filesystemStore,\n            domains: { agents: sourceAgentsStore },\n          }),\n        );\n      } else {\n        const filesystemStore = new FilesystemStore({ dir: this.__codePath });\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\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  /** Returns the configured source control provider, if any. */\n  getSourceControlProvider(): SourceControlProvider | undefined {\n    return this.__sourceControlProvider;\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"],"mappings":"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"}