import { defaultOptionsSchema } from './chunk-7XBOJMBD.js';
import { createPagePaginationSchema, paginationInfoSchema } from './chunk-HT4LP3BO.js';
import { handleError } from './chunk-ONN5EA7E.js';
import { createRoute } from './chunk-D5VCL56B.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import z2 from 'zod';

var semanticRecallSchema = z2.object({
  topK: z2.number().describe("Number of semantically similar messages to retrieve"),
  messageRange: z2.union([
    z2.number(),
    z2.object({
      before: z2.number(),
      after: z2.number()
    })
  ]).describe("Amount of surrounding context to include with each retrieved message"),
  scope: z2.enum(["thread", "resource"]).optional().describe("Scope for semantic search queries"),
  threshold: z2.number().min(0).max(1).optional().describe("Minimum similarity score threshold"),
  indexName: z2.string().optional().describe("Index name for the vector store")
});
var titleGenerationSchema = z2.union([
  z2.boolean(),
  z2.object({
    model: z2.string().describe("Model ID in format provider/model-name (ModelRouterModelId)"),
    instructions: z2.string().optional().describe("Custom instructions for title generation")
  })
]);
var serializedMemoryConfigSchema = z2.object({
  vector: z2.union([z2.string(), z2.literal(false)]).optional().describe("Vector database identifier or false to disable"),
  options: z2.object({
    readOnly: z2.boolean().optional(),
    lastMessages: z2.union([z2.number(), z2.literal(false)]).optional(),
    semanticRecall: z2.union([z2.boolean(), semanticRecallSchema]).optional(),
    generateTitle: titleGenerationSchema.optional()
  }).optional().describe("Memory behavior configuration, excluding workingMemory and threads"),
  embedder: z2.string().optional().describe('Embedding model ID in the format "provider/model" (e.g., "openai/text-embedding-3-small")'),
  embedderOptions: z2.record(z2.string(), z2.unknown()).optional().describe("Options to pass to the embedder, omitting telemetry")
}).refine(
  (data) => {
    const semanticRecall = data.options?.semanticRecall;
    const semanticRecallEnabled = semanticRecall === true || typeof semanticRecall === "object" && semanticRecall !== null;
    if (semanticRecallEnabled) {
      const hasVector = typeof data.vector === "string" && data.vector.length > 0;
      const hasEmbedder = typeof data.embedder === "string" && data.embedder.length > 0;
      return hasVector && hasEmbedder;
    }
    return true;
  },
  {
    message: "Semantic recall requires both vector and embedder to be configured",
    path: ["options", "semanticRecall"]
  }
);
var storedAgentIdPathParams = z2.object({
  storedAgentId: z2.string().describe("Unique identifier for the stored agent")
});
var storageOrderBySchema = z2.object({
  field: z2.enum(["createdAt", "updatedAt"]).optional(),
  direction: z2.enum(["ASC", "DESC"]).optional()
});
var listStoredAgentsQuerySchema = createPagePaginationSchema(100).extend({
  orderBy: storageOrderBySchema.optional(),
  authorId: z2.string().optional().describe("Filter agents by author identifier"),
  metadata: z2.record(z2.string(), z2.unknown()).optional().describe("Filter agents by metadata key-value pairs")
});
var scorerConfigSchema = z2.object({
  sampling: z2.union([
    z2.object({ type: z2.literal("none") }),
    z2.object({ type: z2.literal("ratio"), rate: z2.number().min(0).max(1) })
  ]).optional()
});
var snapshotConfigSchema = z2.object({
  name: z2.string().describe("Name of the agent"),
  description: z2.string().optional().describe("Description of the agent"),
  instructions: z2.string().describe("System instructions for the agent"),
  model: z2.object({
    provider: z2.string().describe("Model provider (e.g., openai, anthropic)"),
    name: z2.string().describe("Model name (e.g., gpt-4o, claude-3-opus)")
  }).passthrough().describe("Model configuration (provider, name, and optional params)"),
  tools: z2.array(z2.string()).optional().describe("Array of tool keys to resolve from Mastra registry"),
  defaultOptions: defaultOptionsSchema.optional().describe("Default options for generate/stream calls"),
  workflows: z2.array(z2.string()).optional().describe("Array of workflow keys to resolve from Mastra registry"),
  agents: z2.array(z2.string()).optional().describe("Array of agent keys to resolve from Mastra registry"),
  integrationTools: z2.array(z2.string()).optional().describe("Array of specific integration tool IDs (format: provider_toolkitSlug_toolSlug)"),
  inputProcessors: z2.array(z2.string()).optional().describe("Array of processor keys to resolve from Mastra registry"),
  outputProcessors: z2.array(z2.string()).optional().describe("Array of processor keys to resolve from Mastra registry"),
  memory: serializedMemoryConfigSchema.optional().describe("Memory configuration object (SerializedMemoryConfig)"),
  scorers: z2.record(z2.string(), scorerConfigSchema).optional().describe("Scorer keys with optional sampling config")
});
var agentMetadataSchema = z2.object({
  authorId: z2.string().optional().describe("Author identifier for multi-tenant filtering"),
  metadata: z2.record(z2.string(), z2.unknown()).optional().describe("Additional metadata for the agent")
});
var createStoredAgentBodySchema = z2.object({
  id: z2.string().describe("Unique identifier for the agent"),
  authorId: z2.string().optional().describe("Author identifier for multi-tenant filtering"),
  metadata: z2.record(z2.string(), z2.unknown()).optional().describe("Additional metadata for the agent")
}).merge(snapshotConfigSchema);
var updateStoredAgentBodySchema = agentMetadataSchema.partial().merge(snapshotConfigSchema.partial());
var storedAgentSchema = z2.object({
  // Thin agent record fields
  id: z2.string(),
  status: z2.string().describe("Agent status: draft or published"),
  activeVersionId: z2.string().optional(),
  authorId: z2.string().optional(),
  metadata: z2.record(z2.string(), z2.unknown()).optional(),
  createdAt: z2.coerce.date(),
  updatedAt: z2.coerce.date(),
  // Version snapshot config fields (resolved from active version)
  name: z2.string().describe("Name of the agent"),
  description: z2.string().optional().describe("Description of the agent"),
  instructions: z2.string().describe("System instructions for the agent"),
  model: z2.object({
    provider: z2.string().describe("Model provider (e.g., openai, anthropic)"),
    name: z2.string().describe("Model name (e.g., gpt-4o, claude-3-opus)")
  }).passthrough().describe("Model configuration (provider, name, and optional params)"),
  tools: z2.array(z2.string()).optional().describe("Array of tool keys to resolve from Mastra registry"),
  defaultOptions: defaultOptionsSchema.optional().describe("Default options for generate/stream calls"),
  workflows: z2.array(z2.string()).optional().describe("Array of workflow keys to resolve from Mastra registry"),
  agents: z2.array(z2.string()).optional().describe("Array of agent keys to resolve from Mastra registry"),
  integrationTools: z2.array(z2.string()).optional().describe("Array of specific integration tool IDs (format: provider_toolkitSlug_toolSlug)"),
  inputProcessors: z2.array(z2.string()).optional().describe("Array of processor keys to resolve from Mastra registry"),
  outputProcessors: z2.array(z2.string()).optional().describe("Array of processor keys to resolve from Mastra registry"),
  memory: serializedMemoryConfigSchema.optional().describe("Memory configuration object (SerializedMemoryConfig)"),
  scorers: z2.record(z2.string(), scorerConfigSchema).optional().describe("Scorer keys with optional sampling config")
});
var listStoredAgentsResponseSchema = paginationInfoSchema.extend({
  agents: z2.array(storedAgentSchema)
});
var getStoredAgentResponseSchema = storedAgentSchema;
var createStoredAgentResponseSchema = storedAgentSchema;
var updateStoredAgentResponseSchema = z2.union([
  // Thin agent record (no version config)
  z2.object({
    id: z2.string(),
    status: z2.string(),
    activeVersionId: z2.string().optional(),
    authorId: z2.string().optional(),
    metadata: z2.record(z2.string(), z2.unknown()).optional(),
    createdAt: z2.coerce.date(),
    updatedAt: z2.coerce.date()
  }),
  // Resolved agent (thin record + version config)
  storedAgentSchema
]);
var deleteStoredAgentResponseSchema = z2.object({
  success: z2.boolean(),
  message: z2.string()
});

// src/server/schemas/agent-versions.ts
var agentVersionPathParams = z2.object({
  agentId: z2.string().describe("Unique identifier for the stored agent")
});
var versionIdPathParams = z2.object({
  agentId: z2.string().describe("Unique identifier for the stored agent"),
  versionId: z2.string().describe("Unique identifier for the version (UUID)")
});
var versionOrderBySchema = z2.object({
  field: z2.enum(["versionNumber", "createdAt"]).optional(),
  direction: z2.enum(["ASC", "DESC"]).optional()
});
var listVersionsQuerySchema = createPagePaginationSchema(20).extend({
  orderBy: versionOrderBySchema.optional()
});
var compareVersionsQuerySchema = z2.object({
  from: z2.string().describe("Version ID (UUID) to compare from"),
  to: z2.string().describe("Version ID (UUID) to compare to")
});
var createVersionBodySchema = z2.object({
  changeMessage: z2.string().max(500).optional().describe("Optional message describing the changes")
});
var agentVersionSchema = z2.object({
  id: z2.string().describe("Unique identifier for the version (UUID)"),
  agentId: z2.string().describe("ID of the agent this version belongs to"),
  versionNumber: z2.number().describe("Sequential version number (1, 2, 3, ...)"),
  // Top-level config fields (from StorageAgentSnapshotType)
  name: z2.string().describe("Name of the agent"),
  description: z2.string().optional().describe("Description of the agent"),
  instructions: z2.string().describe("System instructions for the agent"),
  model: z2.record(z2.string(), z2.unknown()).describe("Model configuration (provider, name, etc.)"),
  tools: z2.array(z2.string()).optional().describe("Array of tool keys to resolve from Mastra registry"),
  defaultOptions: defaultOptionsSchema.optional().describe("Default options for generate/stream calls"),
  workflows: z2.array(z2.string()).optional().describe("Array of workflow keys to resolve from Mastra registry"),
  agents: z2.array(z2.string()).optional().describe("Array of agent keys to resolve from Mastra registry"),
  integrationTools: z2.array(z2.string()).optional().describe("Array of specific integration tool IDs (format: provider_toolkitSlug_toolSlug)"),
  inputProcessors: z2.array(z2.string()).optional().describe("Array of processor keys to resolve from Mastra registry"),
  outputProcessors: z2.array(z2.string()).optional().describe("Array of processor keys to resolve from Mastra registry"),
  memory: serializedMemoryConfigSchema.optional().describe("Memory configuration object (SerializedMemoryConfig)"),
  scorers: z2.record(z2.string(), scorerConfigSchema).optional().describe("Scorer keys with optional sampling config"),
  // Version metadata fields
  changedFields: z2.array(z2.string()).optional().describe("Array of field names that changed from the previous version"),
  changeMessage: z2.string().optional().describe("Optional message describing the changes"),
  createdAt: z2.coerce.date().describe("When this version was created")
});
var listVersionsResponseSchema = paginationInfoSchema.extend({
  versions: z2.array(agentVersionSchema)
});
var getVersionResponseSchema = agentVersionSchema;
var createVersionResponseSchema = agentVersionSchema.partial().merge(
  z2.object({
    // These fields are always present in a version response
    id: z2.string().describe("Unique identifier for the version (UUID)"),
    agentId: z2.string().describe("ID of the agent this version belongs to"),
    versionNumber: z2.number().describe("Sequential version number (1, 2, 3, ...)"),
    createdAt: z2.coerce.date().describe("When this version was created")
  })
);
var activateVersionResponseSchema = z2.object({
  success: z2.boolean(),
  message: z2.string(),
  activeVersionId: z2.string()
});
var restoreVersionResponseSchema = agentVersionSchema.describe(
  "The newly created version from the restored configuration"
);
var deleteVersionResponseSchema = z2.object({
  success: z2.boolean(),
  message: z2.string()
});
var versionDiffEntrySchema = z2.object({
  field: z2.string().describe("The field path that changed"),
  previousValue: z2.unknown().describe('The value in the "from" version'),
  currentValue: z2.unknown().describe('The value in the "to" version')
});
var compareVersionsResponseSchema = z2.object({
  diffs: z2.array(versionDiffEntrySchema).describe("List of differences between versions"),
  fromVersion: agentVersionSchema.describe("The source version"),
  toVersion: agentVersionSchema.describe("The target version")
});

// src/server/handlers/agent-versions.ts
var DEFAULT_MAX_VERSIONS_PER_AGENT = 50;
var SNAPSHOT_CONFIG_FIELDS = [
  "name",
  "description",
  "instructions",
  "model",
  "tools",
  "defaultOptions",
  "workflows",
  "agents",
  "integrationTools",
  "inputProcessors",
  "outputProcessors",
  "memory",
  "scorers"
];
function deepEqual(a, b) {
  if (a === b) return true;
  if (a == null || b == null) return a === b;
  if (typeof a !== typeof b) return false;
  if (Array.isArray(a) && Array.isArray(b)) {
    if (a.length !== b.length) return false;
    return a.every((item, index) => deepEqual(item, b[index]));
  }
  if (a instanceof Date && b instanceof Date) {
    return a.getTime() === b.getTime();
  }
  if (typeof a === "object" && typeof b === "object") {
    const aObj = a;
    const bObj = b;
    const aKeys = Object.keys(aObj);
    const bKeys = Object.keys(bObj);
    if (aKeys.length !== bKeys.length) return false;
    return aKeys.every((key) => Object.prototype.hasOwnProperty.call(bObj, key) && deepEqual(aObj[key], bObj[key]));
  }
  return false;
}
function generateVersionId() {
  return crypto.randomUUID();
}
function extractConfigFromVersion(version) {
  const config = {};
  for (const field of SNAPSHOT_CONFIG_FIELDS) {
    if (field in version) {
      config[field] = version[field];
    }
  }
  return config;
}
function calculateChangedFields(previous, current) {
  if (!previous) {
    return Object.keys(current);
  }
  const changedFields = [];
  const allKeys = /* @__PURE__ */ new Set([...Object.keys(previous), ...Object.keys(current)]);
  for (const key of allKeys) {
    if (key === "updatedAt" || key === "createdAt") {
      continue;
    }
    const prevValue = previous[key];
    const currValue = current[key];
    if (!deepEqual(prevValue, currValue)) {
      changedFields.push(key);
    }
  }
  return changedFields;
}
function computeVersionDiffs(fromConfig, toConfig) {
  const diffs = [];
  const allKeys = /* @__PURE__ */ new Set([...Object.keys(fromConfig), ...Object.keys(toConfig)]);
  for (const key of allKeys) {
    if (key === "updatedAt" || key === "createdAt") {
      continue;
    }
    const prevValue = fromConfig[key];
    const currValue = toConfig[key];
    if (!deepEqual(prevValue, currValue)) {
      diffs.push({
        field: key,
        previousValue: prevValue,
        currentValue: currValue
      });
    }
  }
  return diffs;
}
async function enforceRetentionLimit(agentsStore, agentId, activeVersionId, maxVersions = DEFAULT_MAX_VERSIONS_PER_AGENT) {
  const { total } = await agentsStore.listVersions({ agentId, perPage: 1 });
  if (total <= maxVersions) {
    return { deletedCount: 0 };
  }
  const versionsToDelete = total - maxVersions;
  const { versions: oldestVersions } = await agentsStore.listVersions({
    agentId,
    perPage: versionsToDelete + 1,
    // Get one extra in case we need to skip the active version
    orderBy: { field: "versionNumber", direction: "ASC" }
  });
  let deletedCount = 0;
  for (const version of oldestVersions) {
    if (deletedCount >= versionsToDelete) {
      break;
    }
    if (version.id === activeVersionId) {
      continue;
    }
    await agentsStore.deleteVersion(version.id);
    deletedCount++;
  }
  return { deletedCount };
}
function isVersionNumberConflictError(error) {
  if (error instanceof Error) {
    const message = error.message.toLowerCase();
    return message.includes("unique") && message.includes("constraint") || message.includes("duplicate key") || message.includes("unique_violation") || message.includes("sqlite_constraint_unique") || message.includes("versionnumber");
  }
  return false;
}
async function createVersionWithRetry(agentsStore, agentId, snapshotConfig, changedFields, options = {}) {
  const { changeMessage, maxRetries = 3 } = options;
  let lastError;
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const latestVersion = await agentsStore.getLatestVersion(agentId);
      const versionNumber = latestVersion ? latestVersion.versionNumber + 1 : 1;
      const versionId = generateVersionId();
      await agentsStore.createVersion({
        ...snapshotConfig,
        id: versionId,
        agentId,
        versionNumber,
        changedFields,
        changeMessage
      });
      return { versionId, versionNumber };
    } catch (error) {
      lastError = error;
      if (isVersionNumberConflictError(error) && attempt < maxRetries - 1) {
        await new Promise((resolve) => setTimeout(resolve, 10 * (attempt + 1)));
        continue;
      }
      throw error;
    }
  }
  throw lastError;
}
async function handleAutoVersioning(agentsStore, agentId, existingAgent, updatedAgent, configFields) {
  if (!configFields || Object.keys(configFields).length === 0) {
    return { agent: updatedAgent, versionCreated: false };
  }
  const activeVersion = existingAgent.activeVersionId ? await agentsStore.getVersion(existingAgent.activeVersionId) : null;
  const versionToCompare = activeVersion || await agentsStore.getLatestVersion(agentId);
  const previousConfig = versionToCompare ? extractConfigFromVersion(versionToCompare) : null;
  const changedFields = calculateChangedFields(previousConfig, configFields);
  if (changedFields.length === 0) {
    return { agent: updatedAgent, versionCreated: false };
  }
  const fullConfig = previousConfig ? { ...previousConfig } : {};
  for (const [key, value] of Object.entries(configFields)) {
    fullConfig[key] = value;
  }
  const { versionId } = await createVersionWithRetry(agentsStore, agentId, fullConfig, changedFields, {
    changeMessage: "Auto-saved after edit"
  });
  await agentsStore.updateAgent({
    id: agentId,
    activeVersionId: versionId
  });
  const agentWithNewVersion = {
    ...updatedAgent,
    activeVersionId: versionId
  };
  await enforceRetentionLimit(agentsStore, agentId, versionId);
  return { agent: agentWithNewVersion, versionCreated: true };
}
var LIST_AGENT_VERSIONS_ROUTE = createRoute({
  method: "GET",
  path: "/stored/agents/:agentId/versions",
  responseType: "json",
  pathParamSchema: agentVersionPathParams,
  queryParamSchema: listVersionsQuerySchema,
  responseSchema: listVersionsResponseSchema,
  summary: "List agent versions",
  description: "Returns a paginated list of all versions for a stored agent",
  tags: ["Agent Versions"],
  handler: async ({ mastra, agentId, page, perPage, orderBy }) => {
    try {
      const storage = mastra.getStorage();
      if (!storage) {
        throw new HTTPException(500, { message: "Storage is not configured" });
      }
      const agentsStore = await storage.getStore("agents");
      if (!agentsStore) {
        throw new HTTPException(500, { message: "Agents storage domain is not available" });
      }
      const agent = await agentsStore.getAgentById({ id: agentId });
      if (!agent) {
        throw new HTTPException(404, { message: `Agent with id ${agentId} not found` });
      }
      const result = await agentsStore.listVersions({
        agentId,
        page,
        perPage,
        orderBy
      });
      return result;
    } catch (error) {
      return handleError(error, "Error listing agent versions");
    }
  }
});
var CREATE_AGENT_VERSION_ROUTE = createRoute({
  method: "POST",
  path: "/stored/agents/:agentId/versions",
  responseType: "json",
  pathParamSchema: agentVersionPathParams,
  bodySchema: createVersionBodySchema,
  responseSchema: createVersionResponseSchema,
  summary: "Create agent version",
  description: "Creates a new version snapshot of the current agent configuration",
  tags: ["Agent Versions"],
  handler: async ({ mastra, agentId, changeMessage }) => {
    try {
      const storage = mastra.getStorage();
      if (!storage) {
        throw new HTTPException(500, { message: "Storage is not configured" });
      }
      const agentsStore = await storage.getStore("agents");
      if (!agentsStore) {
        throw new HTTPException(500, { message: "Agents storage domain is not available" });
      }
      const agent = await agentsStore.getAgentById({ id: agentId });
      if (!agent) {
        throw new HTTPException(404, { message: `Agent with id ${agentId} not found` });
      }
      let currentConfig = {};
      if (agent.activeVersionId) {
        const activeVersion = await agentsStore.getVersion(agent.activeVersionId);
        if (activeVersion) {
          currentConfig = extractConfigFromVersion(activeVersion);
        }
      }
      const latestVersion = await agentsStore.getLatestVersion(agentId);
      const previousConfig = latestVersion ? extractConfigFromVersion(latestVersion) : null;
      const changedFields = calculateChangedFields(previousConfig, currentConfig);
      const { versionId } = await createVersionWithRetry(
        agentsStore,
        agentId,
        currentConfig,
        changedFields.length > 0 ? changedFields : [],
        { changeMessage }
      );
      const version = await agentsStore.getVersion(versionId);
      if (!version) {
        throw new HTTPException(500, { message: "Failed to retrieve created version" });
      }
      await enforceRetentionLimit(agentsStore, agentId, agent.activeVersionId);
      return version;
    } catch (error) {
      return handleError(error, "Error creating agent version");
    }
  }
});
var GET_AGENT_VERSION_ROUTE = createRoute({
  method: "GET",
  path: "/stored/agents/:agentId/versions/:versionId",
  responseType: "json",
  pathParamSchema: versionIdPathParams,
  responseSchema: getVersionResponseSchema,
  summary: "Get agent version",
  description: "Returns a specific version of an agent by its version ID",
  tags: ["Agent Versions"],
  handler: async ({ mastra, agentId, versionId }) => {
    try {
      const storage = mastra.getStorage();
      if (!storage) {
        throw new HTTPException(500, { message: "Storage is not configured" });
      }
      const agentsStore = await storage.getStore("agents");
      if (!agentsStore) {
        throw new HTTPException(500, { message: "Agents storage domain is not available" });
      }
      const version = await agentsStore.getVersion(versionId);
      if (!version) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found` });
      }
      if (version.agentId !== agentId) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found for agent ${agentId}` });
      }
      return version;
    } catch (error) {
      return handleError(error, "Error getting agent version");
    }
  }
});
var ACTIVATE_AGENT_VERSION_ROUTE = createRoute({
  method: "POST",
  path: "/stored/agents/:agentId/versions/:versionId/activate",
  responseType: "json",
  pathParamSchema: versionIdPathParams,
  responseSchema: activateVersionResponseSchema,
  summary: "Activate agent version",
  description: "Sets a specific version as the active version for the agent",
  tags: ["Agent Versions"],
  handler: async ({ mastra, agentId, versionId }) => {
    try {
      const storage = mastra.getStorage();
      if (!storage) {
        throw new HTTPException(500, { message: "Storage is not configured" });
      }
      const agentsStore = await storage.getStore("agents");
      if (!agentsStore) {
        throw new HTTPException(500, { message: "Agents storage domain is not available" });
      }
      const agent = await agentsStore.getAgentById({ id: agentId });
      if (!agent) {
        throw new HTTPException(404, { message: `Agent with id ${agentId} not found` });
      }
      const version = await agentsStore.getVersion(versionId);
      if (!version) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found` });
      }
      if (version.agentId !== agentId) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found for agent ${agentId}` });
      }
      await agentsStore.updateAgent({
        id: agentId,
        activeVersionId: versionId,
        status: "published"
      });
      return {
        success: true,
        message: `Version ${version.versionNumber} is now active`,
        activeVersionId: versionId
      };
    } catch (error) {
      return handleError(error, "Error activating agent version");
    }
  }
});
var RESTORE_AGENT_VERSION_ROUTE = createRoute({
  method: "POST",
  path: "/stored/agents/:agentId/versions/:versionId/restore",
  responseType: "json",
  pathParamSchema: versionIdPathParams,
  responseSchema: restoreVersionResponseSchema,
  summary: "Restore agent version",
  description: "Restores the agent configuration from a version, creating a new version",
  tags: ["Agent Versions"],
  handler: async ({ mastra, agentId, versionId }) => {
    try {
      const storage = mastra.getStorage();
      if (!storage) {
        throw new HTTPException(500, { message: "Storage is not configured" });
      }
      const agentsStore = await storage.getStore("agents");
      if (!agentsStore) {
        throw new HTTPException(500, { message: "Agents storage domain is not available" });
      }
      const agent = await agentsStore.getAgentById({ id: agentId });
      if (!agent) {
        throw new HTTPException(404, { message: `Agent with id ${agentId} not found` });
      }
      const versionToRestore = await agentsStore.getVersion(versionId);
      if (!versionToRestore) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found` });
      }
      if (versionToRestore.agentId !== agentId) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found for agent ${agentId}` });
      }
      const restoredConfig = extractConfigFromVersion(versionToRestore);
      await agentsStore.updateAgent({
        id: agentId,
        ...restoredConfig
      });
      const latestVersion = await agentsStore.getLatestVersion(agentId);
      const previousConfig = latestVersion ? extractConfigFromVersion(latestVersion) : null;
      const changedFields = calculateChangedFields(previousConfig, restoredConfig);
      const { versionId: newVersionId } = await createVersionWithRetry(
        agentsStore,
        agentId,
        restoredConfig,
        changedFields,
        {
          changeMessage: `Restored from version ${versionToRestore.versionNumber}`
        }
      );
      const newVersion = await agentsStore.getVersion(newVersionId);
      if (!newVersion) {
        throw new HTTPException(500, { message: "Failed to retrieve created version" });
      }
      await enforceRetentionLimit(agentsStore, agentId, agent.activeVersionId);
      return newVersion;
    } catch (error) {
      return handleError(error, "Error restoring agent version");
    }
  }
});
var DELETE_AGENT_VERSION_ROUTE = createRoute({
  method: "DELETE",
  path: "/stored/agents/:agentId/versions/:versionId",
  responseType: "json",
  pathParamSchema: versionIdPathParams,
  responseSchema: deleteVersionResponseSchema,
  summary: "Delete agent version",
  description: "Deletes a specific version (cannot delete the active version)",
  tags: ["Agent Versions"],
  handler: async ({ mastra, agentId, versionId }) => {
    try {
      const storage = mastra.getStorage();
      if (!storage) {
        throw new HTTPException(500, { message: "Storage is not configured" });
      }
      const agentsStore = await storage.getStore("agents");
      if (!agentsStore) {
        throw new HTTPException(500, { message: "Agents storage domain is not available" });
      }
      const agent = await agentsStore.getAgentById({ id: agentId });
      if (!agent) {
        throw new HTTPException(404, { message: `Agent with id ${agentId} not found` });
      }
      const version = await agentsStore.getVersion(versionId);
      if (!version) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found` });
      }
      if (version.agentId !== agentId) {
        throw new HTTPException(404, { message: `Version with id ${versionId} not found for agent ${agentId}` });
      }
      if (agent.activeVersionId === versionId) {
        throw new HTTPException(400, {
          message: "Cannot delete the active version. Activate a different version first."
        });
      }
      await agentsStore.deleteVersion(versionId);
      return {
        success: true,
        message: `Version ${version.versionNumber} deleted successfully`
      };
    } catch (error) {
      return handleError(error, "Error deleting agent version");
    }
  }
});
var COMPARE_AGENT_VERSIONS_ROUTE = createRoute({
  method: "GET",
  path: "/stored/agents/:agentId/versions/compare",
  responseType: "json",
  pathParamSchema: agentVersionPathParams,
  queryParamSchema: compareVersionsQuerySchema,
  responseSchema: compareVersionsResponseSchema,
  summary: "Compare agent versions",
  description: "Compares two versions and returns the differences between them",
  tags: ["Agent Versions"],
  handler: async ({ mastra, agentId, from, to }) => {
    try {
      const storage = mastra.getStorage();
      if (!storage) {
        throw new HTTPException(500, { message: "Storage is not configured" });
      }
      const agentsStore = await storage.getStore("agents");
      if (!agentsStore) {
        throw new HTTPException(500, { message: "Agents storage domain is not available" });
      }
      const fromVersion = await agentsStore.getVersion(from);
      if (!fromVersion) {
        throw new HTTPException(404, { message: `Version with id ${from} not found` });
      }
      if (fromVersion.agentId !== agentId) {
        throw new HTTPException(404, { message: `Version with id ${from} not found for agent ${agentId}` });
      }
      const toVersion = await agentsStore.getVersion(to);
      if (!toVersion) {
        throw new HTTPException(404, { message: `Version with id ${to} not found` });
      }
      if (toVersion.agentId !== agentId) {
        throw new HTTPException(404, { message: `Version with id ${to} not found for agent ${agentId}` });
      }
      const fromConfig = extractConfigFromVersion(fromVersion);
      const toConfig = extractConfigFromVersion(toVersion);
      const diffs = computeVersionDiffs(fromConfig, toConfig);
      return {
        diffs,
        fromVersion,
        toVersion
      };
    } catch (error) {
      return handleError(error, "Error comparing agent versions");
    }
  }
});

export { ACTIVATE_AGENT_VERSION_ROUTE, COMPARE_AGENT_VERSIONS_ROUTE, CREATE_AGENT_VERSION_ROUTE, DEFAULT_MAX_VERSIONS_PER_AGENT, DELETE_AGENT_VERSION_ROUTE, GET_AGENT_VERSION_ROUTE, LIST_AGENT_VERSIONS_ROUTE, RESTORE_AGENT_VERSION_ROUTE, calculateChangedFields, createStoredAgentBodySchema, createStoredAgentResponseSchema, createVersionWithRetry, deleteStoredAgentResponseSchema, enforceRetentionLimit, generateVersionId, getStoredAgentResponseSchema, handleAutoVersioning, listStoredAgentsQuerySchema, listStoredAgentsResponseSchema, storedAgentIdPathParams, updateStoredAgentBodySchema, updateStoredAgentResponseSchema };
//# sourceMappingURL=chunk-3BLDCVOI.js.map
//# sourceMappingURL=chunk-3BLDCVOI.js.map